2014-10-20 73 views
1

我嘗試將資源文件包含在我的包中。當我構建的包,我讀到這樣的警告:H2161警告:重複資源:類型10(RCDATA)

[dcc32 Conseil] H2161 Warning: Duplicate resource: Type 10 (RCDATA), ID PLUSUTILISEVOIR; File Project.dres resource kept; file Project.dres resource discarded. 

在我的單位我寫: ...
末 ;

{$R Project.dres} 

implementation 
... 
Button.Picture.LoadFromResourceName(HInstance, 'Image1'); 
... 

資源加載良好,但爲什麼我有警告?

+0

我已經找到了迴應的起點。在.dpk中我有「* .res」和「* .dres」。如果我刪除它,我不會收到警告。但是,在項目中,當我使用具有資源的組件時,我收到此消息「找不到資源」 – Joc02 2014-10-21 15:00:03

回答

3

有時IDE會感到困惑。檢查您的.DPR文件(使用項目 - >查看源代碼菜單項)。應該只有一個{$R *.RES}條目; IDE有時會在列出的其中一個單元的右端添加一個。

(我展示的樣品是一個應用程序,但同樣可以適用於包的源文件)

正確:

program MaintMockup; 

uses 
    Vcl.Forms, 
    NewMaintenanceDlg in 'NewMaintenanceDlg.pas' {Form2}, 
    Validations in '..\Validations.pas'; 

{$R *.res} 

begin 
    Application.Initialize; 
    Application.MainFormOnTaskbar := True; 
    Application.CreateForm(TForm2, Form2); 
    Application.Run; 
end. 

不正確的,並會導致重複的資源錯誤(注意的uses秒行額外資源指令):

program MaintMockup; 

uses 
    Vcl.Forms, 
    NewMaintenanceDlg in 'NewMaintenanceDlg.pas' {Form2}, {$R *.RES} 
    Validations in '..\Validations.pas'; 

{$R *.res} 

begin 
    Application.Initialize; 
    Application.MainFormOnTaskbar := True; 
    Application.CreateForm(TForm2, Form2); 
    Application.Run; 
end. 
+0

這是一個.dres文件的問題,它是資源和圖像對話框的編譯輸出。 – 2014-10-22 06:33:12

+0

@David:問題依舊。因爲IDE添加的'{$ R * .dres}'將會有''我編寫... {$ R Project.dres}'指示的海報線所引起的相同資源的重複包含。包含相同的文件(與項目名稱相同的文件)。使用資源和圖像對話框會自動添加'{$ R}',所以Joc02不必「寫」它。 – 2014-10-22 12:31:10

1

這是我對你做了什麼簡介:

  • 您正在開發一個包裝項目。
  • 您已使用資源和圖像對話框從項目菜單中向項目添加了一些文件。
  • 您已將行{$R Project.dres}添加到包中包含的其中一個單元。

編譯器然後在鏈接時報告已經要求鏈接該文件的多個副本Project.dres。編譯器不會執行此操作並丟棄其中一個編譯的資源文件。

理解這一點的關鍵可以在你的包的主文件,.dpk文件中找到。它看起來是這樣的:

package Package1; 

{$R *.res} 
{$R *.dres} 
.... 

當您使用的IDE對話框中的IDE存儲在項目文件中的信息,.dproj文件資源和圖像,並且還增加了{$R *.dres}到主項目源文件。這就是上面可以看到的那條線。 $R指令中的*指示編譯器使用與出現$R指令的文件相同的基本名稱。

所以這就是你最終得到多個引用到同一個.dres文件。編譯器將.dpk文件中的{$R *.dres}擴展爲Project.dres並將其鏈接。

最自然的解決方案是從.pas源單元中刪除它出現的{$R Project.dres}

但是,將源文件放入源文件的原因可能是您在其他項目中使用了源文件,並且希望它獨立運行。源文件包含加載資源的代碼,確保每當項目包含此源文件時,它都包含資源。一個$R指令將做到這一點。但這與使用IDE的資源和圖像對話框不兼容。該IDE機制依賴於將信息保存到.dproj文件,並且是一個以項目爲中心的機制。

所以,你想要的源文件的.pas這裏包括$R指令是做什麼:

  1. 取下資源和圖像對話框中的所有項目。
  2. 確保在任何源文件中都沒有對.dres文件的引用,包括.dpk和.dpr文件。
  3. 創建一個.rc資源腳本文件,列出您希望包含的資源。
  4. 要求編譯器編譯資源腳本,並通過包括這個指令在.PAS源文件鏈接它:{$R images.res images.rc}

顯然我剛剛發明了一個文件名存在,但毫無疑問你會撿東西適當。

+0

感謝您的幫助。我嘗試了但我有兩個問題。首先,當我寫'{$ R images.res images.rc}'時,資源找不到。如果我寫'{$ R images.res'工作正常。其次,如果在包中我創建了兩個使用相同資源的用戶,我有兩個$ r,並且我有警告。 – Joc02 2014-10-22 15:21:16

+0

除非你更精確,否則我無法幫到你。 「無法找到資源」我無能爲力。您需要精確幷包含逐字消息。我相信你成功地製作了'images.rc'? – 2014-10-22 15:25:48

+0

如果我寫'{$ R images.res images.rc}'我在運行時有這條消息「Le projet Project2.exe是一個異常EResNotFound avec消息'資源IMAGE nontrouvée」。如果我寫的「{$ R images.res}」工作正常 – Joc02 2014-10-22 15:33:33

0

David Heffernan向我展示了一種好方法。

在我的情況下,我想分享一個包的多個單位的圖像。每個單元都是一個組件。如果我在每個單元上添加{$ R xxx.res},我有一個waring:「H2161警告:重複資源:」。如果我將每個單元上的{$ R}刪除到.dpk上,那麼當我在項目上使用我的組件時,會出現運行時錯誤「異常EResNotFound」。

我的解決方案是創建一個集中所有呼叫資源的單元。這個單位有「{$ R}」

unit ResourceManager; 

interface 

uses Graphics, Classes; 

type 
    TResourceManager = class 
    public type 
     TYImageList = (acorn, address_bar); 
    public 
     class procedure LoadImage(ilImage: TYImageList; imgResult: TBitmap); overload; 
    end; 

implementation 

uses TypInfo; 

{$R 'TestPackageResource.res'} 
{ TResourceManager } 

class procedure TResourceManager.LoadImage(ilImage: TYImageList; imgResult: TBitmap); 
begin 
    imgResult.LoadFromResourceName(hInstance, GetEnumName(TypeInfo(TYImageList), integer(ilImage))); 
end; 

end. 

在DPK我寫這篇文章:

{$R TestPackageResource.res TestPackageResource.rc} 

的其他單位有一個參考的經理,但沒有一個「$ R」因此沒有警告。 在執行時沒有錯誤,因爲單元「管理器」已加載並且應用了$ R。我的每個組件都可以沒有警告或錯誤的圖像。