在信息管理系统的开发过程中,不可避免地会用到许多编码表,用来存放字典数据。这些编码表的表结构一般只有两个字段:“编码”和“编码字符串”。由于编码表的数量比较多(中小型的MIS系统一般都有几十个),如果分别对它们编程进行维护,那代码量是非常大的。
为了编写通用的编码表维护程序,可以建立编码表的数据描述表,用来存放这些编码表的表结构及其描述信息,为编程提供一些基础信息。
数据描述表的表结构为:
xh 自动编号 主索引字段
TableName 文本 编码表表名(在代码中引用)
TableName_c 文本 编码表汉字名称
fd1 文本 编码字段
fd1_c 文本 编码字段汉字名称
fd2 文本 编码字符串字段
fd2_c 文本 编码字符串字段汉字名称
然后在窗体上拖拉两个数据表格:DBGrid1 和 DBGrid2。拖放四个按钮 btnAdd、btnDel、btnModi 和 btnClose,分别对应于“增加”“删除”“修改”和“关闭”。然后放置一个 ADOConnect 控件,与数据库连接。再放置 ADODataSet1 和 DataSource1 对应于 DBGrid1,ADODataSet2 和 DataSource2 对应于 DBGrid2。
以上控件在设计阶段的关键属性为:
ADODataSet1:Connection=ADOConnection1,
CommandText='select fd1, fd1_c, fd2, fd2_c, TableName, TableName_c, xh
from BaseTables order by xh'
Active=True;
DataSource1:DataSet=ADODataSet1
DBGrid1:DataSource=DataSource1
ADODataSet2:Connection=ADOConnection1,CommandText为空,Active=False
DataSource2:DataSet=ADODataSet2
DBGrid2:DataSource=DataSource2
其中 ADODataSet1 与编码表的数据描述表绑定,ADODataSet2 作为临时数据集,用代码控制分别与各编码表动态绑定。
程序的代码如下(窗体名为 frmBaseTables):
procedure TfrmBaseTables.FormActivate(Sender: TObject);
begin
DBGrid1CellClick(DBGrid1.Columns[0]);
end;
procedure TfrmBaseTables.DBGrid1CellClick(Column: TColumn);
var strTmp :string;
begin
//更换 DBGrid2 的数据集的内容:
ADODataSet2.Active :=False;
strTmp :='select '
+ADODataSet1.FieldByName('fd1').AsString + ','
+ADODataSet1.FieldByName('fd2').AsString + ' from '
+ADODataSet1.FieldByName('TableName').AsString
+' order by '+ADODataSet1.FieldByName('fd1').AsString;
ADODataSet2.CommandText :=strTmp;
ADODataSet2.Active :=True;
//更换 DBGrid2 表头显示的字符串:
DBGrid2.Fields[0].DisplayLabel :=ADODataSet1.FieldByName('fd1_c').AsString;
DBGrid2.Fields[1].DisplayLabel :=ADODataSet1.FieldByName('fd2_c').AsString;
end;
//增加记录:
procedure TfrmBaseTables.btnAddClick(Sender: TObject);
begin
frmAddbaseTable.ShowModal;
end;
//删除记录:
procedure TfrmBaseTables.btnDelClick(Sender: TObject);
begin
if (Application.MessageBox(#10+'确定删除该记录吗?','删除提示',MB_OKCANCEL)=1) then
begin
ADODataSet2.Edit;
ADODataSet2.Delete;
end;
end;
//修改记录:
procedure TfrmBaseTables.btnModiClick(Sender: TObject);
begin
frmModiBaseTable.ShowModal;
end;
//关闭窗体:
procedure TfrmBaseTables.btnCloseClick(Sender: TObject);
begin
self.close;
end;
其中添加和修改记录分别调用了 frmAddbaseTable 和 frmModibaseTable 窗体。
两个窗体的代码非常相似,以添加记录窗体 frmAddbaseTable 为例,其上放置两个
DBEdit 框 DBEditBm 和 DBEditBmString,分别对应于各编码表的编码和编码字符串,
两个按钮 btnSave 和 btnCancel 分别用于保存和取消。以上控件的事件过程如下:
implementation
uses BaseTables;
{$R *.dfm}
procedure TfrmAddbaseTable.FormActivate(Sender: TObject);
begin
//通过代码使 DBEditBm 和 DBEditBmString 与各编码表的字段联系起来:
DBEditBm.DataField :=frmBaseTables.ADODataSet2.Fields[0].FieldName;
DBEditBmString.DataField :=frmBaseTables.ADODataSet2.Fields[1].FieldName;
frmBaseTables.ADODataSet2.Edit;
frmBaseTables.ADODataSet2.Append;
DBEditBm.SetFocus; //编码框获得焦点
end;
//保存:
procedure TfrmAddbaseTable.btnSaveClick(Sender: TObject);
begin
frmBaseTables.ADODataSet2.Post;
close;
end;
//取消:
procedure TfrmAddbaseTable.btnCancelClick(Sender: TObject);
begin
frmBaseTables.ADODataSet2.Cancel;
close;
end;
procedure TfrmAddbaseTable.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
DBEditBm.DataField :='';
DBEditBmString.DataField :='';
end;
西安市雁塔区慈恩路南段 8 号电达公司 710061
张庆 zhangking@263.net 029-5213755, 13892819730
http://100000.home.sohu.com QQ:9365822 2001.11.10
|
|