我有一个自定义res文件“myres.res”。 在这一刻,我在我的应用程序中使用它,我在我的DPR项目文件中的{$ R * .res}行下面添加了{$ R myres.res}并且它运行良好。
现在我想用一个布尔属性“UseCustomRes”来创建一个VCL组件。如果我设置UseCustomRes = True我想在编译项目时添加res文件,但如果我设置UseCustomRes = False,我不想在编译项目时使用res文件。
这可能吗?我不知道是否可能以及它是如何可能的。
答案 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。