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

标签 delphi variable-assignment lazarus eventhandler address-operator

我想动态创建 TImage 控件,然后拖放它们。但是如果我想将用于拖动的过程分配给该图像的事件,它会给我:

Error: Wrong number of parameters specified for call to "ClickEvent"

这是我的拖动代码:

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

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

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,我只想将其分配给事件。

最佳答案

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;

关于delphi - 将过程分配给动态创建的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72679624/

相关文章:

java - 介绍性计算机科学作业

windows - Lazarus 程序是否需要特殊权限才能在 Windows 上运行?

dispose - 在这种情况下如何释放内存?

sql - Delphi:如何将列表作为参数传递给 SQL 查询?

德尔福XE2 : What is the purpose of IMPLICITBUILDING directive found in package

algorithm - 高斯分布+哈希表

pascal - Lazarus Pascal 蜂鸣命令

delphi - 如何在Delphi中制作一次性定时器功能(如JavaScript中的setTimeout)?

delphi - OnShow 事件后自动启动操作的最佳方法是什么?

java - 用 Java 实现 map