或“如何在 Delphi 中将 UI 与业务逻辑分离?”
每个目标平台都有自己的一组原生 firemonkey 控件(Windows= VCL
、MacOS= TMS mCL
、Android= D.P.F
、iOS=TMS iCL
和D.P.F
)。新的FireUI
(多设备表单设计器)是样式化组件的绝佳解决方案,但不适用于原生组件,因为它仍然需要主窗格上的相同组件来支持所有平台。由于您不能将它们混合在同一个表单上,它完全打破了 Delphi 的整个想法。
许多开发人员会说 Delphi是一种失败的方法,请参阅“为什么 FireMonkey 在各个方面都存在根本性错误”。然而,这个问题的前提不是反对 Delphi,而是从它所提供的东西中获得最好的结果。
结论是,对于应用程序中的每个表单,您必须为每个目标平台制作一个单独的表单。这导致了这些问题:
挑战一:如何根据目标平台在项目中包含不同的表单文件?
方案一:将它们全部包含进去,即MainForm_IOS.pas、MainForm_Android.pas、MainForm_Win、MainForm_OSX.pas,然后在文件中使用编译器指令,这样只有其中一个文件的内容是活动的。缺点:一个大型应用程序可以有很多表单(我们大约有 40 个),所以我们谈论的是包含大量文件。
解决方案 2:不要将它们包含在项目中,而是将它们放在单独的文件夹中。然后您可以将匹配的文件夹添加到每个目标平台的搜索路径中。缺点:它们不会出现在项目管理器中,因此每次您需要查找文件时都会减慢工作流程。
解决方案 3:为每个目标平台创建一个项目。缺点:每次添加新单元或更改通用项目设置时,您都必须(记住)将其应用于所有项目。
更新:正如Malcom Groves 视频中所建议的,将所有业务逻辑放在一个包中将消除解决方案 3 的缺点。所以我认为解决方案 3 是最好的方法。
挑战 2:如何将不同的设备形式连接到(相同的)业务逻辑?
可能的解决方案:创建一个“Helper”类,其中包含您通常在表单单元中拥有的所有代码。
更新:这个“Helper 类”实际上是 MVVM 所称的ViewModel
. 我需要的似乎是一个可以支持数据绑定的 MVVM 框架。我对此提出了另一个问题。
欢迎任何关于最佳实践的意见和建议。