2012-06-27 15 views
7

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!

+1

Delphi simplemente refleja el mensaje 'WM_ACTIVATEAPP' que Windows envía a su aplicación. Por qué Windows lo hace, no lo sé. –

+0

¿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. –

+1

@Sertac Sí, ya lo he comprobado. Es exactamente como se describe en la Q. –

Respuesta

1

Como el comentario de David ya indicó, está reflejando la recepción del mensaje WM_ACTIVATE. http://msdn.microsoft.com/en-us/library/windows/desktop/ms632614(v=vs.85).aspx da la respuesta:

Enviado cuando una ventana perteneciente a una aplicación diferente de la ventana activa está a punto de activarse. El mensaje se envía a la aplicación cuya ventana se está activando y a la aplicación cuya ventana se está desactivando.

y los parámetros del mensaje de explicar con más detalle:

wParam:

Indica si la ventana está siendo activado o desactivado. Este parámetro es VERDADERO si la ventana se está activando; es FALSO si la ventana está siendo desactivada.

+1

Eso no explica que el botón de la barra de tareas haga clic en envía un desactivar inmediatamente seguido de un activar. –

+1

David, tienes razón. @Roald, para despejar la confusión, hay un WM_ACTIVATEAPP que señala la activación y la desactivación, pero hay dos eventos Delphi diferentes. La biblioteca Delphi captura WM_ACTIVATEAPP y, dependiendo de wParam, activa un CM_ACTIVATE o un CM_DEACTIVATE; que a su vez son capturados por TApplication para activar los eventos onActivate o onDeactivate. –

+0

Y aún así los votos positivos vienen para una respuesta que no aborda la pregunta que se hizo. Suspiro ..... –

Cuestiones relacionadas