Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   непонятки с ассоциативным массивом (http://www.flasher.ru/forum/showthread.php?t=91841)

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

Цитата:

Сообщение от Pablo4d
Но в массив не добавляется при
Код:

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

все ясно - спасибо !


Часовой пояс GMT +4, время: 14:47.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.