2015-12-17 17 views
7

मैं डेल्फी XE6 में एक TSaveDialog उपयोग करने के लिए कोशिश कर रहा हूँ शैलियों के साथ विफल रहता है:TSaveDialog ग्राहक दृश्य अक्षम

if not SaveDialog1.Execute(0) then 
    Exit; 

कॉल तुरंत झूठी देता है, किसी भी संवाद प्रदर्शित किए बिना। मैं इसे खोल सहेजें संवाद COM वस्तु बनाने का कार्य करने के लिए नीचे का पता लगाया:

function TCustomFileSaveDialog.CreateFileDialog: IFileDialog; 
var 
     LGuid: TGUID; 
begin 
    LGuid := CLSID_FileSaveDialog; 

    CoCreateInstance(LGuid, nil, CLSCTX_INPROC_SERVER, 
    StringToGUID(SID_IFileSaveDialog), Result); 
end; 

CoCreateInstance करने के लिए कॉल विफल हो रहा है।

0x80040111: ClassFactory अनुरोध किया वर्ग की आपूर्ति नहीं कर सकते, ClassID: {C0B4E2F3-BA21-4773-8DBA-335EC946EB8B

procedure TForm1.Button1Click(Sender: TObject); 
const 
    CLSID_FileSaveDialog: TGUID = '{C0B4E2F3-BA21-4773-8DBA-335EC946EB8B}'; 
begin 
    CreateComObject(CLSID_FileSaveDialog); 
end; 

यह EOleSysError अपवाद फेंकता है: मैं इस मुद्दे को पुन: पेश करने में कम से कम कोड बनाया }

मेरा आवेदन आम नियंत्रण पुस्तकालय (6.0.7601.18837) के संस्करण 6 का उपयोग कर रहा है, लेकिन मैं केवल happe यह महसूस किया एनएस उपयोगकर्ता अपने आवेदन के लिए दृश्य शैलियों को अक्षम कर दिया है, तो:

enter image description here

हम अभी भी आम नियंत्रण पुस्तकालय के 6 संस्करण का उपयोग कर रहे, सिर्फ इतना है कि IsAppThemed रिटर्न झूठी।

नोट: मुझे पता है बहुत से लोगों को गलती से कि विश्वास करते हैं:

  • दृश्य शैलियाँ एपीआई ही काम करता है अगर हम Comctrl32.dll के संस्करण 6 लोड
  • तो Comctrl32 के 6 संस्करण है। dll लोड किया जाता है, तो दृश्य शैलियाँ एपीआई
  • हम ComCtrl v6 तो उपयोग नहीं कर रहे हैं काम करेंगे मतलब है कि अगर हम प्रयोग कर रहे हैं दृश्य शैलियाँ विकलांग
  • दृश्य शैलियाँ विकलांग हैं पुराने आम नियंत्रण पुस्तकालय

जानवर बल समाधान वैश्विक UseLatestCommonDialogs गलत पर स्थापित करने के लिए है।

लेकिन वह, बहुत बुरा है, क्योंकि यह केवल जो लोग अपने आवेदन में विकलांग दृश्य शैलियों के लिए लागू होता है:

  • संवाद दृश्य शैलियों के बिना ओएस पर काम जारी (जैसे Windows Server 2008 R2)
  • संवाद के साथ दृश्य शैलियों बंद कर दिया (जैसे विंडोज 7 दृश्य शैलियों के साथ बंद कर दिया) काम करने के लिए

इसका मतलब यह है कि मैं बस, IsAppThemed उपयोग नहीं कर सकते के रूप में वह भी झूठी लौटाता है यदि IsThemeActive गलत है जारी है।

| IsThemeActive | IsAppThemed | Disable visual styles | Result | 
|---------------|-------------|-----------------------|-----------| 
| True   | True  | Unchecked    | Works  | 
| True   | False  | Checked    | Fails  | 
| False   | False  | Unchecked    | Works  | 
| False   | False  | Checked    | Fails  | 

क्या मैं लगता है कि मैं पूछ रहा हूँ कैसे disble दृश्य शैलियाँ compat ध्वज की स्थिति की जांच करने के लिए है।

मैं वास्तव में क्या पूछ रहा हूं कि TSaveDialog डेल्फी में सही तरीके से काम करने के लिए कैसे है (बिना यह बताए कि कंपैट ध्वज को पढ़ने का समाधान समाधान का हिस्सा है)।

+0

मुझे आशा है कि यह एक प्रश्न भी नहीं पहुंचाएगा, लेकिन क्यों "SaveDialog1.Execute (0)" और अधिक सामान्य "SaveDialog1.Execute" क्यों नहीं? – MartynA

+0

@MartynA वैसे इसके लिए तीन कारण हैं i) '.xecute' कोड अंतर्दृष्टि में दिखाई नहीं देता है ii) 'Execute' को कॉल करने से विंडो को 'ApplicationMainHandle' iii' के स्वामित्व का कारण बनता है) वास्तव में मैं संवाद चाहता हूं जिस फॉर्म को मैं देख रहा हूं उसका स्वामित्व (उदाहरण के लिए 'SaveDialog1.Execute (Self.Handle) ')। लेकिन मैं नहीं चाहता था कि लोग 'निष्पादन' पर पारित पैरामीटर पर ध्यान केंद्रित करें, इसलिए मैंने इसे 'निष्पादित (0)' तक सरल बना दिया। हकीकत में, डेल्फी की खिड़की के स्वामित्व को तोड़ दिया गया है, और उसने मालिक को नजरअंदाज कर दिया - इसके बजाय जो कुछ भी आगे चाहता है उसे लाया। –

+0

इस स्वीकृत उत्तर को ध्यान में रखते हुए: http://superuser.com/questions/694734/what-does-compatibility-option-disable-visual-themes-do यह जांचना उचित है ['IsCompositionActive'] (https: // msdn.microsoft.com/en-us/library/windows/desktop/bb759811(v=vs.85).aspx) भी? बस एक अनुमान – fantaghirocco

उत्तर

5

आप निश्चित रूप से कंपैट ध्वज के लिए परीक्षण नहीं करना चाहते हैं। यदि आप परीक्षण करने जा रहे हैं, तो आप परीक्षण करना चाहते हैं कि ध्वज नियंत्रण क्या है। इस मामले में विषयों का उपयोग किया जा रहा है या नहीं।

IsWindowsVistaOrGreater and Winapi.UxTheme.InitThemeLibrary and Winapi.UxTheme.UseThemes 

नहीं तो आप पुराने XP शैली संवाद उपयोग करने की आवश्यकता: आप की तरह है कि तब आप Vista शैली संवाद का उपयोग करना चाहिए निम्न स्थिति में परीक्षण करने के लिए जा रहे हैं। आप इस निम्न कोड के साथ ऐसा कर सकते हैं:

UseLatestCommonDialogs := IsWindowsVistaOrGreater and Winapi.UxTheme.InitThemeLibrary 
    and Winapi.UxTheme.UseThemes; 

हालांकि इस के साथ समस्या यह है कि आप नए शैली संवाद को निष्क्रिय कर देगा जब उपयोगकर्ता विंडोज क्लासिक थीम के साथ चल रहा है है। जो मुझे यकीन है कि आप नहीं चाहते हैं।

तो आप एक कार्यक्षमता आधारित दृष्टिकोण ले सकते हैं। नया विफल होने पर नए शैली के संवाद और पुराने स्टाइल संवाद पर फ़ॉलबैक का उपयोग करने का प्रयास किया जाता है। तो, IFileSaveDialog बनाने का प्रयास करें। सफल होने पर या नहीं, इस पर आधारित UseLatestCommonDialogs असाइन करें।


दूसरी ओर, यह कंपैट सेटिंग उन अनुप्रयोगों पर उपयोग की जानी है जो थीम सक्षम होने पर सही ढंग से काम नहीं करते हैं। आपका एप्लिकेशन थीम के तहत सही तरीके से काम करता है और मुझे लगता है कि यह आपके लिए यह कहने के लिए पूरी तरह से उचित है कि आपका एप्लिकेशन उस विशेष कंपैट मोड का समर्थन नहीं करता है।

आपको संगतता मोड का समर्थन करने की उम्मीद नहीं है। उदाहरण के लिए, यदि आप XP का समर्थन करना बंद करते हैं, तो आपको XP compat shims का समर्थन करने की उम्मीद नहीं की जाएगी।

प्रतिबिंब पर यह मेरी सलाह है। बस कुछ भी नहीं करो। यदि आपके उपयोगकर्ता आपके ऐप को इस तरह विफल होने के बारे में पूछते हैं, तो उन्हें बताएं कि आप उस कंपैट मोड का समर्थन नहीं करते हैं। अपने आवेदन समर्थन संगतता मोड बनाने के लिए यह आपका काम नहीं है।

+0

अजीबता यह है कि ऐसे समय होते हैं जब 'IsWindowsVistaOrGreater और InitThemeLibrary और UseThemes' झूठी वापसी करेंगे, लेकिन नए संवादों का उपयोग करने के लिए यह सही और सही है। –

+1

मेरी इच्छा है कि Embarcadero 'IFileDialog' का उपयोग करने के लिए या नहीं, यह तय करने से पहले एम्बरकेडरो 'ओपन-दर्जन बेकार चेक' के साथ आधे दर्जन बेकार चेक के साथ 'टोपेनडियलॉग'/'टीएसवीडियलॉग' को छेड़छाड़ करना बंद कर देगा। प्रत्येक रिलीज में अधिक चेक जोड़ना प्रतीत होता है।या तो 'IFileDialog' उपलब्ध है या यह नहीं है, ओएस को तय करने दें। यदि 'UseLatestCommonDialogs' सत्य है तो' IFileDialog' लोड करने का प्रयास करें और यदि यह विफल हो जाता है तो पुराने संवाद में फ़ॉलबैक हो जाता है। किया हुआ। लेकिन वे ऐसा नहीं करना चाहते हैं। –

+0

@Remy मैंने शुरुआत में उस दृश्य बिंदु को साझा किया। लेकिन अब मैं सोच रहा हूं कि हमें पूर्व एक्सपी ऐप्स के लिए एक कंपैट मोड का समर्थन क्यों करना होगा। अब मुझे लगता है कि हमारे आधुनिक ऐप्स में ऐसे तरीकों के बारे में चिंता न करने के लिए यह उचित है। –

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