Просмотр полной версии : непонятки с ассоциативным массивом
Делаю так:
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;
Ничего не понял, но на всякий случай сообщу, что в таких случаях стоит использовать Dicrionary а не Array.
я допустим переодически забываю написать myVar = new Object() или
myAr = new Array(). В твоем случае я тоже не вижу таких действий.
Dictionary :D
Флэш Потрошитель
13.02.2007, 19:25
Но в массив не добавляется при aForms[__form.name]=__form;
Интересно, а как именно ты определяешь, добавляется в массив значение или нет?
Например, если ты пытаешься использовать для этого свойство массива length, то ты и не увидишь никакого результата -- у ассоциативных массивов оно не поддерживается.
Интересно, а как именно ты определяешь, добавляется в массив значение или нет?
Дебаггером смотрю
Вот конечный вариант
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;
то уже все будет хорошо?
Нет, просто если тебе нужен ассоциативный массив, более логично использовать Dictionary который легче, и подерживает слабую связку, в отличии от массива.
А вообще где ты инициализируешь массив?
Это же синглетнон. Инициализация происходит по мере надобности - а то чнее просто идет добавление инстанса панели, когда она открывается и она не может повторно открыться пока существует хоть один инстанс такого же класса - ну типа как например панель 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.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.