Архів для категорії ‘Flex Builder 3’

Flex Builder іноді “не бачить” класу

неділя, Червень 15, 2008

Якщо умовою для оператору if є результат функції, та тіло оператору починається з дужки “(”, то Flex Builder не підкаже ім’я класу в якому є подібний if.

Ось приклад:

  1. package
    1. {
    1. public class Flea
    2. {
      1. public function Flea()
      2. {
        1. if(this.hasOwnProperty(”startJump”))
          1. (this as Object).startJump()
      3. }
    3. }
  2. }

В іншому класі того ж проекту при натисканні Ctrl+Space ми не побачимо клас Flea.

1.gif

Також в самому класі не будуть працювати більшість можливостей Flex Builder, як наприклад перехід по F3, або Ctrl+o.

Такого не станеться, якщо використовувати фігурні дужки для обрамлення тіла оператора if :)

  1. if(this.hasOwnProperty(”startJump”))
  2. {
    1. (this as Object).startJump()
  3. }

Результат:

2.gif

getter/setter + (increment || decrement) = жук у компіляторі

п’ятниця, Травень 30, 2008

Маємо змінну задану за допомогою get та set функцій:

  1. var _num:Number = 0;
  2. function get num():Number
  3. {
    1. return _num;
  4. }
  5. function set num(value:Number):void
  6. {
    1. _num = value;
  7. }

Створюємо іще одну змінну:

var num2:Number = num++;

Отримуєм помилку компіляції:

1067: Implicit coercion of a value of type void to an unrelated type Number.

Вважаю що виходить так:

var num2:Number = set num(get num() +1);

А так як результат set num() є void, то ми і отримуємо помилку.

<mx:Binding />

середа, Травень 28, 2008

Доволі часто ми створюємо глобальну змінну (в рамках mxml-компоненту), яка зв’язується (binding) зі змінною внутрішнього компоненту:

  1. <?xml version=”1.0″ encoding=”utf-8″?>
  2. <mx:Canvas xmlns:mx=”http://www.adobe.com/2006/mxml” width=”400″ height=”300″>
    1. <mx:TextInput text=”{textInputText}” />
    2. <mx:String id=”textInputText” />
  3. </mx:Canvas>

Але при цьому зв’язування є одностороннім, тобто, в наведеному прикладі, якщо користувач введе текст в поле, то змінна textInputText не зміниться. На допомогу приходить теґ <Binding>.

  1. <?xml version=”1.0″ encoding=”utf-8″?>
  2. <mx:Canvas xmlns:mx=”http://www.adobe.com/2006/mxml” width=”400″ height=”300″>
    1. <mx:TextInput id=”ti” text=”{textInputText}” />
    2. <mx:String id=”textInputText” />
    3. <mx:Binding source=”ti.text” destination=”textInputText” />
  3. </mx:Canvas>

Єдиний мінус в тому, що треба вигадувати id для TextInput :)

Оновлення:

Виявляється, що можна зробити простіше :)

  1. <?xml version=”1.0″ encoding=”utf-8″?>
  2. <mx:Canvas xmlns:mx=”http://www.adobe.com/2006/mxml” width=”400″ height=”300″>
    1. <mx:TextInput id=”ti” text=”{textInputText}” />
    2. <mx:String id=”textInputText”>{ti.text}</mx:String>
  3. </mx:Canvas>

Це не позбавляє нас від вигадування id, але зберігає одну строчку коду. А <binding> можна використовувати для зв’язування до більш ніж одного об’єкту.

Метагеґ [MIXIN] у Flex

четвер, Березень 27, 2008

Якщо Ви проставите метатеґ [MIXIN] у Вашому класі (трохи вище визначення класу), то при старті Вашого Flex-застосування буде викликана статична функція init():

  1. public static function init(root:DisplayObject):void

Викличе її SystemManager.

У допомозі Flex є згадки про цей метатеґ, знайти їх можна виконавши пошук по слову mixin :)

Як за допомогою [embed] вбудувати swf з кодом

п’ятниця, Березень 21, 2008

Ми знаємо, що при вбудуванні swf за допомогою теґу [Embed] увесь код, який був у swf-ці, втрачається. Є один спосіб як зберегти код.

Спочатку створимо у Flash IDE флешку, головним класом якої буде, наприклад, assets.Flea. В цьому класі є метод startJumping(), який просто починає програвання флешки. Назвемо файл flea.swf.

Тепер вбудуємо flea.swf в будь-який клас у Flex-проекті:

  1. [Embed(”assets/flea.swf”, mimeType=”application/octet-stream”)]
  2. private var FleaAsset:Class;

mimeType=”application/octet-stream” дає зрозуміти компілятору Flex, що вбудування потрібно робити без будь-якої конвертації даних.

Тепер в FleaAsset ми маємо клас ByteArrayAsset, тобто, практично ByteArray.

Далі завантажуємо екземпляр FleaAsset до Loader за допомогою loadBytes():

  1. var currLoader:Loader = new Loader();
  2. var ldrContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
  3. currLoader.loadBytes( new FleaAsset(), ldrContext );

ldrContext ми використовуємо, щоб бути впевненими, що клас, який знаходиться в FleaAsset буде тим самим, що і в Flex проекті.

Далі, щоб клас із FleaAsset з’явився для нашого використання, нам потрібно почекати один кадр. Це не дуже добре, але як це обійти я не знаю.

  1. var sprite:Sprite = new Sprite();
  2. sprite.addEventListener(Event.ENTER_FRAME, enterFrameHandler);

Далі, ми просто створюємо екземпляр класу assets.Flea та використовуємо його як забажаємо. Уся графічна частина цього класу, яку ми створили у Flash IDE, буде присутня :)

  1. import assets.Flea;
  2. function enterFrameHandler(event:Event):void
  3. {
    1. var flea:Flea = new Flea();
    1. addChild(flea);
    1. flea.startJumping();
    2. sprite.removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
  4. }

Я зробив приклад такої собі бібліотеки, яка може спростити роботу з убудованими swf.

Щоб знати більше раджу почитати це (англійською):