2012-06-27 27 views
7

私はApplication.OnActivateの動作をテストするためにD7アプリケーションを作成しました。 MainForm.FormCreate - - MainForm.FormCreate - - エンド
3 - MainFormを
2を開始
1:Delphi 7での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の内容である:
これは、関連する部分です。 :AppActivateの - MainForm.ShowWidthsHeights - -
4を開始MainForm.ShowWidthsHeights - - エンド
6 - MainForm.AppActivate - エンド


5を開始します

これは正しいです。私は、タスクバーにショートカットをクリックした場合

はしかし、これらの4行はMEMO1に追加されます。
7 - MainForm.AppActivate - MainForm.ShowWidthsHeights - -
8を開始しますMainForm.ShowWidthsHeights -
9を開始します - 終了
10 - MainForm.AppActivate - 終了

なぜD7はそれをしますか?
私のアプリケーションは有効化されていませんが、無効化されています。 Application.OnDeactivateイベントも発射されるかどうかをテストするために


、私は、このイベントハンドラを追加:起動した後

Application.OnDeactivate := AppDeactivate; 

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にこのステートメントを追加しますアプリケーション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 

したがって、私のアプリケーションは無効化されてから有効化され、再び無効化されます。
これはかなり混乱しています!

+1

DelphiはWindowsがあなたのアプリケーションに送る 'WM_ACTIVATEAPP'メッセージをあなたに反映しています。なぜWindowsがそうしているのかわかりません。 –

+0

タスクバーのボタンで*を最初にクリックすると(フォームを最小にすると思われる)、メモを見るためにもう一度クリックしたときに7〜10がログに記録されることは確実ですか?メモにロギングするのではなく、 'OutputDebugString'と 'Event Log'(ctrl + alt + v)を使うことができます。 –

+1

@Sertacええ、私はこれをすでにチェックしました。それはまさにQで説明されている通りです。 –

答えて

1

ダビデのコメントが既に述べたように、それはWM_ACTIVATEメッセージの受信を反映しています。 http://msdn.microsoft.com/en-us/library/windows/desktop/ms632614(v=vs.85).aspxは答えを示します:

アクティブなウィンドウとは異なるアプリケーションに属するウィンドウがアクティブになるときに送信されます。メッセージは、ウィンドウがアクティブ化されているアプリケーション、およびウィンドウが非アクティブ化されているアプリケーションに送信されます。

とメッセージのパラメータをさらに説明する:

のwParam:

ウィンドウがアクティブまたは非アクティブにされているかどうかを示します。このパラメータは、ウィンドウがアクティブになっている場合はTRUEです。ウィンドウが非アクティブ化されている場合はFALSEです。

+1

これは、タスクバーボタンのクリックがアクティベーションの直後に非アクティブ化を送信することを説明していません。 –

+1

David、あなたは正しいです。 @Roaldでは、混乱を避けるために、起動と停止を通知するWM_ACTIVATEAPPが1つありますが、2つの異なるDelphiイベントがあります。 DelphiライブラリはWM_ACTIVATEAPPを取得し、wParamに応じてCM_ACTIVATEまたはCM_DEACTIVATEのいずれかを起動します。 TApplicationによってonActivateイベントまたはonDeactivateイベントを発生させるためにキャプチャされます。 –

+0

それでも依頼された質問に答えることができない回答がアップ票に表示されます。一言..... –

関連する問題