2009-09-15 64 views
5

我正在開發爲每個創建的MDI子窗體分配一個選項卡的MDI應用程序。我需要在主(父)表單代碼中「捕獲」子表單的OnActivate,OnCreate和OnDestroy事件。簡單地調用兒童形式的代碼對我來說是不可能的,因爲有很多形式的類被用作MDI兒童,插件也可以加載它自己的形式...德爾福MDI - 處理打開/關閉/激活子窗體

所以,我的問題是:如何捕捉MDI子窗體已被激活/取消激活未使用子窗體事件

回答

3

我寫了一堆年前一個任務欄類型的組件,不只是這種類型的東西。 它被稱爲TrmMDITaskbar。你可以在Torrys上找到它的副本,它是rmControls庫包的一部分。它處理激活的,最小化,最大化等

它的工作原理是,它掛鉤MDIParents窗口句柄尋找MDIChild事件並不會基於這些事件東西的要點。

如果你正在尋找寫自己的,我建議,作爲一個良好的開端。

Ryan。

P.S. Torrys上的版本有點舊,但仍然可以工作。我的支持網站上有更新的版本。 (Mills Enterprise

+0

謝謝。最後我用它代碼SpTBXLib魚鉤使用WH_CBT標誌... :) – migajek 2009-09-15 19:55:19

+0

喜瑞安,我心底喜歡嘗試該組件,但支持網站給了我一個錯誤403解決 - 禁止(您試圖訪問爲其文檔你沒有特權。) – 2010-07-24 08:32:13

+0

@Alin Sfetcu,我最近改變了我的託管服務,但還沒有得到我所有的鏈接和論壇重新安裝。說實話,我認爲我的支持論壇已經運作。我會盡快研究。對不起。正如我所說Torry網站的副本應該仍然有效。 – 2010-07-26 15:38:48

1

你總是可以掛鉤的事件從您的代碼在運行時「事後」。基本上,創建一個通用的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(和鏈接的對象)。