Форум: "Основная";
Текущий архив: 2002.12.09;
Скачать: [xml.tar.bz2];
ВнизMDI StatusBar и Application.OnHint Найти похожие ветки
← →
Andy78 (2002-11-27 16:35) [0]У меня есть 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 16:38) [1]1
← →
exit (2002-11-27 16:42) [2]
procedure TMainFrm.DisplayHint(Sender: TObject);
begin
StatusBar1.Panels[1].Text:= Application.Hint;
end;
← →
SuM@ga (2002-11-27 16:43) [3]У меня такая же проблема.
Помогите.
← →
Игорь Шевченко (2002-11-27 16:46) [4]
> ((ActiveMDIChild.Components[i] as TStatusBar).Owner.Name
> <> "MainFrm")
Это как понимать ? У ActiveMDIChild.Components[i] насколько я понимаю, Owner"ом должен быть сам ActiveMDIChild...
← →
Andy78 (2002-11-27 16:57) [5]((ActiveMDIChild.Components[i] as TStatusBar).Owner.Name
точно не то, забыл закоментировать во время экспериментов
← →
Andy78 (2002-11-27 17:00) [6]вот окончательный обработчик
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;
← →
Игорь Шевченко (2002-11-27 17:04) [7]А поподробнее можно рассказать, что, когда и где должно отображаться ?
← →
Игорь Шевченко (2002-11-27 17:07) [8]
> 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
← →
Andy78 (2002-11-27 17:09) [9]Нужно знать какая именно форма запрашивает вывод хинта : MDIForm или MDIChildFom.
← →
exit (2002-11-27 17:13) [10]То есть получается:
Если есть ActiveMDIChild, то на его статусе отображать Application.Hint, а если он (ActiveMDIChild) не Assigned, то показывать на Статусе MainFrm?
Я же написал уже:
procedure TMainFrm.DisplayHint(Sender: TObject);
begin
StatusBar1.Panels[1].Text:= Application.Hint;
end;
И все хинты рисуются только на статусе главной формы. Зачем так мудрить?
← →
Игорь Шевченко (2002-11-27 17:18) [11]
> Нужно знать какая именно форма запрашивает вывод хинта :
> MDIForm или MDIChildFom
Напишите у формы обработчик CM_HintShow
← →
Andy78 (2002-11-27 17:18) [12]Нет. Это я пробовал, не подходит.
← →
Andy78 (2002-11-27 17:20) [13]2 Игорь Шевченко
У каждой формы что ли ?
← →
Игорь Шевченко (2002-11-27 17:21) [14]Andy78 (27.11.02 17:20)
Если они не от общего предка - то у каждой...У TApplication свойство FHintControl находится в private :-(
← →
Andy78 (2002-11-27 17:28) [15]А может использовать позицию мыши. Как можно распознать где в данный момень находится мышь : на главной форме или на MDIChild ?
← →
Игорь Шевченко (2002-11-27 17:43) [16]Andy78 (27.11.02 17:28)
function FindVCLWindow(const Pos: TPoint): TWinControl;
← →
SuMaga (2002-11-27 18:17) [17]Игорь Шевченко © !!!
Саул !
← →
Andy78 (2002-11-27 18:22) [18]Прокатило !
Вот окончательный обработчик :
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;
← →
Andy78 (2002-11-27 18:37) [19]А еще лучше так :
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;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.12.09;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.008 c