1

我有一个自定义 res 文件“myres.res”。此刻我在我的应用程序中使用它,我在我的 DPR 项目文件的 {$R *.res} 行下添加了 {$R myres.res},它运行良好。

现在我想创建一个带有布尔属性“UseCustomRes”的 VCL 组件。如果我设置 UseCustomRes=True 我想在编译我的项目时添加 res 文件,但如果我设置 UseCustomRes=False 我不想在编译我的项目时使用 res 文件。

这可能吗?我不知道这是否可能以及如何可能。

4

2 回答 2

4

在运行时选择资源
如果您想使用(或不使用)基于运行时变量的资源,您必须始终编译它,否则您将失去在运行时使用它的选项。

在运行时,您可以使用TResourceStream.

这是一个例子:

procedure ExtractResource;
var
  rs: TResourceStream;
begin
  rs:= TResourceStream.Create(HInstance, 'NameOfResource', RT_RCDATA);
  try
    rs.Position:= 0;
    rs.DoSomethingWithTheResource...
  finally
    rs.Free;
  end;
end;

以下是在线帮助:http
: //docwiki.embarcadero.com/Libraries/XE2/en/System.Classes.TResourceStream 请注意,TResourceStream 的帮助条目有点损坏;它没有显示所有方法。
缺少的方法在这里:http ://docwiki.embarcadero.com/Libraries/XE2/en/System.Classes.TStream_Methods

在编译时选择资源
请注意,该{$R *.res}行包括当前目录中的任何 .res 文件。
如果要选择特定的 .res 文件,则必须排除此行。
条件编译是使用 完成的defines,如下所示:

 implementation
   {.R *.res}  //disable the *.res inclusion.
   {$IFDEF GetMyResource}
     {$R MyResource.res}   //will only be compiled if `GetMyResource` is defined
   {$ENDIF}
   {$R AlwaysIncludeThisResource.res} //will always be included.

GetMyResource然后在项目选项下的条件定义中定义符号,请参见此处:https ://stackoverflow.com/a/4530320/650492

于 2013-10-20T17:46:40.827 回答
3

链接器根据特殊 $RESOURCE 指令的存在来包含资源。这些指令不能根据对象实例的属性值进行切换。

因此,借助内置工具,现在可以实现您想要的。您需要做的是添加一个后期构建步骤,该步骤通过在需要时添加资源来修改输出文件。madExcept 就是一个很好的例子。

于 2013-10-20T18:28:03.703 回答