Delphi深度探索-数据库明了的ActiveX控件
强大的数据库开发功能无疑是Delphi王冠上的明珠,至少有80%以上的人每天使用Delphi来开发数据库程序。基于积木式的VCL数据库控件,以及Dev Express和Woll2Woll等公司提供的强大的第三方数据库明了控件,毫不夸张的说只需要简单的设置一下属性,拖拉几下鼠标我们就可以非常快速的完成数据库程序的开发。由于Delphi的数据库功能过于强大了,所以很多人就忽视了一个事实,就是ActiveX同样可以提供灵活的数据库绑定,遗憾的是Delphi本身所提供的几个第三方的ActiveX控件中没有一个是数据库明了的控件,这间接导致了一个误解,使得很多人误以为Delphi并不支持数据明了的ActiveX控件(也包括很久以前的我J)。这当然是错误的看法。
在Delphi中使用数据明了的ActiveX控件
在下面的例子中,我们将使用随Office 2000安装到系统中的Microsoft Calendar 9.0控件来进行演示,它就是一个数据明了控件。选择Component | Import ActiveX Control,选择Microsoft Calendar 9.0(见下图1.12),把类名从TCalendar改成TAXCalendar,以避免同系统中原有的同名控件冲突,然后点Install按钮安装此控件。
图1.12
新建一个程序,在窗体上放置一个TAXCalendar控件。再放上一个DataSource 和Table控件。设定DataSource的Dataset为Table1,然后设定Table1的DataBaseName 属性为DBDEMOS,TableName 属性为EMPLOYEE.DB,最后设定Table1.Active属性为True。
接下来就该进行数据库绑定了,注意一下引入的TAXCalendar具有DataSource和DataBindings这两个同一般ActiveX控件不同的属性,这是因为ActiveX Import Wizard在引入ActiveX控件先判断是否是数据库明了的控件,如果是就以TDBOleControl作为基类进行继承,如果不是就从TOleControl开始继承。而TDBOleControl实现了DataBindings和DataSource属性。设定AXCalendar1.DataSource属性为Datasource1。
这时我们在窗体上用鼠标右键单击TAXCalendar控件的话,会发现在右键菜单中多出了一个DataBindings…菜单项(见下图1.13)。
图1.13
点击菜单项后,会显示数据绑定属性编辑框(见下图1.14)。分别在FieldName列表框中选定HireDate,在Property Name列表框中选择Value(12)(其中12是Value的Dispid号),点击Bind按钮,就会在数据库字段和Value属性间建立数据关联。
图1.14
最后,再在窗体上放置一个DBGrid和DBNavigator控件,并设定它们的DataSource为DataSource1。运行程序,移动当前数据位置的时候,你可以注意到ActiveX的日期显示也会随之变化,同数据库中的Hiredate保持一致。如图1.15所示:
图1.15
创建数据明了的ActiveX控件
虽然我们已经清楚了Delphi的确可以使用数据明了的ActiveX控件,那么一个新的问题就产生了,Delphi本身可不可以创建数据明了的ActiveX控件呢?由于Delphi提供了一步到位的ActiveX控件转换生成,就有很多人希望能够把Delphi中强大的数据库控件转换为ActiveX控件,以便能在其他支持ActiveX的开发环境开发数据库程序时仍然能够享受到象在Delphi中一样的轻松愉快的感觉。但是我在前面第一部分中已经提到了,由于Delphi的数据明了控件同ActiveX数据库控件的在内部机制上差距过大,因此Delphi无法简单的直接转换其强大的数据库控件。那么是不是就意味我们就没有办法了呢?of course not! 其实使用类型库编辑器,我们可以异常轻松的实现数据明了的ActiveX控件,就让我们用TEdit控件来试验一下,看看如何去做。
选菜单命令New | ActiveX | ActiveX Control启动ActiveX Control Convert Wizard,选TEdit控件作为转化对象,生成EditXActiveX框架。
接下来,我们将改造TEdit的Text属性,使其支持数据绑定。选 View | Type Library来察看Delphi生成的类型库,并选中Text属性,然后切换到Flags属性页(见下图1.16)。
图1.16
注意在Flags属性页有很多多选框,对于我们来说,只关心同数据绑定相关的选项。它们是Bindable,Display Bindable,Default Bindable,Immediate Bindable和Request Edit选项。
标记一个属性为bindable后,并将其同数据库字段绑定后,当用户修改了属性后,控件就会通知数据库值已经变化,并请求数据库记录更新状况,数据库反过来也会通知记录更新是否成功。
Bindable选项表明属性支持数据绑定,如果把属性标记为bindable,属性将在其值变化时通知其容器。
Request Edit表明属性支持OnRequestEdit 通知消息,这允许控件询问容器属性值是否允许用户修改。
Display Bindable表示容器可以向用户显示这个属性是可绑定的。
Default Bindable表示它是唯一的,缺省的可绑定属性,使用它必须同时标记了Bindable属性。
Immediate Bindable当被标记时,所有的改变都会被通知,同时还需要设定bindable和Request Edit标记。
下面我们就标记EditX控件的Text属性为Bindable,Display Bindable,Default Bindable,和Request Edit。然后点Refresh按钮刷新类型库,最后选Run | Register ActiveX Server注册ActiveX控件。
再引入新的EditX ActiveX控件,就会发现它确实实现了数据绑定的功能,下面就是一个使用了数据明了的EditX的程序的运行示意图1.17,(Delphi的ActiveX数据明了功能的实现的确简单很COOL,不是吗?。
图1.17