Форум 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 (http://www.flasher.ru/forum/showthread.php?t=113925)

vikingcompany 13.07.2008 21:57

Высота компонента Tree
 
Динамически создаю компонент Tree, который заполняю данными.
При создании, задаю ему конкретный физический размер,
достаточный для работы с компонентом лишь в режиме
"хочешь развернуть одну ветку, будь любезен свернуть другую".
Если же развернуть все ветки, часть из них будет просто не видна :-(

Подскажите кто знает: можно ли динамически задавать размер (высоту) компонента Tree,
дабы все ветки оставались видны?

alexcon314 13.07.2008 22:44

У этого компонента есть VScrollPolicy-свойство, для случаев, когда содержимое не убирается в "окно" компонента.
А так - mytree.setSize(w, h) ;

vikingcompany 13.07.2008 23:00

Цитата:

Сообщение от alexcon314 (Сообщение 751885)
У этого компонента есть VScrollPolicy-свойство, для случаев, когда содержимое не убирается в "окно" компонента.

Это мне известно. Но я его специально скрыл - скроллер портит внешний вид.

Цитата:

Сообщение от alexcon314 (Сообщение 751885)
А так - mytree.setSize(w, h) ;

Именно так я и задаю размер изначально.
А вот как его изменить в соответствии с раскрытыми ветвями ... :umnik2:

alexcon314 14.07.2008 00:41

Извините, недопонял ваш вопрос в первом посте.
Собственно, что мешает вычислять высоту по количеству веток? Но, вообще как-то необычно - отказываться от вертикального скролла и менять размер компонента. потому и метода специально такого там нету.

vikingcompany 14.07.2008 10:17

А как именно узнать количество веток?

alexcon314 14.07.2008 12:09

Посчитать. Сделать обход по дереву с подсчетом нод.

vikingcompany 17.07.2008 10:31

Понял. Обход делаю так:
Код:

for (var i:Number = 0; i < 10; i++)
{
my_tree.selectedNode = my_tree.getTreeNodeAt(i);
trace (my_tree.getDisplayIndex(my_tree.selectedNode) + 1);
}

Это работает для заранее известного количества веток (в примере для 10-ти).
При меньшем количестве веток
my_tree.getDisplayIndex(my_tree.selectedNode) трейсится как "Nan".
Как правильно ввести ограничение, чтобы при Nan обход прекращался?

alexcon314 17.07.2008 14:25

Использовать while(){}

vikingcompany 17.07.2008 16:01

Это понятно.
А меня куда больше волнует условие:
если
Код:

while(my_tree.getDisplayIndex(my_tree.selectedNode) = none) {...}
ничего не работает :-(

vikingcompany 17.07.2008 21:30

Как правильно его сформировать?

vikingcompany 19.07.2008 08:49

Что ж, видно на мою тему все забили. Даже метры.
Посему отвечаю самому себе:
Код:

var i:Number = 1;
do
 {
 my_tree.selectedNode = my_tree.getTreeNodeAt(i);
 i++;
 }
while (i > my_tree.selectedIndex);
trace (i-1);

Данный алгоритм трейсит количесво веток в дереве.
Правда работает он пока только с закрытыми ветвями.

Если же перед алгоритмом вписать код на открытие какой-либо ветки, например
Код:

my_tree.setIsOpen(my_tree.getTreeNodeAt(0), true);
обход завершается раньше времени :-(
Почему так происходит - мне пока непонятно, но я попытаюсь разобраться.

Если моя мелочная проблема кого-нибудь заинтересует, буду рад помощи.

kutuzov 19.07.2008 20:06

лучше так конечно не делать, но зато работает
Код:

for (var k = 0; k<10; k++) {
        tree.addItem("qwe");
}
tree.doLater(this,"delay");
function delay() {
        while (tree.maxVPosition) {
                tree.setSize(tree.width, tree.height+1);
        }
}


vikingcompany 19.07.2008 21:46

Спасибо конечно, но не совсем понятно, что этот алгоритм должен делать.
У меня он просто создал 10 новых ветвей в дополнение к моим имеющимся :-(

Передо мной же стоит задача написать аглоритм, изменяющий размеры Tree
в зависимости от открытия/закрытия веток.
alexcon314 предложил сделать это, вычислив количество веток дерева.
Над этой подзадачей я сейчас и бьюсь. Выше я приводил свои наработки.
Тот алгоритм таки трейсил количество веток, но только если все они закрыты.
Я тут придумал ещё кое что:
Код:

var i:Number = 0;
do
 {
 i++;
 my_tree.selectedIndex = i;
 trace (my_tree.getDisplayIndex(my_tree.selectedNode));
 }
while (i < 10)

Этот алгоритм работает как с открытыми, так и с закрытыми ветвями,
и трейсит индекс выделенной ветви при каждом проходе.
Количество проходов я задаю сам, числом в условии while (i < 10).
Однако при количестве веток меньшем этого числа (10),
одно и тоже число трейсится несколько раз (до i=10).

Сейчас меня интересует только одно:
как правильно сформировать условие, чтобы при i > количества веток
обход прерывался.

kutuzov 19.07.2008 22:14

ваш вопрос был в том, как при раскрытии ветки в tree увеличить высоту tree так, чтобы были видны все пункты tree (если не так, то поясните точнее)

мой пример кода увеличивает высоту tree до тех пор пока tree.maxVPosition станет равен нулю, когда это произойдет значит в tree листать нечего, раз нечего листать значит показаны все пункты tree

Wolsh 19.07.2008 23:18

Просто уберите из алгоритма kutuzovа кусок про 10 строчек :)

vikingcompany 20.07.2008 00:08

Цитата:

Сообщение от kutuzov (Сообщение 753135)
мой пример кода увеличивает высоту tree до тех пор пока tree.maxVPosition станет равен нулю, когда это произойдет значит в tree листать нечего, раз нечего листать значит показаны все пункты tree

Интересно, интересно ... Ща попробую.
А для корректной работы этого алгоритма vScrollPolicy должно быть "off" или "on"?
А то вертикальный скроллер у меня скрыт...

kutuzov 20.07.2008 00:33

Цитата:

Сообщение от vikingcompany (Сообщение 753152)
А для корректной работы этого алгоритма vScrollPolicy должно быть "off" или "on"?

есть только один способ узнать наверняка (с) kutuzov

ещё для оптимизации времени работы можешь сначала прибавлять по 10 пикселей, потом вычесть 10 и прибавлять уже по одному пикселю

vikingcompany 21.07.2008 10:36

Должен признать: да, действительно - Вы нашли очень оригинальное решение.
Такой параметр как maxVPosition - просто отличный критерий.
Я внедрил его в функцию открытия ветви по клику. Привожу фрагмент кода:
Код:

function ClickToOpen()
        {
        this.setIsOpen(this.selectedNode,!(this.getIsOpen(this.selectedNode)));
        this.vScrollPolicy = "on";
        this.setSize(this.width, 0);
       
        do {this.setSize(this.width, this.height + 1)}
        while (this.maxVPosition);       

        this.vScrollPolicy = "off";
        }
this.addEventListener("change", ClickToOpen);

Однако скорость работы Вашего решения оставляет желать лучшего :-(
Наряду с ним, я закончил другой алгоритм:
Код:

function ClickToOpen()
        {
var i:Number = 0;
do
 {
 i++;
this.selectedIndex = i;
 }
while (i < 100);
this.setSize(spesifications.width, (this.getDisplayIndex(this.selectedNode) + 1) * 23);       
        };
this.addEventListener("change", ClickToOpen);

Работает намного быстрее.
Число проходов 100 - произвольное и на скорость работы не влияет.
Коэффициент 23 нашёл методом подбора, для шрифта по умолчанию наиболее оптимальный.


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

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