Как да дефинирам обхват в TreeView

Има TreeView, моля, кажете ми как можете да определите кои възли се виждат в клиентската зона при преместване на скрола, кои са по-високи и кои по-ниски

За горния прозорец има специално свойство TTreeView .Основните очевидно ще трябва да бъдат проверени.

И така, как го проверявате?

> HRustBB (26.05.10 18:41) [4]Взимаме TopItem, от него преминаваме надолу през възлите (GetNextSibling), докато IsVisible върне False.

Можете да добавите: веднага след като предишният алгоритъм работи (бе намерен невидим възел от 0-то ниво, ние вземаме последния видим (предишен) и прилагаме същия алгоритъм към неговите дъщерни възли - и така нататък, докато се намери последният видим възел на произволно ниво.

> вземете последния видим (предишен) и приложете същото > алгоритъм към неговите дъщерни възли - и така нататък до > последният видим възел на произволно ниво.Така че това е РЕКУРСИЯ! Страшен! :)

И освен това не е ясно защо е необходим самият предмет? Задача Z, както почти винаги, не се обявява.

>HRustBB (05/26/10 16:10) [3] >Сигурен ли си?

Сигурен съм, че като подсказка в допълнение към [1] е напълно достатъчно да го разберете сами

IsVisible – свойство само за четене. Показва дали дадения възел е видим в момента или не. Ако възелът е видим, свойството IsVisible е True, в противен случай е False. В същото време възелът се счита за видим, ако няма родителски възли или ако неговите родителски възли на всички нива са в разширено състояние, т.е. ако по принцип този възел може да се види на екрана -няма значение дали действително се вижда или не, т.е. например, ако дървото на TTreeView има лента за превъртане и тази лента за превъртане е настроена напо такъв начин, че даденият възел е извън прозореца на TTreeView, но всички родителски възли на този възел са разширени, той все още се счита за видим. (в) не е мое

Всичко това ми е необходимо, за да направя нещо подобно на прозореца "data schema" в MSaccess. Трябва да разберете кои възли са видими и да рисувате от дъното на линията на връзката към други прозорци.

> Имам нужда от всичко това, за да направя нещо подобно на прозореца "schema > data" в MSAccess. Трябва да разберем кои възли са видими и да начертаем > от долната връзка към други прозорци.

Няма нужда да се занимавате с глупости и всичко ще е куп.

Е, опитайте да използвате трион с две ръце като клечка за зъби.

> Не е нужно да се занимавате с глупости и всичко ще бъде на куп

Не, ами глупости, не глупости е друг въпрос. Как да намерите видими възли?

има идея да се броят пикселите между възлите, когато са разширени и да се сравняват с размерите на компонента

> има идея да се броят пикселите между възлите, когато са разширени > > и сравнете с размерите на компонента

хм, помислих и за това, но исках да намеря по-елегантно решение, вероятно ще трябва да го направя.

А какво ще кажете за трион с една ръка, може би има готови компоненти, които решават такива проблеми? (въпрос за всеки случай :)

>Как мога да намеря видими възли? Разровете се в помощта за TTreeNode

друга мисъл, вземете дръжката и попитайте Уинду дали вижда този прозорец

използва Windows, Съобщения, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls;

тип TForm1 = клас(TForm) TreeView1: TTreeView; частен < Лични декларации > procedure OnScroll(var Msg: TWMVScroll); съобщение WM_VScroll; публичен < Публични декларации > край;

var Form1:TForm1;

procedure TForm1.OnScroll(var Msg: TWMVScroll); var hnd:HWND; tr:TRect; begin tr:=TreeView1.selected.DisplayRect(false); form1.Caption:=Inttostr(tr.Top); end;

тук процедурата OnScroll възниква, когато формулярът получи съобщение TWMVScroll. И как мога да накарам съобщението да хваща TreeView1, тоест процедурата OnScroll да се извиква, когато TreeView1 превърта, а не прозореца на приложението?

> така че процедурата OnScroll да се извиква, когато TreeView1превърта, добавете

процедура WMHScroll(променливо съобщение: TWMHScroll); съобщение WM_HSCROLL; процедура WMVScroll(променливо съобщение: TWMVScroll); съобщение WM_VSCROLL;

Ти би ли прочел сам какви събития има TreeView и кои не, или Чукчи не е четец?

Къде да добавя това?

> И къде да добавя това?Е, къде ти трябва нещо? Към Дървото? И така, към него. пишете: тип TMyScrollEventnutyTreeView = class(TTreeView) private procedure WMHScroll(var Message: TWMHScroll); съобщение WM_HSCROLL; процедура WMVScroll(променливо съобщение: TWMVScroll); съобщение WM_VSCROLL; защитен < Защитени декларации > публични < Публични декларации > публикувани < Публикувани декларации > край;