Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Model view controller MVC Lazarus参数数量错误_Model View Controller_Controller_Compiler Errors_Lazarus - Fatal编程技术网

Model view controller MVC Lazarus参数数量错误

Model view controller MVC Lazarus参数数量错误,model-view-controller,controller,compiler-errors,lazarus,Model View Controller,Controller,Compiler Errors,Lazarus,我试图在lazarus中实现MVC模式,我已经创建了模型和视图(直接从设计器创建)。现在,我正在编写“控制器”,但当我尝试重新分配自动生成的方法“Button.OnClick”时,我出现了一个编译错误: controller.pas(31,44) Error: Wrong number of parameters specified for call to "QuitBtn" 控制器的构造函数: constructor TController.Create(AModel : TGame ; A

我试图在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;   
因此,两个avec都使用相同的参数“Sender:TObject”


感谢阅读

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

您必须获得TController的实例。现在,由于您的代码在TController的构造函数中运行,您手头上就有了其中一个。那么就这样写吧:

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

FView.Quit.OnClick := QuitBtn;
我也不确定QuitBtn是否是事件处理程序的好名字。它听起来更像是UI小部件的名称

也许您使用的编译器模式要求@operator生成方法引用:

FView.Quit.OnClick := @QuitBtn;

谢谢你的回答,我尝试了代码的2部分,但是,同样的错误你很确定吗?他将在德尔福工作。你处于不同的模式吗?也许需要一个@。它与@一起工作,谢谢,我还没有考虑过低级别的实现(尽管它是隐式的),谢谢!PS:如果你可以为另一个编辑你的答案:)那么,你到底使用哪种编译器模式?当你用Lazarus创建一个新项目时,使用默认模式