2009-09-15 23 views
5

Ich entwickle MDI-Anwendung, die eine Registerkarte für jedes erstellte MDI-Kind zuweist. Ich muss OnActivate, OnCreate und OnDestroy Ereignisse des untergeordneten Formulars im Hauptformularcode abfangen. Einfach den Code in Kinderform aufzurufen, ist für mich unmöglich, da es viele Formklassen gibt, die als MDI-Kinder verwendet werden können. Auch das Plugin kann sein eigenes Formular laden ...Delphi MDI - Handhabung öffnen/schließen/aktivieren untergeordnetes Formular

Also meine Frage ist: wie man das fängt Das MDI-Unterformular wurde aktiviert/deaktiviert , ohne die Ereignisse des untergeordneten Formulars zu verwenden?

Antwort

3

Ich schrieb einen Taskbar-Typ der Komponente vor ein paar Jahren, die genau diese Art von Sache macht. Es heißt TrmMDITaskbar. Sie können eine Kopie davon auf Torrys finden, es ist ein Teil des Bibliothekspakets rmControls. Es behandelt Aktivierung, Minimierung, Maximierung usw.

Der Kern davon, wie es funktioniert, ist, dass es die MDIParents-Fenstergriff hooking auf der Suche nach MDIChild Ereignisse und macht Sachen basierend auf diesen Ereignissen.

Wenn Sie schauen, um Ihre eigenen zu schreiben, würde ich vorschlagen, dass als ein guter Ort zu beginnen.

Ryan.

P.S. Die Version auf Torrys ist etwas älter, sollte aber noch funktionieren. Ich habe eine neuere Version auf meiner Support-Website verfügbar. (Mills Enterprise)

+0

danke. Schließlich löste ich es mit Code aus SpTBXLib, die Hooks mit WH_CBT Flag ... :) – migajek

+0

Hallo Ryan, ich werde gerne diese Komponente versuchen, aber die Support-Website gibt mir einen Fehler 403 - Forbidden (Sie haben versucht, auf ein Dokument zuzugreifen, für die Sie haben keine Privilegien.) –

+0

@Alin Sfetcu, Ich habe vor kurzem meinen Hosting-Service geändert und muss noch alle meine Links und Foren neu installiert bekommen. Um ehrlich zu sein, dachte ich, ich hätte die Support-Foren bereits in Betrieb. Ich werde das so schnell wie möglich prüfen. Entschuldigung für den Blödsinn. Wie ich schon sagte, sollte die Torry-Site-Kopie noch funktionieren. –

1

Sie können die Ereignisse "nach der Tat" immer von Ihrem Code zur Laufzeit hängen. Im Grunde erstellen Sie eine generische OnActivate, die etwa wie folgt aussieht:

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; 

dann die InitChildForm rufen die Event-Handler zu Ihrem generischen Versionen an einem gewissen Punkt in Ihrem Programm (höchstwahrscheinlich Recht, nachdem Sie das Formular erstellen) einzustellen. Natürlich werden Sie nach dem Schließen des Hauptformulars die SavedEvents (und verknüpfte Objekte) freigeben wollen.

Verwandte Themen