Архів для категорії ‘Спіймані блохи’

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

E4X синтаксис для не XML

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

При використанні синтаксису E4X для не XML об’єктів, компілятор Вам нічого не скаже, але в run-time отримаєте помилку.

var obj:Object = {a:1};
trace( obj.(a == 1) );

TypeError: Error #1123: Filter operator not supported on type Object.

Загадка про Date

середа, Березень 5, 2008

trace( Date( new Date() ) is Date );

Що буде в output?

Далі відповідь

(more…)

Object та його методи

неділя, Березень 2, 2008

Усі методи класу Object створені динамічно у його властивості prototype. Тобто використано прототипний тип спадкування. Тобто Вам не потрібно використовувати ключове слово override для того, щоб перевантажити метод.

describeType для Object показує, що три методи (hasOwnProperty, isPrototypeOf, propertyIsEnumerable) підпадають до класового типу спадкування. Алей для них не потрібно використовувати override.

Оновлення:

Практично теж саме з Array. (Є іще класи, які підпадають під вище сказане, але переважно вони є final класами)

Далі результат роботи trace(describeType({}));

(more…)

[Flex 3] PopUpButton.closeOnActivity

четвер, Лютий 28, 2008

У Flex є такий компонент PopUpButton. Поведінка його схожа на ComboBox, тільки ми маємо можливість задати будь-який компонент який відкриється при натисканні. Але маємо неприємність з тим, що при натисканні на щойно відкритий компонент він зразу зачиняється. Тобто ми не можемо використовувати, наприклад, List з встановленим allowMultipleSelection=true та вибрати декілька елементів в List. У компонента PopUpButton є потрібна нам властивість:

/**
*  @private
*  Storage for the closeOnActivity property.
*/
private var _closeOnActivity:Boolean = true;

/**
*  @private
*  Specifies popUp would close on click/enter activity.
*  In popUps like Menu/List/TileList etc, one need not change
*  this as they should close on activity. However for multiple
*  selection, and other popUp, this can be set to false, to
*  prevent the popUp from closing on activity.
*
*  @default true
*/
private function get closeOnActivity():Boolean
{
	// We are not exposing this property for now, until the need arises.
	return _closeOnActivity;
}

/**
*  @private
*/
private function set closeOnActivity(value:Boolean):void
{
	_closeOnActivity = value;
}

Але як бачите вона є private :)

Рішення:

Потрібно зупинити всі MouseEvent.Click від нашого PopUp’у :

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
	<mx:PopUpButton>
		<mx:popUp>
			<mx:List id="list" allowMultipleSelection="true">
				<mx:dataProvider>
					<mx:Array>
						<mx:String>Один</mx:String>
						<mx:String>Два</mx:String>
						<mx:String>Три</mx:String>
						<mx:String>Чотири</mx:String>
						<mx:String>П'ять</mx:String>
					</mx:Array>
				</mx:dataProvider>
			</mx:List>
		</mx:popUp>
	</mx:PopUpButton>
	<mx:creationComplete>
		<![CDATA[
			list.addEventListener(MouseEvent.CLICK, listClickHandler, true);
		]]>
	</mx:creationComplete>
	<mx:Script>
		<![CDATA[
			private function listClickHandler(event:MouseEvent):void
			{
				event.stopImmediatePropagation();
			}
		]]>
	</mx:Script>
</mx:Application>