- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近偶然发现了一种非常奇怪的行为。当我在程序中使用 TActionMainMenuBar(或 TActionToolBar)、编译并运行,然后启动 Photoshop CS5 或 Internet Explorer 9 时,ActionMainMenuBar(和 ActionToolBar)会丢失其所有设置。指定颜色图中定义的颜色消失,字体设置也丢失。有人以前见过这个并知道解决方法吗?
D2007 Pro(应用所有更新)、D2010 Pro(应用所有更新)、Vista Home Premium 32 位、NVidia GForce 8600 GT,已安装最新驱动程序。
重现步骤:
如果先启动 Photoshop 或 IE,然后再启动 Delphi 程序,则不会发生任何情况。在 IDE 的设计模式下也存在该错误。一位开发人员同事已经通过 Win7 Pro 32 位和 ATI Radeon 9800 Pro 确认了他的系统所描述的行为。
感谢任何评论/解决方案
菲尔
PS:使用 Photoshop CS3 不会产生此错误
最佳答案
这是重现问题的另一种方法:
Perform(WM_SETTINGCHANGE, 0, 0);
将按钮添加到表单中在其点击处理程序中。
现在我们知道 WM_SETTINGCHANGE
广播可能是导致问题的原因,我们可能想知道启动 IE 是否会产生相同的结果:
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;
运行应用程序并启动 IE 后,几秒钟后,备忘录中将显示以下内容:
0000, Software\Microsoft\Internet Explorer\SearchScopes
我不知道每次启动时 IE 都会对我们的表单(以及所有其他顶级窗口)说些什么,而且我不知道它是否在地球上的每个 Windows 盒子上或只是你和我的 Windows 盒子上都这样做,但显然 ActionMainMenuBar
不擅长处理它。
一个win控件(表单),接收WM_WININICHANGE
,执行CM_WININICHANGE
并在收到后向其所有控件广播相同的内容。下面是菜单栏的处理方式:
procedure TCustomActionMainMenuBar.CMWininichange(var Message: TWMWinIniChange);
begin
inherited;
RequestAlign;
Font.Assign(Screen.MenuFont);
end;
认为系统菜单字体可能已更改(代码应该在消息中查找“WindowsThemeElement”或“WindowMetrics”部分,但无论如何..),它是从刷新的 Screen.MenuFont
重新分配的。 。问题是,我们并没有完全使用它。
此外,ColorMap 响应 CM_WININICHANGE
通过调用 UpdateColors
重置其颜色方法。这甚至是documented :
<小时/>因此,解决方案将涉及决定要做什么并覆盖这两种行为,我尝试评论以下解决方案,以了解为什么我相信这将是正确的解决方案:UpdateColors is called automatically when an ActionBand component receives a CM_WININICHANGE message.
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;
关于delphi - TActionMainMenuBar 和 TActionToolbar 丢失设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9577540/
我正在尝试通过创建派生自该组件的自己的组件来扩展 TActionMainMenuBar。 我想做的一件事是允许沿着菜单栏绘制渐变。我已经设法做到了这一点,但当分配的 TActionManager 设置
使用TActionMainMenuBar时,有没有办法将Actions组件和子菜单从右向左对齐? 改变比迪烟似乎没有改变 将 Bidiparent 设置为 false 没有帮助 将 Align 更改为
我希望从我的应用程序中可以选择切换主菜单的显示。 仍然可以通过工具栏等使用功能,因此隐藏菜单不会带走任何内容。隐藏菜单实际上是用户的一个 GUI 选择。 无论如何,我的主菜单是使用 TActionMe
我一直在开发一个 VCL 程序,并且正在添加用于放置列出一组文件的“最近文件”下拉子菜单的代码。对于这个程序,我填充了 tActionManager 和 tActionMainMenuBar。在标准
我使用 TActionMainMenuBar 来显示基于 TActions 的菜单。我通过设置相同的 GroupIndex 对操作进行分组。因此它们可以像 RadioGroup 一样操作,但问题是绘制
我有一个带有主表单的应用程序。在此表单中,我放置了三个 TActionMainMenuBar,因为应用程序本质上以三种不同的模式运行。 菜单栏都是由主窗体上的 TActionManager 中存储(代
TActionMainMenuBar 在绘制没有子项的根元素时存在错误。 使用Delphi XE2/w7-32位** 如何重现: 使用 TActionMainMenuBar 构建菜单,向其中添加一些操
我最近偶然发现了一种非常奇怪的行为。当我在程序中使用 TActionMainMenuBar(或 TActionToolBar)、编译并运行,然后启动 Photoshop CS5 或 Internet
我需要帮助尝试让 & 字符显示在 Delphi XE6 VCL TActionMainMenuBar 中。我在 Stack Overflow 上遇到过类似的请求,但没有一个能直接解决我遇到的问题。 在
通常可以像这样更改 TActionMainMenuBar 或 TMainMenu 的字体: Screen.MenuFont.Name := 'Calibri'; 当使用 Vcl 样式时,如果为组件注册
我正在努力尝试在 TActionMainMenuBar 中显示提示。德尔福XE2。 我正在运行时创建菜单。我添加类别、子项目,清除菜单,一切都很好。单击菜单项可以正常工作(目前它只是使用操作项标记
TActionMainMenuBar没有此功能。 TActionToolBar 会自动添加 Chevron,但此菜单有一些自定义命令。 如何将此功能添加到 TActionMainMenuBar 并隐藏
我正在尝试使 TActionMainMenuBar 像 TMainMenu 一样显示样式化的 MDI 按钮。 有什么建议吗?我无法停止在这个项目中使用 MDI。 最佳答案 好的,首先这不是一个 Vcl
我是一名优秀的程序员,十分优秀!