Вход

Просмотр полной версии : Высота компонента Tree


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

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

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

vikingcompany
13.07.2008, 23:00
У этого компонента есть VScrollPolicy-свойство, для случаев, когда содержимое не убирается в "окно" компонента.
Это мне известно. Но я его специально скрыл - скроллер портит внешний вид.

А так - 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
мой пример кода увеличивает высоту tree до тех пор пока tree.maxVPosition станет равен нулю, когда это произойдет значит в tree листать нечего, раз нечего листать значит показаны все пункты tree
Интересно, интересно ... Ща попробую.
А для корректной работы этого алгоритма vScrollPolicy должно быть "off" или "on"?
А то вертикальный скроллер у меня скрыт...

kutuzov
20.07.2008, 00:33
А для корректной работы этого алгоритма 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 нашёл методом подбора, для шрифта по умолчанию наиболее оптимальный.