Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-10-2006
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
ixMike Va por buen camino
Exclamation Destroy en OnClose de MDIChild

Amigos del foro:

En un programa DMI que estoy desarrolando tengo un menú en la ventana madre, y al cual (en parte) deshabilito si no hay ventanas hijas. En la ventana hija (es siempre la misma, la creo cuantas veces necesite), en su evento OnClose coloco lo siguiente:

Código Delphi [-]
Procedure TFHija.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Destroy;
frmMain.ActualizarMenus;
end;

Hago esto porque es la única forma de actualizar el menú, porque si lo coloco en el evento OnDestroy no funciona.

Pero, ¿es esto correcto? ¿Hay alguna otra forma mejor de hacerlo?

Gracias.
Responder Con Cita
  #2  
Antiguo 03-10-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Creo que estaría mejor así:

Código Delphi [-]
Procedure TFHija.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  frmMain.ActualizarMenus;
  Action := caFree;
end;

// Saludos
Responder Con Cita
  #3  
Antiguo 03-10-2006
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
ixMike Va por buen camino
Pues no
porque al llamar a ActualizarMenus la ventana sigue existiendo y entonces el menu no cambia para nada (por eso tuve que recurrir a lo que antes he puesto), pero gracias de todas formas
Responder Con Cita
  #4  
Antiguo 03-10-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cierto, no había caido en eso. Pero a ver, lo que haces puede darte problemas por varias razones:

1. Se aconseja el uso de Free en lugar de Destroy;
2. No se aconseja destruir un formulario desde alguno de sus eventos y en su lugar debe usarse Action := caFree en el evento OnClose.

Te pongo una forma de hacer lo que deseas. Esta ya la he probado

1. Al formulario hijo déjalo sólo con el Action := caFree en el OnClose.
2. Cuando crees un nuevo formulario hijo, le pides que notifique a su padre cuando fallezca

Código Delphi [-]
with TFormHijo.Create(...) do
begin
  FreeNotification(Self);
end;

3. En el formulario padre redefine el método Notification para recibir tal notificación:

Código Delphi [-]
type
  TFormPadre = class(TForm)
  protected
    procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  end;

implementation

procedure TFormPadre.Notification(AComponent: TComponent; Operation: TOperation);
begin
  inherited;

  { Si el hijo se muere y ya no hay más (MDIChildCount = 0) ... }
  if (AComponent is TFormHijo) and (Operation = opRemove) and (MDIChildCount = 0) then
    ActualizarMenus;
end;

// Saludos

Última edición por roman fecha: 03-10-2006 a las 19:58:14.
Responder Con Cita
  #5  
Antiguo 03-10-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Sin palabras Roman, me encanta cuando te sacas cosas como esta de la manga. Esta me la guardo ...
Responder Con Cita
  #6  
Antiguo 03-10-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Pues te lo agradezco. De hecho, en mi opinión/gusto, esta técnica es la más apropiada para el sempiterno problema de crear un formulario sólo si no existe ya:

Código Delphi [-]
if not Assigned(FormHijo) then
  FormHijo := TFormHijo.Create(...);

FormHijo.Show;

Es el padre quien pone en nil la referencia FormHijo cuando recibe la notificación de defunción.

// Saludos
Responder Con Cita
  #7  
Antiguo 05-10-2006
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
ixMike Va por buen camino
Muchísimas gracias.

Como siempre, sencillo y eficaz.

Además, esto me va a ir de maravilla para otros muchos programas futuros (y algún otro presente)
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Al cerrar Form no entra en OnClose nowheremanza OOP 2 13-09-2005 14:04:41
Otra de diferencias... (free y destroy) FunBit OOP 3 03-09-2005 02:33:39
Destroy de mala madre... Xianto OOP 9 31-03-2005 20:24:11
Diferencias entre FREE y DESTROY bustio OOP 1 23-06-2004 05:48:35
Manejo Del Free Y El Destroy Robert SQL 4 19-03-2004 15:11:34


La franja horaria es GMT +2. Ahora son las 22:24:20.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi