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

时间:2014-01-22 16:54:52

标签: image delphi resources components

我会发现你的问题。 我有一个名为“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(BITMAP),ID BB_NOBMP;保存文件C:\ MyFrameWorkTest \ Resources \ JBCompRes.RES资源;文件C:\ MyFrameWorkTest \ Resources \ JBCompRes.RES资源被丢弃。

请注意,我的“JBCompRes.Res”只在一个地方,以防“C:\ MyFrameWorkTest \ Resources \”文件夹。

我确定了如何做不会产生问题,但如果我不这样做,我会在你想要称之为未找到功能的单元中引用资源文件。

关于这个问题的任何想法。

如果你能提供帮助,我们已经感激不尽了。

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:0)

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

我可能错了,但还没有办法做到这一点。

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

例如,我的 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,它们也是这样工作的。

Regarts。