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!
Delphi jest po prostu odzwierciedleniem wiadomości 'WM_ACTIVATEAPP' wysyłanej przez system Windows do aplikacji. Dlaczego Windows tak robi, nie wiem. –
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ść. –
@ Sertac Tak, sprawdziłem to już. Jest dokładnie tak, jak to opisano w Q. –