标签位图 @ DELPHI ??? 是什么类型?

4

我遇到了一个错误:

[DCC 错误] Unit_TProcessClass.pas(334): E2010 不兼容的类型: 'TBitmap' 和 'tagBITMAP'

该类被定义为:

TMyClass = Class 
private
  MyBMP : TBitmap;
  property aBMP : TBitmap read MyBMP write MyBMP;

而代码如下:
processABitmap(aMyClass.aBMP) ;  -> here is the compile error !!! 
2个回答

13
问题在于VCL中存在两种名为TBitmap的类型。一种定义在Windows单元中,另一种定义在Graphics单元中。很明显你正在向一个期望Graphics.TBitmap的函数传递Windows.TBitmap,或者反之亦然。
你几乎肯定不想与Windows.TBitmap有任何关系。因此解决方案是确保在uses子句中所有单元都列出Windows单元之后列出Graphics单元。这将隐藏Windows.TBitmap
我的心理调试提示表明,在声明TMyClass的单元中,要么根本没有在其uses子句中列出Graphics,要么在Windows之前列出Graphics
最后,你如何自己解决这样的问题呢?嗯,尝试按CTRL +点击TMyClass中引用的TBitmap。我相信它们会带你去到在Windows中声明的TBitmap。这应该足以让你知道它不是你写TBitmap时所指的类型。

12
问题在于您混淆了Windows.TBitmap(又名tagBitmap,它是描述Windows API位图的记录)和Graphics.TBitmap,即VCL位图类。

因此,您可能需要:

var
  b: Windows.TBitmap;

或(更可能的情况)

var
  b: Graphics.TBitmap;

如果省略了单位,则将使用最后引用的单位。例如,如果您的uses子句如下:

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

那么TBitmap意味着Graphics.TBitmap,这通常是您想要的。

因此,解决您的问题的方法之一是需要将Graphics添加到某些uses子句中,或者确保在列表中将Graphics列在Windows之后。


事实上,我总是确保Windows在我的使用子句中是第一个单元 - 每次都是。这是我使用每个新单元时自然而然的第一件事情。 - Jerry Dodge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接