【问题标题】:Delphi: How to structure multi-device application with native controls?Delphi:如何使用本机控件构建多设备应用程序?
【发布时间】:2014-12-08 08:53:54
【问题描述】:

或“如何在 Delphi 中将 UI 与业务逻辑分离?”

每个目标平台都有自己的一组原生 firemonkey 控件(Windows=VCL、MacOS=TMS mCL、Android=D.P.F、iOS=TMS iCLD.P.F)。新的FireUI(多设备表单设计器)是样式化组件的绝佳解决方案,但不适用于原生组件,因为它仍然需要主窗格上的相同组件来支持所有平台。由于您不能将它们混合在同一个表单上,它完全打破了 Delphi 的整个想法。

很多开发人员会说 Delphi 失败的方法,请参阅“Why FireMonkey is so fundamentally wrong in every aspect”。但是,这个问题的前提是不是与 Delphi 争论,而是要从它所提供的东西中获得最好的结果。

那么结论是,对于应用程序中的每个表单,您必须为每个目标平台制作一个单独的表单。这导致了以下问题:

挑战一:如何根据目标平台在项目中包含不同的表单文件?

解决方案1:包括所有的,即MainForm_IOS.pas、MainForm_Android.pas、MainForm_Win、MainForm_OSX.pas,然后在文件里面使用编译器指令,所以只有其中一个的内容文件处于活动状态。 缺点:一个大型应用程序可以有很多表单(我们大约有 40 个),所以我们谈论的是包含大量文件。

解决方案 2:不要将它们包含在项目中,而是将它们放在单独的文件夹中。然后您可以将匹配的文件夹添加到每个目标平台的搜索路径中。 缺点:它们不会显示在项目管理器中,因此每次需要查找文件时都会减慢工作流程。

解决方案 3:为每个目标平台创建一个项目。 缺点:每次添加新单元或更改通用项目设置时,都必须(记住)将其应用于所有项目。

更新:正如Malcom Groves video 中所建议的,将所有业务逻辑放在一个包中将消除解决方案3 的缺点。所以我认为解决方案3 是最好的方法。

挑战2:如何将不同的设备形式连接到(相同的)业务逻辑?

可能的解决方案:创建一个“Helper”类,其中包含您通常在表单单元中拥有的所有代码。

更新:这个“Helper 类”实际上就是 MVVM 所称的 ViewModel。我需要的似乎是一个可以支持数据绑定的 MVVM 框架。我已经为此做了another question


欢迎任何关于最佳实践的意见和建议。

【问题讨论】:

  • 我会为每个操作系统创建一个项目并采用分层方法,表单是表示层,并且对于每个操作系统都是唯一的。其余的都是业务层(可以根据您的需要进一步分层)。
  • @whosrdaddy:太好了,我刚刚添加了它作为挑战 1 的第三个解决方案。
  • 关于挑战 2,我将应用 MVC 模式。无论如何,这个问题不适合 SO,因为这个问题主要是基于意见的;)
  • 我完全同意 whosrdaddy - 这个问题不适合 SO,尤其是你如何为真正的问题做准备。
  • 汉斯,例如这里MVVM

标签: forms delphi architecture firemonkey delphi-xe7


【解决方案1】:

对于挑战 1: 您可以根据编译目标有条件地链接您的 FireMonkey 表单资源:

{$R *.Windows.fmx MSWINDOWS}
{$R *.Macintosh.fmx _MACOS}

等等

这正是 XE7 多视图设计器所做的,但我认为使用这种机制将整个表单文件有条件地链接到您的可执行文件中没有任何反对意见。当然你可能还想在你的项目文件中 ifdef 对应的单位。

对于挑战 2:只需使用某种形式的模型视图控制器逻辑。因此,您的平台相关表单将与平台无关控制器对话。

【讨论】:

  • 挑战1:你的意思是在表单单元中链接吗? - 我想这对应于解决方案2?挑战 2:我同意,我的问题是如何用 Delphi 实际实现它。
  • @Hans 看看我在你的问题中的评论。或者只是谷歌德尔福 MVC / MVVM
猜你喜欢
  • 2023-01-21
  • 2020-01-23
  • 1970-01-01
  • 2022-08-24
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多