Delphi XE2:禁用组件上的 vcl 样式

2024-01-08

我正在尝试按照有关禁用表单上控件上的颜色的示例进行操作。

TStyleManager.Engine.RegisterStyleHook(ClrMeans.TwwDBComboDLG, TEditStyleHook);

但在注册或取消注册第 3 方控件 (infopower TwwDBComboDlg) 或标准 VCL TEdit 时出现异常。有人对此有任何问题或建议


The link http://theroadtodelphi.wordpress.com/2012/02/06/changing-the-color-of-edit-controls-with-vcl-styles-enabled/这里解释了您需要了解的内容。

基本上,您需要放入一个“空钩子”,这是您已经知道的,或者需要放入一个“VCL 颜色”钩子,这是您所缺少的一半。另一半是你的零指针问题。

为了使 TEdit 衍生品(像您的)看起来像 VCL 标准颜色,使其与您的控件一起工作所需的代码如下:

uses
  Winapi.Messages,
  Vcl.Controls,
  Vcl.StdCtrls,
  Vcl.Forms,
  Vcl.Themes,
  Vcl.Styles;

type

TEditStyleHookColor = class(TEditStyleHook)
  private
    procedure UpdateColors;
  protected
    procedure WndProc(var Message: TMessage); override;
    constructor Create(AControl: TWinControl); override;
  end;

implementation


type
 TWinControlH= class(TWinControl);


constructor TEditStyleHookColor.Create(AControl: TWinControl);
begin
  inherited;
  //call the UpdateColors method to use the custom colors
  UpdateColors;
end;

//Here you set the colors of the style hook
procedure TEditStyleHookColor.UpdateColors;
var
  LStyle: TCustomStyleServices;
begin
 if Control.Enabled then
 begin
  Brush.Color := TWinControlH(Control).Color; //use the Control color
  FontColor   := TWinControlH(Control).Font.Color;//use the Control font color
 end
 else
 begin
  //if the control is disabled use the colors of the style
  LStyle := StyleServices;
  Brush.Color := LStyle.GetStyleColor(scEditDisabled);
  FontColor := LStyle.GetStyleFontColor(sfEditBoxTextDisabled);
 end;
end;

//Handle the messages of the control
procedure TEditStyleHookColor.WndProc(var Message: TMessage);
begin
  case Message.Msg of
    CN_CTLCOLORMSGBOX..CN_CTLCOLORSTATIC:
      begin
        //Get the colors
        UpdateColors;
        SetTextColor(Message.WParam, ColorToRGB(FontColor));
        SetBkColor(Message.WParam, ColorToRGB(Brush.Color));
        Message.Result := LRESULT(Brush.Handle);
        Handled := True;
      end;
    CM_ENABLEDCHANGED:
      begin
        //Get the colors
        UpdateColors;
        Handled := False;
      end
  else
    inherited WndProc(Message);
  end;
end;

Procedure ApplyVCLColorsStyleHook(ControlClass :TClass);
begin
    if Assigned(TStyleManager.Engine) then
       TStyleManager.Engine.RegisterStyleHook(ControlClass, TEditStyleHookColor);
end;

initialization
     ApplyVCLColorsStyleHook(TwwDBComboDlg);

NIL 的问题是,如果您没有打开 VCL 主题,则 Engine 为零,您应该检查并从该代码返回,而不调用您正在调用的函数。如果您错过了,您可以在此处打开主题:

有趣的副业:获取VCL 样式实用程序 http://code.google.com/p/vcl-styles-utils/source/checkout图书馆。这是使用它来更改内容颜色的示例:

 TCustomStyleExt(TStyleManager.ActiveStyle).SetStyleColor(scEdit, clWindow);
 TCustomStyleExt(TStyleManager.ActiveStyle).SetStyleFontColor(sfEditBoxTextNormal
                   ,clWindowText);

您可以创建样式,并将这些样式应用到特定控件,甚至扩展主题引擎,也许可以使用 VCL Styles Utils 工具来获得您想要的结果,但这并不简单。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Delphi XE2:禁用组件上的 vcl 样式 的相关文章

  • 有什么办法可以将2个数组添加到一个数组中吗?

    有没有一种简单通用的方法可以将两个数组添加到一个数组中 在下面的情况下 不可能简单地使用C A B陈述 我想避免每次都为它制定算法 TPerson record Birthday Tdate Name Surname string end
  • Delphi 7,加载PNG到TImage

    只是想加载 PNG 尝试使用适用于其他格式的 OleGraphic 来使用我的 LoadPic 但在 PNG 上失败 目标是将图像复制到隐藏位图 然后将其屏蔽并复制到可见的工作图像画布 如果 CopyRect 不这样做 请随意提出其他建议
  • 如何添加资源并使用它们

    在我的应用程序中 我想添加 2 个图像作为资源 我想使用这些图像 当我在应用程序中单击 是 按钮时 第一张图像将被设置为壁纸 当我在应用程序中单击 否 按钮时 第二张图像将被设置为桌面壁纸 提前致谢 regards 最简单的方法是创建一个文
  • 使用普通画布/文本输出更新LayeredWindow

    有没有一种方法可以使用画布在表单上绘图 然后使用 updatelayeredwindow 这样表单就不可见 但文本可见 就像只显示文本的半透明表单一样 如果没有 那么有没有办法只用画布 opengl directx 制作某种半透明形式 我想
  • 我可以在“Delphi 2007 for Win32”中使用.NET DLL吗?

    是否可以在 Delphi 2007 for Win32 中使用 NET DLL 我尝试以与 ActiveX 组件相同的方式导入 DLL 但它似乎不起作用 组件菜单 gt 导入组件 gt 导入 NET 程序集 是否可能 如果可以 步骤是什么
  • VCL.位图到 FMX.位图

    我在网上找到了这段代码 但 FMX Bitmap 没有扫描线 是否可以以某种方式将 VCL TBitmap 复制或绘制到 FMX Bitmap IFDEF MSWINDOWS type TBitmap FMX Types TBitmap T
  • 如何在Delphi XE中通过名称获取类类型引用?

    我实际上正在尝试使用 Rtti 来实现通用方法调用程序 它应该像这样工作 我将提供类名 方法名和参数 调用者将通过调用此类的指定方法来完成其工作 因此 我需要类引用才能获取其 Rtti 信息并寻找我想要调用的方法 有没有办法在不实现我想要使
  • 如何确保 FormClose 程序运行,无论程序如何退出?

    在 Delphi 7 中 我有一个 TMainForm FormClose 过程 旨在在程序退出时写出一些状态 这在手动关闭程序时效果很好 但是 我发现如果程序被 Windows 强制 退出 例如在 Windows 更新后需要重新启动 则不
  • Indy 的 TIdHTTPProxyServer:如何过滤请求?

    我正在使用 TIdHTTPProxyServer 来实现一个简单的 HTTP 代理 但我现在想阻止一些与某些 URL 匹配的连接 哪个事件和 或组件最适合实现这一目标 Indy 文档并没有太多解释 Thanks 作为基本过滤器 您可以使用
  • 运行delphi客户端自动化程序后excel.exe保持加载状态的原因是什么?

    我编写了一个 Delphi 程序 该程序从单个 XLS 文件的多个不同电子表格中提取数据并将其合并到文本文件中以供以后处理 这是德尔福7console程序 最相关的代码片段的摘录将向您表明 显然 我的程序表现得相当好 或者至少达到了它需要的
  • 使用 OLE 和 Delphi 提高 Word 文档中搜索替换的性能

    经过一些实验 我最终得到了以下代码来在 MSWord 中执行搜索和替换 此代码在页眉和页脚中也能完美运行 包括首页或奇数 偶数页的页眉和 或页脚不同的情况 问题是我需要打电话MSWordSearchAndReplaceInAllDocume
  • Delphi - 在修复 VCL 错误时,单元 x 是用不同版本的 x 编译的

    我正在使用 Delphi XE6 并在我的项目中使用 Datasnap 和 JSON 我想纠正 VCL 单元 System JSON pas 在 TJSONString ToString 函数中 中的一个错误 它应该转义反斜杠字符和引号 为
  • 有人用CrossKylix进行真正的跨平台开发吗?

    新版本克罗斯凯利克斯 http crosskylix untergrund net 两周前更新过 即使 Kylix 已经停产很久了 但它似乎仍然被一些 Delphi 开发人员使用 有人在 Windows 和 Linux 的跨平台开发中成功使
  • TDictionary 上的 GetItem 由链接器消除

    我正在使用一个TDictionary of
  • 如何在调试器中显示 TStringList 的内容?

    我想在调试应用程序时显示 TStringList 的全部内容 相反 我只是得到指示 Flist 仅显示地址 如果您使用的是 Delphi 2010 或更高版本 调试器允许使用调试可视化工具 http docwiki embarcadero
  • 不断断点?如何去除它们?

    我下载了一个用Delphi 2009制作的项目 这也是我使用的 但是有一个断点我无法删除 如果我尝试删除它 它会在程序执行后再次执行 我在其他调试器中遇到了这样的事情 称为硬件断点 但这并不重要 如何删除断点 EDIT Article ht
  • Word 2010 自动化:“转到书签”

    我有一个用 Delphi 7 编写的程序 它打开一个基于模板的新 Word 文档 文档打开后 系统会自动跳转到书签 在模板中预定义 并在其中添加一些文本 以下代码在 Word 2003 中工作正常 但会导致invalid variant o
  • 石和磅的格式正确吗?

    我有一个图表 用于显示重量 以英石和磅 lbs 为单位 该图表由记录中的数据填充 对于权重 数据类型为 Double 记录数据是在运行时编辑的 我需要知道一种正确格式化输入数据的方法 为了更好地理解 首先看一下这些示例值 它们表示为石和磅
  • Delphi 5 中的 Oracle 数据库连接

    我正在使用 Delphi 5 版本 我想连接到 Oracle 数据库 我有 TDatabase 组件 我不知道如何通过 Delphi 连接到数据库 请提供连接数据库的步骤 谢谢 The TDatabase http docwiki emba
  • 如何调试仅在应用程序关闭时发生的崩溃? (德尔福)

    因此 经过最近的一些更改 我们发现我们最古老的应用程序之一有时会在关闭时崩溃 这会以 运行时错误 216 消息的形式或来自 Windows 错误报告的消息的形式表明应用程序已停止工作 该应用程序已经发出OutputDebugString 每

随机推荐

  • 将具有 multipart/form-data 的 HTML/axios 中的对象列表发布到 DRF 多部分解析器

    这是我的序列化器 class ParentSerializer serializers ModelSerializer children ChildSerializer many True reverse FK relation Paren
  • 在 SymmetricDS Embedded 中创建 SYM 表

    我正在尝试嵌入对称DS http www symmetricds org 3 7 在使用H2数据库的java应用程序中 该应用程序是一个客户端节点并使用该类ClientSymmetricEngine来自 SymmetricDS API 主节
  • Django sorl-thumbnail 不显示图像

    我尝试使用 Django sorl thumbnail 但它不显示图像 并且不显示任何错误 设置 py INSTALLED APPS sorl thumbnail Models class Toy models Model name mod
  • 如何获取 HttpRuntime.Cache 中对象的大小?

    我目前在 ASP NET HttpRuntime Cache 中存储许多不同类型的对象 我想知道是否有办法计算出每个对象有多大 看看这些问题 使用 C 获取字段的大小 以字节为单位 https stackoverflow com quest
  • Iron Router onBeforeAction 未被调用

    我有一个 user路线设置 这应该渲染login如果当前用户没有登录 则为模板 整个路由器有一个waitOn等待的currentUser订阅完成 问题是当我去 user它只是渲染dataNotFound模板代替 以下是与这种情况相关的代码片
  • Python-按页分割pdf

    我在用PyPdf2分裂大PDF到页面 问题是这个过程非常缓慢 这是我使用的代码 import os from PyPDF2 import PdfFileWriter PdfFileReader with open input pdf pat
  • Synapse Delphi HTTPS SSL GET 请求

    仅对 HTTP URL 的 GET 请求有效 如果我尝试请求 HTTPS url 则它不会返回任何内容 我几乎尝试了一切 感谢任何帮助 这是我的代码 SynHttp Sock CreateWithSSL TSSLOpenSSL SynHtt
  • Dockerfile 和 dpkg 命令

    我正在尝试创建一个 Dockerfile 来安装 VuFind 这是我的 Dockerfile Name of container docker vufind 3 Pull base image FROM ubuntu 16 04 MAIN
  • 访问同一缓存行的线程

    我遇到了关于线程不要访问相同缓存行的建议 我真的无法理解为什么 而且在对该主题进行搜索时 我遇到了以下问题 多线程和CPU缓存 https stackoverflow com questions 4802565 multiple threa
  • 将 maxAge 与 Express.js 结合使用的正确方法是什么?

    我见过几种变体 假设我希望我的 cookie 一秒钟后过期 我应该使用 app use express session secret mysecret maxAge new Date Date now 1000 or app use exp
  • @cacheput 没有更新现有的缓存

    我正在使用 Spring 4 和 Hazelcast 3 2 我正在尝试使用以下代码向现有缓存添加新记录 不知何故 缓存没有得到更新 同时我也没有看到任何错误 下面是供参考的代码片段 注意 可缓存工作正常 只有缓存输出不起作用 请阐明这一点
  • MyBatis 基于 XML + 注解的配置

    是否可以在应用程序中同时为 MyBatis 提供基于 XML 注解的配置 我问这个问题的原因是因为在我的应用程序中我使用的是基于注释的方法 但在其中一种情况下 我需要使用 IN 子句 可以使用
  • 是否可以在 Blazor 上单击元素外部以将其关闭?

    有点重复在 Blazor 上单击 div 或元素外部以将其关闭的事件 https stackoverflow com questions 61369498 event for click outside a div or element t
  • 匿名班级问题

    我对这一行有一点疑问 匿名类不能定义构造函数 那么 为什么我们还可以定义一个匿名类 语法如下 new class name argument list class body 您没有在匿名类中定义构造函数 而是从超类调用构造函数 您无法为匿名
  • 在 PHP 中将 JPG/GIF 图像转换为 PNG?

    可能重复 使用 PHP 将 jpg 图像转换为 gif png 和 bmp 格式 https stackoverflow com questions 755781 convert jpg image to gif png bmp forma
  • 获取两个值之间的 n 个不同的随机数,其总和等于给定数

    我想在总和为给定数字的范围内找到不同的随机数 注意 我在 stackoverflow 中发现了类似的问题 但是他们并没有完全解决这个问题 即他们不考虑范围的负下限 如果我希望随机数之和等于 1 我只需生成所需的随机数 计算总和并将每个随机数
  • 批处理文件删除早于指定日期的文件[重复]

    这个问题在这里已经有答案了 如何创建批处理文件来删除早于指定日期的文件 这似乎不起作用 DELOLD BAT echo off SET OLDERTHAN 1 IF NOT DEFINED OLDERTHAN GOTO SYNTAX for
  • 如何防止多个 Toast 重叠

    我一直在使用一个常见的 myToast 我使用 myToast cancel 在发出新的 toast 之前 对于 Android v2 3 及更早版本 这非常有效 当需要发送新的 Toast 时 如果旧的 Toast 仍在屏幕上 则会取消
  • SQL Server 2008 R2:从视图中包含的表中删除重复行

    创建表dup1 CREATE TABLE dup1 cola VARCHAR 10 colb VARCHAR 10 插入记录 INSERT INTO dup1 VALUES 1 2 INSERT INTO dup1 VALUES 1 2 I
  • Delphi XE2:禁用组件上的 vcl 样式

    我正在尝试按照有关禁用表单上控件上的颜色的示例进行操作 TStyleManager Engine RegisterStyleHook ClrMeans TwwDBComboDLG TEditStyleHook 但在注册或取消注册第 3 方控