Frage

Ich entwickle MDI-Anwendung, die für jede erstellte MDI Kind eine Registerkarte zuweist. Ich muß „fangen“ OnActivate, OnCreate- und OnDestroy Ereignisse der Kinder Form in der Haupt (übergeordnete) Form Code. Einfach den Code ruft bei Kindern Form für mich unmöglich ist, da es viele Form der Klassen, die als MDI Kinder verwendet werden, auch das Plugin laden kann es eigene Form ist ...

Also, meine Frage ist: Wie zu fangen, dass untergeordnetes MDI-Formular aktiviert wurde / deaktiviert ohne Kind Form der Ereignisse mit

War es hilfreich?

Lösung

Ich schrieb eine Taskbar Art der Komponente vor ein paar Jahren, die gerade diese Art der Sache tut. Es ist TrmMDITaskbar genannt. Sie können eine Kopie davon auf Torrys , es ist ein Teil des rmControls Bibliothekspaket. Es behandelt Aktivierung, Minimieren, Maximieren etc.

Der Kern, wie es funktioniert, ist, dass es die MDIParents Fenstergriff Haken für MDIChild Ereignisse suchen und tut Dinge auf der Grundlage dieser Ereignisse.

Wenn Sie sich auf Ihren eigenen schreiben ich, dass als ein guter Ort vorschlagen würde, beginnen.

Ryan.

P. S. Die Version auf Torrys ist ein wenig älter, aber sollte immer noch funktionieren. Ich habe eine neuere Version auf meiner Support-Website zur Verfügung steht. ( Mills Unternehmen )

Andere Tipps

Sie können immer die Ereignisse Haken „nach der Tat“ aus dem Code zur Laufzeit. 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 auf Haupt-Formschluss sollten Sie die SavedEvents (und verknüpfte Objekte) befreien.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top