用DELPHI 3.0制作应用软件经验谈

2008-04-09 04:17:25来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

  DELPHI3.0提供了强大的数据库程序开发工具和组件,从底层的BDE(BorlandDatabaseEngine)到桌面的DatabaseDesktop,从各式各样的数据库开发组件,到完整的Client/Server解决方案。以下是我在使用DELPHI3.0制作数据库应用程序时悟得的几点“真经”,著之为文,与大家切磋。

一、2000年问题
  在程序中使用有关日期的组件,如DatetimePicker,MaskEdit等时,均使用长日期格式即可。

二、赋予初始值
  你可能希望在使用Append增加一条记录时,能自动填写某些字段,这时,可以使用数据库组件的隐含属性。由于面向对象语言的继承特性,父对象的属性被子对象所屏蔽、继承或扩充。出于安全因素,部分属性在子对象的Object Inspector中没有显式的列出,但实际上并未屏蔽,仍然可以使用,如DBEdit、DBCombobox的text属性,DBCheckedbox的Checked属性,报表组件QRDBText的Caption属性等都可以在程序中使用。如下面一段程序:
  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:编码表

字段名 Name Id 记录1 Tanglu 1 记录2 shangwang 2

  id:欲存入表(现为空)

字段名 Id 记录1   记录2  


  在Form1上放如下构件:

table1 指向nameid表,即databasename=test; tablename=nameid; Datasource1 指向table1,即dataset=table1 table2 指向id表,即databasename=test; tablename=id; Datasource2 指向table2,即dataset=table2 dbgrid1 指向table2,即dataSource=dataSource2

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:如何实现在一个Dbgrid中显示多数据库

下一篇:用Delphi编程访问SQLServer数据库