2009-05-05 14 views
7

मैं कुछ सरल एनिमेशन के लिए ऑनइडल-ईवेंट का उपयोग कर रहा हूं, और यह ठीक काम करता है। समस्या यह है कि जब उपयोगकर्ता विंडो को स्थानांतरित या आकार बदलना शुरू करता है, तो ऑनइड-इवेंट फायरिंग बंद कर देता है जब तक कि चाल/आकार बदलने का कार्य पूरा नहीं हो जाता है।डेल्फी: विंडो चाल के प्रारंभ और अंत का पता लगाएं

मुझे ऐसा होने पर पता लगाने की आवश्यकता है, ताकि मैं सभी एनिमेशन को रोक सकूं। लेकिन मैं खिड़की के आंदोलन का पता कैसे लगा सकता हूं?

+5

OnIdle का उपयोग नहीं वास्तव में एक अच्छा विचार है, के रूप में यह सक्रिय कोर पर 100% CPU लोड का कारण होगा। इसके बजाय टाइमर इवेंट का उपयोग करें, जिसमें दो फायदे हैं: यह द्वितीयक संदेश लूप में भी आग लग जाएगा, इसलिए एनीमेशन चलने/आकार बदलने के दौरान जारी रहता है (जब इसे पूर्ण विंडो ड्रैगिंग सक्रिय होना चाहिए); और सिस्टम की गति के बावजूद, आप प्रति सेकंड एनीमेशन चरणों की एक समझदार संख्या सेट करने में सक्षम होंगे। – mghie

+0

टाइमर बनाम निष्क्रिय एक दिलचस्प विषय है। दोनों के पास पेशेवर और विपक्ष हैं, लेकिन मेरे छोटे सजावटी एनिमेशन के लिए, ओडल ठीक काम करेगा। – Vegar

+0

ऐसे "छोटे सजावटी एनिमेशन", यदि $ उपयोगकर्ता उन्हें अक्षम नहीं कर सकता है, तो लैपटॉप पर बहुत अधिक बैटरी समय लग सकता है। इसके अलावा, आप सक्रिय रूप से अन्य अनुप्रयोगों से सीपीयू चक्र चुरा रहे हैं। अपने लिए यह कोशिश करें, हकीकत में OnIdle केवल विपक्ष है। – mghie

उत्तर

8

मैं साथ mghie टिप्पणी जाना चाहते हैं: एनीमेशन के लिए एक टाइमर का उपयोग करें, और सक्रिय/संदेश संचालकों के साथ उसे निष्क्रिय।

आपके मामले में, आपको निम्न संदेश संचालकों जोड़ सकते हैं:

//fired when starting/ending a "move" or "size" window 
procedure WMEnterSizeMove(var Message: TMessage) ; message WM_ENTERSIZEMOVE; 
procedure WMExitSizeMove(var Message: TMessage) ; message WM_EXITSIZEMOVE; 


    procedure TForm.WMEnterSizeMove(var msg: TMessage); 
    begin 
    AnimationTimer.Enabled := false; 
    inherited; 
    end; 

    procedure TForm.WMExitSizeMove(var msg: TMessage); 
    begin 
    AnimationTimer.Enabled := true; 
    inherited; 
    end; 
+1

मैं उन दो संदेशों को बाद में देखता हूं। मैं उनके बारे में पहले नहीं जानता था। धन्यवाद। – Vegar

+0

@LeGEC: लेकिन एनीमेशन को बिल्कुल अक्षम क्यों करें? यह चलती/आकार देने में हस्तक्षेप नहीं करता है, और सक्षम होने पर पूर्ण विंडो ड्रैगिंग से मेल खाता है। – mghie

4

मैंने यह कोशिश नहीं की है, लेकिन मैं कहूंगा कि आप शायद WM_WINDOWPOSCHANGING का उपयोग कर सकते हैं ताकि यह कहने के लिए कि विंडो कब स्थानांतरित हो रही है। http://msdn.microsoft.com/en-us/library/ms632653(VS.85).aspx

डेल्फी कोड होगा:

TSomeForm = class(TForm) 
protected 
    ... 
    procedure WindowPosChanging(var Msg : TMessage); message WM_WINDOWPOSCHANGING; 
    ... 
end; 
संबंधित मुद्दे