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 ?

È stato utile?

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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top