2010-06-08 8 views
13

विंडोज 98 युग के कई बार हमने अनुभव किया है कि कुछ संवाद अपने जेड-ऑर्डर को खो देते हैं और पहले फॉर्म पर वापस जाते हैं।डेल्फी - फॉर्म/MsgBoxes को पूर्व फ़ॉर्म के अंतर्गत जाने के लिए कैसे रोकें?

उदाहरण के लिए:

Dialog1.ShowModal; 

Dialog1.OnClickButton() : ShowMessage('anything'); 

जब MessageBox प्रकट होता है, यह कभी कभी ध्यान केंद्रित नहीं है और Dialog1 के तहत ले जाया जाता है। उपयोगकर्ता इसके बारे में उलझन में हैं, वे कहते हैं: मेरा आवेदन जम गया !!! लेकिन यदि वे किसी अन्य ऐप पर वापस जाने के लिए Alt + Tab का उपयोग करते हैं, तो फोकस संदेशबॉक्स पर वापस आ जाता है और यह अग्रभूमि विंडो होगी।

हमने शोमेसेज, संदेशबॉक्स, सामान्य रूपों और क्विकरपोर्ट फ़ॉर्म के साथ इसका अनुभव किया है।

क्या किसी को इसके बारे में पता है? क्या यह एक विंडोज बग है? आप इसे कैसे रोक सकते हैं? इसे कैसे पकड़ें?

आपकी मदद के लिए धन्यवाद: dd


मैं वास्तव में कहा कि Win98 के बाद, इसलिए सभी OS के (Win7 भी) इस समस्या से प्रभावित कर रहे हैं। हमने डेल्फी 6 प्रोफेसर का उपयोग किया, इसलिए गुण डिफ़ॉल्ट रूपों के साथ काम नहीं कर रहे हैं।

किसी ने कहा कि संदेश संवाद संदेशबॉक्स + MB_APPLMODAL के साथ नियंत्रित हैं। यह अच्छी खबर है, लेकिन हमारे पास कई पुराने रूप और घटक हैं, तीसरे पक्ष के उपकरण हैं।

तो फॉर्मों के प्रतिस्थापन के साथ पूरी तरह से नया आवेदन करने के लिए कड़ी मेहनत है।

लेकिन हम इसे करने का प्रयास करेंगे।

मुझे लगता है कि जवाब यह आधा अनुप्रयोग समस्या है और आधे विंडोज़ समस्या है। यदि विंडोज कभी-कभी इसे संभालता है, और कभी-कभी ऐसा नहीं होता - ऐसा लगता है कि यह एक विंडोज बग है। लेकिन अगर हम अच्छी मोडल विंडो बनाने के लिए मजबूर कर सकते हैं तो यह एक प्रोग्रामिंग बग है।

क्या कोई मुझे बता सकता है कि WS_POPUP ध्वज का अर्थ क्या है? क्या इसका कुछ दुष्प्रभाव है या नहीं?

धन्यवाद: dd

+0

मुझे अक्सर यह समस्या भी है, मुझे कोई जवाब नहीं मिला है। लोगों के साथ आने के लिए तत्पर हैं। –

+0

यह किस संस्करण के साथ हो रहा है? –

+0

आप विंडोज 98 हैं? वाह। जैसा कि सर्टैक पूछता है, डेल्फी का संस्करण महत्वपूर्ण है। डेल्फी 2007 और बाद में एक कामकाज है। –

उत्तर

13

है यही कारण है कि PopupMode and PopupParent properties के लिए कर रहे हैं।

जैसे, आप कर सकते हैं:

Dialog1.PopupMode := pmExplicit; 
Dialog1.PopupParent := self; 
Dialog1.ShowModal; 

यह विंडोज सही जेड आदेश बताता है।

+0

वाह, [इस पर प्रलेखन] (http://docwiki.embarcadero.com/VCL/en/Forms.TForm.PopupMode) बिल्कुल सहायक नहीं है! लेकिन कोशिश करो; यह काम करता हैं! –

+1

@ क्रैग - शोमेसेज, संदेशबॉक्स और अपवाद संदेशों के साथ मदद नहीं करेगा .. –

+0

@Sertac, वे नियमित विंडो के आसपास सुविधा कार्य हैं। आप 'Application.OnException' को संभालने के द्वारा कस्टम अपवाद संदेश कर सकते हैं। इसी प्रकार, यदि आपको एक अनुकूलित 'शोमेसेज' की आवश्यकता है, तो आप एक लिख सकते हैं। –

6

डेल्फी (पूर्व डेल्फी 2007 तक) के पुराने संस्करणों, अपने मुख्य रूप से अन्य रूपों पर के लिए:

Application.MessageBox(PChar(amessage), PChar(atitle), otherflags or MB_TOPMOST); 
+0

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

0

मैं को देखा:

interface 
    TMyForm = Class(TForm) 
    protected 
    procedure CreateParams(var Para: TCreateParams); override; 
    end; 
... 
implementation 
... 
procedure TMyForm.CreateParams(var Para: TCreateParams); 
begin 
    inherited; 
    Para.Style := Para.Style or WS_POPUP; 
    { WinXP Window manager requires this for proper Z-Ordering } 
    // Para.WndParent:=GetActiveWindow; 
    Para.WndParent := Application.MainForm.Handle; 
end; 

संदेश बॉक्स के लिए अपने झंडे में MB_TOPMOST शामिल इस पृष्ठ और आधे घंटे के लिए अक्सर पूछे जाने वाले प्रश्न और अभी भी कोई टिप्पणी पोस्ट करने का तरीका नहीं मिल रहा है, इसलिए प्रोटोकॉल के इस उल्लंघन के लिए मुझे क्षमा करें।

सब मैं स्पष्ट कर दिया कि पोस्टर, IMHO, विंडोज 98. का उपयोग नहीं कर रहा है वे लिखते हैं करना चाहते हैं की

पहले "के बाद विंडोज 98 युग" जो मुझे समझ में मतलब है कि वह 98.

के बाद विंडोज संस्करणों के साथ इस समस्या हो रही है

जैसा कि मुझे यह समस्या भी है (सीबी 200 9), मैं पोस्टर के सवाल पर जोर देना चाहता हूं "क्या यह विंडोज बग है?", जिसे मैंने उत्तर नहीं दिया है। यदि यह डेल्फी/बिल्डर बग है, तो शायद इससे बचने का कोई तरीका है? मैं नहीं देख सकता कि सभी संभावित संवादों को कैसे रोकना एक व्यावहारिक समाधान है, न ही fsStayOnTop का उपयोग करने से बचें। मेरे पास एक सेटिंग फॉर्म है जिसे मेरे मुख्य रूप के शीर्ष पर रहने की आवश्यकता है, लेकिन सेटिंग फॉर्म पॉपअप डायलॉग कर सकता है और कुछ शर्तों के तहत सेटिंग फॉर्म के तहत गायब हो जाएगा।

यदि मैं समझूंगा कि ज़ेड-ऑर्डर का समर्थन गलत कहां है, तो यह बहुत उपयोगी होगा, क्योंकि इससे बचने के तरीके पर एक सुराग प्रदान किया जा सकता है।

SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or 
    WS_EX_APPWINDOW or WS_EX_TOPMOST); 
SetWindowLong(Handle, GWL_HWNDPARENT, GetDesktopWindow); 

हैंडल प्रपत्र (Form1.Handle) के हत्थे है:

+0

यह एक विंडोज़ बग है, इस अर्थ में, कि आपके रूपों का ज़ेड-ऑर्डर Windows XP में विंडोज़ आंतरिक "विंडो मैनेजर" के आर्किटेक्चर द्वारा संरक्षित नहीं है, एक निश्चित बिंदु के बाद। यह एक विंडोज़ बग नहीं है, इस अर्थ में कि विंडोज एपीआई स्वयं गारंटी नहीं देता है कि यह किसी विशेष प्रकार के जेड-ऑर्डर को याद रखेगा, जब तक कि आपने CreateParams का उपयोग करके अपने पैरेंट-विंडो लिंक सही तरीके से सेट नहीं किए हैं (जैसा कि मैंने दिखाया है मेरे जवाब में)। –

+0

संयोग से आप वास्तव में कोई भी पाठ (संभावित रूप से ग्रे) या "टिप्पणी जोड़ें" लेबल वाले बटन को नहीं देख सकते हैं? –

+0

हाँ, लेकिन केवल अपनी पोस्ट के लिए। शायद किसी को केवल अन्य पदों पर टिप्पणी करने की इजाजत है यदि किसी के पास पर्याप्त अंक हैं, लेकिन फिर मैं एक उत्तर पोस्ट कर सकता हूं .. तो मुझे इसमें तर्क दिखाई नहीं देता है। न ही यह बग बीटीडब्ल्यू क्यों मौजूद है, यह सही पाने के लिए काफी आसान लगता है। –

0

एक चाल मैं का उपयोग किया है हाल ही में प्रत्येक प्रपत्र के निर्माण के दौरान कोड की इन दो पंक्तियों लागू किया गया था। WS_EX_APPWINDOW भाग प्रत्येक विंडो को टास्क बार पर दिखाई देता है, अगर आप उस अतिरिक्त प्रभाव को नहीं चाहते हैं तो इसे हटा दें।

SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or 
    WS_EX_TOPMOST); 

मैं भी अपने कस्टम संवाद (- त्रुटि, पुष्टि, आदि मैं संवाद से प्रत्येक शैली के लिए एक नया कार्य बनाया) निर्माण में मदद करने के लिए इस समारोह का उपयोग करें:

मेरी मुख्य रूप से मैं इस लाइन का उपयोग :

function CustomDlg(const AMessage : string; const ADlgType: TMsgDlgType; 
    const AButtons: TMsgDlgButtons; const ADefaultButton: TMsgDlgBtn) : TForm; 
begin 
    Result := CreateMessageDialog(AMessage, ADlgType, AButtons, ADefaultButton); 
    with Result do 
    begin 
     SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or 
     WS_EX_APPWINDOW or WS_EX_TOPMOST); 
     SetWindowLong(Handle, GWL_HWNDPARENT, GetDesktopwindow); 
     FormStyle := fsStayOnTop; 
     BringToFront; 
    end; 
end; 

FormStyle := fsStayOnTop; हिस्सा है, वैकल्पिक पाठ्यक्रम के है, लेकिन मैं इसका इस्तेमाल यकीन है कि मेरे पुष्टि और त्रुटि संवाद हमेशा उपयोगकर्ता के लिए दिखाई दे रहे हैं बनाने के लिए।

ऐसा लगता है कि यह थोड़ा सा काम है लेकिन शुद्ध प्रभाव यह है कि अब मुझे अन्य रूपों के पीछे गलती से छिपाने वाले फॉर्मों के बारे में चिंता करने की ज़रूरत नहीं है।

+0

मुझे इसे 'SetWindowLong()' फ़ंक्शन के साथ जोड़ना चाहिए, आपको अपने स्वयं के कस्टम फॉर्म बनाने की आवश्यकता नहीं है और यह आपके पास मौजूद किसी भी मौजूदा रूप में कर सकता है। यदि आप पहले से ही कस्टम फॉर्म बना रहे हैं तो 'CreateParams()' को ओवरराइड करने का तरीका है। –

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