2009-09-15 5 views
5

Sto sviluppando un'applicazione MDI che assegna una scheda per ogni figlio MDI creato. Ho bisogno di "catturare" gli eventi OnActivate, OnCreate e OnDestroy del modulo figlio nel codice del modulo principale (principale). Chiamare semplicemente il codice in forma di bambini è impossibile per me, dato che ci sono molte classi di form che sono usate come bambini MDI, anche il plugin può caricare il proprio modulo ...Delphi MDI - gestione apertura/chiusura/attivazione modulo figlio

Quindi, la mia domanda è: come catturarlo Il modulo figlio MDI è stato attivato/disattivato senza utilizzare gli eventi del modulo figlio?

risposta

3

Ho scritto un tipo di componente barra delle applicazioni un gruppo di anni fa che fa proprio questo tipo di cose. Si chiama TrmMDITaskbar. È possibile trovare una copia di esso su Torrys, è una parte del pacchetto della libreria rmControls. Gestisce l'attivazione, la minimizzazione, la massimizzazione, ecc.

L'essenza di come funziona è che aggancia l'handle di finestra di MDIParents alla ricerca di eventi MDIChild e fa cose basate su quegli eventi.

Se stai cercando di scriverne uno, suggerirei che sia un buon punto di partenza.

Ryan.

P.S. La versione su Torrys è un po 'più vecchia ma dovrebbe comunque funzionare. Ho una versione più recente disponibile sul mio sito web di supporto. (Mills Enterprise)

+0

grazie. finalmente l'ho risolto usando il codice di SpTBXLib che si aggancia usando il flag WH_CBT ... :) – migajek

+0

hi ryan, mi piacerebbe provare quel componente ma il sito di supporto mi dà un errore 403 - Proibito (hai provato ad accedere a un documento per il quale non hai i privilegi.) –

+0

@Alin Sfetcu, ho recentemente cambiato il mio servizio di hosting e devo ancora reinstallare tutti i miei link e forum. A dire il vero pensavo di avere già i forum di supporto funzionanti. Approfondirò il più presto possibile. Mi dispiace per il goof. Come ho affermato, la copia del sito Torry dovrebbe ancora funzionare. –

1

È sempre possibile collegare gli eventi "dopo il fatto" dal codice in fase di esecuzione. Fondamentalmente creare un OnActivate generico che sembra qualcosa di simile:

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; 

Quindi chiamare l'InitChildForm per impostare i gestori di eventi per le vostre versioni generiche a un certo punto del programma (molto probabilmente subito dopo aver creato il modulo). Ovviamente al termine della chiusura del modulo principale si desidera liberare le SavedEvents (e gli oggetti collegati).