Delphi MDI: manejo de abrir / cerrar / activar formulario hijo
-
07-07-2019 - |
Pregunta
Estoy desarrollando una aplicación MDI que asigna una pestaña a cada hijo MDI creado. Necesito '' atrapar '' Eventos OnActivate, OnCreate y OnDestroy del formulario secundario en el código del formulario principal (principal). Simplemente llamar al código en forma secundaria es imposible para mí, ya que hay muchas clases de formularios que se usan como elementos secundarios MDI, también el complemento puede cargar su propia forma ...
Entonces, mi pregunta es: ¿cómo detectar que el formulario MDI secundario se ha activado / desactivado sin usar los eventos del formulario secundario ?
Solución
Hace un par de años escribí un componente de tipo Barra de tareas que hace exactamente este tipo de cosas. Se llama TrmMDITaskbar. Puede encontrar una copia en Torrys , es parte del paquete de la biblioteca rmControls. Maneja la activación, minimización, maximización, etc.
La esencia de cómo funciona es que engancha el identificador de la ventana de MDIParents en busca de eventos MDIChild y hace cosas basadas en esos eventos.
Si estás buscando escribir el tuyo, te sugiero que sea un buen lugar para comenzar.
Ryan.
P.S. La versión en Torrys es un poco más antigua pero aún debería funcionar. Tengo una versión más nueva disponible en mi sitio web de soporte. ( Mills Enterprise )
Otros consejos
Siempre puedes conectar los eventos "después del hecho" de su código en tiempo de ejecución. Básicamente, cree un OnActivate genérico que se vea así:
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;
Luego llame a InitChildForm para configurar los controladores de eventos para sus versiones genéricas en algún momento de su programa (muy probablemente justo después de crear el formulario). Por supuesto, al cerrar el formulario principal, querrá liberar los eventos guardados (y los objetos vinculados).