Image 修复重复资源:键入2(位图)并从资源文件加载文件

Image 修复重复资源:键入2(位图)并从资源文件加载文件,image,delphi,resources,components,Image,Delphi,Resources,Components,我只会发现你的问题。 我有一个名为“JBCompRes.Res”的资源文件。此文件有两个用于创建特定按钮的组件的图像 这些图像用于多个组件,我在框架中创建了一个特定文件夹,其中存储了所有资源文件 要从资源文件加载图像,我使用方法:“LoadFromResourceName”,如下代码示例所示: unit MyCalcEdit; Uses SysUtils , MyResources ; {$R JBCompRes.RES } // my resource file {TCalcEdit}

我只会发现你的问题。 我有一个名为“JBCompRes.Res”的资源文件。此文件有两个用于创建特定按钮的组件的图像

这些图像用于多个组件,我在框架中创建了一个特定文件夹,其中存储了所有资源文件

要从资源文件加载图像,我使用方法:“LoadFromResourceName”,如下代码示例所示:

unit MyCalcEdit;

Uses SysUtils , MyResources ;

{$R JBCompRes.RES } // my resource file

{TCalcEdit}

TCalcEdit constructor Create ( AOwner : TComponent ) . ;
Begin
  Inherited ;
  BeepOnEnter : = False ;
  Style.BorderStyle : = ebs3D ;
  Properties.ButtonGlyph.LoadFromResourceName ( HInstance , CResCalculadoraBmp ) ;
end ;



unit MyDBCalcEdit;

Uses SysUtils , MyResources ;

{$R JBCompRes.RES } / / my resource file

{TDBCalcEdit}

constructor TDBCalcEdit.Create(AOwner : TComponent);
Begin
  Inherited ;
  BeepOnEnter : = False ;
  Style.BorderStyle : = ebs3D ;
  Properties.ButtonGlyph.LoadFromResourceName ( HInstance , CResCalculadoraBmp ) ;
end;
以组件为单位,我需要引用资源文件的名称,以便方法正确地加载资源,但如果我编译了一个delphi 使用这些组件是消息复制资源,如下所示:

[DCC警告]W1056警告:重复资源:类型2(位图),ID BB_NOBMP;文件C:\MyFrameWorkTest\Resources\JBCompRes.RES资源已保留;文件C:\MyFrameWorkTest\Resources\JBCompRes.RES资源已丢弃

请注意,我的“JBCompRes.Res”仅位于一个位置,如果是“C:\MyFrameWorkTest\Resources\”文件夹

我确定了如何做并不会产生问题,但如果我不确定,我会参考单元中的资源文件,您可以将其称为未找到的功能

对这个问题有什么想法吗


非常感谢您的帮助。

编译器告诉您正在链接两个同名资源。您提供的代码确认编译器是正确的

您应该更改代码,以便只链接资源一次

我想你有点糊涂了。我怀疑您认为需要在加载资源的每个文件中链接资源。事实并非如此。资源在模块内共享。只要资源链接到模块一次,就可以从任意多个不同的单元加载它


如果我是你,我会创建一个简单的共享单元,其中包含定义资源名称的常量,并包含链接资源的所有$R指令。该共享单元将是唯一一个将资源与$R链接的地方。事实上,您的单元名为MyResources,看起来您已经完成了大部分工作。您只需将$R指令下移到该单元。

在多次测试和模拟得出结论后,如果不生成重复资源的警告,您就无法在不同单元中共享同一资源

我可能错了,但还没有找到一个方法来做到这一点

我找到的唯一方法是创建一个特定的资源文件来使用该单元

例如,我的JBCalcEdit组件将有一个JBCalcEditRes.Res。此文件包含内部使用的图像。我的组件JBPrint将具有JBPrintRes.Res等等

工作示例:

Unit UnJBCalcEdit;

Interface

Uses Classes;

Type
  .......

Implementation

Uses SysUtils;

Const
  CImgPadraoJBCalcEdit = 'ImgPadraoJBCalcEditBmp';

  {$R UnJBCalcEdit.RES} //meu arquivo de recurso

{ TJBCalcEdit }

Constructor TJBCalcEdit.Create(AOwner: TComponent);
Begin
  Inherited;
  BeepOnEnter := False;
  Style.BorderStyle := ebs3D;
Properties.ButtonGlyph.LoadFromResourceName(HInstance, CImgPadraoJBCalcEdit);
End;
因此,可以保证资源不会被重复并且将被正确使用

在分析其他复杂组件(如DevExpress)时,它们也是这样工作的


重新开始。

Hi@David Heffernan。在发布怀疑之前,我创建了带有常量和资源定义的单元。所有编译都没有错误或警告,但是,当方法“LoadFromResourceName”发生错误时,会通知资源名nof已建立。另一种选择是做我所做的事。它工作了,但是警告被生成了。你确实需要准确地链接资源,这不是我告诉你的吗?嗨@DavidHeffernan。真的,也许是你说的,但我明白了别的。我知道资源指令将以可以在其他应用程序中使用的单元为单位。由于我有两个组件中使用的相同映像,它们位于不同的包和单元中,因此我希望为此使用单个资源。当然,我不理解你的建议可能是错误的。感激的朋友。