delphi 将过程分配给动态创建的对象

eeq64g8w  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(179)

我想动态地创建TImage控件,然后拖放它们。但是如果我想将用于拖动的过程分配给此Image的一个事件,它会给我:
错误:为调用“ClickEvent”指定的参数数目错误
下面是我的代码:

procedure ClickEvent(Sender:TObject; Button:TMouseButton; Shift:TShiftstate; X,Y:Integer);
begin
  if Button = mbLeft then TControl(Sender).BeginDrag(False);
end;

在这里,我创建Image并添加属性:

procedure SpawnCard(Ort:TWinControl; sKarte:TKarteClass; Liste: Array of TKarte; BilderListe:Array of TCustomImage);
var
  Bild:TImage;
begin
  Liste[High(Liste)]:=sKarte.Create();

  Bild:=TImage.Create(Combat);
  with Bild do
  begin
    OnMouseDown:=ClickEvent;
    Parent:=Ort;
    Top:=1;
    Left:=200*length(BilderListe);
    width:=200;
    height:=300;
    Proportional:=True;
    Stretch:=True;
    Picture.LoadFromFile(Liste[High(Liste)].PicPath);
  end;

  BilderListe[High(BilderListe)]:=Bild;

end;

我不想调用ClickEvent,我只想把它赋给事件。

8yparm6h

8yparm6h1#

TImage.OnMouseDown(继承自其父类TControl)是一个TMouseEvent属性。

TMouseEvent = procedure(Sender: TObject; Button: TMouseButton;
    Shift: TShiftState; X, Y: Integer) of object;

正如您所看到的,它被声明为“of object”,这意味着它需要一个方法指针(请参见Method Pointers section)。

范例1:

在窗体(或任何其他对象)上声明ClickEvent

TForm1 = class(TForm)
    Image1: TImage;
  public
    procedure ClickEvent(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  end;

...

procedure TForm1.ClickEvent(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbLeft then TControl(Sender).BeginDrag(False);
end;

然后,您可以按如下方式指定它:

Image1.OnMouseDown := Form1.ClickEvent;

范例2:

ClickEvent声明为class method

TMyEventHandlers = class
    class procedure ClickEvent(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  end;

...

class procedure TMyEventHandlers.ClickEvent(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbLeft then TControl(Sender).BeginDrag(False);
end;

然后,您可以按如下方式指定它:

Image1.OnMouseDown := TMyEventHandlers.ClickEvent;

相关问题