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 ?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top