Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   меню из массива неизвестного размера. Проблема с target (http://www.flasher.ru/forum/showthread.php?t=134568)

ZergMaster 04.01.2010 22:22

меню из массива неизвестного размера. Проблема с target
 
Всем привет это опять я.

Столкнулся тут с проблемой.
Делаю приложение для вконтакта. В приложении есть кнопочка "найти друга", по нажатию на которую появляется скроллирующийся список друзей пользователя, при нажатии на одного из друзей в специальном окошечке должен появлятся ID этого друга.
Делаю все следующим образом.

Выполняю запрос к api вконтакте GetFriends, на который мне приходит xml со списком id-шников друзей. Я этот xml сразу перевожу в массив friendsArray, после чего выполняю запрос GetProfiles(String(friendsArray)), на который мне приходит xml с их first_name, last_name и т.п. При загрузке я этот xml аналогично перевожу в массив и сортирую
Код AS3:

for(var u:int =0; u<e.xml..user.length(); u++) 
                {
                FIOstr = String(e.xml.user[u].first_name+" "+e.xml.user[u].last_name);
                fioArray.push(String(FIOstr));
                }
fioArray.sort(Array.CASEINSENSITIVE);

Затем идет выстраивание меню. В библиотеке у меня есть мувик Friend, который является просто белым прямоугольником с рамочкой. Проверяя длинну поступившего мне от GetProfiles xml, я столько же раз добавляю на сцену мувик Friend, создаю в нем текстовое поле Friend_txt.
Потом создаю листенер внутри условного цикла for (addEventListener(MouseEvent.MOUSE_OVER, rectOver)). Сначала я этот листенер повесил на мувик Friend. И вроде бы все путем. Тогда создаем где-нить вначале var clip:Movie Clip, а потом в функции rectOver(e:MouseEvent) пишем clip = e.target as Movie Clip; и тогда все свойства мувика Friend передаются переменно clip. Тогда бы можно было бы в цикле for создать Friend'у свойство и присвоить ему значение, например, e.xml.user[i].uid, а потом взять его при нажатии. И все было бы хорошо...
Но не работало. И, оттрэйсив e.target я обнаружил, что на него реагирует не мой мувик Friend, а текстовое поле Friend_txt ... тогда я написал код ниже. В нем все работает - на наедение на определенный пункт меняется цвет, на сведении - меняется обратно... но вот только как вытащить пресловутый e.xml.user[i].uid, который мне так нужен?... Сбился с ног искать ответ на этот вопрос.. Вроде бы что-то близкое к тому, что мне надо связано с currentTarget, только я пока не понимаю,что это. Объясните кому не жалко? Хэлпы читал, только все ранво не очень понятно. Если бы можно было бы через этот target, который я ловлю, отслеживать и не только сам таргет (то есть в данном случае текстовое поле), но и мувик, в котором он находится (то есть мувик Friend)?

ниже привожу код всего этого, как он выглядит сейчас:



Код AS3:

for(var i:int =0; i<e.xml..user.length(); i++) 
        {
        var Friend_txt:TextField = new TextField();
        var fmt2:TextFormat = new TextFormat();
            fmt2.size = 10
            fmt2.font = "Verdana";
            fmt2.indent = 10
        Friend_txt.defaultTextFormat = fmt2;
        Friend_txt.wordWrap = true;
        Friend_txt.selectable=false;
        Friend_txt.x=-0.5;
        Friend_txt.y=-0.5;
        Friend_txt.width = 248.7;
        Friend_txt.height = 19;
        Friend_txt.text = e.xml.user[i].uid
 
        var rectangle = new Friend();
        forScroll.scrollMov.addChild(rectangle);
        rectangle.x= 0;
        rectangle.y= i*18;
        rectangle.addChild(Friend_txt);
 
 
        var Ob:Object = new Object;
        Ob.UID2= e.xml.user[i].uid
        Ob = Friend_txt
        Ob.text = String(fioArray[i]);
        Ob.background = true;
        Ob.border = true;
        Ob.borderColor = 0xCCCCCC;
        Ob.backgroundColor = 0xFFFFFF;
        Ob.textColor = 0x000000;
        Ob.selectable=false;
 
 
 
        varDif=forScroll.masker.height-forScroll.scrollMov.height;
        Ob.addEventListener(MouseEvent.MOUSE_OVER, rectOver);
        Ob.addEventListener(MouseEvent.MOUSE_OUT, rectOut);
        Ob.addEventListener(MouseEvent.CLICK, rectClik);
        }
 
 
                                                function rectClik(e:MouseEvent):void
                                                        {
                                                                clip = e.target as Object;
                                                                toID.text= String(clip.UID2);
                                                                forScroll.visible=false;
 
                                                        }
 
                                                function rectOver(e:MouseEvent):void
                                                        {
 
 
                                                                var fmt3:TextFormat = new TextFormat();
                                                                fmt3.size = 11
                                                                fmt3.font = "Verdana";
                                                                fmt3.indent = 20
 
                                                                clip = e.target as Object;
                                                                clip.backgroundColor = 0xC0EFFF
                                                                clip.textColor = 0x306591
                                                                clip.setTextFormat(fmt3);
                                                        }
                                                function rectOut(e:MouseEvent):void
                                                        {
 
                                                                clip.backgroundColor = 0xFFFFFF;
                                                                clip.textColor = 0x000000;
                                                                clip.setTextFormat(fmt2);
                                                        }


udaaff 04.01.2010 23:11

DisplayObjectContainer#mouseChildren в помощь.

ZergMaster 06.01.2010 04:41

огроменное спасибо udaaff!=) Это работает так, что лучше и не придумаешь!)

Тогда ещё вопрос... немного по другой теме. Но все-таки. может быть есть какой-то способ отсортировать xml по какому-нибудь элементу? А то, во-первых, это неудобно - переводить его в массив, потом сортировать, а во вторых столкнулся с одной проблемой. Список юзеров то я отсортировал во имени-фамилии
Код AS3:

for(var u:int =0; u<e.xml..user.length(); u++) 
                {
                FIOstr = String(e.xml.user[u].first_name+" "+e.xml.user[u].last_name);
                fioArray.push(String(FIOstr));
                }
 
                fioArray.sort(Array.CASEINSENSITIVE);

только вот теперь когда я создаю мувико свойство и присваиваю ему значение IDшника юзера,
Код AS3:

rectangle.UID2= e.xml.user[i].uid

то получается, что id не соответствует фамилии. Можно было бы как-то впихнуть id в массив fioArray, только непонятно как, но было бы круче, если бы можно было бы сортировать xml по какому-нибудь элементу. Я что-то так и не нашел как это сделать.

gnus 06.01.2010 12:19

http://webdevotion.be/blog/2008/01/2...ist-using-e4x/

ZergMaster 06.01.2010 15:07

по ходу это под flex

Добавлено через 6 часов 20 минут
я нашел простое решение. Это сделать fioArray многоуровневым массивом. В итоге получается

Код AS3:

for(var u:int =0; u<e.xml..user.length(); u++) 
  {
  FIOstr = String(e.xml.user[u].first_name+" "+e.xml.user[u].last_name);
  fioArray.push([String(FIOstr), e.xml.user[u].uid]);
  }
 
fioArray.sort(Array.CASEINSENSITIVE);

таким образом

Код AS3:

rectangle.UID2= fioArray[i][0];
Friend_txt.text = fioArray[i][1];

всем спасибо за участие!


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

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