Delphi VCL 样式教程 - 如何在运行时更改样式

标签 delphi delphi-xe2 vcl-styles

是否有一个很好的 VCL 样式教程,我们可以在其中了解如何动态(在运行时)加载/更改样式?

这应该适用于 Delphi XE2 及更高版本,因为 XE2 是第一个使用 VCL 样式的版本。

最佳答案

我添加答案是因为本地信息通常比链接更受青睐。

以下是开始之前您需要了解的关键事实:

  1. 许多 VCL 控件都有颜色属性,但是当样式打开时,这些属性将被忽略,并且像 Button 这样的默认“公共(public)控件”将由 Delphi 本身绘制,而不是使用 XP 或“Windows自带”的Windows 2000风格。

  2. 不知何故,在您的应用程序深处,VCL 样式放置了一些钩子(Hook)来接管对控件的绘制。它可以处理的所有内容都将使用常规控件顶部的“皮肤”进行绘制。许多人称之为“为 vcl 换肤”,在 VCL 样式之前,您可能已经找到了第三方皮肤系统。现在它已内置。

  3. 任何没有被钩住的东西,仍然会得到常规的样式。因此,大多数第三方控件和 VCL 的某些部分不会被主题化。不要期望立即得到完美的结果。此外,有时您可能会看到由于蒙皮而导致的一些瞬时闪烁或故障,这是可以预料的。在运行时添加样式加载,结果的最终质量谁也说不准。您不一定能保证在运行时加载的样式将包含您可能希望它包含的所有内容。您也不能保证您静态包含在应用程序中的内容,但至少静态包含的内容可以由您的 QA 团队(可能是您)进行验证。

以下是最简单的入门步骤:实际上只有第 2 步到第 4 步是必要的。

  1. 单击文件 -> 新建 -> VCL Forms 项目。

  2. 右键单击“项目管理器” Pane 中的项目选项,然后单击“属性”。导航至应用程序 -> 外观

  3. 单击自定义样式即可将其打开。 (Amakrits 是我列表中的第一个,所以我将单击它)。

  4. 单击“默认样式”组合框并将其更改为默认以外的其他样式。

  5. 在表单上填写一些内容,使其不为空。 (按钮、列表框等)。

  6. 运行您的应用。

enter image description here

现在,高级内容:在运行时更改样式:

我使用此按钮单击和 formcreate 来执行此操作:

fdefaultStyleName:String; 添加到表单的私有(private)部分。

确保Vcl.Themes位于您的uses子句中。

procedure TForm1.Button1Click(Sender: TObject);
begin
 if Assigned(TStyleManager.ActiveStyle) and (TStyleManager.ActiveStyle.Name<>'Windows') then begin
   TStyleManager.TrySetStyle('Windows');
 end else begin
   TStyleManager.TrySetStyle(fdefaultStyleName); // whatever was in the project settings.
 end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
if Assigned(TStyleManager.ActiveStyle) then
  fdefaultStyleName := TStyleManager.ActiveStyle.Name;

end;

关于Delphi VCL 样式教程 - 如何在运行时更改样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9906312/

相关文章:

Delphi 10.2 - 如何从欢迎页面删除即将举行的事件面板?

delphi - 当 vcl 样式激活时,如何为我的应用程序的消息框设置外观?

delphi - 在运行时更改图表栏偏移量 (OffsetPercent)

multithreading - CoInitialize 在 Delphi DataSnap 服务器应用程序中

delphi - 程序的后续运行如何使用先前运行的信息,以及如何更改文本文件的一行?

delphi - 如何在启用 VCL 样式的情况下为 TComboBox 的背景着色

delphi - 在 Delphi XE2 中的创建/显示表单上设置变量样式

delphi - Chromium:如何获取加载页面的所有形式

ios - 在 iOS 上加载程序期间无法显示消息

delphi - 如何在Delphi XE3中使用align-data-move SSE?