Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Компонент Tree и поиск в нём 2 (http://www.flasher.ru/forum/showthread.php?t=98163)

ARTur2 07.07.2007 18:40

Компонент Tree и поиск в нём 2
 
"Здравствуйте!
У меня есть что-то похожее на галерею. Использую флешевский пример, который находиться тут - диск/Program Files/Macromedia/Flash 8/Samples and Tutorials/Samples/ActionScript/Galleries , файл gallery_tree. Мне интересно узнать, можно в данный пример добавить поиск. Например, после введёного названия фотографии список развернулся бы и она выбралась автоматически... Если можно, то посоветуйте, пожалуйста, как это сделать?" - этот вопрос у меня был совсем недавно, но к сожалению никто на него не ответил. Иеперь мне нужно научиться
1. Научиться искать в XML.
2. Перехватить тот XML, в котором надо искать.
Может быть кто-нибудь знает, как это реализовать...

iNils 07.07.2007 21:43

Я знаю, что ваша тема тут и на другом форуме. Не много ли?

Накидал такой примитив (добавить после кода в примере), но поскольку я компонетами не пользуюсь, то возможно все еще проще, но мне лень вникать.
Код:

////
var o:Object = new Object ();
Key.addListener (o);
o.onKeyDown = function () {
        if (Selection.getFocus () == String (txt) && Key.isDown (Key.ENTER)) {
                var node:Array = treeDP_xml.firstChild.firstChild.childNodes;
                var str:String = txt.text;
                for (var i:Number = 0; i < node.length; i++) {
                        if (node[i].attributes.label == str || node[i].attributes.src == str) {
                                my_tree.setIsOpen (my_tree.getTreeNodeAt (0), true);
                                my_tree.selectedNode = my_tree.getTreeNodeAt (0).getTreeNodeAt (i);
                                treeListener.change ({target:my_tree});
                                break;
                        }
                }
        }
};
var txt:TextField = this.createTextField ("txt", this.getNextHighestDepth (), 300, 20, 200, 30);
txt.background = true;
txt.border = true;
txt.type = "input";
txt.text = "DCP_0732";


ARTur2 08.07.2007 15:16

Больщое Вам спасибо! Как оказалось всё на самом деле не так трудно, как я думал.

iNils 08.07.2007 16:10

Надо в хелп заглядывать чаще.

ARTur2 09.07.2007 15:17

2 iNils : у меня к Вам возник ещё один не большой вопрос.
Код:

var node:Array = treeDP_xml.firstChild.firstChild.childNodes;
как я понимаю, эта строка кода "загоняет" всё из XML-файла в масив. Всё отлично работает для макромедиевского примера. Но дело в том, что там, в примере, всего одна галерея. А как быть, если их несколько. Я уже совсем запутался в этих Child'ах...
Допустим, если я заменяю эту строку на
Код:

var node:Array = treeDP_xml.lastChild.lastChild.childNodes;
то для поиска доступна только последняя галерея.
Если так
Код:

var node:Array = treeDP_xml.firstChild.lastChild.childNodes;
то не работает вообще ничего... Так вот, вопрос заключается в том, как записать в масив весь XML-файл, если в нём не одна галерея, я n-штук?

iNils 09.07.2007 16:26

Допустим есть
Код:

<?xml version="1.0"?>
<tree>
        <node label="Gallery 1">
                <node label="DCP_0730" src="DCP_0730.jpg" />
                <node label="DCP_0731" src="DCP_0731.jpg" />
        </node>
        <node label="Gallery 2">
                <node label="DCP_0730" src="DCP_0730.jpg" />
                <node label="DCP_0731" src="DCP_0731.jpg" />
        </node>
</tree>

Тогда надо изменить строку опредялющую массив со списком картинок на
Код:

var node:Array = treeDP_xml.firstChild.childNodes[номер].childNodes;
Где номер - это номер нода задающий галерею, <node label="Gallery 1"> или <node label="Gallery 2">, причем отсечт идет от 0. Соответственно, вам нужно организовать цикл, чтобы обочти все галереи.

ARTur2 09.07.2007 17:03

Мой XML-файл выглядит так:
Код:

<?xml version="1.0"?>
<tree>
        <node label="Gallery 1">
                <node label="DCP_0730" src="DCP_0730.jpg" />
                <node label="DCP_0731" src="DCP_0731.jpg" />
        </node>
        <node label="Gallery 2">
                <node label="DCP_0732" src="DCP_0732.jpg" />
                <node label="DCP_0733" src="DCP_0733.jpg" />
        </node>
</tree>

по Вашему совету я поменял строку определяющую масив на следущее:
Код:

for ( var n:Number = 0; n<2 ; n++) {
                var node:Array = treeDP_xml.firstChild.childNodes[n].childNodes;
                trace(node);
                }

Trace показывает следущее:
Код:

<node label="DCP_0730" src="DCP_0730.jpg" />,<node label="DCP_0731" src="DCP_0731.jpg" />
<node label="DCP_0732" src="DCP_0732.jpg" />,<node label="DCP_0733" src="DCP_0733.jpg" />

Это ведь значит, что масив заполнен так, как нам надо. Но почему-то теперь поиск работает только для последней галереии. А разварачивает первую. Т.е. если искать "DCP_0732", покажет картинку для него, а "выбраной" в дереве будет DCP_0730.jpg. По первой же галереии поиск вообще не даёт ничего...

iNils 09.07.2007 17:19

Заменить часть кода на этот
Код:

if (Selection.getFocus () == String (txt) && Key.isDown (Key.ENTER)) {
        for (var j:Number = 0; j < treeDP_xml.firstChild.childNodes.length; j++) {
                var node:Array = treeDP_xml.firstChild.childNodes[j].childNodes;
                var str:String = txt.text;
                trace (j)
                for (var i:Number = 0; i < node.length; i++) {
                        if (node[i].attributes.label == str || node[i].attributes.src == str) {
                                my_tree.setIsOpen (my_tree.getTreeNodeAt (j), true);
                                my_tree.selectedNode = my_tree.getTreeNodeAt (j).getTreeNodeAt (i);
                                treeListener.change ({target:my_tree});
                                break;
                        }
                }
        }
};

и разобраться в своих ошибках

ARTur2 09.07.2007 17:37

Спасибо! Разобрался и более менее всё понял!
У меня ещё возник вопрос, просто на будущее. А если, допустим, в галерее 1, есть ещё галерея 3, в ней галерея 4 и т.д. То как тогда можно было бы организовать "обход" дерева?

iNils 09.07.2007 17:50

1. Разобраться что такое XML и как с ним работать во флеш. Можно прочитать тут http://www.artlebedev.ru/tools/techn...etc/flash-xml/
2. Зайти в поиск и поискать по словам дерево, xml*, обход и тому подобное.


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

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