यहाँ समस्या उत्पन्न होने से एक अन्य तरीका है:
- पूरा प्रश्न के रूप में चरण 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;
आउच, सबसे अधिक संभावना रजिस्ट्री सेटिंग ... रजिस्ट्री के लिए स्रोत कोड खोजने का प्रयास करें, देखें कि "सेव/लोड" कार्यान्वयन कहां है और एक वर्कअराउंड ... – ComputerSaysNo
जब आप कहते हैं कि आपका ActionMainMenuBar 'इसकी सभी सेटिंग्स खो देता है 'क्या आप संपत्ति सेटिंग्स या छवियों या घटना हैंडलर या कुछ और का जिक्र कर रहे हैं? –
यह अपनी संपत्ति सेटिंग्स खो रहा है - इस मामले में रंग जो रंगरूप और फ़ॉन्ट सेटिंग्स में परिभाषित हैं। – Phil