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

Вниз

Компонент Treeview   Найти похожие ветки 

 
Хам   (2006-08-22 13:50) [0]

Как в компоненте Treeview в зависимости от того на какую ветку подведён курсор, выводилась нужная подсказка ?


 
Ega23 ©   (2006-08-22 14:03) [1]

Гы.. Кто из мастеров подсказал - не помню. По крайней мере авторство не моё.



procedure TCustomKdrDBTreeView.TVMouseMove(Sender: TObject;
 Shift: TShiftState; X, Y: Integer);
var
Node : TTreeNode;
HintText:String;
begin
 if (@FTVMouseMove<>nil) then FTVMouseMove(Sender, Shift, X, Y);
 if (ShowHint) and (FHintField<>"") then
  begin
   Node := GetNodeAt(X, Y);
   if Node<>nil then
    begin
     HintText:=TKdrDBTreeViewItemIdent(Node.Data).HintFieldValue;
     if (HintText<>"") and (Self.Hint<>HintText) then
      begin
       Self.Hint:=HintText;
       Application.CancelHint;
      end;
    end;

  end;
end;


 
Хам   (2006-08-23 10:10) [2]

Что то у меня не получаеться ((
Сделал пока вот так

procedure TMainForm.OtdelTreeViewMouseMove(Sender: TObject;
 Shift: TShiftState; X, Y: Integer);
var
 node:TTreeNode;
 HintText:String;
begin
   Node := OtdelTreeView.GetNodeAt(X, Y);
   if (node <> nil)  then begin
     if OtdelTreeView.Hint<>PsubUnit(node.data)^.full_name_unit then begin
       OtdelTreeView.Hint:=PsubUnit(node.data)^.full_name_unit;
       node:=nil;
     end;
   end;
end;

На даный момент хинт меняеться только если курсор выйдет за пределы treeview а потом сново войдёт в облость. Если перемещать курсор внутри treeview , то хинт не меняеться (

Мне вот ещё не понятно назначение вот этой строчки
if (@FTVMouseMove<>nil) then FTVMouseMove(Sender, Shift, X, Y);


 
Ega23 ©   (2006-08-23 10:14) [3]


> if (@FTVMouseMove<>nil) then FTVMouseMove(Sender, Shift,
>  X, Y);


Это у меня собственный компонент, внутри которого идёт обработка MouseMove. Но пользователь тоже может что-то своё на MouseMove повесить. Вот эта строчка, фактически, проверяет, есть ли пользовательский обработчик MouseMove, и если есть - его выполняет.


>  node:=nil;


А ЭТО ЗАЧЕМ?????


 
Наиль ©   (2006-08-23 10:18) [4]

Проверяй изменилась ли ветка дерева, если изменилась, то вызывай Application.ShowHint:=true. Если вызывать без проверки, то будет мерцание.
Для большей надёжности изучи Application.SetShowHint, и сделай аналог под себя.


 
Хам   (2006-08-23 10:22) [5]

>  node:=nil;
> А ЭТО ЗАЧЕМ?????

Если без этой строчки то абсолютно ничего не меняеться, прога работает так же


 
Жуков Олег   (2006-08-23 10:36) [6]


>если изменилась, то вызывай Application.ShowHint:=true

Наверно Application.CancelHint всё-таки логичнее будет. ShowHint может быть уже задействовано по назначению.


> эта строчка, фактически, проверяет, есть ли пользовательский
> обработчик MouseMove, и если есть - его выполняет.

Не понятно зачем. Есть виртуальный MouseMove в котором уже есть. Чтобы вызвался пользовательский обработчик достаточно в перекрытом MouseMove вызвать inherited;


 
Хам   (2006-08-23 10:42) [7]

Application.CancelHint Вот это помогло
Ещё один вопрос , а как сделать многострочный хинт ? Если значение я присваиваю динамичиски ?


 
Жуков Олег   (2006-08-23 10:48) [8]

Hint := "Line1" + #13#10 + "Line2" + #13#10 + "Line3";?


 
Хам   (2006-08-23 10:56) [9]

Угу спасибо за помощь )))


 
Наиль ©   (2006-08-23 10:58) [10]


> ShowHint может быть уже задействовано по назначению.
С хинтами давно не работал. Про CancelHint, если и знал, то забыл. Поэтому и рекомендовал реализовать собственный SetShowHint (что, как выяснилось, в принципе не верно).

> Ещё один вопрос , а как сделать многострочный хинт ? Если
> значение я присваиваю динамичиски ?

Можно организовать для хинта расширеную функциональность, следующим образом:
unit Unit4;

interface
uses Controls, Forms;
type
MyHint=class(THintWindow)
 // Своя реализация
end;
implementation

initialization
HintWindowClass:=MyHint;
end.


 
Ega23 ©   (2006-08-23 11:37) [11]


> Не понятно зачем. Есть виртуальный MouseMove в котором уже
> есть. Чтобы вызвался пользовательский обработчик достаточно
> в перекрытом MouseMove вызвать inherited;


А зачем? Завёл поле, типа TNotifyEvent, а дальше переназначил свой обработчик.



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

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

Наверх




Память: 0.49 MB
Время: 0.061 c
15-1158000666
AntiUser
2006-09-11 22:51
2006.10.01
Сортировка и ORDER BY


2-1158161232
greengeneral
2006-09-13 19:27
2006.10.01
нажатие Buton


2-1158044547
nstur
2006-09-12 11:02
2006.10.01
Как убрать программу с панели задач


2-1158138732
Sirus
2006-09-13 13:12
2006.10.01
Очистка DBGRID-а


3-1153897920
Zouch
2006-07-26 11:12
2006.10.01
Диалог на подключение к БД