添加业务域对象
设定根节点的名称为MoneyModel然后设定New_ModelRoot节点名称为MoneyModelRoot同时别忘了设定MoneyModel的Model root class属性为MoneyModelRoot后面的所有类都将从MoneyModelRoot类派生
在右键菜单中选New Class命令创建新的类Person和AcctItem设定它们的SuperClass属性为MoneyModalRoot
添加属性
在模型编辑器的树视图中选择AcctItem类使用右键菜单中的Add Attribute来添加AmountHappenDate和Name属性设置所有属性为Persistent类型表示这些属性的值要保存到数据库中设定属性的数据类型为Currency编辑界面示意如下
添加关联
选中MoneyModel节点然后在右键菜单中选择New Association命令创建PayAssoc关联命名关联的两端角色为Pay和Money每个角色的设置如下
Pay: 选择AcctItem作为角色的类关闭Embed checkbox并选择*作为多重度因子
PayPerson: 选择Person作为角色的类设定多重度为
编辑界面示意如下
通过上面一系列的操作我们就完成了整个的建模工作它同前面的UML模型是完全等价的
添加用户界面
要想使一个应用程序可以跑起来我们还必须做一些界面工作在CMoneypas 单元中添加BoldAFPDefault和CDataModule到uses部分BoldAFPDefault使得Bold for Delphi可以自动生成Bold控件可调用的商业对象的编辑界CDataModule单元则使Bold组件可以获知数据模块中的模型从Bold Handles组件面板上拖动个BoldListHandle控件到窗体上然后从Bold Controls组件面板上拖放个BoldNavigator和个BoldGrid组件分别用于显示人员和账目信息列表另外还要添加个标准的Label控件来添加界面描述界面示意图如下
其中BoldListHandle组件就相当于在数据库开发中的DataSource数据源两者的主要的区别是BoldListHandle中的数据是对象实例而DataSource中的数据是数据库记录而BoldGrid和BoldNavigator则对应于数据感知组件中的DbGrid和DbNavigator组件区别就是DbGrid中编辑的是数据库记录而BoldGrid中编辑的是对象属性
在数据库开发中需要将数据源同数据感知组件绑定同样为了编辑对象数据也要将BoldListHandle同对象感知组件BoldNavigator和BoldGrid进行绑定设定BoldNavigator和BoldGrid的BoldHandle为相应的数据源设定后的结果如下
在普通数据库开发中除了要有DataSource外还要有同DataSource绑定的数据集DataSet同样的BoldListHandle对应于DataSource也要同DataMoudle中的BoldModel进行绑定而Bold中的BoldSystemHandle组件就对应于TDataBase包含了对象模型中所有对象实例因此设定两个BoldListHandle组件的RootHandle属性为DmMoneybshMoney这还不算完因为现在BoldListHandle是要分别获得人员和账目的相关信息而要指定对象DataBase中的对象DataSet在Bold中指定不同的对象集合需要使用OCL语言双击BoldListHandle的Expression属性会弹出一个OCL语言编辑器如下图示意
前面提到了OCL语言是一种标准的对象查询语言这里先不详述后面会进一步的介绍这里为了获得全部人员信息的列表的话需要输入PersonallInstances表达式同样获得账目列表信息的话需要设定BoldListHanlde的Expression属性为AcctItemallInstances
设定好BoldHandle的属性后右击BoldGrid然后选择Create Default Columns命令会创建对应于对象元数据的字段最后还要在添加DataModule的OnDestroy事件处理函数
procedure TDmMoneyDataModuleDestroy(Sender: TObject);
begin
//更新数据库
bshMoneySystemUpdateDatabase;
end;
上面语句确保运行时录入的信息将被保存到XML文件中最后运行程序输入一些信息的效果图示意如下
Bold同传统数据库开发的区别
两者之间最重要的不同就是元数据Borland的控件感知的是数据库表字段的结构定义元数据而Bold控件感知的是类的定义元数据两者另一个重要的区别就是数据的同步的处理方式在传统的数据库程序中我们想同步不同网格中的数据的话可以使用下列方法
A) 多个查询
三个网格控件每个连接到不同的SQL数据源来获取数据 每次更新任意网格的数据时重新运行这些查询来更新这要求我们进行大量代码编写并且要仔细考虑数据集的状态比如当前数据集是否处于编辑模式等
B)过滤网格
通过使用单一查询并借助于某些更为强大的第三方的带有内置的过滤功能的网格控件我们可以稍微简单一些的实现这个功能但依赖于SQL表达式的查询会产生一个只读的数据集同时对第三方控件的依赖也是不好的问题
而在Bold中我们可以随意的修改任何对象的值所有的变动会自动的同步更新Bold for Delphi还支持各种方法来确保同步可以在网络上的不同机器间实现由于篇幅限制这种功能将不在本文中讨论