用DELPHI 3.0制作应用软件经验谈 |
|||||||||||||||||||||||||||||||||||||||
DELPHI3.0提供了强大的数据库程序开发工具和组件,从底层的BDE(BorlandDatabaseEngine)到桌面的DatabaseDesktop,从各式各样的数据库开发组件,到完整的Client/Server解决方案。以下是我在使用DELPHI3.0制作数据库应用程序时悟得的几点“真经”,著之为文,与大家切磋。 一、2000年问题 在程序中使用有关日期的组件,如DatetimePicker,MaskEdit等时,均使用长日期格式即可。 二、赋予初始值 procedure Tform1.Button1Click(Sender:TObject); Var S:string; begin Table1.append; DBEdit1.text:=锦江区; DBComboBox1.text:=望滨路; S:=DBComboBox1.text; DBCheckedBox1.checked:=false; End; 以上,将为DBEdit1、DBComboBox1、DBCheckedBox1赋予初始值。通过对象浏览器研究组件对象的继承关系后,你一定还可以发现更多的隐含属性,这将为我们的编程工作提供很大的帮助。 三、动态问题 1、动态组合框(DBLookupComboBox) 为了使用户可以自己方便地改变组合框中的内容,例如经常变动的工作人员名单,应该使用DBLookupComboBox代替一般的DBComboBox。步骤如下: (1)建立一个工作人员名单数据库,在程序中提供对此库的增加、修改、删除等操作。 (2)使用DBLookupComboBox时,将属性ListSource指向名单库,Listfield和Keyfield指向名称字段,DataSource和Datafield指向欲写入的数据库和字段。在运行时,程序从名单库中提取名称信息,从而实现动态产生组合框中的内容。DataSource和Datafield也可以不填,这时提供动态信息,但不向任何数据库写入内容。 这种方法也适用于Dbgrid,方法见后所述的“lookup字段的使用”一节。 2、动态SQL ? 程序中可以动态地为Query组件写入SQL语句,填入参数。例如: procedure Tform1.Button1Click(Sender:TObject); Var S:string; begin Query1.active:=false; S:=select*fromt1.dbf Query1.SQL.add(s); S:=whereid=:id; Query1.SQL.add(s); Query1.Params[0].AsString:=1; Query1.active:=true; End; 以上程序将选出t1.dbf所有id为1的记录。使用动态SQL,可以实现动态查询、动态报表等功能,十分有用。 四、报表制作 在DELPHI3.0中,不再有DELPHI1.0、DELPHI2.0原有的ReprotSmith报表制作工具,改为一套完整的QuickReport报表组件,使得报表与应用程序的连接更为紧密,运用更加灵活方便。具体的制作可参考DELPHI3.0提供的例子程序Qr2demo。有以下几点值得注意: (1)建立新报表可以在File菜单的New...中选取Report,也可以先建立一个空表单(Form)后,再放上一个QuickReport组件。前者建立一个从TQuickReport继承的对象,后者不进行继承,若程序中使用了复杂报表(几个报表的组合)。 (2)主要对明细报表制作(Master/Detail)。 这类报表可以用两种方法生成,一种是像Qr2demo中一样,使用两个Table组件,另一种是使用一个Query组件,配合SQL语句实现。例如: Select*fromxl.dbfa,byq.dbfb Wherea.xlmc=b.xlmc 则将选出两个库中所有xlmc字段相同的记录,从而实现了主要对明细关系。 (3)BeforePrint事件和OnPrint事件可提供打印前的预处理。 以下程序中,Qrimage画了一个“勾”,通过BeforePrint事件和OnPrint事件预处理当前记录的下一条记录,从而在产生报表时决定在当前记录的“高压”还是“低压”处打勾。Qrimage的enabled属性决定其是否显示和打印。 procedure do1(s1:string); begin if s1=高压then begin qr1.qrimage1.enabled:=true; qr1.qrimage2.enabled:=false; end elseif s1=低压then begin qr1.qrimage1.enabled:=false; qr1.qrimage2.enabled:=true; end else begin qr1.qrimage1.enabled:=false; qr1.qrimage2.enabled:=false; end; end; procedure Tqr1.qr2BeforePrint(Sender:TQuickRep;varPrintReport:Boolean); begin query2.active:=true; query2.first; qrimage1.enabled:=false; qrimage2.enabled:=false; end; procedure Tqr2.QRDBText5Print(sender:TObject;varValue:String); begin do1(query2.fieldbyname(DianYa).asstring); if not query2.eof then query2.next; end; 五、lookup字段的使用 在实际的数据库程序中,我们经常使用编码表,例如对消费品名进行编码,在存入消费库中时使用消费品编码,而在使用DBGRID或其他数据明了构件显示出来时使用具体内容。这就要使用lookup字段了。 我们可以作以下试验: (1)新建一个项目,使用database desktop建两个库,别名test,如下: nameid:编码表
id:欲存入表(现为空)
|