📄 delp025.html
字号:
<html><!-- #BeginTemplate "/Templates/delphi.dwt" -->
<head>
<!-- #BeginEditable "doctitle" -->
<title>独孤之所 - 用DELPHI 3.0制作应用软件经验谈</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta NAME="author" VALUE="独孤求败(Fwolf)">
<!-- #EndEditable -->
<style type="text/css">
<!--
body { font-family: "宋体"; font-size: 9pt}
td { font-family: "宋体"; font-size: 9pt}
a:hover { text-decoration: underline}
a { text-decoration: none}
input { font-family: "宋体"; font-size: 9pt}
select { font-family: "宋体"; font-size: 9pt}
-->
</style>
</head>
<body>
<table width="98%" border="0" align="center">
<tr>
<td width="33%"><a href="../../../index.html"><img src="../../../logos/fwolf9.gif" width="271" height="60" alt="独孤之所首页" border="0"></a></td>
<td width="67%">
<div align="center"> </div>
</td>
</tr>
</table>
<table width="100%" border="0" align="center" cellspacing="1" bgcolor="#66FF66">
<tr>
<td width="90%"><a href="../../../index2.html">独孤之所</a> > <a href="../../book.htm">天下文章</a>
> <a href="../delphi.html">Delphi</a> > <font color="#FF3333"><!-- #BeginEditable "2%C7%F8" -->用DELPHI
3.0制作应用软件经验谈<!-- #EndEditable --></font>
</td>
<td width="10%">
<div align="center"><a href="javascript:window.close()">[关闭窗口]</a></div>
</td>
</tr>
</table>
<hr size="1">
<br>
<table width="584" border="0" align="center" cellspacing="1">
<tr>
<td width="582"> <font color="#FF3333">
<div align="center"><!-- #BeginEditable "%B1%EA%CC%E2" -->用DELPHI 3.0制作应用软件经验谈<!-- #EndEditable --></div>
</font> </td>
</tr>
<tr>
<td width="582">
<div align="center"><!-- #BeginEditable "%D7%F7%D5%DF" --><!-- #EndEditable --></div>
</td>
</tr>
<tr>
<td width="582"><!-- #BeginEditable "%CE%C4%B1%BE%C7%F8" -->
<center>
<p> DELPHI3.0提供了强大的数据库程序开发工具和组件,从底层的BDE(BorlandDatabaseEngine)到桌面的DatabaseDesktop,从各式各样的数据库开发组件,到完整的Client/Server解决方案。以下是我在使用DELPHI3.0制作数据库应用程序时悟得的几点“真经”,著之为文,与大家切磋。<br>
<br>
<br>
<br>
<strong>一、2000年问题<br>
<br>
</strong> 在程序中使用有关日期的组件,如DatetimePicker,MaskEdit等时,均使用长日期格式即可。<br>
<br>
<br>
<br>
<strong>二、赋予初始值<descript></strong></p>
<p align="left"><strong><br>
<br>
</strong> 你可能希望在使用Append增加一条记录时,能自动填写某些字段,这时,可以使用数据库组件的隐含属性。由于面向对象语言的继承特性,父对象的属性被子对象所屏蔽、继承或扩充。出于安全因素,部分属性在子对象的Object
Inspector中没有显式的列出,但实际上并未屏蔽,仍然可以使用,如DBEdit、DBCombobox的text属性,DBCheckedbox的Checked属性,报表组件QRDBText的Caption属性等都可以在程序中使用。如下面一段程序:<br>
<br>
procedure Tform1.Button1Click(Sender:TObject);<br>
<br>
Var<br>
<br>
S:string;<br>
<br>
begin<br>
<br>
Table1.append;<br>
<br>
DBEdit1.text:='锦江区';<br>
<br>
DBComboBox1.text:='望滨路';<br>
<br>
S:=DBComboBox1.text;<br>
<br>
DBCheckedBox1.checked:=false;<br>
<br>
End;<br>
<br>
以上,将为DBEdit1、DBComboBox1、DBCheckedBox1赋予初始值。通过对象浏览器研究组件对象的继承关系后,你一定还可以发现更多的隐含属性,这将为我们的编程工作提供很大的帮助。<br>
<br>
<br>
<br>
<strong>三、动态问题<br>
<br>
</strong> 1、动态组合框(DBLookupComboBox)<br>
<br>
为了使用户可以自己方便地改变组合框中的内容,例如经常变动的工作人员名单,应该使用DBLookupComboBox代替一般的DBComboBox。步骤如下:<br>
<br>
(1)建立一个工作人员名单数据库,在程序中提供对此库的增加、修改、删除等操作。<br>
<br>
(2)使用DBLookupComboBox时,将属性ListSource指向名单库,Listfield和Keyfield指向名称字段,DataSource和Datafield指向欲写入的数据库和字段。在运行时,程序从名单库中提取名称信息,从而实现动态产生组合框中的内容。DataSource和Datafield也可以不填,这时提供动态信息,但不向任何数据库写入内容。<br>
<br>
这种方法也适用于Dbgrid,方法见后所述的“lookup字段的使用”一节。<br>
<br>
<br>
<br>
2、动态SQL<br>
<br>
在程序中可以动态地为Query组件写入SQL语句,填入参数。例如:<br>
<br>
procedure Tform1.Button1Click(Sender:TObject);<br>
<br>
Var<br>
<br>
S:string;<br>
<br>
begin<br>
<br>
Query1.active:=false;<br>
<br>
S:='select*fromt1.dbf'<br>
<br>
Query1.SQL.add(s);<br>
<br>
S:='whereid=:id';<br>
<br>
Query1.SQL.add(s);<br>
<br>
Query1.Params[0].AsString:='1';<br>
<br>
Query1.active:=true;<br>
<br>
End;<br>
<br>
<br>
<br>
以上程序将选出t1.dbf所有id为1的记录。使用动态SQL,可以实现动态查询、动态报表等功能,十分有用。<br>
<br>
<br>
<br>
<strong>四、报表制作<br>
<br>
</strong> 在DELPHI3.0中,不再有DELPHI1.0、DELPHI2.0原有的ReprotSmith报表制作工具,改为一套完整的QuickReport报表组件,使得报表与应用程序的连接更为紧密,运用更加灵活方便。具体的制作可参考DELPHI3.0提供的例子程序Qr2demo。有以下几点值得注意:<br>
<br>
(1)建立新报表可以在File菜单的New...中选取Report,也可以先建立一个空表单(Form)后,再放上一个QuickReport组件。前者建立一个从TQuickReport继承的对象,后者不进行继承,若程序中使用了复杂报表(几个报表的组合)。<br>
<br>
(2)主要对明细报表制作(Master/Detail)。<br>
<br>
这类报表可以用两种方法生成,一种是像Qr2demo中一样,使用两个Table组件,另一种是使用一个Query组件,配合SQL语句实现。例如:<br>
<br>
Select*fromxl.dbfa,byq.dbfb Wherea.xlmc=b.xlmc<br>
<br>
则将选出两个库中所有xlmc字段相同的记录,从而实现了主要对明细关系。<br>
<br>
<br>
<br>
(3)BeforePrint事件和OnPrint事件可提供打印前的预处理。<br>
<br>
以下程序中,Qrimage画了一个“勾”,通过BeforePrint事件和OnPrint事件预处理当前记录的下一条记录,从而在产生报表时决定在当前记录的“高压”还是“低压”处打勾。Qrimage的enabled属性决定其是否显示和打印。<br>
<br>
procedure do1(s1:string);<br>
<br>
begin<br>
<br>
if s1='高压'then<br>
<br>
<br>
begin<br>
<br>
qr1.qrimage1.enabled:=true;<br>
<br>
qr1.qrimage2.enabled:=false;<br>
<br>
end<br>
<br>
elseif <br>
s1='低压'then<br>
<br>
begin<br>
<br>
qr1.qrimage1.enabled:=false;<br>
<br>
qr1.qrimage2.enabled:=true;<br>
<br>
end<br>
<br>
else begin<br>
<br>
qr1.qrimage1.enabled:=false;<br>
<br>
qr1.qrimage2.enabled:=false;<br>
<br>
end;<br>
<br>
end;<br>
<br>
<br>
<br>
procedure Tqr1.qr2BeforePrint(Sender:TQuickRep;varPrintReport:Boolean);<br>
<br>
begin<br>
<br>
query2.active:=true;<br>
<br>
query2.first;<br>
<br>
qrimage1.enabled:=false;<br>
<br>
qrimage2.enabled:=false;<br>
<br>
end;<br>
<br>
<br>
<br>
procedure Tqr2.QRDBText5Print(sender:TObject;varValue:String);<br>
<br>
begin<br>
<br>
do1(query2.fieldbyname('DianYa').asstring);<br>
<br>
if not query2.eof then<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -