PDA

Просмотр полной версии : Компонент Tree и поиск в нём 2


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

iNils
07.07.2007, 21:43
Я знаю, что ваша тема тут (http://www.flasher.ru/forum/showthread.php?t=98057) и на другом форуме (http://www.flash-mx.ru/forum/topic_show.pl?tid=1982). Не много ли?

Накидал такой примитив (добавить после кода в примере), но поскольку я компонетами не пользуюсь, то возможно все еще проще, но мне лень вникать.
////
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/technogrette/etc/flash-xml/
2. Зайти в поиск и поискать по словам дерево, xml*, обход и тому подобное.