我想动态创建 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/