带有WebBroser和HTML应用程序的MVC Delphi看起来像什么?

带有WebBroser和HTML应用程序的MVC Delphi看起来像什么?,delphi,model-view-controller,oop,webbrowser-control,Delphi,Model View Controller,Oop,Webbrowser Control,当我第一次读到这篇文章时,我感到很困惑,他说在启动一个应用程序时,你可以使用“MVC风格的设计”,该应用程序在表单上同时使用Delphi和WebBrowser组件,以及HTML与CSS和JavaScript来创建灵活的UI和动态更新的视觉效果的奇妙组合 在我听说Ajax之前,我已经在Delphi中做了一段时间,在我听说“MVC”之前,我也做了很多 也许这是一个寻求帮助的好机会:使用MVC设计的代码看起来像什么 通过阅读工作源代码,然后阅读有关某个技术主题的大量文献,我总是能更好地理解范例。由MV

当我第一次读到这篇文章时,我感到很困惑,他说在启动一个应用程序时,你可以使用“MVC风格的设计”,该应用程序在表单上同时使用Delphi和WebBrowser组件,以及HTML与CSS和JavaScript来创建灵活的UI和动态更新的视觉效果的奇妙组合

在我听说Ajax之前,我已经在Delphi中做了一段时间,在我听说“MVC”之前,我也做了很多

也许这是一个寻求帮助的好机会:使用MVC设计的代码看起来像什么

通过阅读工作源代码,然后阅读有关某个技术主题的大量文献,我总是能更好地理解范例。由MVC模式设计的原型教科书示例Delphi WebBrowser HTML DOM修改应用程序会是什么样子?

MVC代表“模型-视图-控制器”。因此,使用MVC的应用程序以以下方式制作其接口:

  • 拥有封装业务层(MVC上的“模型”)上的业务规则的类

  • 表单(在桌面应用程序上)或html(jsp、asp.net、coldfusion等)页面,是用户功能的可视化表示。(这是“视图”)

  • 修改“视图”的类(或方法,取决于复杂性),使其按照所需的行为进行操作。(控制人)

因此,控制器绑定在模型和视图上。视图未绑定到特定控制器(因此可以在其他零件上重用),也未绑定到模型

是控制器让事情发生。它与模型类交互并控制视图的行为


这就是我对MVC的理解。

一个非常简单的演示应用程序,演示了一般原理:

TModel = class
  property ValueList : TList <Double> read ... write ...;
end;
视图仅从模型中读取数据。与GUI的所有交互都委托给控制器类(顺便说一句,它使用观察者设计模式):

通过这种方式,您可以实现多项目标:

  • 您可以轻松地使用多个视图(允许用户在视图之间切换,或同时显示视图)
  • 所有数据都在模型中,并且与表示完全分离。更改表达,不更改模型中的任何内容
  • 要实现持久性,只需保存模型
  • 您可以使用控制器执行所有必要的检查。(而不是为每个视图实现此功能)
为了获得一个完整的优势列表,web上充满了对MVC模式及其替代方案的讨论


在Delphi应用程序中,您可能会发现,由于Delphi中基于事件的编程风格,控制器的开销很大。我经常做的只是将应用程序拆分为模型和视图。

我认为Smasher很好地解释了基本原理。我之所以认为MVC是一种好的风格,是因为Delphi部分是模型和控制器,HTML+CSS+Javascript通过调用Delphi应用程序中定义的后期绑定COM组件来定义视图。这是一篇很好的文章:解释如何在中从Javascript调用Delphi。

通常控制器修改模型,而不是视图。这听起来很不错,但您是否碰巧有一个简单的演示应用程序,可以在代码中显示这是如何发生的?我已经相应地更新了这个问题。@SeanX:嗯?好了,视图是一个静态的东西,由控制器控制。是使事情发生的控制器。视图从模型中获得它所需要的一切。控制器更改模型。这就是我的理解。如果您想要设计方案,您可能必须更详细地说明数据如何在应用程序中流动。webbrowser准确地显示了什么?应用程序中存在哪些部分?哪一个是GUI相关的?啊,是的,现在我们有进展了。因此,在一个只有一个TWebBrowser来显示HTML的Delphi应用程序中,控制器可能是从“视图”中提取HTML并将其放入WebBrowser组件的东西?我将WebBrowser视为显示HTML的视图。HTML的另一个视图可能是显示HTML文档结构的树。
IView = interface ['{0D57624C-CDDE-458B-A36C-436AE465B477}']
public
  procedure Update;
end;

TTableView = class (TInterfacedObject, IView)
private
  FModel : TModel;
  FController : TController;
public
  procedure Update;
end;

TDiagramView = class (TInterfacedObject, IView)
private
  FModel : TModel;
  FController : TController;
public
  procedure Update;
end;
TController = class
private
  FModel : TModel;
  FViewList : TList <IView>;
private
  procedure UpdateViews;
public
  procedure AddDataValue (Value : Double);
end;
procedure TController.AddDataValue (Value : Double);
begin
  FModel.ValueList.Add (Value);
  UpdateViews;
end;

procedure TController.UpdateViews;
var
  View : IView;
begin
  for View in FViewList do
    View.Update;
end;