跑在.NET的大路上——Delphi 2005快速开发.NET通讯簿

编程爱好者

前言: Borland新推出的Delphi 2005为那些徘徊在.NET门外又钟爱Delphi这款快速应用程序开发工具(RAD)的编程爱好者带来了希望。它提供了VCL for .NET系列组件,使编程爱好者使用传统的Win32开发方式就可以开发出.NET平台的应用,而不必了解已被很好封装的.NET细节。许多Win32下的成熟开发方法可以原封不动地移植到.NET中,绝大多数不涉及系统底层的Delphi源代码稍作修改即可在.NET中重用。同时Delphi 2005还将ADO.NET整合到RAD中,更使.NET下的数据库开发如虎添翼。

本文就将用Delphi 2005开发一个.NET下的通讯录程序。程序虽然简单,但却包括了开发.NET应用程序的诸多要点。本例后台数据库使用SQL Server 2000,并假设已经建好了数据库zzh2005和数据表mp2005。

启动Delphi 2005,在“Welcome Page”中点击“New”按钮,在弹出的对话框中点“Delphi for .NET Projects”项,然后在右边的子项中选“VCL Forms Applictions”,最后点“OK”,就生成了.NET应用程序框架。整个应用程序的建立我们则大致遵照建立数据库、连接数据库、设计应用程序界面、实现代码的合理顺序进行。由于构造数据库非本文重点,假设已经建立,我们就先来看看采用何种技术来连接已有的数据库。

一、测试数据库连接

要开发一个通讯录程序,首先就要考虑如何和数据库连接。Delphi 2005提供了多种数据库连接方式,除了ADO和ODBC外,还有Borland的数据库引擎BDE和DBExpress,它们都可以在.NET中使用。其中ADO.NET是微软力推的数据库访问技术,与.NET平台的结合最为紧密。BDE是Borland自有的数据库引擎,得到了Borland Windows平台开发工具的全线支持。为解决数据库引擎跨平台问题,Borland又对BDE进行了改进,推出了全新的DBExpress。本文则以通用性最高的ADO.NET为例,介绍.NET中的数据库连接技术。

点击“Tool Patette”上的“Categories”按钮,在随之出现的控件列表框中选“dbGo”项,所有ADO.NET控件便呈现眼前。其中,TADOConnection是纯粹的数据库连接控件,它为其它ADO.NET控件提供数据源。TADOTable、TADODataset和TADOQuery是数据集控件,TADOTable返回一个表的全部数据。TADODataset和TADOQuery返回符合查询条件的数据。TADOCommand、TADOStoredProc分别是数据库操作语句和存储过程执行控件,凡是不需要返回数据集的操作均可使用TADOCommand控件,而要执行数据库中的存储过程则非用TADOStoredProc控件不可。不难看出,几个ADO.NET控件各有特长,各有妙用,不过在大多数数据库应用程序中,以TADOCommand、TADOTable和TADODataset的使用频度最高。

将TADODataset拖到主窗体中,便生成了ADODataset1对象。选中它,再在“Object Inspector”中点击“ConnectionString”属性后的按钮,打开数据库连接窗口。选“Use Connection String”项,点击其后的“Build…”按钮。在弹出的设置框中选“Microsoft OLE DB Provider for SQL Server”项,即MS SQL Server数据库引擎。点击“下一步”按钮后,出现数据连接页面。在“选择和输入服务器名称”组合框中输入或选择数据库服务器名称,一般为主机名或主机IP地址。然后选择“输入登录服务器的信息”项,它的选择应与SQL Server 2000中的设置一致。接着从“在服务器上选择数据库”组合框中选择zzh2005数据库,点击“测试连接”按钮(图1)。若连接成功,点击“确定”按钮退出;若连接不成功,则要检查上述参数项是否设置正确,以及后台数据库运行是否正常。最后在“CommandText”属性中输入查询语句“Select * from Mp2005”,并将“Active”属性设为True。这样就把数据表Mp2005中的全部数据装入了ADODataset1数据集中。

3-g14-1-1.jpg
图1

二、程序界面设计

成功设置好数据库连接后,我们就可以来设计程序界面了。要让数据操作控件访问数据集,中间还得有个桥梁,这就是数据访问控件,它们全在“Data Access”项下。将其中的TDataSource控件拖到主窗体中,生成DataSource1对象,并在“Object Inspector”中设其“DataSet”属性为ADODataset1。再选择“Data Controls”项,里面有14个常用的数据操作控件。将TDBGrid拖到主窗体中,生成DBGrid1对象,并设其“DataSource”属性为DataSource1。这样数据表Mp2005的数据便在DBGrid1显示出来。现在DBGrid1的列标题显示的是字段名,不很直观,应把它们改成中文名称。双击DBGrid1,弹出列设置框。点击“Add New”按钮,添加Tcolumn对象,并将其“FieldName”属性设为Mp2005表的某个字段,这里设为xj_bh,Title属性类下的“Caption”属性也相应改为“编号”,“Alignment”则设为taCenter,意为列标题居中显示。同理,将表中的其它字段一一加入并设置好。

在“Tool Patette”上选“Standard”项,将其下的TButton控件拖到主窗体中,共拖5次,生成Button1、Button2、Button3、Button4和Button5按钮对象,分别设它们的“Caption”属性为“&A增加”、“&D删除”、“&S保存”、“&S查询”和“&X退出”。最后将它们和DBGrid1对象的大小和位置均设置好,程序界面的设计即告完成(图2)。

3-g14-1-2.jpg
图2

三、实现查询代码

尽管Delphi 2005堪称高效的RAD,甚至不写一行代码就可以开发出一个数据库应用程序,但若要充分发挥它的功能并达到设计的要求,必要的代码还是不可少。下面就是通讯录程序的代码。

procedure TForm1.DataSource1StateCh

ange(Sender: TObject);

begin

if (DataSource1.State=dsInsert) or (DataSource1.State=dsEdit) then

begin

Button2.Enabled:=false;

Button3.Enabled:=true;

end

else

begin

Button2.Enabled:=True;

Button3.Enabled:=false;

end;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

AdoDataset1.Append;

Dbgrid1.SetFocus;

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

if application.MessageBox('请确认是否删除该条信息?','删除',MB_OKCANCEL)=ID_OK then ADODataset1.Delete;

end;

procedure TForm1.Button3Click(Sender: TObject);

begin

AdoDataset1.Post;

end;

procedure TForm1.Button4Click(Sender: TObject);

var

sss:string;

begin

sss:=Trim(inputbox('查询','请输入姓名(可不输全):',''));

AdoDataset1.Locate('xj_xm',sss,[loParti

alKey])

end;

procedure TForm1.Button5Click(Sender: TObject);

begin

close;

end;

代码输入并调试完毕后,选择“Project→Build”菜单,即可生成执行文件。运行它试试,还不错吧(图3)?当然,有兴趣的朋友还可以为它增加一些功能,如打印、发邮件、存储照片、播放音乐等,使之成为一个实用的电子名片管理软件。

3-g14-1-3.jpg
图3

四、小结

通过以上的例子可以看出,Delphi 2005的确实现了让Win32程序员平滑过渡到.NET平台的承诺。

Delphi 2005将几乎所有Win32控件都移植到了.NET开发环境中,使大量Win32 Delphi代码不加修改或稍作修改就可以用在.NET程序的开发上,很好地保护了现有的开发资源,并因代码高度的可重用性而提高了开发效率和软件品质。

Delphi 2005对.NET的支持相比前作完善了许多,.NET平台的各种资源都能被充分利用,不管是第三方控件还是.NET自带的类库。而且它对.NET的开发元素的封装和改造非常成功。

Delphi 2005差不多可以开发.NET平台上的所有软件类型。而现在.NET确实已是一个成熟和优秀的平台。

最后特别想同读者们分享的是Delphi 2005强大的即时提示和帮助功能。它大大减轻了开发者需要记忆的强度和查询难度,不仅减轻了开发的压力,而且提高了开发的效率。