答案 0 :(得分:4)
如果使用“将每个数据库对象放入一个大数据模块”(或大型应用程序中的“少数大数据模块”)方法,请务必小心。这可以使您的项目数据模块如此之大,您将不得不使用高清显示器查看此数据模块上的所有TXDataset
底线:切换到使用业务逻辑的专用类而不是大型全局数据模块。仅在非常小的项目中使用具有逻辑的全局数据模块。
答案 1 :(得分:4)
嗯,我强烈建议您在设计用户界面时使用Actions(TActionList)。有许多预定义的操作,包括可以对数据集执行的下一个/上一个/插入/删除/编辑/更新操作,因此最好使用这些操作并将它们链接到表单上的按钮/菜单。这可以防止重复的UI逻辑代码。
Delphi不需要CRUD生成器!!将TDataSource,TDBGrid和TActionList添加到表单,将预定义的数据源操作添加到操作列表,将这些操作链接到按钮或菜单,然后就完成了!
答案 2 :(得分:4)
我有自己的Delphi / MySQL框架,可以让我快速添加“新屏幕”。我不会分享它,但我可以描述我采取的方法:
我使用带有基于TFrame的层次结构的选项卡式界面。我创建了一个标签并将TFrame链接到其中。
我使用标准的mysql存储过程实现来处理所有的crud管道和并发控制。 CustomerSEL,CustomerGET,CustomerUPD,CustomerDEL等......
我的主要表单主要包含导航栏面板和包含TPageControl的面板
我的层次结构中的类的示例
TFRAME TMFrame - 我的派生,接口实现捕获OnShow,OnHide和其他一些细节
- TWebBrowserFrame --TDataAwareFrame --TObjectEditFrame --TCustomerEditFrame --TOrderEditFrame 等等... --TObjectListFrame --TCustomerListFrame
等...
和一些对话.. ..
TDialog TMDialog --TDataAwareDialog --TObjectEditDialog - TContactEditDialog 等等.. --TObjectSelectDialog --TContactSelectDialog
等...
当我添加要管理的新对象时,它可能是客户的新属性,假设我们想跟踪客户拥有的车辆。
创建表CustomerVehicles 我运行我的特殊sproc生成器,创建我的SEL,GET,UPD,DEL 测试那些......
从我上面提到的基类派生,删除一些控件。将选项卡添加到TCustomerEdit。
Delphi始终将数据集作为抽象层,通过DataSources将其公开给您的GUI。将数据集添加到客户数据模块,然后“注册”。我自己的派生数据模块类TMDataModule
中的自定义函数安全控制同样在框架中处理。我'注册'需要安全标志才能显示或启用的组件。
我通常可以添加一个新对象,构建sprocs,在一小时内添加维护屏幕。
当然,这通常只是一个开始,通常当你添加一些东西时,你使用它不仅仅是跟踪。如果这是一个车库应用程序,我们想要添加客户带入车库的车辆,识别它,以便我们可以跟踪历史记录。但即便如此,它也很快。
我尝试使用'更新的开发工具'转包给年轻人,当我说我用Delphi快十倍时,他们似乎永远不会相信我!我可以在两个小时内完成没有错误的工作,看起来它们需要两天时间,而且它们仍然有漏洞......
DO - 小心规划您的VFI!正如有人提到的,如果你想在你的父类之一上更改组件的名称,请做好准备。你需要打开并“编辑”层次结构中的每个孩子,即使你清理DCU,你仍然可以拥有一些DFM地狱。我可以向你保证,2006年这仍然是一个问题。
不要创建一个怪物数据模块
你需要花时间进行前期设计,在你创造了大量的家属之后进行重构可能是一个有趣的挑战,但是当你必须快速获得新的工作时,这是一场噩梦!
答案 3 :(得分:3)
对于大型应用程序,我使用tiopf对象持久性框架。这让我可以轻松处理对象而不是数据集和交换数据库。我的大多数业务逻辑都转移到了业务对象模型(BOM)中,我的表单非常愚蠢。 tiopf有几种方法可以将BOM连接到表单;持久感知控件,Ttidataset用于数据感知控件和Mogel Gui Mediator类用于连接正常控件。
对于小型和快速的应用程序,我只使用数据模块和数据库组件。要记住的主要事项是:
答案 4 :(得分:2)
使用VFI(视觉形式继承)。设计一个标准的数据库表单。例如,空DataSet,DataSource,一个由2张纸组成的PageControl。首先是空的,稍后您将添加编辑控件来操纵子表单中的数据。将DBGrid添加到第二个工作表。请注意,这不是OOP方式,但它简单快捷。
答案 5 :(得分:2)
我会看看Remobjects的Data Abstract。