PDA

Просмотр полной версии : Динамически создать Component типа ComboBox


xception
16.09.2007, 17:58
Всем привет.
Возникла необходимость создать динамически компонент в AS3 и вытащить его в мувик. Создание компонента надо запихнуть в класс.
Собственно есть мувик, есть файл MyControl.as находящийся в директории control относительно мувика.

MyControl.as
package control
{
import fl.controls.ComboBox;
import flash.display.MovieClip;

public class MyControl {
public var c:ComboBox;

public function MyControl (parMc:MovieClip){
c = new ComboBox();
parMc.addChild(c);
}
}
}

В первом фрейме клипа код
import control.MyControl;
var ctrl:MyControl = new MyControl(this);

При запуске выдает сообщения (ругается на MyControl.as):
1046: Type was not found or was not a compile-time constant: ComboBox.
1180: Call to a possibly undefined method ComboBox.
1172: Definition fl.controls:ComboBox could not be found.

Однако, если вытащить на сцену один компонент вручную, то он без проблем создает и мой динамически.

Подскажите пожалуйста почему он не может ComboBox импортировать из fl.controls если в мувик не вытащен компонент? Как это можно обойти?

Спасибо заранее.

etc
16.09.2007, 18:18
Надо положить компонент комбобокса в библиотеку.

xception
16.09.2007, 18:21
Спасибо, понятно.

STILL.05
22.02.2008, 13:26
использую ComboBox
запускаю swf через FlashCS3 все работает нормально
если запустить swf через плеер то нифига не работает
ругается на ошибку в строчке
comboBox = new ComboBox()
вот текст ошибки

TypeError: Error #2007: Parameter type must be non-null.
at flash.events::EventDispatcher/addEventListener()
at fl.core::UIComponent/fl.core:UIComponent::callLater()
at fl.core::UIComponent/invalidate()
at fl.core::UIComponent/setSharedStyle()
at fl.managers::StyleManager$/fl.managers:StyleManager::setSharedStyles()
at fl.managers::StyleManager$/registerInstance()
at fl.core::UIComponent$iinit()
at fl.controls::ComboBox$iinit()
at EnvironmentTest/EnvironmentTest::initSpeed()[D:\package\EnvironmentTest.as:91]


кто знает в чем проблема?

Olegg
22.02.2008, 13:56
var comboBox:comboBox = new ComboBox();

может так...тее ж надо загнать в переменную типа comboBox и с ней уже работать.

STILL.05
22.02.2008, 17:19
не понял, вы о чем?

FilimoniC
25.02.2008, 03:34
Изнутри конструктора вызывается addEventListener(type,function)? Так может type в каком-то из случаев null ? Скорее всего проблема там

STILL.05
26.02.2008, 12:20
:( :rtfm: :wacko:
удалил из кода все ссылки на объект comboBox
создаю его в методе Init

private function Init():void {
var comboBox:ComboBox = new ComboBox()
}


все равно выдает туже ошибку :(


мало того взял из хелпа код (точная копия из хелпа)

import fl.controls.*;
import fl.containers.*;
import fl.controls.listClasses.*;
import fl.controls.dataGridClasses.*;
import fl.controls.progressBarClasses.*;
import fl.core.UIComponent;
import fl.data.DataProvider;

var dp:DataProvider = new DataProvider();
dp.addItem( { label: "BaseScrollPane", data:BaseScrollPane } );
dp.addItem( { label: "Button", data:Button } );
dp.addItem( { label: "CellRenderer", data:CellRenderer } );
dp.addItem( { label: "CheckBox", data:CheckBox } );
dp.addItem( { label: "ColorPicker", data:ColorPicker } );
dp.addItem( { label: "ComboBox", data:ComboBox } );
dp.addItem( { label: "DataGrid", data:DataGrid } );
dp.addItem( { label: "HeaderRenderer", data:HeaderRenderer } );
dp.addItem( { label: "ImageCell", data:ImageCell } );
dp.addItem( { label: "IndeterminateBar",data:IndeterminateBar } );
dp.addItem( { label: "Label", data:Label } );
dp.addItem( { label: "List", data:List } );
dp.addItem( { label: "NumericStepper", data:NumericStepper } );
dp.addItem( { label: "ProgressBar", data:ProgressBar } );
dp.addItem( { label: "RadioButton", data:RadioButton } );
dp.addItem( { label: "ScrollPane", data:ScrollPane } );
dp.addItem( { label: "Slider", data:Slider } );
dp.addItem( { label: "TextArea", data:TextArea } );
dp.addItem( { label: "TextInput", data:TextInput } );
dp.addItem( { label: "TileList", data:TileList } );
dp.addItem( { label: "UILoader", data:UILoader } );
dp.addItem( { label: "UIComponent", data:UIComponent } );

var cb:ComboBox = new ComboBox();
cb.move(10,10);
cb.setSize(300,25);
cb.prompt = "Select a component to view its styles";
cb.rowCount = 12;
cb.dataProvider = dp;
cb.addEventListener(Event.CHANGE, showStyleDefinition);
addChild(cb);

var dg:DataGrid = new DataGrid();
dg.setSize(425,300);
dg.move(10,50);
dg.columns = [ new DataGridColumn("StyleName"), new DataGridColumn("DefaultValue") ];
addChild(dg);

function showStyleDefinition(e:Event):void {
var componentClass:Class = e.target.selectedItem.data as Class;
var styles:Object = componentClass["getStyleDefinition"].call(this);
trace(styles.toString());
var styleData:DataProvider = new DataProvider();
for(var i:* in styles) {
trace(i + " : " + styles[i]);
styleData.addItem( { StyleName:i, DefaultValue:styles[i] } );
}
styleData.sortOn("StyleName");
dg.dataProvider = styleData;
}


если открыть уже скомпиленный swf во FlashCS3 то все работает
если открыть swf через плеер но нифига не работает
подскажите плиз, в чем может быть проблема?

etc
26.02.2008, 13:42
Проверил. Все работает.

CrazyFlasher
26.02.2008, 14:31
вы случайно открываете не через 8-ой плеер?

STILL.05
26.02.2008, 16:10
нашел причину
у меня стоял плеер 9 версии но ниже чем 9,0,115,0
стоял кажется 9,0,12,0
загрузил с adobe.com последнюю версию, все заработало