Как да дефинирам обхват в 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; защитен < Защитени декларации > публични < Публични декларации > публикувани < Публикувани декларации > край;