2013-10-20 51 views
0

我有一個自定義的res文件「myres.res」。 在這個時刻,我在我的應用程序中使用它,我在我的DPR項目文件中的{$ R * .res}行下面添加了{$ R myres.res},它工作得很好。通過Delphi的代碼添加資源文件

現在我想創建一個帶有布爾屬性「UseCustomRes」的VCL組件。如果我設置UseCustomRes = True,我想在編譯我的項目時添加res文件,但是如果我設置了UseCustomRes = False,我不想在編譯我的項目時使用res文件。

這可能嗎?我不知道這是否可能以及如何可能。

+0

您可以創建一個組件,將任何數據保留爲DFM文件/資源​​的一部分。或採取一些已經存在的。 –

回答

3

資源是基於鏈接器包括是否存在特殊的$ RESOURCE指令。這些指令不能根據對象實例屬性的值進行切換。

因此,藉助內置的工具,現在可以實現您的願望。你需要做的是添加一個後期構建步驟,通過在需要時添加資源來修改輸出文件。這是一個很好的例子,這是madExcept。

2

在運行時
採摘的資源。如果你想使用基於你必須編譯它始終在運行時變量的資源(或沒有),否則你將失去在使用它的選項運行。

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