- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用Delphi XE6和VCL样式。我有主要的应用程序和 dll。我的主应用程序已启用运行时主题,并且我正在使用 vcl 样式文件。我对 DLL 做了非常相似的事情。我启用了运行时主题,并在使用和资源文件下添加了 VCL.Themes、VCL.Styles,其中包含 VCL 样式文件。当加载 DLL 时,我从资源加载 VCL 样式并将其设置为 DLL gui。主应用程序和 DLL 不是使用运行时包构建的。
现在我有了用自己的风格设计的主应用程序 GUI,也用自己的风格设计了 DLL gui。这似乎工作正常,直到...
当我单击主应用程序中的按钮时,该事件将打开 TPopupMenu,其样式与 DLL GUI 的样式相同,而不是主应用程序样式。如果我浏览菜单,我也会收到 AV 并且程序崩溃。看看附图。
我做错了什么?我目前看到的唯一解决方法是从其他控件派生我自己的自定义 TPopupMenu。
<小时/>正如我所 promise 的,我准备了与我的应用程序类似的简单演示程序。它由具有自己风格的主机应用程序和添加到资源的风格的 DLL 组成。运行它并单击弹出按钮,然后尝试从弹出窗口中选择某些内容。它会崩溃并停止在某些 StdWindowProc 或类似的东西中。另外,如果您进入窗口系统菜单(左上角),当您尝试从该菜单中选择某些内容时,您会注意到系统菜单的样式为 DLL gui 并且也会崩溃。 rar 文件链接:dropbox.com/sh/f2jmbsmw18akpyg/AAA6SWdBmVhf6n6K-mvYLLmua?dl=0
感谢您的帮助。
最佳答案
这是 VCL 样式及其菜单样式设置方式的一个基本问题。样式是通过进程范围的钩子(Hook)来实现的。具体来说,是通过从 Vcl.Themes
单元中的 TCustomStyleEngine.CreateSysHook
调用 SetWindowsHookEx
安装的 CBT Hook 。事实上,该钩子(Hook)仅适用于 GUI 线程,但这是进程范围内的,因为进程中只有一个 GUI 线程。
由于您的应用程序中有多个 VCL 实例(一个在 DLL 中,一个在应用程序中),因此安装了两个 Hook 。那太多了。最近安装的 Hook (恰好是 DLL)获胜,这就是 DLL 菜单样式感染您的可执行文件的原因。以及为什么会遇到访问冲突。 DLL 正在尝试对属于可执行文件的菜单进行操作。因此,尽管您尽了最大努力,但最终还是得到了从主机可执行文件访问 VCL 对象的 DLL 代码。
没有简单的方法可以解决这个问题并在两个模块中完全支持样式。我们这里得到的是设计的基本结果。该系统并未设计为支持多个 VCL 实例。如果您希望在多个模块中使用 VCL 样式,那么设计者希望您使用运行时包。
我想您也许能够通过在完全不同的线程中操作 DLL 来获得一些吸引力。这将涉及从该不同的线程加载 DLL,以便 VCL 在该线程中初始化。对 DLL 的所有调用都必须来自该线程。并且您需要在该线程中运行消息循环。你可能能够做到这一点,但我对此表示怀疑。即使提到了所有的附带条件,您仍然必须处理这样一个事实:您有两个 GUI 线程,这会带来输入队列处理的各种问题。
也许另一种方法是从 DLL 中卸载 Hook 。只要您的 DLL 不显示菜单,那么您就可以卸载该 Hook 。它会禁用 DLL 显示的菜单样式,但这也许是可以接受的。
这个版本的 DLL(在我对其进行了一些简化之后)会卸载该钩子(Hook)。
library VCLStyleDLL;
{$R 'Style.res' 'Style.rc'}
uses
VCL.Styles,
VCL.Themes,
VCL.SysStyles; // to gain access to TSysPopupStyleHook
{$R *.res}
begin
TStyleManager.TrySetStyle('Glossy', false);
TCustomStyleEngine.UnRegisterSysStyleHook('#32768', TSysPopupStyleHook);
end.
使用此版本的 DLL,主机可执行文件不会遇到您在问题中描述的问题。
关于delphi - DLL 中的 VCL 样式正在影响应用程序中的 TMenuItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25933252/
一些背景(是 TLabel and TGroupbox Captions Flicker on Resize 的延续): 所以,我有一个应用程序可以加载不同的插件并创建一个TPageControl 上
我正在从 this handy template 复制一些 VCL 规则并在最新稳定的 Varnish4 上运行。但是 VCL 的这一部分: vcl 4.0; sub vcl_init { #
无论如何,这就是我的分析。今天早上,我将我的应用程序“分发”给了我们的组织,结果发现,在 XE8 中对这个旧的 win32 应用程序进行了一个月的新工作后,不使用 Windows 7“Basic”主题
在执行命令时 sudo service varnish reload 我收到以下错误: nish@styx:~$ sudo service varnish reload * Reloading HT
所以我第一次使用 Varnish 。我花了很多时间阅读它是如何工作的,但我无法弄清楚如何有选择地清除缓存。 就像说我有一个这样的网址 /?account=123&url=google.com 另一个喜
首先,维基百科将控制面板小程序定义为: graphical user interface which allows users to view and manipulate basic system
我的主窗体(我的图像中的 form1)中央有一个页面控件,我想打开停靠在该页面控件中的其他表单。因为我的子窗体上有很多控件,所以我需要垂直和水平滚动条(在子窗体上我有事件滚动条选项处于事件状态),但这
在Varnish中,std.log子例程是否会对性能产生影响,我应该关注该影响?例如,如果我将它称为请求的3-4次,那么在处理大量请求时会产生累积效果吗? 据我所知,std.log通过请求锁定,写入消
VCL中有几个内置子例程; vcl_recv,vcl_pipe,vcl_pass,vcl_hit,vcl_miss等; 引用https://varnish-cache.org/docs/4.1/use
我有以下形式的 URL: http://some-site.com/api/v2/portal-name/some/webservice/call 我要获取的数据需要 http://portal-na
我现在遇到了一个相当罕见的情况。我有一个直接与 Windows 消息队列交互的应用程序。该应用程序还使用 LuaJIT 运行外部 Lua 脚本。我想要为这些脚本提供调试工具,因此我创建了一个普通的 V
使用 Delphi 7 IDE 进行调试时,如何单步执行程序文件/borland/delphi7/source 文件夹中的代码? 听起来是个愚蠢的问题,但好奇的人想要调试。 (并不是说我认为源有什么问
在我的编程团队中,我们都使用 Delphi XE2 Professional。我们刚刚发现,在不同的计算机上,可用的 VCL 样式数量不同。 VCL 样式从何而来?我是否需要小心地将样式从一个 Del
我注意到,当启用 VCL-Styles 时,即使没有按下 Alt 键,也会使用热键选择菜单中的项目。 这会干扰我的用户界面的其余部分,并且我发现样式库改变热键的行为非常奇怪。 我可以以某种方式消除这种
我有一个源自 TMemo 的控件。它工作得很好,直到我第一次使用 Delphi XE7 VCL Styles。在Delphi XE7下,样式不应用于控件的滚动条。如果使用深色主题/风格,看起来很糟糕,
我一直在尝试将我拥有的单位从 VCL 转换为 FMX。我使用的库之一是用于 TpenStyle 的 VCL.Graphics: wallstyle,pathstyle,solvedpathstyle:
我正在设置主菜单字体(通过 Screen.MenuFont)以匹配程序中其他地方使用的字体的名称/大小。但主菜单不会随表单的其余部分一起刷新 - 我必须将鼠标移到每个菜单项上才能让它以新字体重新绘制该
我正在设置主菜单字体(通过 Screen.MenuFont)以匹配程序中其他地方使用的字体的名称/大小。但主菜单不会随表单的其余部分一起刷新 - 我必须将鼠标移到每个菜单项上才能让它以新字体重新绘制该
我为其编写软件的产品之一是会计类应用程序。它用 C++ 编写,使用 C++ Builder 和 VCL 控件,连接到运行在 Linux 上的 PostgreSQL 数据库。 PostgreSQL 数据
我正在创建一个包含多个表单的 VCL 表单应用程序。我创建了一个名为 formCreateAppointment 的新表单。 我正在尝试通过 menuItem 中的这段代码加载表单: formCrea
我是一名优秀的程序员,十分优秀!