Tôi đã viết một ứng dụng D7 để kiểm tra hành vi của Application.OnActivate.
Đây là phần có liên quan:Hành vi không mong muốn của Ứng dụng.Kích hoạt trong 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;
Sau khi khởi động ứng dụng, nội dung của Memo1 là:
1 - MainForm.FormCreate - Bắt đầu
2 - MainForm.FormCreate - End
3 - MainForm. AppActivate - Bắt đầu
4 - MainForm.ShowWidthsHeights - Bắt đầu
5 - MainForm.ShowWidthsHeights - End
6 - MainForm.AppActivate - End
Điều đó là chính xác.
Nhưng nếu tôi sau đó bấm vào một phím tắt trên thanh taskbar, những 4 dòng được thêm vào Memo1:
7 - MainForm.AppActivate - Bắt đầu
8 - MainForm.ShowWidthsHeights - Bắt đầu
9 - MainForm.ShowWidthsHeights - Kết thúc
10 - MainForm.AppActivate - Kết thúc
Tại sao D7 làm điều đó?
Đơn đăng ký của tôi chưa được kích hoạt, ngược lại, nó đã bị hủy kích hoạt!
Để kiểm tra xem sự kiện Application.OnDeactivate cũng bị sa thải, tôi đã thêm xử lý sự kiện này:
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;
và thêm vào bản Tuyên Bố này để TMainForm.FormCreate:
Application.OnDeactivate := AppDeactivate;
Sau khi khởi động ứng dụng, Memo1 chứa 6 dòng giống như trong trường hợp ban đầu, nhưng nhấp vào một lối tắt trong thanh tác vụ dẫn đến 8 dòng phụ trong 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
Vì vậy, ứng dụng của tôi bị vô hiệu hóa, sau đó kích hoạt, và sau đó ngừng hoạt động lại!
Khá khó hiểu!
Delphi đơn giản phản ánh cho bạn thông điệp 'WM_ACTIVATEAPP' mà Windows gửi tới ứng dụng của bạn. Tại sao Windows lại làm như vậy, tôi không biết. –
Bạn có tích cực là từ 7 đến 10 được ghi lại khi bạn * lần đầu tiên nhấp * trên nút thanh tác vụ (có lẽ có lẽ sẽ giảm thiểu biểu mẫu), hoặc khi bạn bấm lại để xem bản ghi nhớ? Bạn có thể sử dụng 'OutputDebugString' và 'Event Log' (ctrl + alt + v) thay vì đăng nhập vào bản ghi nhớ để chắc chắn. –
@Sertac Yeah, tôi đã kiểm tra điều này rồi. Nó chính xác như được mô tả trong Q. –