在My Component中使用TImage

时间:2015-03-25 05:36:28

标签: delphi custom-component

我正在尝试在我的组件中使用 Timage ,但我在第" Image.Parent:=Self;" as 'incompatible type 'TWinControl' and 'TGasTurbine'行接收编译器错误

所以'TGasTurbine是我的组件名称

这是我的Paint程序。我该怎么办?

Procedure TGasTurbine.Paint;
var
   Image: TImage;
begin
  Inherited;
  Image := TImage.Create(self);
  Image.Parent:=Self;
  Image.Height := 100;
  Image.Width := 100;
  Image.Stretch:=True;
  Image.Picture.LoadFromFile('H:\Component\Automation\Pump.Bmp');
end;

3 个答案:

答案 0 :(得分:3)

您的组件的类型是什么?你是怎么描述它的班级的? 如果您的控件旨在成为其他控件的父级,则它必须是TWinControl的祖先。

修改 TGraphicControl不能包含其他组件,不能拥有它们。 您必须选择 - 或从TWindowControl继承您的类,或拒绝使用内部TImage,并注意图片存储和绘图(最好)。
最好用你的方式描述你的情景。

为什么要在Paint程序中创建内部组件?通常情况下,在每次重新绘制时都会多次调用它,并且一次又一次地创建新组件(顺便说一句,没有释放) - 这不是一个明智的方法。

答案 1 :(得分:3)

  

不兼容的类型'TWinControl'和'TGasTurbine'

这告诉您控件的父级必须派生自TWinControl。而您的TGasTurbine课程并非来自TWinControl

虽然您可以更改派生,但那将是错误的解决方案。您应该删除TImage控件。您选择了错误的方法在自定义控件中绘制图像。

而是在控件中声明类型为TBitmap的字段。

FBitmap: TBitmap;

在构造函数中创建并填充它:

FBitmap := TBitmap.Create;
FBitmap.LoadFromFile(...);

然后用Paint方法绘制它:

Canvas.Draw(0, 0, FBitmap);

请记住在析构函数中释放位图。

您可能最好将图像作为资源而不是外部文件进行链接。

答案 2 :(得分:2)

为什么甚至尝试将TImage组件创建为您自己组件的内部组件?

相反,您应该创建TBitmap来存储图像数据,然后使用StretchDraw http://docwiki.embarcadero.com/Libraries/XE7/en/Vcl.Graphics.TCanvas.StretchDraw

在组件画布上简单地绘制该位图

如果您需要支持其他图像类型,您还可以使用TPicture作为内部组件而不是TBitmap,这样您就可以绘制TImage组件支持的所有支持的图像类型,该组件也将TPicture作为其内部组件。