Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16495038
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 20:46:38

下载本文示例代码
p>  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   (2)双击table2,弹出字段编辑器,在字段编辑器上右击,选择“addfields...",加入“id"字段;再选择“newfield..."。这时弹出newfield对话框,如下填写: name type Field type Key fields dataset Lookup keys Result field test string ookup Id Table1 id name   (3)将table1和table2的active属性置为true,编译运行。   这时可以看出,从test字段下拉出姓名,选定一个后,存入id字段的是其编码,这样就达到了目的。 p>  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   (2)双击table2,弹出字段编辑器,在字段编辑器上右击,选择“addfields...",加入“id"字段;再选择“newfield..."。这时弹出newfield对话框,如下填写: name type Field type Key fields dataset Lookup keys Result field test string ookup Id Table1 id name   (3)将table1和table2的active属性置为true,编译运行。   这时可以看出,从test字段下拉出姓名,选定一个后,存入id字段的是其编码,这样就达到了目的。 下载本文示例代码


用DELPHI 3.0制作应用软件经验谈用DELPHI 3.0制作应用软件经验谈用DELPHI 3.0制作应用软件经验谈用DELPHI 3.0制作应用软件经验谈用DELPHI 3.0制作应用软件经验谈用DELPHI 3.0制作应用软件经验谈用DELPHI 3.0制作应用软件经验谈用DELPHI 3.0制作应用软件经验谈用DELPHI 3.0制作应用软件经验谈用DELPHI 3.0制作应用软件经验谈用DELPHI 3.0制作应用软件经验谈用DELPHI 3.0制作应用软件经验谈用DELPHI 3.0制作应用软件经验谈用DELPHI 3.0制作应用软件经验谈用DELPHI 3.0制作应用软件经验谈
阅读(107) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~