2009-09-15 10 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).

Problemi correlati