Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.25;
Скачать: CL | DM;

Вниз

Чего-то с утра башка не варит:) Вообщем есть заполненный TreeView   Найти похожие ветки 

 
Song ©   (2002-04-15 09:49) [0]

И заполненный так, что итемы не убираются в клиентскую область. Надо задать свойство TopItem так, чтобы было видно последнюю ветвь. Итемы с подветвями, поэтому обычной разностью не вычислишь. Как делаю я:


Function FirstSubNodes(Tree:TTreeView):ShortInt;
Var Node:TTreeNode;
Begin
Result:=0;
Node:=Tree.Items[0];
With Tree Do
Repeat
try
Node:=Node.GetNextSibling;
Inc(Result);
except
Break;
end;
Until False;
End;

Procedure ItemToTop(Tree:TTreeView; Number:ShortInt);
Var t:Integer;
Node:TTreeNode;
Begin
Node:=Tree.Items[0];
t:=1;
With Tree Do
Repeat
try
IF t=Number then
Begin
TopItem:=Node;
Abort;
End;
Node:=Node.GetNextSibling;
Inc(t);
except
Break;
end;
Until False;
End;


Вызываю так:


...
IF TreeView1.Items.Count>0 then
Begin
Num:=FirstSubNodes(TreeView1);
IF Num>19 then ItemToTop(TreeView1,Num-18);
End;


После загрузки дерева, все ветви свёрнуты.
Сначала подсчитываю кол-во веток первого уровня, а потом нахожу в цикле (вторая процедура) ту ветку, которую нужно сделать в качестве TopItem, чтобы было видно последнюю ветвь.

Всё работает. Вопрос: как сделать оптимальней, по возможности без перебора, побыстрей. Может истина где-то здесь, но по причине того, что вчера был выходной, что-то она ко мне никак идти не хочет :)


 
MBo ©   (2002-04-15 09:59) [1]

а что-нибудь такое не подойдет?
treeview1.Selected:=treeview1.Items[treeview1.Items.count-1];


 
Song ©   (2002-04-15 10:08) [2]

Мне нужно выделить не последнюю ветвь, а последнюю ветвь первого уровня. т.е. если сделать как Вы посоветовали, то последняя ветвь развернётся (если она имеет детей)


 
Song ©   (2002-04-15 10:09) [3]

2MBo © (15.04.02 09:59)
Блин, сердце кровью обливается. :))) Неужели так нельзя?

With TreeView1 Do Selected:=Items[Items.Count-1];

:)


 
MBo ©   (2002-04-15 10:14) [4]

дык

var node:ttreenode;
begin
node:=treeview1.Items[treeview1.Items.count-1];
while node.parent<> nil do node:=node.parent;
treeview1.selected:=node;

или
for i:=0 to node.level-1 do node:=node.parent;


 
Song ©   (2002-04-15 10:21) [5]

Или так:


Procedure ItemToTop(Tree:TTreeView);
Var t:Integer;
Begin
With Tree Do
For t:=Items.Count-1 downto 0 Do
IF Items[t].Level=0 then
Begin
Select(Items[t]);
Break;
End;
End;


 
Song ©   (2002-04-15 10:22) [6]

Ага, спасибо, всё таки, истинна, действительно была где-то рядом. :)


 
Song ©   (2002-04-15 10:24) [7]

Кстати, присваивание свойству Selected ничего не даёт, почему-то. Пришлось метод Select() использовать.


 
MBo ©   (2002-04-15 13:14) [8]

У меня с Selected работает



Страницы: 1 вся ветка

Текущий архив: 2002.04.25;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.015 c
3-80829
Seri
2002-04-05 07:21
2002.04.25
Что за файлы DDP в Delphi 6?


3-80811
valievrf
2002-04-05 12:39
2002.04.25
информация по БД


3-80815
Jony
2002-04-04 17:20
2002.04.25
Некорректная работа DBNavigator.


1-80970
Jaxtor
2002-04-12 11:21
2002.04.25
Закрытие формы MDIChild программным методом


14-81069
Oleg_V
2002-03-19 05:45
2002.04.25
Братья програмеры помогите, как зделать форму с неровными краями!!???