Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо