使用Delphi按代码添加资源文件

时间:2013-10-20 17:36:41

标签: delphi resources vcl

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

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

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

2 个答案:

答案 0 :(得分:3)

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

在运行时,您可以使用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

答案 1 :(得分:3)

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

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