2009-09-15 62 views
5

Estoy desarrollando una aplicación MDI que asigna una pestaña para cada hijo MDI creado. Necesito "atrapar" OnActivate, OnCreate y OnDestroy eventos de forma secundaria en el código de formulario principal (principal). Simplemente llamar al código en forma de niños es imposible para mí, ya que hay muchas clases de formularios que se usan como MDI secundarios, también el complemento puede cargar su propia forma ...Delphi MDI - manejo abrir/cerrar/activar el formulario hijo

Entonces, mi pregunta es: cómo atrapar eso El formulario hijo MDI ha sido activado/desactivado sin usar los eventos del formulario hijo?

Respuesta

3

Escribí un tipo de componente de barra de tareas hace muchos años que hace exactamente este tipo de cosas. Se llama TrmMDITaskbar. Puede encontrar una copia en Torrys, es parte del paquete de la biblioteca rmControls. Se encarga de la activación, minimización, maximización, etc.

La esencia de cómo funciona es que engancha el controlador de ventana de MDIParents en busca de eventos MDIChild y hace cosas basadas en esos eventos.

Si está buscando escribir uno propio, le sugiero que sea un buen lugar para comenzar.

Ryan.

P.S. La versión de Torrys es un poco más antigua, pero debería funcionar. Tengo una versión más nueva disponible en mi sitio web de soporte. (Mills Enterprise)

+0

gracias. finalmente lo resolví usando el código de SpTBXLib que se engancha usando la bandera WH_CBT ... :) – migajek

+0

Hola ryan, me encantaría probar ese componente pero el sitio web de soporte me da un Error 403 - Prohibido (Has intentado acceder a un documento para el cual no tiene privilegios.) –

+0

@Alin Sfetcu, recientemente cambié mi servicio de alojamiento y todavía no me han reinstalado todos mis enlaces y foros. Para decir la verdad, pensé que ya tenía los foros de soporte funcionando. Lo investigaré lo antes posible. Lo siento por el goof. Como dije, la copia del sitio de Torry debería funcionar. –

1

Siempre puede conectar los eventos "después del hecho" de su código en tiempo de ejecución. Básicamente crear un AlActivar genérico que se ve algo como esto:

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; 

continuación, llame al InitChildForm para configurar los controladores de eventos a 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 SavedEvents (y los objetos vinculados).

Cuestiones relacionadas