model-view-controller - MVC Lazarus 参数数量错误

标签 model-view-controller controller compiler-errors lazarus

我正在尝试在 lazarus 中实现 MVC 模式,我已经创建了模型和 View (直接来自设计师)。现在,我正在编写“ Controller ”,但是当我尝试重新分配自动生成的方法“Button.OnClick”时,出现编译错误:

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

Controller 的构造函数:
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”

谢谢阅读

最佳答案

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

你必须得到一个 TController 的实例。现在,由于您的代码在 TController 的构造函数中运行,因此您手头有了其中之一。所以就这样写:

FView.Quit.OnClick := Self.QuitBtn;

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

我也不确定 QuitBtn 是否是事件处理程序的好名字。这听起来更像是 UI 小部件的名称。

也许您正在使用需要 @ 运算符来生成方法引用的编译器模式:
FView.Quit.OnClick := @QuitBtn;

关于model-view-controller - MVC Lazarus 参数数量错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18902774/

相关文章:

asp.net-mvc - MVC 架构中的项目何时应该拥有自己的 Controller ?

javascript - 如何将 controller.js 包含到 ng-include html 页面中?

python - Python fancyimpute安装在Mac上,但未安装在Windows上

java - 无法使用 groovy @Delegate 从 java 类生成的方法

model-view-controller - 从 HtmlHelper 获取对象实例

java - 使用 ResponseBody 并返回 Model 类实例的 Controller 方法上的奇怪 Spring MVC 4.2.x 行为

objective-c - 如何以编程方式或通过按钮等方式触发 IBAction 方法?

json - this.input.get() 不起作用 beego

asp.net - 值不能为空。参数名称 : items (DrodownList)

c++ - 调用 LLVM 中隐式删除的复制构造函数(将代码从 windows 移植到 mac)