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

Вниз

Как в TreeView определить область видимости   Найти похожие ветки 

 
HRustBB   (2010-05-26 00:47) [0]

Имеется TreeView, подскажите пожалуйсто как можно определить какие ноды при перемещении скрола видны в клиентской области, какие выше, а какие ниже


 
MBo ©   (2010-05-26 08:17) [1]

Для верхнего в окошке есть специальное свойство TTreeView
Нижележащие, видимо, придется проверять.


 
MsGuns ©   (2010-05-26 09:53) [2]

TTreeNode.visible


 
HRustBB   (2010-05-26 16:10) [3]


> MsGuns ©   (26.05.10 09:53) [2]
> TTreeNode.visible


Вы уверены?


 
HRustBB   (2010-05-26 18:41) [4]


> MBo ©   (26.05.10 08:17) [1]
> Для верхнего в окошке есть специальное свойство TTreeView
> Нижележащие, видимо, придется проверять.


Вот вот, а как проверить то?


 
Юрий Зотов ©   (2010-05-26 23:36) [5]


> HRustBB   (26.05.10 18:41) [4]

Берем TopItem, от него в цикле идем вниз по узлам (GetNextSibling) до тех пор, пока IsVisible не вернет False.


 
Юрий Зотов ©   (2010-05-27 00:48) [6]

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


 
Германн ©   (2010-05-27 01:46) [7]


> берем последний видимый (предыдущий) и применяем тот же
> алгоритм к его дочерним узлам - и т.д., пока не будет найден
> последний видимый узел произвольного уровня.

Так это ж РЕКУРСИЯ! Страшно! :)


 
Германн ©   (2010-05-27 02:03) [8]

И к тому же не понятно для чего нужен сам сабж? Задача Z, как почти всегда, не озвучена.


 
MsGuns ©   (2010-05-27 09:00) [9]

>HRustBB   (26.05.10 16:10) [3]
>Вы уверены?

Уверен, что в качестве подсказки в дополнению к [1] вполне достаточно, чтобы разобраться самостоятельно

>Германн ©   (27.05.10 01:46) [7]
>Так это ж РЕКУРСИЯ! Страшно! :)

 :) Разве что для автора
На самом деле ничего страшного, т.к. рекурсия обрывается на первом невидимом узле - ЮЗ все написал :)


 
HRustBB   (2010-05-28 13:05) [10]

IsVisible – Свойство только для чтения. Индицирует, виден ли данный Node в данный момент или нет. Если Node видимый, свойство IsVisible равно True, в противном случае равно False. При этом Node считается видимым, если он не имеет родительских Node, или же если его родительские Node всех уровней находятся в развёрнутом состоянии, т.е. если в принципе данный Node можно видеть на экране – не важно виден ли он в действительности или нет, т.е. к примеру, если дерево TTreeView имеет полосу прокрутки, и эта полоса прокрутки установлена таким образом, что данный Node находится за приделами окна TTreeView, но все родительские Node этого Node развёрнуты, он всё равно считается видимым. (c) не мое

Все это нужно мне чтобы сделать коечто похожее на окно "схема данных" в MSAccess. Нужно выяснить какие ноды видны и нарисовать от низ линии связи к другим окошкам.


 
Jeer ©   (2010-05-28 14:33) [11]


> Все это нужно мне чтобы сделать коечто похожее на окно "схема
> данных" в MSAccess. Нужно выяснить какие ноды видны и нарисовать
> от низ линии связи к другим окошкам.


Бредом не надо заниматься и все будет пучком.

Ну, попробуй двуручную пилу использовать в качестве своей зубочистки.


 
12 ©   (2010-05-28 14:37) [12]

т.е. лучше одноручную? :)


 
HRustBB   (2010-05-28 14:54) [13]


> Бредом не надо заниматься и все будет пучком


Не, ну бред, не бред это вопрос другой. Как ноды видимые то найти?


 
12 ©   (2010-05-28 15:11) [14]

есть идея посчитать пикселы между нодами, когда они развернуты
и сравнить с размерами компонента


 
HRustBB   (2010-05-28 15:27) [15]


> есть идея посчитать пикселы между нодами, когда они развернуты
>
> и сравнить с размерами компонента


мм, думал об этом тоже, но хотел найти более изящное решение, придется наверно так и сделать.


 
HRustBB   (2010-05-28 15:29) [16]

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


 
MBo ©   (2010-05-28 15:59) [17]

>Как ноды видимые то найти?
В справке по TTreeNode покопаться


 
12 ©   (2010-05-28 16:13) [18]

еще мысль, хэндл взять и Винду поспрашивать, видит ли она это окно


 
MBo ©   (2010-05-28 16:14) [19]

TTreeNode.DisplayRect


 
12 ©   (2010-05-28 16:22) [20]


> TTreeNode.DisplayRect

тоже нашел :)


 
Юрий Зотов ©   (2010-05-28 16:52) [21]

См. TreeView_GetItemRect


 
HRustBB   (2010-06-20 02:20) [22]


unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ComCtrls;

type
 TForm1 = class(TForm)
   TreeView1: TTreeView;
 private
   { Private declarations }
   procedure OnScroll(var Msg: TWMVScroll); message WM_VScroll;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

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

end.


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


 
Германн ©   (2010-06-20 02:42) [23]

А что у TTreeView  нет событий скроллинга?
Во- первых бред.
Во-вторых - нежелание читать учебники.
В-третьих - "чукча не читатель". А ведь не так давно были на форуме схожие вопросы.


 
KilkennyCat ©   (2010-06-20 03:34) [24]


> чтобы процедура OnScroll вызывалась при скроллинге TreeView1

добавь  

procedure WMHScroll(var Message: TWMHScroll); message WM_HSCROLL;
procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL;


 
KilkennyCat ©   (2010-06-20 03:39) [25]


> Германн ©   (20.06.10 02:42) [23]
>
> А что у TTreeView  нет событий скроллинга?

неа. да и не нужны особо.


 
HRustBB   (2010-06-20 15:31) [26]


> Германн ©   (20.06.10 02:42) [23]


Почитал бы сам какие есть события у TreeView, а каких нет, или чукча не читатель?


> KilkennyCat ©   (20.06.10 03:34) [24]
> > чтобы процедура OnScroll вызывалась при скроллинге TreeView1добавь
>  procedure WMHScroll(var Message: TWMHScroll); message WM_HSCROLL;
> procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL;
>


А куда добавить то?


 
KilkennyCat ©   (2010-06-20 19:25) [27]


> А куда добавить то?

Ну а куда надо-то? К Дереву? Значит, к нему.
пишешь:
type TMyScrollEventnutyTreeView = class(TTreeView)
private
 procedure WMHScroll(var Message: TWMHScroll); message WM_HSCROLL;      
 procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL;
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
end;


параметры тут : http://msdn.microsoft.com/en-us/library/bb787577%28VS.85%29.aspx



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

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

Наверх




Память: 0.53 MB
Время: 0.01 c
2-1274947026
Dzmitry
2010-05-27 11:57
2010.09.12
A call to an OS function failed


15-1276723981
KilkennyCat
2010-06-17 01:33
2010.09.12
Грамотный перевод AutoExpand?


2-1276664021
Delphist2
2010-06-16 08:53
2010.09.12
текст в ячейке excel


15-1276348839
Дмитрий С
2010-06-12 17:20
2010.09.12
Помогите рассчитать сопротивление.


15-1276546519
xayam
2010-06-15 00:15
2010.09.12
Задача для математиков и/или программистов