我正在開發爲每個創建的MDI子窗體分配一個選項卡的MDI應用程序。我需要在主(父)表單代碼中「捕獲」子表單的OnActivate,OnCreate和OnDestroy事件。簡單地調用兒童形式的代碼對我來說是不可能的,因爲有很多形式的類被用作MDI兒童,插件也可以加載它自己的形式...德爾福MDI - 處理打開/關閉/激活子窗體
所以,我的問題是:如何捕捉MDI子窗體已被激活/取消激活未使用子窗體事件?
我正在開發爲每個創建的MDI子窗體分配一個選項卡的MDI應用程序。我需要在主(父)表單代碼中「捕獲」子表單的OnActivate,OnCreate和OnDestroy事件。簡單地調用兒童形式的代碼對我來說是不可能的,因爲有很多形式的類被用作MDI兒童,插件也可以加載它自己的形式...德爾福MDI - 處理打開/關閉/激活子窗體
所以,我的問題是:如何捕捉MDI子窗體已被激活/取消激活未使用子窗體事件?
我寫了一堆年前一個任務欄類型的組件,不只是這種類型的東西。 它被稱爲TrmMDITaskbar。你可以在Torrys上找到它的副本,它是rmControls庫包的一部分。它處理激活的,最小化,最大化等
它的工作原理是,它掛鉤MDIParents窗口句柄尋找MDIChild事件並不會基於這些事件東西的要點。
如果你正在尋找寫自己的,我建議,作爲一個良好的開端。
Ryan。
P.S. Torrys上的版本有點舊,但仍然可以工作。我的支持網站上有更新的版本。 (Mills Enterprise)
你總是可以掛鉤的事件從您的代碼在運行時「事後」。基本上,創建一個通用的OnActivate看起來是這樣的:
type
TEventHolder = class
private
FSFActivate: TNotifyEvent;
published
property SavedFormActivate : TNotifyEvent
read FSFActivate write fSFActivate;
end;
type
TMainForm = class(Tform)
:
SavedEvents : tStringList;
procedure ChildFormActivate(Sender: TObject);
procedure InitChildForm(MdiForm:TForm);
end;
procedure TMainForm.ChildFormActivate(Sender: TObject);
var
i : integer;
begin
// your special processing here this is called for the child form.
i := SavedEvents.IndexOf(ClassName);
if i <> -1 then
tEventHolder(SavedEvents.Objects[i]).SavedFormActivate(Sender);
end;
procedure TMainForm.InitChildForm(MdiForm:TForm);
var
OrigEvents : TEventHolder;
begin
if not Assigned(SavedEvents) then
SavedEvents := tSTringlist.create;
if Assigned(MdiForm.OnActivate) then
begin
OrigEvents := tEventHolder.create;
OrigEvents.SavedFormActivate := MdiForm.OnActivate;
SavedEvents.AddObject(MdiForm.ClassName,OrigEvents);
end;
MdiForm.OnActivate := ChildFormActivate;
end;
然後調用InitChildForm在你的程序的一些點設置事件處理程序應用到仿製藥(最有可能對你創建表單後)。當然,在主窗體關閉時,您將需要釋放SavedEvents(和鏈接的對象)。
謝謝。最後我用它代碼SpTBXLib魚鉤使用WH_CBT標誌... :) – migajek 2009-09-15 19:55:19
喜瑞安,我心底喜歡嘗試該組件,但支持網站給了我一個錯誤403解決 - 禁止(您試圖訪問爲其文檔你沒有特權。) – 2010-07-24 08:32:13
@Alin Sfetcu,我最近改變了我的託管服務,但還沒有得到我所有的鏈接和論壇重新安裝。說實話,我認爲我的支持論壇已經運作。我會盡快研究。對不起。正如我所說Torry網站的副本應該仍然有效。 – 2010-07-26 15:38:48