2012-06-27 4 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 이벤트도 해고되는 경우, 나는이 이벤트 핸들러 추가 테스트하려면 :

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 

그래서 내 응용 프로그램이 비활성화되고 활성화 된 다음 다시 비활성화됩니다.
매우 혼란 스럽습니다!

+1

델파이는 단순히 Windows가 앱으로 보내는 WM_ACTIVATEAPP 메시지를 반영합니다. Windows가 그렇게하는 이유는 모르겠습니다. –

+0

작업 표시 줄 단추를 * 처음 클릭 할 때 (양식을 최소화 할 수있을 가능성이 높음) 또는 다시 클릭하여 메모를 볼 때 7에서 10까지 기록된다는 것이 긍정적입니까? 메모에 기록하는 대신 'OutputDebugString'과'이벤트 로그 '(ctrl + alt + v)를 사용할 수 있습니다. –

+1

@Sertac 그래, 나는 이것을 이미 확인했다. 그것은 정확히 Q. –

답변

1

David의 의견은 이미 언급했듯이 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가 있지만 두 가지 다른 Delphi 이벤트가 있습니다. 델파이 라이브러리는 WM_ACTIVATEAPP를 캡처하고 wParam에 따라 CM_ACTIVATE 또는 CM_DEACTIVATE를 시작합니다. TApplication에 의해 캡처되어 onActivate 또는 onDeactivate 이벤트를 발생시킵니다. –

+0

그리고 아직 질문에 대한 답을 찾지 못하는 응답이 있습니다. 한숨 ..... –

관련 문제