Delphi MDI - gestione apri / chiudi / attiva modulo figlio
-
07-07-2019 - |
Domanda
Sto sviluppando un'applicazione MDI che assegna una scheda per ogni figlio MDI creato. Devo " catturare " Eventi OnActivate, OnCreate e OnDestroy del modulo figlio nel codice del modulo principale (padre). È semplicemente impossibile chiamare il codice in forma di figlio, poiché ci sono molte classi di moduli che vengono utilizzate come figli MDI, inoltre il plugin può caricare il suo modulo ...
Quindi, la mia domanda è: come catturare quel modulo figlio MDI è stato attivato / disattivato senza usare gli eventi del modulo figlio ?
Soluzione
Ho scritto un componente della barra delle applicazioni un gruppo di anni fa che fa proprio questo tipo di cose. Si chiama TrmMDITaskbar. Puoi trovarne una copia su Torrys , fa parte del pacchetto della libreria rmControls. Gestisce l'attivazione, la riduzione, la massimizzazione ecc.
L'essenza di come funziona è che aggancia la maniglia della finestra di MDIParents alla ricerca di eventi MDIChild e fa cose basate su quegli eventi.
Se stai cercando di scrivere il tuo, lo suggerirei come un buon punto di partenza.
Ryan.
P.S. La versione su Torrys è un po 'più vecchia ma dovrebbe ancora funzionare. Ho una versione più recente disponibile sul mio sito Web di supporto. ( Mills Enterprise )
Altri suggerimenti
Puoi sempre agganciare gli eventi "dopo il fatto" dal tuo codice in fase di esecuzione. Fondamentalmente crea un OnActivate generico che assomigli a questo:
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 chiama InitChildForm per impostare i gestori eventi sulle tue versioni generiche a un certo punto del tuo programma (molto probabilmente subito dopo aver creato il modulo). Naturalmente alla chiusura del modulo principale vorrai liberare SavedEvents (e oggetti collegati).