2012-06-27 13 views
7

में सक्रिय करें। मैंने आवेदन के व्यवहार का परीक्षण करने के लिए एक डी 7 आवेदन लिखा था .ऑनएक्टिवेट।आवेदन का अप्रत्याशित व्यवहार। डेल्फी 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; 

आवेदन शुरू करने के बाद, Memo1 की सामग्री है:
यह प्रासंगिक हिस्सा है
1 - MainForm.FormCreate - शुरू
2 - MainForm.FormCreate - अंत
3 - MainForm। AppActivate - शुरू
4 - MainForm.ShowWidthsHeights - शुरू
5 - MainForm.ShowWidthsHeights - अंत
6 - MainForm.AppActivate - अंत

यह सही है।

लेकिन अगर मैं तो टास्कबार में एक शॉर्टकट पर क्लिक करें, इन 4 लाइनों Memo1 जोड़े जाते हैं:
7 - MainForm.AppActivate - शुरू
8 - MainForm.ShowWidthsHeights - शुरू
9 - MainForm.ShowWidthsHeights - अंत
10 - MainForm.AppActivate - अंत

डी 7 ऐसा क्यों करता है?
मेरा आवेदन सक्रिय नहीं किया गया है, इसके विपरीत, इसे निष्क्रिय कर दिया गया है!


अगर 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; 

एप्लिकेशन, मेमो 1 में मूल मामले में समान 6 लाइनें थीं, लेकिन टास्कबार में शॉर्टकट पर क्लिक करने के परिणामस्वरूप मेमो 1:

में 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

डेल्फी आपको केवल 'WM_ACTIVATEAPP' संदेश को प्रतिबिंबित कर रहा है जो Windows आपके ऐप पर भेजता है। विंडोज ऐसा क्यों करता है, मुझे नहीं पता। –

+0

क्या आप सकारात्मक हैं कि 7 से 10 लॉग होता है जब आप * टास्कबार बटन पर पहली बार क्लिक करते हैं (जो प्रपत्र को कम से कम कम करेगा), या जब आप ज्ञापन देखने के लिए फिर से क्लिक करेंगे? आप सुनिश्चित करने के लिए ज्ञापन पर लॉगिंग करने के बजाय 'आउटपुटडिबगस्ट्रिंग' और 'इवेंट लॉग' (ctrl + alt + v) का उपयोग कर सकते हैं। –

+1

@ सर्टैक हाँ, मैंने इसे पहले ही चेक किया है। यह ठीक है जैसा कि क्यू –

उत्तर

1

जैसा कि डेविड की टिप्पणी पहले से ही कहा गया है, यह WM_ACTIVATE संदेश प्राप्त करने को दर्शाता है। http://msdn.microsoft.com/en-us/library/windows/desktop/ms632614(v=vs.85).aspx उत्तर देता है:

भेजा गया जब सक्रिय विंडो की तुलना में किसी भिन्न अनुप्रयोग से संबंधित विंडो सक्रिय होने वाली है। संदेश उस एप्लिकेशन को भेजा जाता है जिसकी खिड़की सक्रिय की जा रही है और उस एप्लिकेशन के लिए जिसकी विंडो निष्क्रिय हो रही है।

और संदेश के मापदंडों आगे समझाने:

wParam:

इंगित करता है खिड़की सक्रिय किया जा रहा है कि क्या है या निष्क्रिय किया गया। यह पैरामीटर सत्य है यदि विंडो सक्रिय हो रही है; खिड़की निष्क्रिय हो रही है तो यह गलत है।

+1

यह टास्कबार बटन की व्याख्या नहीं करता है क्लिक करें तुरंत एक सक्रियण के बाद एक निष्क्रियता भेजता है। –

+1

डेविड, आप सही हैं। @ रोल्ड, भ्रम को दूर करने के लिए, एक WM_ACTIVATEAPP है जो सक्रियण और निष्क्रियता को संकेत देता है, लेकिन दो अलग-अलग डेल्फी घटनाएं होती हैं। डेल्फी लाइब्रेरी WM_ACTIVATEAPP को कैप्चर करती है और wParam के आधार पर इसे या तो CM_ACTIVATE या CM_DEACTIVATE को आग लगती है; जो बदले में एक्टिवेट या निष्क्रिय घटनाओं को आग लगाने के लिए टीएप्लिकेशन द्वारा कब्जा कर लिया जाता है। –

+0

और फिर भी ऊपर के वोट एक ऐसे उत्तर के लिए आते हैं जो पूछे गए प्रश्न को हल करने में विफल रहता है। Sigh ..... –

संबंधित मुद्दे