用Delphi代码添加资源文件

用Delphi代码添加资源文件,delphi,resources,vcl,Delphi,Resources,Vcl,我有一个自定义的res文件“myres.res”。 现在我在应用程序中使用它,我在DPR项目文件中的{$R*.res}行下添加了{$R myres.res},效果非常好 现在我想要一个带有布尔属性“UseCustomeRes”的VCL组件。如果我设置UseCustomers=True,我希望在编译项目时添加res文件,但如果我设置UseCustomers=False,我不希望在编译项目时使用res文件 这可能吗?我不知道这是否可能以及如何可能。在运行时选择资源 如果您想使用(或不使用)基于运行时

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

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


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

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

运行时,您可以使用
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;
以下是联机帮助:
请注意,TResourceStream的帮助条目有点不完整;它不会显示所有方法。
缺少的方法如下所示:


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

 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
,请参见此处:

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

运行时,您可以使用
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;
以下是联机帮助:
请注意,TResourceStream的帮助条目有点不完整;它不会显示所有方法。
缺少的方法如下所示:


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

 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
,请参见此处:

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


所以,有了内置的工具,现在就可以实现您想要的了。您需要做的是添加一个构建后步骤,该步骤通过在需要时添加资源来修改输出文件。一个很好的工具例子就是madeexcept。链接器基于特殊$RESOURCE指令的存在而包含资源。不能根据对象实例属性的值切换这些指令


所以,有了内置的工具,现在就可以实现您想要的了。您需要做的是添加一个构建后步骤,该步骤通过在需要时添加资源来修改输出文件。MadException就是一个很好的例子。您可以制作一个组件,将任何数据保存为DFM文件/资源的一部分。您可以制作一个组件,将任何数据作为DFM文件/资源的一部分保存。或者拿一些已经存在的。