我有一个自定义 res 文件“myres.res”。此刻我在我的应用程序中使用它,我在我的 DPR 项目文件的 {$R *.res} 行下添加了 {$R myres.res},它运行良好。
现在我想创建一个带有布尔属性“UseCustomRes”的 VCL 组件。如果我设置 UseCustomRes=True 我想在编译我的项目时添加 res 文件,但如果我设置 UseCustomRes=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;
以下是在线帮助: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
链接器根据特殊 $RESOURCE 指令的存在来包含资源。这些指令不能根据对象实例的属性值进行切换。
因此,借助内置工具,现在可以实现您想要的。您需要做的是添加一个后期构建步骤,该步骤通过在需要时添加资源来修改输出文件。madExcept 就是一个很好的例子。