2011-03-21 5 views
6

डेल्फी 200 9 में, मैं एक साधारण करता हूं:मैं FindDialog को शीर्ष पर रहने से कैसे बचा सकता हूं? डेल्फी)?

FindDialog.Execute; 

FindDialog विंडो मेरे प्रोग्राम की मुख्य विंडो के शीर्ष पर रहती है जैसा इसे करना चाहिए।

हालांकि, अगर मैं अपने प्रोग्राम की विंडो पर किसी अन्य प्रोग्राम से दूसरी विंडो खोलता हूं, तो FindDialog विंडो दूसरी विंडो के शीर्ष पर बनी हुई है।

अगर मैं इसे किसी अन्य प्रोग्राम (जैसे नोटपैड) से FindDialog के साथ आज़माता हूं, तो ऐसा नहीं होता है। नोटपैड पर एक और प्रोग्राम की विंडो खोलना और इसके FindDialog नोटपैड और FindDialog विंडोज़ दोनों को कवर करेगा। यह सही और अपेक्षित व्यवहार प्रतीत होता है।

क्या यह कुछ गलत है या क्या यह डेल्फी ने FindDialog को लागू करने के तरीके में एक समस्या है? क्या नोटपैड तरीके से काम करने के लिए मैं कुछ कर सकता हूं?


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


बहुत रोचक। मेरा PrintDialog शीर्ष पर नहीं रहता है। अभी भी नहीं पता कि मेरा FindDialog क्यों करता है। अभी भी शोध कर रहा है ...


मैंने कॉल को बदल दिया: FindDialog.Execute (हैंडल); अभी भी शीर्ष पर।


मैंने अपने मुख्य रूप में एक और FindDialog (इस बार FindDialog1) जोड़ा और मैं इसे अपने प्रोग्राम के स्टार्टअप पर निष्पादित करता हूं। यह वही रह-ऑन-टॉप व्यवहार है। कम से कम यह इंगित करता है कि मेरे FindDialog या अनुकूलन के साथ ऐसा करने के लिए कुछ भी नहीं था जिसे मैंने इसके साथ किया था। तो यह मेरे मुख्य रूप में एक सेटिंग होना चाहिए।


ऐसा नहीं लगता है कि मैं अकेला हूं जिसने इसका सामना किया है। देखें: Resource Tuner: Version History जो डेल्फी एप्लिकेशन प्रतीत होता है, जहां संस्करण 1.99 के तहत यह कहता है: "बगफिक्स: (खोज) संवाद पूर्वावलोकन विंडो किसी अन्य एप्लिकेशन पर स्विच करते समय शीर्ष पर रुक गई।" मैं उनसे संपर्क करने का प्रयास कर सकता हूं और देख सकता हूं कि उन्हें याद होगा कि उनका क्या फिक्स था।


मैं अपने फॉर्म में कुछ नए संवाद जोड़ता हूं और इन कॉल को एक ही स्थान पर डालता हूं:

FindDialog1.Execute(); 
PrintDialog1.Execute(); 
ReplaceDialog1.Execute(); 
FontDialog1.Execute(); 

FindDialog और ReplaceDialog अन्य विंडो के सामने शीर्ष पर रहता है। PrintDialog और FontDialog शीर्ष पर नहीं रहते हैं और काम करते हैं जैसा कि उन्हें करना चाहिए।

तो संवाद के दो सेटों के बीच क्या अंतर है जो पहले दो को गलत बनाता है?


इसके अलावा, यह समस्या मेरे प्रोग्राम के पुराने संस्करण में होती है जिसे डेल्फी 4 xxx113 के साथ संकलित किया गया था। अब मुझे लगता है कि यह समस्या मेरे पुराने संस्करण में नहीं हुई थी जो डेल्फी 4.

का उपयोग करती थी और यह एक उपयोगकर्ता था जिसने इस समस्या की सूचना दी थी। वह विंडोज एक्सपी का उपयोग करता है, और मैं विस्टा पर विकास कर रहा हूं, इसलिए यह विभिन्न ओएस के तहत होता है।


पुष्टिकरण: हाँ, मैं एक नया रूप बनाता हूं और उस पर एक FindDialog जोड़ता हूं। FindDialog में समस्या नहीं है। यह इंगित करता है कि मेरे प्रोग्राम में कुछ ढूँढें FindDialog को शीर्ष पर रहने का कारण बन रहा है। अब, मुझे यह पता लगाना है कि वह क्या है। कोई और विचार? अगर कोई मुझे जवाब देता है जो मुझे हल करने में मदद करने के लिए मुझे एक सुराग देता है, तो उन्हें स्वीकार्य उत्तर मिल जाएगा।


समाधान: Sertac के उत्तर में उनके जवाब ने मुझे कामकाज दिया:

 Application.NormalizeTopMosts; 
    FindDialog.Execute(); 
    Application.RestoreTopMosts; 

ऐसा करने से FindDialog TopMost होने से रोकता है जब एप्लिकेशन TopMost नहीं होता है।

... लेकिन मैं अभी भी वास्तव में यह नहीं समझता (NormalizeTopMosts पर डेल्फी सहायता) बहुत भ्रमित है और यह इंगित नहीं करता कि इसे ऐसा करना चाहिए।

उम्मीद है कि यह "ठीक" अन्य समस्याओं का कारण नहीं बनता है।

+4

इसे पुन: पेश नहीं कर सकता (डी 200 9 पूरी तरह अद्यतन)। दोनों 'FindDialog1.Execute;' और 'FindDialog1.Execute();' दोनों को दोनों को कोई संभाल नहीं लेना चाहिए। जब ​​मैं ढूँढें संवाद खोलता हूं, तो कुछ अन्य ऐप खोलें (मेरे मामले में नोटपैड) और इसे मेरे ऊपर ले जाएं संवाद के साथ डेल्फी ऐप, इसकी मुख्य विंडो और खोज संवाद दोनों नोटपैड की खिड़की से ढके हुए हैं। –

+1

मैंने यहां कुछ गलत समझा होगा लेकिन मैं डेल्फी एक्सई में पुन: उत्पन्न नहीं कर सकता। –

+2

एफडब्ल्यूआईडब्ल्यू मैं इस व्यवहार को डी 2010 में पुन: उत्पन्न नहीं कर सकता। क्या आप निष्पादन विधि के लिए एक HWND पास कर रहे हैं? यदि मुख्य रूप के हैंडल को पार करने का प्रयास न करें और देखें कि क्या इससे मदद मिलती है। –

उत्तर

3

वीसीएल कोड को देखते हुए, एकमात्र संभव तरीका एक खोज संवाद बॉक्स शीर्ष पर रहता है, 'निष्पादन' कहलाता है, पहले से ही सबसे ऊपर की खिड़की है। इस तरह इसे कोड किया गया है, संवाद का स्वामित्व 'ट्रैडियोधर्मीविंडो' के स्वामित्व में होता है जो एप्लिकेशन में जेड-ऑर्डर में शीर्ष विंडो के स्वामित्व में आता है। यदि यह 'शीर्ष विंडो' एक शीर्ष-सबसे खिड़की है तो खोज संवाद भी है।

procedure TForm1.Button1Click(Sender: TObject); 
var 
    f: TForm; 
begin 
    f := TForm.CreateNew(Self); 
    f.FormStyle := fsStayOnTop; 
    f.Show; 
    FindDialog1.Execute; 
end; 

या,

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    FormStyle := fsStayOnTop; 
    FindDialog1.Execute; 
    FormStyle := fsNormal; 
end; 


ऊपर नमूने एक सर्वोच्च खोजने के संवाद का निर्माण करेगा। लेकिन एक ऑन-टॉप-फॉर्म संभवतः अनजान नहीं होगा, इसलिए मुझे लगता है कि यह आपकी समस्या का स्रोत नहीं होगा।

किसी भी मामले में, यह या तो है या आप किसी अन्य कोड टुकड़े द्वारा संवाद पर शैलियों को बदल रहे हैं।


बीटीडब्ल्यू, FindDialog1.Execute() पर विभिन्न हैंडल पास करने के परीक्षण को परेशान न करें, इसका कोई प्रभाव नहीं पड़ेगा, आपके प्रश्न पर मेरी टिप्पणी देखें।

संपादित करें:

इस एक के बारे में कैसे:

procedure TForm1.Button4Click(Sender: TObject); 
var 
    f: TForm; 
begin 
    f := TForm.CreateNew(Self); 
    f.FormStyle := fsStayOnTop; 
    f.Show; 
    f.Hide; 
    FindDialog1.Execute; 
end; 

बिंदु है, एक खिड़की EnumThreadWindows द्वारा प्रगणित पाने के लिए दिखाई दे सकता है नहीं है। तो कोई भी मौजूदा रहने-ऑन-टॉप फॉर्म इस व्यवहार को प्रदर्शित करने के लिए खोज संवाद का कारण बन सकता है।

बेहतर परीक्षण और अनुमान लगाने के बजाय देखें। अपना पता संवाद लॉन्च करने से पहले नीचे दिए गए परीक्षण को चलाएं। इसमें संवाद को खोजने के लिए तर्क 'dialogs.pas' निष्पादित करता है, और यदि संवाद सबसे ऊपर जाएगा तो अपवाद उठाएगा।

function EnumThreadWndProc(hwnd: HWND; var lParam: LPARAM): Bool; stdcall; 
var 
    Window: TWinControl; 
begin 
    Result := True; 
    Window := FindControl(hwnd); 
    if Assigned(Window) and (Window is TForm) then begin 
    Result := False; 
    lParam := Longint(Window); 
    end; 
end; 

procedure TForm1.Button6Click(Sender: TObject); 
var 
    OnTopForm: Longint; 
begin 
    OnTopForm := 0; 
    EnumThreadWindows(GetCurrentThreadId, @EnumThreadWndProc, LPARAM(@OnTopForm)); 
// if (OnTopForm <> 0) and (TForm(OnTopForm).FormStyle = fsStayOnTop) then 
    if (OnTopForm <> 0) and (GetWindowLong(TForm(OnTopForm).Handle, 
          GWL_EXSTYLE) and WS_EX_TOPMOST = WS_EX_TOPMOST) then 
    raise Exception.Create('darn! got one: ' + TForm(OnTopForm).Name); 
end; 


एक अन्य परीक्षण संवाद शुरू करने से पहले आवेदन की NormalizeTopMosts कॉल करने के लिए हो सकता है, लेकिन मैं कुछ डेल्फी संस्करण इस विधि से टूट गया है और अपना काम नहीं करता है के साथ पता है।

+0

हम्म। मेरे पास 3 रूप हैं जो फॉर्म स्टाइल हैं: = fsStayOnTop, लेकिन ये विशेष फ़ंक्शन फॉर्म (जैसे मेरे बारे में बॉक्स) हैं जो इस समस्या के दौरान अभी तक खोले नहीं गए हैं। आपका जवाब मुझे सोचता है, यद्यपि। धन्यवाद। – lkessler

+0

+1 अच्छा खोज :) – jachguate

+0

NormalizeTopMosts मेरे लिए इसे हल करने लगता है। मेरा संपादित उत्तर देखें। धन्यवाद Sertac !! – lkessler

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

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