2011-09-22 18 views
10

डेल्फी XE में में मुख्य रूप और मोडल संवाद "शीर्ष पर रहें" अपडेट 1, मैं मोडल रूपों अगर माता-पिता (मुख्य) प्रपत्र की FormStyle fsStayOnTop पर सेट है की मालूम होता है यादृच्छिक व्यवहार हो रही है।डेल्फी XE

1) मेनफॉर्मऑन टास्कबार के साथ: = गलत (पुराना तरीका), सबकुछ "बस काम करता है"। नए मेनफॉर्मऑन टास्कबार के साथ: = सही है, मुख्य रूप मुख्य रूप से "शीर्ष पर बने रहने" पर सेट होने पर मुख्य रूप के पीछे छिपा हुआ है। ज्यादातर मामलों में

modalForm.PopupParent := self; 

modalForm को कॉल करने से ठीक पहले .ShowModal मदद करता है। लेकिन हमेशा नहीं।

2) मेरे सभी मोडल रूपों, सरल हैं कोई तामझाम, MainFormCenter, पर तैनात प्रपत्र विरासत, आदि और फिर भी PopupParent का उपयोग कर न केवल उनमें से लगभग आधे के लिए काम करता है, जबकि अन्य आधा अभी भी छिपा हो ठीक मुख्य रूप के पीछे। सबसे अजीब बात यह है कि, एक मामले में कोड की असंबद्ध रेखाओं का क्रम तोड़ता है या बनाता है। देखें लाइनों चिह्नित (1) और (2) इस कोड में:

procedure TEchoMainForm.DBMaintenancePrompt(actions : TMaintenanceActions); 
var 
    frm : TDBMaintenanceForm; 
begin 
    frm := TDBMaintenanceForm.Create(self); 
    try 
    frm.Actions := actions; // (1) 
    frm.PopupParent := self; // (2) 
    frm.ShowModal; 
    finally 
    frm.Free; 
    end; 
end; 

जब इस क्रम में मार डाला, मोडल प्रपत्र सही ढंग से मुख्य रूप से शीर्ष पर पता चलता है। लेकिन जब मैं लाइनों को उलट देता हूं, तो मोडल फॉर्म मुख्य के पीछे छिपा रहता है। चिह्नित रेखा (1) मॉडल फॉर्म की एक संपत्ति सेट करती है, जिसके परिणामस्वरूप TRzPheckGroup में अनचेक किए गए कई चेकबॉक्स चेक किए जाते हैं, जो TRzPageControl (Raize घटकों से) पर बैठे हैं। इस सेटर विधि चलाता है कि जब लाइन (1) ऊपर निष्पादित करता है:

procedure TDBMaintenanceForm.SetActions(const Value: TMaintenanceActions); 
var 
    ma : TMaintenanceAction; 
begin 
    for ma := low(ma) to high(ma) do 
    cgMaintActions.ItemChecked[ ord(ma)] := (ma in Value); 
    end; 
end; 

मोडल प्रपत्र मुख्य रूप के पीछे दिखाने के लिए अगर लाइनों के आदेश (1) और (2) है यह पर्याप्त है को उलट दिया।

यह TRzCheckGroup को इंगित कर सकते हैं (जो जब सेटर कोड चलाता है चालाकी से हो जाता है), लेकिन मुझे दो अन्य रूपों है कि एक ही समस्या दिखाने के लिए और TRzCheckGroup (या TRzPageControl) प्रयोग नहीं करते हैं। और मैं समस्या घटकों का उपयोग कर एक अलग नमूना ऐप के साथ समस्या को पुन: पेश नहीं कर सका। फॉर्म को अक्षम करने, पेजर कंट्रोल या सेटर की अवधि के लिए TRzCheckGroup का कोई प्रभाव नहीं पड़ता है।

यह एक समय मुद्दा नहीं प्रतीत होता है, क्योंकि जब मोडल फॉर्म एक बार छुपा रहता है, तो यह हमेशा होता है। व्यवहार में परिवर्तन केवल कोड की रेखाओं को पुन: व्यवस्थित करने से आता है।

3) एक अंतिम अवलोकन: मेरे मोडल रूप काफी सरल हैं, इसलिए वे बिना किसी देरी के तुरंत दिखाई देते हैं। लेकिन जब मुख्य रूप fsStayOnTop है, तो अक्सर मैं इसके ऊपर मोडल फॉर्म शो देख सकता हूं, फिर इसे पीछे "धक्का" मिलता है। फिर, एसीसी को मारने पर, (अदृश्य) मोडल फॉर्म मुख्य रूप के शीर्ष पर एक सेकंड के अंश के लिए दिखाता है, फिर बंद हो जाता है।

या तो मुझे कुछ ऐसा याद आ रहा है जो हिंडसाइट में स्पष्ट प्रतीत होता है, या यह मानसिक डीबगिंग के लिए एक कॉल है, मुझे नहीं पता। कोई विचार, कृपया?


अद्यतन। मैंने किसी अन्य रूप पर समस्या को ट्रैक करने का प्रयास किया है जहां यह होता है। इसमें कुछ बटन (राइज) और एक टीएसआईएनटीएक्सएममो (eControl.ru से एक उन्नत ज्ञापन घटक) है। इस रूप में समस्या का अनुभव करने वाले अन्य रूपों के साथ लगभग कुछ भी सामान्य नहीं है।कोड और परीक्षण के कुछ हिस्सों को हटाने के बाद, अब मैं एक विधि में एक छोटा बदलाव करके समस्या को पुन: उत्पन्न कर सकता हूं जो ज्ञापन घटक को स्ट्रिंग निर्दिष्ट करता है:

यह मेरा मूल कोड है, जिसके कारण संपादक को फ़ॉर्म शामिल है

procedure TEditorForm.SetAsText(const Value: string); 
begin 
    Editor.Text := Value; 
end; 

जब मैं एक रिक्त स्ट्रिंग पर काम बदलने के लिए, सही ढंग से प्रपत्र प्रदर्शित करता है:

procedure TEditorForm.SetAsText(const Value: string); 
begin 
    Editor.Text := ''; // CRAZY! Problem goes away 
end; 

जब मैं संपादक के लिए एक एकल वर्ण निर्दिष्ट करते हैं, प्रपत्र फिर से छुपा शुरू होता है मुख्य रूप के पीछे छिपाने :

procedure TEditorForm.SetAsText(const Value: string); 
begin 
    Editor.Text := 'a'; // Problem is back 
end; 

बेशक अन्य दो समस्याग्रस्त रूप इस संपादक घटक या इसकी किसी भी इकाई का उपयोग नहीं करते हैं।

मैंने ज्ञापन नियंत्रण को हटाने और इसे फिर से जोड़ने (विचार निर्माण आदेश इत्यादि) को जोड़ने का प्रयास किया है, लेकिन इसका कोई प्रभाव नहीं पड़ा। वही अगर मैं कोड में ज्ञापन बना देता हूं। जैसे ही एक गैर-खाली स्ट्रिंग को ज्ञापन की टेक्स्ट प्रॉपर्टी में असाइन किया गया है, फॉर्म छिपाता है।

+0

मैं थोड़ा उलझन में हूं। आप कहते हैं कि यह क्रमांकित लाइनों के साथ काम करता है, लेकिन उस कोड में ऑब्जेक्ट इंस्टेंस की विधि के बिना 'स्वयं' संदर्भित किया गया है। पोस्ट किए गए कोड लाइनों के क्रम के बावजूद संकलित नहीं करेंगे, बहुत कम काम करेंगे। जब आप वास्तविक कोड पोस्ट नहीं करते हैं तो कोड विसंगतियों को समझाना मुश्किल है। :) –

+0

@ केन: अब फिक्स्ड, धन्यवाद। कोड मुख्य रूप का एक तरीका है, इसलिए स्वयं संदर्भ मान्य है। यह शब्दशः कोड है। मैंने सेटएक्शन में कोड को थोड़ा सा सरल बना दिया, लेकिन जैसा कि यहां लिखा गया है, यह संकलित करता है * और * अभी भी "छुपा" समस्या का कारण बनता है। –

+0

@moodforaday: आपके पास मोडल फॉर्म की 'पॉपअप मोड' प्रॉपर्टी क्या है? आपके पास 'TApplication.ModalPopupMode' प्रॉपर्टी क्या है? –

उत्तर

-1

विंडोज ऐप के लिए कई शीर्ष रूपों का समर्थन नहीं करता है। और मोडल फॉर्म डिफ़ॉल्ट रूप से सबसे ऊपर है। लेकिन आपके पास यह शैली आपके स्वयं के रूप में है।

दिमाग में एक निर्णय: अपने मुख्य मुख्य रूप से शीर्ष पर क्लिक करें (कोई दृश्य प्रभाव नहीं), मोडल फॉर्म को कॉल करें, मोडल समाप्त होने पर शीर्षतम शैली को वापस सेट करें।

0

मुझे कुछ समय पहले एक ही समस्या थी। मेरा समाधान Self.BringToFront; को OnShow मोडल फॉर्म की घटना में जोड़ना था।