Pascal 如何在Lazarus上的颜料盒内创建画布对象?

Pascal 如何在Lazarus上的颜料盒内创建画布对象?,pascal,lazarus,Pascal,Lazarus,在表单上,我放置了一个属性为Align=alClient的Paintbox和一个按钮。 我需要在按钮的OnClick事件中的PaintBox内绘制画布类型的对象 这是将要创建的画布对象: const IconSize:Integer = 10 type Icon = Class public posX, posY:Integer; constructor Create(X,Y:Integer); destructor Destroy; procedu

在表单上,我放置了一个属性为Align=alClient的Paintbox和一个按钮。 我需要在按钮的OnClick事件中的PaintBox内绘制画布类型的对象

这是将要创建的画布对象:

const IconSize:Integer = 10
type
  Icon = Class   
  public
    posX, posY:Integer;
    constructor Create(X,Y:Integer);
    destructor Destroy;
    procedure SetX(AValue: Integer);
    procedure SetY(AValue: Integer);
  published
    property LocationX : Integer read posX write SetX;
    property LocationY : Integer read posY write SetY;
end;     
var CanvasIcon: Icon;
这是对象的构造函数方法:

constructor Icon.Create(X, Y: Integer);
var Bitmap:TBitmap;
begin
  Bitmap:=TBitmap.Create;
  try
    Bitmap.Height := IconSize;
    Bitmap.Width := IconSize;
    Bitmap.Canvas.Pen.Color := clBlack;
    Bitmap.Canvas.Rectangle(Round(X-(IconSize/2)), Round(Y-(IconSize/2)),
      Round(X+(IconSize/2)), Round(Y+(IconSize/2)));
    PaintBox.Canvas.Draw(0, 0, Bitmap);
  finally
    Bitmap.Free;
  end;
end;   
这是按钮的OnClick事件:

然而,拉撒路显示了以下信息:

src/unitpaintbox.pas121,33错误:为要创建的调用指定的参数数目错误


但构造函数接收两个参数,与按钮的onClick事件中指定的参数完全相同。如何解决这个问题?

你不是在画布上画,而是在画布上画。TPaintBox已经有画布;您只需在画布上绘制图形。类和其他类型也是以T开头的惯例,这就是为什么它被称为TPaintBox、TBitmap和TCanvas。它清楚地表明了这一点,因此当您在代码中看到Icon时,您不必怀疑它是类型Icon=class还是变量var Icon:TIcon;。TCanvas已经有一个构造函数,它不接受参数Canvas:=TCanvas.Create;。TCanvas是一个能够执行图形的类。它不能单独存在,必须连接到可见的或至少可能可见的对象,如从TControl下降的可视控件,或从TRasterImage下降的对象连接到屏幕外缓冲区。TBitmap是最常用的。因为你没有像Ken已经说过的那样遵循一般惯例,所以很难看出什么是错误的。最有可能的是在范围中有一些其他图标,例如表单的属性或字段等等。当我做了Ken White所说的更改并更改了CustomIcon的名称图标时,问题就解决了。这看起来是一个冲突问题,图标已经存在。
procedure TFormPaintBox.Button1Click(Sender: TObject);
begin
  CanvasIcon:=Icon.Create(10,10);
end;