2012-03-06 13 views
7

मैंने हाल ही में एक अजीब व्यवहार में ठोकर खाई। जब मैं अपने प्रोग्राम में एक TActionMainMenuBar (या TActionToolBar) का उपयोग करता हूं, संकलित करता हूं और चलाता हूं, और उसके बाद फ़ोटोशॉप सीएस 5 या इंटरनेट एक्सप्लोरर 9 शुरू करता है, तो ActionMainMenuBar (और ActionToolBar) इसकी सभी सेटिंग्स खो देता है। निर्दिष्ट कॉलोमैप में परिभाषित रंग गायब हो जाते हैं और फ़ॉन्ट सेटिंग्स भी खो जाती हैं। क्या किसी ने इसे पहले देखा है और एक कामकाज जानता है?TActionMainMenuBar और TActionToolbar सेटिंग्स खो देते हैं

डी 2007 प्रो (सभी अपडेट लागू), डी 2010 प्रो (सभी अपडेट लागू), Vista होम प्रीमियम 32 बिट, एनवीडिया जीएफओर्स 8600 जीटी, नवीनतम ड्राइवर स्थापित।

कदम पुन: पेश करने:

  1. ड्रॉप एक TActionManager और एक रूप
  2. पर एक TActionMainMenuBar ActionMainMenuBar
  3. को
  4. असाइन TwilightColorMap ActionMainMenuBar पर कुछ मेनू आइटम
  5. खींचें श्रेणी के साथ श्रेणी बनाएं
  6. रन प्रोग्राम
  7. आईई 9 या फ़ोटोशॉप सीएस 5
  8. शुरू करें
  9. घड़ी सभी पूर्वनिर्धारित सेटिंग गायब

आप शुरू करते हैं तो फ़ोटोशॉप या IE पहले और उसके बाद डेल्फी कार्यक्रम (आप प्रभाव देखने के लिए फिर से IE9 बंद करने के लिए किया है), कुछ नहीं होता। आईडीई में डिज़ाइन मोड में जब बग भी मौजूद होता है। एक साथी डेवलपर ने पहले से ही Win7 प्रो 32 बिट और एक अति Radeon 9800 प्रो के साथ अपने सिस्टम के लिए वर्णित व्यवहार की पुष्टि कर दी है।

कोई टिप्पणी/समाधान

के लिए Thx

फिल

पुनश्च: का उपयोग फ़ोटोशॉप CS3 इस बग का उत्पादन नहीं करता

+1

आउच, सबसे अधिक संभावना रजिस्ट्री सेटिंग ... रजिस्ट्री के लिए स्रोत कोड खोजने का प्रयास करें, देखें कि "सेव/लोड" कार्यान्वयन कहां है और एक वर्कअराउंड ... – ComputerSaysNo

+0

जब आप कहते हैं कि आपका ActionMainMenuBar 'इसकी सभी सेटिंग्स खो देता है 'क्या आप संपत्ति सेटिंग्स या छवियों या घटना हैंडलर या कुछ और का जिक्र कर रहे हैं? –

+0

यह अपनी संपत्ति सेटिंग्स खो रहा है - इस मामले में रंग जो रंगरूप और फ़ॉन्ट सेटिंग्स में परिभाषित हैं। – Phil

उत्तर

7

यहाँ समस्या उत्पन्न होने से एक अन्य तरीका है:

  • पूरा प्रश्न के रूप में चरण 1 से 4 (एक ट्वाइलाइट कॉलरमैप छोड़ने सहित)।
  • अपने क्लिक हैंडलर में कोड  Perform(WM_SETTINGCHANGE, 0, 0); कोड के साथ फ़ॉर्म में एक बटन जोड़ें।
  • एप्लिकेशन चलाएं और बटन दबाएं।


तो अब हम जानते हैं कि एक WM_SETTINGCHANGE प्रसारण समस्या का कारण हो सकता है, हम आश्चर्य हो सकता है अगर शुरू करने आईई ही पैदा करता है:

type 
    TForm1 = class(TForm) 
    .. 
    protected 
    procedure WMSettingChange(var Message: TWMSettingChange); 
     message WM_SETTINGCHANGE; 
    .. 

procedure TForm1.WMSettingChange(var Message: TWMSettingChange); 
begin 
    Memo1.Lines.Add(IntToHex(Message.Flag, 4) + ', ' + Message.Section); 
    inherited; 
end; 

हम अपने एप्लिकेशन को चलाने के लिए और फिर आईई, कुछ का शुभारंभ करने के बाद सेकंड बाद नीचे ज्ञापन में प्रकट होता है:

0000, सॉफ्टवेयर \ Microsoft \ इंटरनेट एक्सप्लोरर \ SearchScopes

मुझे नहीं पता कि आईई को प्रत्येक प्रक्षेपण में हमारे फॉर्म (और अन्य सभी शीर्ष-स्तरीय विंडोज़) को क्या कहना है, और मुझे नहीं पता कि यह पृथ्वी पर हर विंडोज़ बॉक्स पर या सिर्फ आपका और मेरा है , लेकिन स्पष्ट रूप से ActionMainMenuBar इसे संभालने में कोई अच्छा नहीं है।


WM_WININICHANGE प्राप्त करने वाला एक जीत नियंत्रण (फॉर्म), CM_WININICHANGE प्राप्त करता है और इसे प्राप्त करने पर इसे अपने सभी नियंत्रणों में प्रसारित करता है। नीचे कैसे यह मेनू पट्टी द्वारा नियंत्रित किया जाता है:

procedure TCustomActionMainMenuBar.CMWininichange(var Message: TWMWinIniChange); 
begin 
    inherited; 
    RequestAlign; 
    Font.Assign(Screen.MenuFont); 
end; 

सोच संदेश में एक 'WindowsThemeElement' या 'WindowMetrics' अनुभाग के लिए कि प्रणाली मेनू फॉन्ट बदल दिए गए हैं सकता है (कोड देखा जाना चाहिए था लेकिन वैसे भी ..), इसे ताज़ा Screen.MenuFont से पुनः सौंपा गया है। समस्या यह है कि, हम इसका बिल्कुल उपयोग नहीं कर रहे थे।

अतिरिक्त रूप से ColorMap 10 को कॉल करके अपने रंगों को रीसेट करके CM_WININICHANGE पर प्रतिक्रिया देता है। यह भी documented है:

UpdateColors कहा जाता है स्वचालित रूप से जब एक ActionBand घटक एक CM_WININICHANGE संदेश प्राप्त करता है।


तो समाधान क्या करना है तय करने और दोनों व्यवहार अधिभावी शामिल होगा, मैं के लिए क्यों मुझे विश्वास है कि यह सही समाधान किया जाएगा नीचे समाधान टिप्पणी करने का प्रयास:

type 
    // Derive your own ColorMap that would reset its own colors. 
    // This is an interposer for simplicity.. 
    TTwilightColorMap = class(actncolormaps.TTwilightColorMap) 
    public 
    procedure UpdateColors; override; 
    published 
    property Color default clGreen; 
    property FontColor default clYellow; 
    property MenuColor default $4488FF; 
    // reintroduce as many property as necessary, probably all is necessary.. 
    end; 

    TForm1 = class(TForm) 
    .. 
    private 
    FSaveMenuFont: TFont; // will hold initial main menu bar's font settings 
    protected 
    procedure WMSettingChange(var Message: TWMSettingChange); 
     message WM_SETTINGCHANGE; 
    end; 

.. 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    FSaveMenuFont := TFont.Create; 
    FSaveMenuFont.Assign(ActionMainMenuBar1.Font); 
end; 

procedure TForm1.FormDestroy(Sender: TObject); 
begin 
    FSaveMenuFont.Destroy; 
end; 

procedure TForm1.WMSettingChange(var Message: TWMSettingChange); 
begin 
    inherited; 
    // The below are the *section*s that really changing system settings 
    // would notify that I'm aware of, there may be more... 
    if (Message.Section <> 'WindowsThemeElement') 
     or (Message.Section <> 'WindowMetrics') then 
    ActionMainMenuBar1.Font.Assign(FSaveMenuFont) 
    else 
    // Develop your logic here. The system menu font might really have been 
    // changed. You can get it from Screen.MenuFont. But then if we had been 
    // using the system font, the control already applies the change by default. 

end; 

procedure TTwilightColorMap.UpdateColors; 
begin 
    inherited; 
    // Reset your colors, note that system colors might have been 
    // changed or not. If changed, they should be reflected in 'cl..' constants. 
    Color := clGreen; 
    FontColor := clYellow; 
    MenuColor := $4488FF; 
end; 
+1

+1। अच्छा जासूस काम, और अच्छी तरह से लिखित उत्तर। :) –

+1

धन्यवाद @ केन। जहां तक ​​मैं यह कह सकता हूं कि यह व्यापक रूप से उपयोगी नहीं होगा, क्योंकि कलरमैप व्यापक रूप से उपयोग नहीं किया जाता है। लेकिन यह मजेदार था :)। –

+0

आप कभी नहीं बता सकते ... अभी भी बहुत सारे लोग डी 7 और 2007 का उपयोग कर रहे हैं जिनके पास वीसीएल शैलियों तक पहुंच नहीं है जो उनका उपयोग कर सकते हैं। अभी भी समस्या का पता लगाने के लिए एक अच्छी नौकरी। :) –

3

यह मिला ! समस्या यह थी कि ActionMainMenuBar1 की Colormap प्रॉपर्टी को ActionMainMenuBar1 पर रीसेट किया जाता है। प्रत्येक बार IE9 या फ़ोटोशॉप CS5 प्रारंभ/बंद हो जाता है। मैं सर्टैक के समाधान को एक उत्तर के रूप में स्वीकार करूंगा क्योंकि इसने मुझे इस मुद्दे को हल करने के लिए सही दिशा में इंगित किया था।

यहां अंतिम कोड है। यह आईई 9 और फ़ोटोशॉप सीएस 5 दोनों के साथ निर्दोष रूप से काम करता है (जहां तक ​​मैं कह सकता हूं)।

unit Unit1; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, ActnMan, ActnColorMaps, ActnList, ToolWin, ActnCtrls, ActnMenus, 
    StdCtrls; 


type 
    TForm1 = class(TForm) 
    ActionManager1: TActionManager; 
    ActionMainMenuBar1: TActionMainMenuBar; 
    Action1: TAction; 
    Action2: TAction; 
    Action3: TAction; 
    Action4: TAction; 
    TwilightColorMap1: TTwilightColorMap; 
    Memo1: TMemo; 
    procedure FormCreate(Sender: TObject); 
    procedure FormDestroy(Sender: TObject); 
    procedure ActionMainMenuBar1GetControlClass(Sender: TCustomActionBar; 
     AnItem: TActionClient; var ControlClass: TCustomActionControlClass); 
    protected 
    procedure WMSettingChange(var Message: TWMSettingChange); message WM_SETTINGCHANGE; 
    private 
    { Private declarations } 
    FSaveMenuFont: TFont; // will hold initial main menu bar's font settings 
    FSaveColormap: TTwilightColormap; 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 


// Fixing paint issue when IE9 was run and closed again 

procedure TForm1.ActionMainMenuBar1GetControlClass(Sender: TCustomActionBar; 
    AnItem: TActionClient; var ControlClass: TCustomActionControlClass); 
begin 
    ActionMainMenuBar1.ColorMap.Assign(FSaveColormap); 
end; 


procedure TForm1.FormCreate(Sender: TObject); 
begin 
    FSaveMenuFont := TFont.Create; 
    FSaveMenuFont.Assign(ActionMainMenuBar1.Font); 
    FSaveColormap := TTwilightColormap.Create(Self); 
    FSaveColormap.Assign(ActionMainMenuBar1.Colormap); 
end; 


procedure TForm1.FormDestroy(Sender: TObject); 
begin 
    FSaveMenuFont.Destroy; 
    FSaveColormap.Destroy; 
end; 


procedure TForm1.WMSettingChange(var Message: TWMSettingChange); 
begin 
    inherited; 
    // Memo1.Lines.Add(IntToHex(Message.Flag, 4) + ', ' + Message.Section); 
    ActionMainMenuBar1.Font.Assign(FSaveMenuFont); 
    // In case Photoshop CS5 was run and closed before 
    ActionMainMenuBar1.ColorMap.Assign(FSaveColormap); 
end; 

end. 

आपकी मदद के लिए सभी को धन्यवाद।

+0

खुशी है कि आपने इसे हल किया है :) और आपके समाधान को पोस्ट करने के लिए धन्यवाद। –

+0

मैं अंत में आईई 9 और फ़ोटोशॉप सीएस 5 दोनों के लिए पेंट समस्या को ठीक करने में कामयाब रहा। कृपया ऊपर अद्यतन कोड देखें। धन्यवाद। – Phil

+0

अब GetControlClass अनावश्यक नहीं है? –

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