Escribí una aplicación D7 para probar el comportamiento de Application.OnActivate.
Esta es la parte relevante:Comportamiento inesperado de Application.OnActivate en Delphi 7
procedure TMainForm.FormCreate (Sender: TObject);
begin
Memo1.Lines.Add (IntToStr (Memo1.Lines.Count + 1) + ' - MainForm.FormCreate - Begin');
Application.OnActivate := AppActivate;
Memo1.Lines.Add (IntToStr (Memo1.Lines.Count + 1) + ' - MainForm.FormCreate - End');
end;
procedure TMainForm.AppActivate (Sender: TObject);
begin
Memo1.Lines.Add (IntToStr (Memo1.Lines.Count + 1) + ' - MainForm.AppActivate - Begin');
ShowWidthsHeights (Sender);
Memo1.Lines.Add (IntToStr (Memo1.Lines.Count + 1) + ' - MainForm.AppActivate - End');
end;
procedure TMainForm.ShowWidthsHeights (Sender: TObject);
begin
Memo1.Lines.Add (IntToStr (Memo1.Lines.Count + 1) + ' - MainForm.ShowWidthsHeights - Begin');
Memo1.Lines.Add (IntToStr (Memo1.Lines.Count + 1) + ' - MainForm.ShowWidthsHeights - End');
end;
Después de iniciar la aplicación, el contenido de Memo1 es:
1 - MainForm.FormCreate - Comenzar
2 - MainForm.FormCreate - End
3 - MainForm. AppActivate - Comience
4 - MainForm.ShowWidthsHeights - Begin
5 - MainForm.ShowWidthsHeights - Fin
6 - MainForm.AppActivate - Fin
Eso es correcto.
Pero si a continuación, haga clic en un acceso directo en la barra de tareas, estas 4 líneas se añaden a Memo1:
7 - MainForm.AppActivate - Begin
8 - MainForm.ShowWidthsHeights - Begin
9 - MainForm.ShowWidthsHeights - End
10 - MainForm.AppActivate - Fin
¿Por qué D7 hace eso?
Mi aplicación no ha sido activada, por el contrario, ¡ha sido desactivada!
Para probar si el evento Application.OnDeactivate también se disparó, añadí este controlador de eventos:
procedure TMainForm.AppDeactivate(Sender: TObject);
begin
Memo1.Lines.Add (IntToStr (Memo1.Lines.Count + 1) + ' - MainForm.AppDeactivate - Begin');
Memo1.Lines.Add (IntToStr (Memo1.Lines.Count + 1) + ' - MainForm.AppDeactivate - End');
end;
y añadió que esta declaración TMainForm.FormCreate:
Application.OnDeactivate := AppDeactivate;
Después de iniciar la aplicación, Memo1 contenía las mismas 6 líneas que en el caso original, pero al hacer clic en un atajo en la barra de tareas, se obtuvieron 8 líneas adicionales en Memo1:
7 - MainForm.AppDeactivate - Begin
8 - MainForm.AppDeactivate - End
9 - MainForm.AppActivate - Begin
10 - MainForm.ShowWidthsHeights - Begin
11 - MainForm.ShowWidthsHeights - End
12 - MainForm.AppActivate - End
13 - MainForm.AppDeactivate - Begin
14 - MainForm.AppDeactivate - End
Por lo tanto, mi aplicación se desactiva, luego se activa y luego se desactiva de nuevo.
¡Eso es bastante confuso!
Delphi simplemente refleja el mensaje 'WM_ACTIVATEAPP' que Windows envía a su aplicación. Por qué Windows lo hace, no lo sé. –
¿Está seguro de que se registra de 7 a 10 cuando * primero hace clic * en el botón de la barra de tareas (que presumiblemente minimizaría el formulario) o cuando hace clic de nuevo para ver la nota? Puede usar 'OutputDebugString' y el 'Event Log' (ctrl + alt + v) en lugar de registrarse en la nota para estar seguro. –
@Sertac Sí, ya lo he comprobado. Es exactamente como se describe en la Q. –