Ver Mensaje Individual
  #9  
Antiguo 11-04-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por chileno
pero la idea inicial es cerrar la ficha
El punto es que es esta idea original la que no le cuadra a nadie más que a ti. ¿Para qué muestras una ventana a la que el usuario posiblemente no va a acceder (si escoge cancelar)?

Pero bueno, no soy yo quien para dictar tus gustos. Lo apunto sólo para opinar que a fin de cuentas esto puede ser confuso para el usuario.

¿Se puede hacer lo que quieres? Sí, claro que se puede. El problema es sólo, como ya has visto, que no puedes cerrar- ni, por tanto destruir -una ventana desde su propio evento OnShow. La solución entonces está en ejecutar el código que ahora tienes en este evento posteriormente.

Aquí la idea:

Código Delphi [-]
const
  CM_AFTERSHOW = WM_USER + 1;

type
  TFicha1 = class(TForm)
    procedure FormShow(Sender: TObject);

  private
    procedure CMAfterShow(var Msg: TMessage); message CMAFTERSHOW;
  end;

implementation

procedure TFicha1.FormShow(Sender: TObject);
begin
  PostMessage(Self.Handle, CM_AFTERSHOW, 0, 0);
end;

procedure TForm1.CMAfterShow(var Msg: TMessage);
begin
  with TFicha2.Create(nil) do
    try
      if ShowModal = mrCancel then Self.Close;
    finally
      Free;
    end;
end;

PostMessage envía un mensaje a la ventana (Ficha1) que se procesará sólo hasta que terminen de procesarse los otros mensajes, lo cual se traduce en que tal mensaje no se recibirá sino hasta que el evento OnShow haya terminado por completo. Tal mensaje lo recibes con el manejador CMAfterShow desde donde sí puedes autocerrar el formulario.

// Saludos
Responder Con Cita