|
一个数据库应用程序,常常需要提供数据输入功能,即让用户输入数据,并存入数据库中,这就涉及到一个数据输入是否合法的问题。若用PowerBuilder来编写这种程序,实现这一点是非常方便的,因为PowerBuilder中每一个数据输入控件都可以单独对其输入进行控制,但Delphi没有提供这样的功能。我们用Delphi编写这样的程序时,就需要自己编写一些代码来实现。这并不是Delphi的一个缺点,相反,我们通过对用户输入数据的人为控制,可以编写出相当方便可靠的数据库应用程序。下面举一个很常见的例子加以说明。
也许大家在编写数据库程序时遇到过这种情况:库中一些字段必须是非空的,比如索引字段,但用户输入时可能会忘记,如果对这种情况不作出提示,仍旧将这条记录存入库中,就会破坏库的完整性,而且在排序、查找等操作中也会出错。于是我们就要对这种情况加以控制。举例如下:
一、建立一个简单的数据库,设名为People.dbf,别名为man,库结构如表1。表1 字段名 类型 长度 name c 8 age n 3
work c 10
二、创建一个工程。
三、在Form1中放入如下控件,并设定其属性如表2。
四、定义一个布尔类型的数组,作为三个DbEdit框中是否有数据输入的标志。
implementation
var
test:array[1..3]of boolean;
{$R *.DFM}
五、编写Dbedit1、DbEdit2、DbEdit3的OnExit事件代码如下:
procedure TForm1.DBEdit1Exit(Sender:TObject);
begin
if DbEdit1.text=′′ then {若要进行更精确的控制,在这里可以填写更多代码}
est[1]:=false
lse test[1]:=true;
end;
procedure TForm1.DBEdit2Exit(Sender:TObject);
begin
if DbEdit2.text=′′ then
test[2]:=false
lse test[2]:=true;
end;
procedure TForm1.DBEdit3Exit(Sender:TObject);
begin
if DbEdit3.text=′′ then
est[3]:=false
lse test[3]:=true;
end;
六、编写Button1的Onclick事件代码如下:
procedure TForm1.Button1Click(Sender:TObject);
var i:integer;
begin
i:=1;
while test[i] and (i<=3) do {检测test数组元素是否为真}
i:=i+1;
if i<=3 then {有数据输入为空的情况}
begin showmessage(′数据未完全录入′); {提示}
case i of
1:DbEdit1.Setfocus;
2:DbEdit2.Setfocus;
3:DbEdit3.Setfocus;
end; {激活数据输入为空的DbEdit }
end
else begin table1.post; {如果输入都非空,则存入库中}
Button1.Enabled:=false;
Button2.Enabled:=true;
end;
end;
七、编写Button2的OnClick事件代码如下:
procedure TForm1.Button2Click(Sender:TObject);
var i:integer;
begin
for i:=1 to 3 do test[i]:=false; {初始化数组}
table1.open; {打开数据库}
table1.Append; {增加一条空记录}
table1.edit; {使库处于修改状态}
DbEdit1.setfocus;
Button1.Enabled:=true;
Button2.Enabled:=false;
end;
八、编写Form1的OnClose事件代码如下:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
table1.close; {关闭数据库}
end;
九、存盘并运行程序,单击“录入”后向DbEdit框中输入数据,输入完毕按“确定”按钮,若某个DbEdit框未输入数据,这时会出现一个提示框,显示出错信息,而且入库操作不会进行,光标会停留在未输入数据的DbEdit框中,等待用户输入数据,直到必须输入数据的DbEdit框都被填入数据后,这条记录才会被存入库中。这样就避免了不完整记录的入库。
显然,我们还可以在DbEdit的OnExit事件中加入更多的代码,来对该框进行更精确的控制,这里限于篇幅,就不在一一举例了。
注意:有些数据库并不是要求每个字段都非空,这时只需对要求非空的字段加以控制就行了。表2 控件名称 属性 作用 DataSource1 DataSet:Table
DbEdit1DbEdit2DbEdit3 DataSource:DataSource1 DataField:nameDataField:ageDataField:work
用于输入姓名用于输入年龄用于输入职业 Table DataBaseName:manTalbeName:people.dbf 指定别名及数据库名称
Button1 Caption:确定 确定向库中写入数据 Button2 Caption:录入 开始数据输入操作
|