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

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>