пятница, 29 февраля 2008 г.

DataGrid cellRenerer для столбца

Поместить в первый кадр (На сцену перетащить компонет DataGrid обозвать dg, в либу поместить Button)
var sampleItem1:Object = { Name:"John Alpha",     Number:"555-123-0101", Email:"jalpha@fictitious.com" };
var sampleItem2:Object = { Name:"Mary Bravo", Number:"555-372-3322", Email:"mbravo@fictitious.com" };
var sampleItem3:Object = { Name:"Trevor Gamma", Number:"555-485-1212", Email:"tgamma@fictitious.com" };
var sampleItem4:Object = { Name:"Susan Delta", Number:"555-987-3434", Email:"sdelta@fictitious.com" };

//dg.setStyle('cellRenderer', MyRenderer);

dg.columns = ["Name", "Number", "Email"];

dg.addItem(sampleItem1);
dg.addItem(sampleItem2);
dg.addItem(sampleItem3);
dg.addItem(sampleItem4);
dg.addColumn("NewCol");
dg.getColumnAt(0).cellRenderer=MyRenderer;
dg.getColumnAt(1).cellRenderer=MyRenderer2;

MyRenderer.as:
package
{
import fl.controls.LabelButton;
import fl.controls.listClasses.ICellRenderer;
import fl.controls.listClasses.ListData;
import fl.containers.BaseScrollPane;

public class MyRenderer extends LabelButton implements ICellRenderer {
private var _listData:ListData;
private var _data:Object;

public function MyRenderer() {
}

public function set listData(newListData:ListData):void {
_listData = newListData;
label = "Random: " + _listData.label;
drawRandomColor();
}

private function drawRandomColor():void {
graphics.beginFill(Math.random()*0xFFFFFF);
graphics.drawRect(0,0,20,20);
graphics.endFill();
}

public function get listData():ListData {
return _listData;
}

public function set data(newData:Object):void {
_data = newData;
}

public function get data():Object {
return _data;
}
}
}

MyRenderer2.as:
package
{
import fl.controls.LabelButton;
import fl.controls.listClasses.ICellRenderer;
import fl.controls.listClasses.ListData;
import fl.containers.BaseScrollPane;
import flash.display.Sprite;
import flash.events.MouseEvent;

public class MyRenderer2 extends Sprite implements ICellRenderer {
private var _listData:ListData;
private var _data:Object;

public function MyRenderer2() {
this.graphics.lineStyle(1);
this.graphics.drawCircle(10, 10, 10);

this.addEventListener(MouseEvent.CLICK, mouseClickHandler);
}

private function mouseClickHandler(e:MouseEvent):void {
trace("cell clicked");
}

public function set listData(newListData:ListData):void {
_listData = newListData;
//label = "Random: " + _listData.label;
//drawRandomColor();
}

private function drawRandomColor():void {
graphics.beginFill(Math.random()*0xFFFFFF);
graphics.drawRect(0,0,20,20);
graphics.endFill();
}

public function get listData():ListData {
return _listData;
}

public function set data(newData:Object):void {
_data = newData;
}

public function get data():Object {
return _data;
}
public function get selected():Boolean {
return true;
}
public function set selected(value:Boolean):void {

}
public function setMouseState(state:String):void {
if (state == "over") { trace ("mouse Over") } ;
}
public function setSize(width:Number, height:Number):void {
this.width = width;
this.height = height;
}

public function setStyle(style:String, value:Object):void {

}

}
}

вторник, 26 февраля 2008 г.

Передача параметра EventHandler-у (хак от __etc)

Очень помог прием (хак) с функцией delegate

function resizeHandler(event:Event, ...rest):void {
trace(event, rest);
}
var delegate:Function = function(scope:Object, func:Function, ...rest):Function {
return function(...args):void {
func.apply(scope, args.concat(rest));
}
}
super.stage.addEventListener(Event.RESIZE, delegate(this, this.resizeHandler, 1, 2, 3));

понедельник, 25 февраля 2008 г.

Клик по вложенному мувику

Взято с форума, на заметку:

Есть MovieClip1, на нем событие MouseClick1
в этом MovieClip1 есть MovieClip2 и на нем тоже обработчик клика - MouseClick2. Когда нажимаем на MovieClip2 выполняются оба метода MouseClick1 и MouseClick2.
Как избежать? Хочу чтобы обрабатывался только MouseClick2.
Спасибо!

private function mouseClick1 (e:MouseEvent):void {
if (e.eventPhase == EventPhase.AT_TARGET) {
//
}
}

четверг, 14 февраля 2008 г.

TextField - концентратор багов

Очень утомляет и вызывает крайнюю степень раздражения недоделаность TextField-а. Наверное за его разработку отвечали индусы-двоешники. Индусы которые еще ничего, делали что посерьезнее. А двоешникам дали TextField.

Когда getCharIndexAtPoint(x, y) попадает на перенос строки ("\n"), то возвращает черти что (4294967295).

вторник, 12 февраля 2008 г.

Прочитать 100 раз и запомнить. Слабые ссылки

На форуме miramax коротко и ясно описал что такое weakReference
Прочитать и запомнить:

GC удаляет только те объекты, к которым нельзя добраться из точки входа (основного объекта программы, Document Class, функция main как хотите называйте).
Например есть стуктура:

А (точка входа)
/ \
Б В
|
Г
/ \
Д Е

Если в какой-то момент убить ссылку из Б в Г, то будут удалены и Г, и Д, и Е. Т.е. если из точки входа невозможно провести путь к объекту, то он будет удалён, т.к. такой объект не может быть использован в основном потоке исполнения(который запускается в точке входа) даже теоретически =).

Некоторые классы используют так называемые "мягкие ссылки", которые не учитываются при обходе GC. Путь из точки входа к ним провести можно, но это не повлияет на GC/

Например тот же Dictionary, если ссылка на объект определена только в нём, и свойство Dictionary.weakReference = true. То объект будет удалён.

Ещё пример - метод
EventDispatcher.addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
В евент диспатчере как бы инкапсулированы ссылки на все обработчики, но
если последний аргумент true, то при обходе GC они не будут учитываться. Т.е. если на событие подписан метод объекта, на который нет других ссылок. Объект будет всё равно удалён.

вторник, 5 февраля 2008 г.