Компонент DataGrid swf файла в FlashDevelop AS3.0 проекте.

Вдруг не с того ни с сего захотелось потестить DataGrid, таким необычным способом. В flash CS3 перетянул в библиотеку компонент DataGrid, а еще создал MovieClip c классом, в этом классе надо как положено экспорт в первый кадр, класс, ну вы знаете ;). В этом классе надо вызвать событие DataGridEvent.ITEM_EDIT_BEGIN, что-бы класс DataGridEvent вкомпилился во флешку. Теперь компилим. Создаем в FlashDevelop ActionScript 3 (мне нравится Empty project) c Create Directory for project. Вставляем в эту директорию файл нашей скомпиленной в CS3 флешки с компонентом DataGrid в библиотеке.
Так как DataGrid компонет сложный и содержит в себе кучу всяких классов, то и доствать их проблематично, тк. надо прописывать все доставаемые из флешки классы с package путями. Решение ничего не делать пришло само собой после посещения etcs.ru записки о flash, где можно узнать о загруженной флешке больше. Таким образом функция getDefinitionNames вернет названия всех флешкиных классов в формате например flash.display::Sprite этого предостаточно, что бы преобразовать массив с классами в формат flash.display.Sprite получть таким образом все классы и сделать обращение к ним в коротком формате Sprite. Переделаный и дополненный класс для загрузки библиотеки swf файла.
//SwfLib
package lex
{
	import flash.display.*
	import flash.events.*;
	import flash.text.*;
	import flash.ui.*;
	import flash.system.*;
	import flash.net.*;
	import flash.utils.*;

	import ru.etcs.utils.getDefinitionNames;//получить имена всех классов флешки


	dynamic public class SwfLib extends Sprite
	{
		private var swfByte:ByteArray;

		private var loader:Loader;
		public var cl:Object,
		classNameArr:Array,//имена всех классов в массиве
		shortClassNameArr:Array,//короткие имена всех классов в массиве
		reg:RegExp = /::/,
		i:int,
		j:int;//все классы, которые были во флешке с сокращенными именами

		public function SwfLib(_swfByte:ByteArray):void
		{
			classNameArr = [];//массив имен всех классов содержащихся во флешке
			shortClassNameArr = [];//массив имена классов без паккажа
			cl = new Object();//все классы которые были во флешке, например так cl.Button 
			swfByte = _swfByte;
			loader = new Loader;
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadComplete);

			loader.loadBytes(swfByte,new LoaderContext(false, ApplicationDomain.currentDomain));

		}
		public function onLoadComplete(evt:Event):void {
			//trace(" getQualifiedClassName (loader.content) "+getQualifiedClassName (loader.content));//дернуть документ класс
			loader.removeEventListener(Event.COMPLETE, onLoadComplete);
			classNameArr = getDefinitionNames(loader.contentLoaderInfo);
			for (i = 0; i < classNameArr.length; i++) {
				classNameArr[i] = classNameArr[i].replace(reg, '.');
				shortClassNameArr[i] = shortName(classNameArr[i]);
				cl[shortClassNameArr[i]] = 
				loader.contentLoaderInfo.applicationDomain.getDefinition(classNameArr[i])as Class
			}
			
			//trace(classNameArr);
			dispatchEvent(new LexEvent(LexEvent.COMPLETE, {value:"swfOK"}));
		}

		public function idGetClass(_id:String, _className:String):void {
			this[_id] = loader.contentLoaderInfo.applicationDomain.getDefinition(_className)as Class;
		}

		private function shortName(_str:String):String {
			var chArr:Array = [];
			var len:int = _str.length;
			for (j = len-1; j >= 0; j--) {
				if (_str.charAt(j) == '.') break;
				chArr.unshift(_str.charAt(j));//добавить в начало массива
			}
			return chArr.join('');
		}

	}
}
В объекте cl будут все классы содержащиеся во флешке.

Документ класс

package  
{
	import flash.display.*;
	import flash.text.*;
	import lex.*;

	dynamic public class StartDataGridDoc extends MovieClip
	{
		[Bindable]
		[Embed(source = "DataGridEventExample.swf", mimeType='application/octet-stream')]
		private var swfByteDataGrid:Class,
		swfLib:SwfLib,
		cl:Object,//классы
		ob:Object;//объекты

		public function StartDataGridDoc() 
		{
			swfLib = new SwfLib(new swfByteDataGrid);
			swfLib.addEventListener(LexEvent.COMPLETE, onSwfComplete);
			cl = new Object;
			ob = new Object;
		}

		public function onSwfComplete(evt:LexEvent):void {
			swfLib.removeEventListener(LexEvent.COMPLETE, onSwfComplete);
			init();
		}

		public function init():void{

			cl = swfLib.cl;//все классы загруженной флешки в одном объекте

			addChild(ob.table = new cl.DataGrid());//добавляем табличку

			addChild(ob.txtInput = new cl.TextInput());//добавляем текстовое поле
			ob.txtInput.setSize(300,30);
			ob.txtInput.move(10,340);

			addChild(ob.label = new cl.Label());//создать невыделяемое текстовое поле
			ob.label.setSize(200,30);
			ob.label.move(10,320);

			ob.tabData = new cl.DataProvider();// табличные данные

			ob.table.setSize(400,300);
			ob.table.editable = true;

			var i:uint;
			var totalRows:uint = 42;
			ob.table.columns = [ new cl.DataGridColumn("col1"),
						new cl.DataGridColumn("col2"),
						new cl.DataGridColumn("col3"),
						new cl.DataGridColumn("четвертый")];

			for (i=0; i<totalRows; i++) {
				ob.tabData.addItem( {col1:Math.round(Math.random() * 100),
							col2:Math.round(Math.random() * 100),
							col3:Math.round(Math.random() * 100) } );
			}
			ob.table.dataProvider = ob.tabData;
			var noEditor:Object = falseEditor();//редактор для первого столбца
			ob.table.columns[0].itemEditor = noEditor;//первая колонка не редактируемая
			ob.table.columns[1].sortOptions = Array.NUMERIC;//col 1 сортируется по числовым данным
			ob.table.addEventListener(cl.DataGridEvent.ITEM_EDIT_BEGIN, announceEditBegin);
		}

		private function announceEditBegin(e:Object):void {
			var row:Object;//строка
			var col:Object;//колонка
			var nameHead:String;//имя заголовка активной ячейки
			var strCell:String;
			var i:int;
			var allCellStr:String;

			row = e.target.columns;

			col = row[e.rowIndex];

			//trace(describeType(e.target));

			nameHead = row[e.columnIndex].dataField;//через колонку
			nameHead = row[e.columnIndex].headerText;//через header (так тоже можно)
			//показать содержимое клацнутой ячейки
			strCell = ''+ob.tabData.getItemAt(uint(e.rowIndex))[nameHead];
			trace(ob.tabData.getItemAt(uint(e.rowIndex))[row[0].headerText]);
			allCellStr = '';
			for (i = 0; i < 4; i++) //содержимое всей строки
			allCellStr += ob.tabData.getItemAt(uint(e.rowIndex))[row[i].headerText] +" ";
			ob.txtInput.text = allCellStr;
			ob.label.text = strCell;
		}

		private function falseEditor():Object {
			var tablEditor:Object = new cl.DataGridCellEditor();
			tablEditor.textField.background = true;
			tablEditor.textField.backgroundColor = 0xFF0000;//красный
			tablEditor.maxChars = 2;//максимальное число символов
			tablEditor.restrict = "";//используемые символы
			var txt:TextField = tablEditor.textField;
			txt.type = TextFieldType.DYNAMIC;//запрет на редактирование
			return tablEditor;
		}

	}

}
В общем это попытка объединить основную работу с Таблицей как демку. Ячейки первого столбца выделяются, но не редактируется, второго при нажатии на заголовок сортируются по цифровым значениям, при клацании на ячейку, ее текст появляется в label, который так-же берется из загруженной флешки, содержимое строки на которой клацнули появляется в компоненте TextInput этот компонент то-же залетел вместе с DataGrid прицепом. Вот так это выглядит, специально сделал вывод в 10 плеер, что бы проверить как будет себя чувствовать Embed флешка из 9 со своими компонентами. Вроде ничего так.
Компилим и смотрим, что вышло.

Архив, содержащий проект с DataGrid, которая находится в Embed swf файле.