Delphi MDI - Umgang mit open / close / aktivieren Kind Form
-
07-07-2019 - |
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
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.