Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.09.12;
Скачать: [xml.tar.bz2];

Вниз

Как в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.005 c
11-1196527644
Byka (345-824-826)
2007-12-01 19:47
2010.09.12
помогите с Lazarus?


15-1276625703
George
2010-06-15 22:15
2010.09.12
Импровизация


15-1276584640
Неокубинец
2010-06-15 10:50
2010.09.12
Автоматизированный загрузчик


2-1277059445
Delphist2
2010-06-20 22:44
2010.09.12
savedialog


15-1276585131
brother
2010-06-15 10:58
2010.09.12
Любителям zx-spectrumа: видео...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский