我编写了一个D7应用程序来测试Application.OnActivate的行为。
以下是相关部分:
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;
启动应用程序后,Memo1的内容为:
1 - MainForm.FormCreate - 开始
2 - MainForm.FormCreate - 结束
3 - MainForm.AppActivate - 开始
4 - MainForm.ShowWidthsHeights - 开始
5 - MainForm.ShowWidthsHeights - 结束
6 - MainForm.AppActivate - 结束
没错。
但如果我点击任务栏中的一个快捷方式,则会向Memo1添加这4行:
7 - MainForm.AppActivate - 开始
8 - MainForm.ShowWidthsHeights - 开始
9 - MainForm.ShowWidthsHeights - 结束
10 - MainForm.AppActivate - 结束
为什么D7会这样做?
我的应用程序还没有被激活,相反,它已被停用!
为了测试是否触发了Application.OnDeactivate事件,我添加了此事件处理程序:
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;
并在TMainForm.FormCreate中添加了以下语句:
Application.OnDeactivate := AppDeactivate;
启动应用程序后,Memo1中包含与原始情况相同的6行内容,但是单击任务栏中的快捷方式会在Memo1中添加8行额外的内容:
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
我的应用程序被停用,然后重新启用,然后再次停用!
这相当令人困惑!
OutputDebugString
和“事件日志”(ctrl+alt+v)而不是记录备忘录来确保。 - Sertac Akyuz