Ver Mensaje Individual
  #4  
Antiguo 03-10-2003
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
¿Estás seguro de que no funciona si lo pones en el evento OnActivate?

Acabo de hacer la prueba y, efectivamente, si se pone en el evento OnShow, el que aparece primero es el formulario del login, lo caul es lógico ya que en el evento OnShow aún no termina el proceso para mostrar el formulario.

Sin embargo, al ponerlo en el evento OnActivate sucedió lo que tú quieres:

Apareció el formulario principal y sobre él el del Login.

Ahora bien, de cualquier manera yo no usaría el evento OnActivate. Éste se genera siempre que el formulario se activa desde otro formulario de la aplicación. Por tanto, si resulta que usas un tercer formulario en tu aplicación, cuando desde él selecciones el principal volverá a generarse OnActivate y por tanto a hacerse el login.

Para que te sirva el evento OnShow puedes hacer lo siguiente:

Deberás generar tu mismo un evento que se ejecute después de OnShow. La manera de hacerlo es crando un mensaje personal y un manejador para él:

Código:
const
  CM_AFTERSHOW = WM_USER + 1;

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

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

implementation

procedure TForm1.CMAfterShow(var Message: TMessage);
begin
  Application.ProcessMessages;

  with TForm2.Create(Self) do
  begin
    try
      if ShowModal = mrCancel then
        Self.Close;
    finally
      Free;
    end;
  end;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  PostMessage(Handle, CM_AFTERSHOW, 0, 0);
end;
PostMessage mandará el mensaje CM_AFTERSHOW sólo haste que termine el evento OnShow, con lo cual garantizas que al llegar a CMAfterShow el formulario ya se mostró.

// Saludos
Responder Con Cita