PDA

Просмотр полной версии : непонятки с ассоциативным массивом


Pablo4d
09.02.2007, 17:30
Делаю так:

public function openForm(__form:Class):void
{
if (isFormOpen(__form.name))
{
return;
}
var form:IFlexDisplayObject=PopUpManager.createPopUp(DisplayObject(Application.application),__form,false);
addForm(form);
}

public function addForm(__form:Object):Boolean
{
if (isFormOpen(__form.name))
{
return false;
}
aForms[__form.name]=__form;
return true;
}

public function removeForm(__form:Object):Boolean
{
if (isFormOpen(__form.name))
{
delete aForms[__form.name];
}
return false;
}

public function isFormOpen(__name:String):Boolean
{
if (aForms[__name]!=null)
{
return true;
}
return false
}



Но в массив не добавляется при
aForms[__form.name]=__form;

Nirth
10.02.2007, 04:48
Ничего не понял, но на всякий случай сообщу, что в таких случаях стоит использовать Dicrionary а не Array.

__i
12.02.2007, 12:30
я допустим переодически забываю написать myVar = new Object() или
myAr = new Array(). В твоем случае я тоже не вижу таких действий.

Dictionary :D

Флэш Потрошитель
13.02.2007, 19:25
Но в массив не добавляется при aForms[__form.name]=__form;

Интересно, а как именно ты определяешь, добавляется в массив значение или нет?

Например, если ты пытаешься использовать для этого свойство массива length, то ты и не увидишь никакого результата -- у ассоциативных массивов оно не поддерживается.

Pablo4d
13.02.2007, 19:43
Интересно, а как именно ты определяешь, добавляется в массив значение или нет?

Дебаггером смотрю

Вот конечный вариант

package control
{
import mx.managers.PopUpManager;
import mx.core.Application;
import mx.containers.TitleWindow;
import flash.display.DisplayObject;
import mx.core.IFlexDisplayObject;

public class SingleFormsController
{
private static var controller:SingleFormsController;

public static var EVENT_EVENT_CODES_FORM_CLOSE:String="EVENT_EVENT_CODES_FORM_CLOSE";

private var aForms:Array;

public static function getInstance():SingleFormsController
{
if (controller==null)
{
controller=new SingleFormsController();
}
return controller
}

public function SingleFormsController()
{
if (controller != null)
{
throw new Error("Only SingleFormsController can exist.");
}
aForms=new Array();
}

public function openForm(__form:Class):void
{
if (isFormOpen(__form.formname))
{
return;
}
var form:IFlexDisplayObject=PopUpManager.createPopUp(DisplayObject(Application.application),__form,false);
addForm(__form.formname,form);
}

public function addForm(__name:String,__form:Object):Boolean
{
if (isFormOpen(__name))
{
return false;
}
aForms[__name]=__form;
return true;
}

public function removeForm(__formname:String):Boolean
{
var form:IFlexDisplayObject=getFormByName(__formname)
if (form)
{
PopUpManager.removePopUp(form);
delete aForms[__formname];
}
return false;
}

private function getFormByName(__formname:String):IFlexDisplayObject
{
return aForms[__formname];
}

public function isFormOpen(__name:String):Boolean
{
if (aForms[__name]!=null)
{
return true;
}
return false
}

}
}

Это текущий вариант если заменить
private var aForms:Array;
на
private var aForms:Dictionary;

то уже все будет хорошо?

Nirth
13.02.2007, 23:45
Нет, просто если тебе нужен ассоциативный массив, более логично использовать Dictionary который легче, и подерживает слабую связку, в отличии от массива.

А вообще где ты инициализируешь массив?

Pablo4d
14.02.2007, 14:57
Это же синглетнон. Инициализация происходит по мере надобности - а то чнее просто идет добавление инстанса панели, когда она открывается и она не может повторно открыться пока существует хоть один инстанс такого же класса - ну типа как например панель Settings в приложениях (ее нельзя открыть два раза сразу)

Denis.Oleynik
17.02.2007, 00:53
Похоже, что у тебя просто ошибка в коде, Array здесь не причем, т.к. он подходит для строковых ключей. Как я вижу, ошибка у тебя в

public function openForm(__form:Class):void
{
if (isFormOpen(__form.formname))
{
return;
}
var form:IFlexDisplayObject=PopUpManager.createPopUp(DisplayObject(Application.application),__form,false);
addForm(__form.formname,form);
}

обрати внимание на __form.formname, есть ли тут значение.
если хочешь взять имя класса используй getQualifiedClassName, хотя ты запросто можешь использовать в качестве ключа сам __form:Class, только в этом случае замени Array на Dictionary.

Pablo4d
19.02.2007, 15:03
все ясно - спасибо !