¿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