Архів для May, 2008

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

Friday, May 30, 2008

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

var _num:Number = 0;
function get num():Number
{
	return _num;
}
function set num(value:Number):void
{
	_num = value;
}

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

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, то ми і отримуємо помилку.

Загадка про switch + XML

Thursday, May 29, 2008

Код:

var xx:XML = <root attr="1"></root>;
switch(xx.@attr)
{
	case 1:
		trace("Case: 1");
	break;
	case "1":
		trace("Case: 2");
	break;
	default:
		trace("Default");
}

Що буде в output?

(more…)

<mx:Binding />

Wednesday, May 28, 2008

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

<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="300">
	<mx:TextInput text="{textInputText}" />
	<mx:String id="textInputText" />
</mx:Canvas>

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

<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="300">
	<mx:TextInput id="ti" text="{textInputText}" />
	<mx:String id="textInputText" />
	<mx:Binding source="ti.text" destination="textInputText" />
</mx:Canvas>

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

Оновлення:

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

<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="300">
	<mx:TextInput id="ti" text="{textInputText}" />
	<mx:String id="textInputText">{ti.text}</mx:String>
</mx:Canvas>

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

flash.trace.Trace

Monday, May 26, 2008

Так, є такий клас, дуже непримітний, але може бути дуже корисним :)

Він робить дивовижну річ. Після “запуску” видає в output імена УСІХ! методів які виконуються, з іменами класів, до яких належать ці методи. Клас не документовано, тобто як з ним працювати не знаю (google теж нічого не каже), але методами спроб та помилок щось таки вдалось зрозуміти.

Ось усі його методи (клас статичний, тобто усі методи статичні):

  • Trace.setLevel(l:int, target:int=2):Object
  • Trace.getLevel(target:int=2):int
  • Trace.setListener(f:Function):Object
  • Trace.getListener():Function;

Trace.setLevel(l:int, target:int=2):Object

Виставляє рівень віщування, та ціль віщування.

Першим параметром може бути одна з констант:

  • Trace.METHODS_AND_LINES_WITH_ARGS = 4
    • Назва методу з вхідними параметрами та номер строчки в коді зі шляхом до класу, в якому виконався метод
  • Trace.METHODS_AND_LINES = 3
    • Назва методу та номер строчки
  • Trace.METHODS_WITH_ARGS = 2
    • Назва методу з вхідними параметрами
  • Trace.METHODS = 1
    • Тільки назва методу
  • Trace.OFF = 0
    • Вимкнуто

Другим параметром може бути:

  • Trace.LISTENER = 2
    • Віщувати у функцію, яка буда додана, за допомогою setListener().
  • Trace.FILE = 1
    • Віщувати у output.

Trace.getLevel(target:int=2):int

Повертає рівень віщування для цілі.

Trace.setListener(f:Function):Object

Виставляє функцію для віщування при цілі віщування = Trace.LISTENER.

Функція має приймати 4 параметри:

private function traceListener(
	fileInfo:String,
	lineNumber:String,
	classAndMethod:String,
	methodArguments:String
):void

fileInfo – тека, де знаходиться файл + “;” + щось іще (в мене була пуста строчка) :) + “;” + ім’я файлу.

Приклад: “D:\Projects\ForTestsF3\src;;ForTestsF3.mxml”

lineNumber – номер строчки

classAndMethod – повне ім’я класу + (“/” || “$/” ) + ім’я методу.

Приклади: “flash.display::DisplayObjectContainer/addChild”

“flash.trace::Trace$/setListener” – “$/” використовується, якщо визваний метод – статичний

methodArguments -вхідні параметри методу, розділені комою (,). Але якщо параметри методу задано за допомогою rest оператору (…), то вони показані не будуть.

Trace.getListener():Function

Повертає заданий раніше лістенер.

Ось приклад:

import flash.trace.Trace;
function test(t:String):String
{
	return t;
}
Trace.setLevel(Trace.METHODS_WITH_ARGS, Trace.FILE);
var st:String = "hello!";
test(st);
stop();

В output отримаєте:

	14554003 AVMINF: MTHD Untitled_fla::MainTimeline/test ("hello!") @ 0x042F0300
	4554004 AVMINF: MTHD flash.display::MovieClip/stop () @ 0x0EF004D0

Дуже дякую 7thsky за допомогу!