【问题标题】:How to apply VCL Styles to DLL-based forms in Inno Setup?如何在 Inno Setup 中将 VCL 样式应用于基于 DLL 的表单?
【发布时间】:2014-03-15 09:00:24
【问题描述】:

我正在使用 Inno Setup (Unicode) 和一组我在 Delphi XE2 中编写的 DLL。 DLL 具有在安装向导/进度期间显示的 VCL 表单。

我已经在我的 Inno Setup 安装程序中试用了 implementing VCL Styles。一切都很好,除了在这些 DLL 中创建的表单。部分表单是蒙皮的,但不是全部...

如您所见,表单的背景颜色、列表视图背景颜色和字体颜色都发生了变化。但是,列表视图标题、进度条和表单的边框仍然是旧样式。

如何使这些 DLL 中的表单显示正确的样式?

【问题讨论】:

  • 我实际上猜测我必须通过将样式文件名传递给每个 DLL 来将此样式文件加载到每个 DLL 中,例如使用像ApplyVclStyle(const Filename: WideString);这样的导出过程@
  • 插件只能对inno setup创建的表单和控件进行换肤。对于您的 dll 的形式,您必须按照您在评论中所说的那样加载您自己的 VCL 样式。

标签: delphi dll delphi-xe2 inno-setup vcl-styles


【解决方案1】:

Inno Setup 的 VCL Styles 插件仅用于在 Inno Setup 中的窗体和控件上绘制样式。为了让这些 DLL 中的表单被蒙皮,你需要从 DLL 中导出一个 Inno Setup 可以在文件名中传递的函数...

Inno 设置

[Code]
#define public VclStyleFile "Carbon (2).vsf"

procedure DllLoadStyle(const StyleFilename: WideString);
  external 'DllLoadStyle@MyDLL.dll stdcall';

function InitializeSetup: Boolean;
begin
  ExtractTemporaryFile('{#VclStyleFile}');
  LoadVCLStyleW(ExpandConstant('{tmp}\{#VclStyleFile}'));
  DllInit; //Presumed your DLL needs to initialize / instantiate the form
  DllLoadStyle(ExpandConstant('{tmp}\{#VclStyleFile}'));
  ...
end;

Delphi DLL

uses
  Vcl.Themes,

procedure DllLoadStyle(const StyleFilename: WideString); stdcall;
begin
  TStyleManager.SetStyle(TStyleManager.LoadFromFile(StyleFilename))
end;

exports
  DllLoadStyle;

【讨论】:

  • OT:您不需要扩展您的预处理器变量,除非它们的值中包含一些 Inno Setup 常量(您需要对其进行扩展)。预处理器只是将变量的值发送到脚本。因此,ExtractTemporaryFile 函数调用中的 ExpandConstant 函数完全没有任何作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-21
  • 1970-01-01
  • 2018-10-10
  • 1970-01-01
相关资源
最近更新 更多