MVC Lazarus参数数量错误

4

我正在尝试在Lazarus中实现MVC模式,我已经创建了模型和视图(直接从设计师创建)。现在,我正在编写“控制器”,但是当我尝试重新分配自动生成的方法“Button.OnClick”时,我遇到了编译错误:

controller.pas(31,44) Error: Wrong number of parameters specified for call to "QuitBtn"

控制器的构造函数:

constructor TController.Create(AModel : TGame ; AView : TFArena);
begin
  Model := AModel;
  FView := AView;

  {Compilation Error}
  FView.Quit.OnClick := TController.QuitBtn;
end;

并且步骤如下:
procedure TController.QuitBtn(Sender : TObject);
begin
  ShowMessage('MVC READY');
end;       

这个方法是从Lazarus自动生成的。

procedure TFArena.QuitClick(Sender: TObject);
begin
  {Nothing because she's gonna be over assigned}
end;   

因此,两者都使用相同的参数“Sender:TObject”。
谢谢阅读。
1个回答

3

OnClick事件必须实现一个实例的方法。你已经传递了方法的代码部分,但缺少数据,即实例。

你必须获取TController的一个实例。现在,你手头上有一个因为你的代码运行在TController的构造函数中。所以只需像这样编写:

FView.Quit.OnClick := Self.QuitBtn;

当然,你总是可以省略 Self 这个习惯用法。
FView.Quit.OnClick := QuitBtn;

我不确定QuitBtn是事件处理程序的一个好名字。它听起来更像是UI小部件的名称。而且,也许你正在使用需要@操作符生成方法引用的编译器模式:
FView.Quit.OnClick := @QuitBtn;

谢谢回答,我尝试了代码的第二部分,但是还是出现了同样的错误。 - Titouan56
1
你确定吗?在 Delphi 中可以工作。你处于不同的模式吗?也许需要一个 @ 符号。 - David Heffernan
那么,你到底使用哪种编译器模式呢? - David Heffernan
这是objfpc,不是Delphi,并且objfpc确实需要一个@。它使一些情况不那么模糊。 - Marco van de Voort
@marco 这种模式是否保留过程变量的类型安全性。我对 Delphi 的一个痛点是默认的不带类型的 @ 操作符。 - David Heffernan
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接