![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
MDI StatusBar и Application.OnHint [D6, Win95/98, Win2k]
Andy78 © (2002-11-27 16:35:00)У меня есть MDI приложение. Я пишу свой обработчик Application.OnHint, который отображает хинт конпонентов в StatusBar"e главной формы(MDIForm). Когда открываю MDIChildForm, то хинты от главной формы также отображаются в StatusBar"e MDIChildForm. Мне нужно чтоб хинты от главной формы не отображаличь в MDIChild.
Вот код обработчика:
...
Application.OnHint:= DisplayHint;
...
procedure TMainFrm.DisplayHint(Sender: TObject);
var i: Integer;
begin
if Assigned(ActiveMDIChild) then
for i:= 0 to ActiveMDIChild.ComponentCount -1 do
if (ActiveMDIChild.Components[i] is TStatusBar) and
((ActiveMDIChild.Components[i] as TStatusBar).Owner.Name <> "MainFrm") then
(ActiveMDIChild.Components[i] as TStatusBar).Panels[0].Text:= GetLongHint(Application.Hint)
else
else
StatusBar1.Panels[1].Text:= GetLongHint(Application.Hint);//GetLongHint(Application.Hint)
end;
Andy78 (2002-11-27 18:37:00) [1]А еще лучше так :
procedure TMainFrm.DisplayHint(Sender: TObject);
var i: Integer;
P: TPoint;
begin
GetCursorPos(P);
if Assigned(ActiveMDIChild) then
for i:= 0 to ActiveMDIChild.ComponentCount -1 do
if (ActiveMDIChild.Components[i] is TStatusBar) then
if (FindVCLWindow(P).Owner.Name <> "MainFrm") then
(ActiveMDIChild.Components[i] as TStatusBar).Panels[0].Text:= GetLongHint(Application.Hint)
else
MainFrm.StatusBar1.Panels[1].Text:= GetLongHint(Application.Hint)
else
else
StatusBar1.Panels[1].Text:= GetLongHint(Application.Hint);
end;
Andy78 (2002-11-27 18:22:00) [2]Прокатило !
Вот окончательный обработчик :
procedure TMainFrm.DisplayHint(Sender: TObject);
var i: Integer;
P: TPoint;
begin
GetCursorPos(P);
if Assigned(ActiveMDIChild) then
for i:= 0 to ActiveMDIChild.ComponentCount -1 do
if (ActiveMDIChild.Components[i] is TStatusBar) and (FindVCLWindow(P).Owner.Name <> "MainFrm") then
(ActiveMDIChild.Components[i] as TStatusBar).Panels[0].Text:= GetLongHint(Application.Hint)
else
else
StatusBar1.Panels[1].Text:= GetLongHint(Application.Hint);
end;
SuMaga (2002-11-27 18:17:00) [3]Игорь Шевченко © !!!
Саул !
Игорь Шевченко (2002-11-27 17:43:00) [4]Andy78 (27.11.02 17:28)
function FindVCLWindow(const Pos: TPoint): TWinControl;
Andy78 (2002-11-27 17:28:00) [5]А может использовать позицию мыши. Как можно распознать где в данный момень находится мышь : на главной форме или на MDIChild ?
Игорь Шевченко (2002-11-27 17:21:00) [6]Andy78 (27.11.02 17:20)
Если они не от общего предка - то у каждой...У TApplication свойство FHintControl находится в private :-(
Andy78 (2002-11-27 17:20:00) [7]2 Игорь Шевченко
У каждой формы что ли ?
Andy78 (2002-11-27 17:18:00) [8]Нет. Это я пробовал, не подходит.
Игорь Шевченко (2002-11-27 17:18:00) [9]
> Нужно знать какая именно форма запрашивает вывод хинта :
> MDIForm или MDIChildFom
Напишите у формы обработчик CM_HintShow
exit (2002-11-27 17:13:00) [10]То есть получается:
Если есть ActiveMDIChild, то на его статусе отображать Application.Hint, а если он (ActiveMDIChild) не Assigned, то показывать на Статусе MainFrm?
Я же написал уже:
procedure TMainFrm.DisplayHint(Sender: TObject);
begin
StatusBar1.Panels[1].Text:= Application.Hint;
end;
И все хинты рисуются только на статусе главной формы. Зачем так мудрить?
Andy78 (2002-11-27 17:09:00) [11]Нужно знать какая именно форма запрашивает вывод хинта : MDIForm или MDIChildFom.
Игорь Шевченко (2002-11-27 17:07:00) [12]
> if Assigned(ActiveMDIChild) then
> for i:= 0 to ActiveMDIChild.ComponentCount -1 do
> if (ActiveMDIChild.Components[i] is TStatusBar) then
> (ActiveMDIChild.Components[i] as TStatusBar).Panels[0].Text:=
> GetLongHint(Application.Hint)
> else
> else
> StatusBar1.Panels[1].Text:= GetLongHint(Application.Hint);
В этом варианте любой Hint отображается в StatusBar MDIChild-формы, как и написано.
Если надо знать, кто запрашивает вывод hint"а, то прямой путь идти на обработку сообщения CM_HINTSHOW
Игорь Шевченко (2002-11-27 17:04:00) [13]А поподробнее можно рассказать, что, когда и где должно отображаться ?
Andy78 (2002-11-27 17:00:00) [14]вот окончательный обработчик
procedure TMainFrm.DisplayHint(Sender: TObject);
var i: Integer;
begin
if Assigned(ActiveMDIChild) then
for i:= 0 to ActiveMDIChild.ComponentCount -1 do
if (ActiveMDIChild.Components[i] is TStatusBar) then
(ActiveMDIChild.Components[i] as TStatusBar).Panels[0].Text:= GetLongHint(Application.Hint)
else
else
StatusBar1.Panels[1].Text:= GetLongHint(Application.Hint);
end;
Andy78 (2002-11-27 16:57:00) [15]((ActiveMDIChild.Components[i] as TStatusBar).Owner.Name
точно не то, забыл закоментировать во время экспериментов
Игорь Шевченко (2002-11-27 16:46:00) [16]
> ((ActiveMDIChild.Components[i] as TStatusBar).Owner.Name
> <> "MainFrm")
Это как понимать ? У ActiveMDIChild.Components[i] насколько я понимаю, Owner"ом должен быть сам ActiveMDIChild...
SuM@ga (2002-11-27 16:43:00) [17]У меня такая же проблема.
Помогите.
exit (2002-11-27 16:42:00) [18]
procedure TMainFrm.DisplayHint(Sender: TObject);
begin
StatusBar1.Panels[1].Text:= Application.Hint;
end;
Andy78 (2002-11-27 16:38:00) [19]1