2012-06-27 21 views
7

Napisałem aplikację D7, aby przetestować zachowanie Application.OnActivate.
Jest to istotne części:Nieoczekiwane zachowanie Application.OnActivate w 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; 

Po uruchomieniu aplikacji zawartość Memo1 jest:
1 - MainForm.FormCreate - Rozpoczęcie
2 - MainForm.FormCreate - koniec
3 - MainForm. AppActivate - rozpocznij
4 - MainForm.ShowWidthsHeights - rozpocznij
5 - MainForm.ShowWidthsHeights - koniec
6 - MainForm.AppActivate - Koniec

To prawda.

Ale jeśli następnie kliknij skrót na pasku zadań, te 4 linie są dodawane do Memo1:
7 - MainForm.AppActivate - rozpocznij
8 - MainForm.ShowWidthsHeights - rozpocznij
9 - MainForm.ShowWidthsHeights - Koniec
10 - MainForm.AppActivate - Koniec

Dlaczego D7 to robi?
Moja aplikacja nie została aktywowana, wręcz przeciwnie, została wyłączona!


Aby sprawdzić, czy zdarzenie Application.OnDeactivate jest również zwolniony, dodałem ten obsługi zdarzeń:

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; 

i dodali oświadczenie TMainForm.FormCreate:

Application.OnDeactivate := AppDeactivate; 

Po uruchomieniu aplikacja, Memo1 zawierała te same 6 linii, co w oryginalnym przypadku, ale kliknięcie skrótu na pasku zadań spowodowało dodanie 8 dodatkowych linii w 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 

Moja aplikacja zostanie dezaktywowana, a następnie aktywowana, a następnie ponownie wyłączona!
To dość mylące!

+1

Delphi jest po prostu odzwierciedleniem wiadomości 'WM_ACTIVATEAPP' wysyłanej przez system Windows do aplikacji. Dlaczego Windows tak robi, nie wiem. –

+0

Czy jesteś pewien, że od 7 do 10 jest rejestrowany, gdy * klikniesz * na przycisku na pasku zadań (co prawdopodobnie zminimalizuje formularz) lub gdy klikniesz ponownie, aby wyświetlić notatkę? Możesz użyć 'OutputDebugString' i 'Event Log' (ctrl + alt + v) zamiast logować się do notatki, aby mieć pewność. –

+1

@ Sertac Tak, sprawdziłem to już. Jest dokładnie tak, jak to opisano w Q. –

Odpowiedz

1

Jak już wspomniano w komentarzu Dawida, jest to odbieranie wiadomości od WM_ACTIVATE. http://msdn.microsoft.com/en-us/library/windows/desktop/ms632614(v=vs.85).aspx daje odpowiedź:

Wysyłane, gdy ma zostać aktywowane okno należące do innej aplikacji niż aktywne okno. Komunikat jest wysyłany do aplikacji, której okno jest aktywowane, oraz do aplikacji, której okno jest dezaktywowane.

i parametry komunikatu wyjaśniają dalej:

wParam:

Wskazuje, czy okno jest włączona lub wyłączona. Ten parametr ma wartość TRUE, jeśli okno jest aktywowane; jest FALSE, jeśli okno jest dezaktywowane.

+1

To nie wyjaśnia kliknięcia przycisku na pasku zadań, powoduje natychmiastowe dezaktywowanie, a następnie aktywację. –

+1

David, masz rację. @Roald, aby usunąć zamieszanie, istnieje jeden WM_ACTIVATEAPP, który sygnalizuje aktywację i dezaktywację, ale istnieją dwa różne zdarzenia Delphi. Biblioteka Delphi przechwytuje WM_ACTIVATEAPP i w zależności od wParam uruchamia następnie CM_ACTIVATE lub CM_DEACTIVATE; które z kolei są przechwytywane przez TApplication w celu wywołania zdarzeń onActivate lub onDeactivate. –

+0

I wciąż pojawiają się głosy up-voting dla odpowiedzi, która nie odnosi się do pytania, które zostało zadane. Westchnienie ..... –

Powiązane problemy