给予帮助,关于在程序中各相似功能块如何复用:(100分)

  • 主题发起人 主题发起人 fg007
  • 开始时间 开始时间
F

fg007

Unregistered / Unconfirmed
GUEST, unregistred user!
给予帮助,关于在程序中各相似功能块如何复用:
我的问题是这样的:在一个管理软件中,有30多个基础数据录入及编辑,如职称类别表,职务类别表,学历类别,专业类别,考勤类别,部门类别。。。。
对这些表的录入操作其本相同,但如果写好一个表的代码,然后用COPY PASTE 在简单的修改一下,这样就重复的劳动30次,还有要改进一点,那么将会全部重新COPY PASTE
我想用 继承窗体 来做,不过好像也不是很完美,望各位大侠指点!!!
 
比较对 edit1 设置了 onchange 事件 edit1change
那么你可以在 form 的 OnCreate 中设置其它编辑框的 onchange 事件。
edit2.Onchange:=edit1change;
edit3.Onchange:=edit1change;
...........
但你在设计 edit1change 时必须考虑到它是用于 edit1,edit2,edit3 ,....的.
 
你说什么呀!
我是说有很多的表要进行录入操作
不过提交,编辑等操作相似如何用同一代码来操作所有相似的表!!!
Delphi6.0+win98+SQL Server+ADO+ ADOQuery
 
问题描述不清楚.......
 
问题是这样:
建立一个Form ,用于对一个表的数据录入,编辑操作。
这种功能类似的Form 要建立30 多个来对30多个表进行录入功能,
如何实现代码重用。
我的想法是用 Form 继承来做, 不知各大侠有何高见?
 
使用函数
 
写一个好的基类应该能搞得定的
 
动态生成控件,只要一个窗体,参考代码
constructor TDBEditForm.Create(AOwner:TComponent;SQLString,MasterTabName,
ACaption,DetailTabName,AMasterFields:string;DetailReadOnly:boolean=false);
function CreateDBControl(FADS:TCustomADODataSet;FDataSource:TDataSource;
FOwner:TWinControl;AReadOnly:boolean=false):boolean;
//建立主从表的编辑控件
var
i,j,k,x,y,t,w,p:integer;
s:string;
pm:TPopupMenu;
mi:TMenuItem;
begin
j:=0;x:=-20;y:=7;
result:=true;
for i:=0 to FADS.Fields.Count-1 do
begin
//生成标签
with TLabel.Create(self) do
begin
Parent := FOwner;
Alignment := tarightjustify;
AutoSize := false;
left := x;
top := y+3;
Width := LABLE_MAX_WIDTH;
Caption := FADS.Fields.FieldName+':';
end;

//取出字段对应的控件类代号,rsTabFields也是一个表,保存编辑字段所用的控件代码,编辑长度,显示等
if rsTabFields.Locate(SField_Name,
FADS.Fields.FieldName,[]) then
begin
t:=rsTabFields.FieldByName(SField_Type).AsInteger;
w:=rsTabFields.FieldByName(SField_EditWidth).AsInteger;
p:=rsTabFields.FieldByName(SField_AccessPopedom).AsInteger;
s:=rsTabFields.FieldByName(SField_Hint).AsString;
end else
begin
t:=0;
w:=100;
p:=2;
s:='';
end;
if iUserGrade>p then
t:=-1;
//根据数据库字段生成相应控件
case t of
0,1:with TDBNumberEditEh.create(FOwner) do
//数字编辑框
begin
Parent := FOwner;
AutoSize := false;
AutoSelect := true;
Left := x+LABLE_MAX_WIDTH;
Top := y;
Width := w;
Height := EDIT_HEIGHT;
DataSource := FDataSource;
DataField := FADS.Fields.FieldName;
Hint := s;
Flat := true;
ReadOnly := AReadOnly;
DecimalPlaces := 6;
EditButton.Visible := True;
EditButton.Style := ebsUpDownEh;
end;
2:with TDBEditEh.create(FOwner) do
//普通编辑框
begin
Parent := FOwner;
AutoSize := false;
AutoSelect := true;
Left := x+LABLE_MAX_WIDTH;
Top := y;
Width := w;
Height := EDIT_HEIGHT;
DataSource := FDataSource;
DataField := FADS.Fields.FieldName;
Hint := s;
Flat := true;
ReadOnly := AReadOnly;
end;
3:with TDBCheckBoxEh.create(FOwner) do
//复选框
begin
Parent := FOwner;
Left := x+LABLE_MAX_WIDTH;
Top := y+1;
Width := w;
Height := EDIT_HEIGHT;
Caption := FADS.Fields.FieldName;
DataSource := FDataSource;
DataField := FADS.Fields.FieldName;
Hint := s;
Flat := true;
ReadOnly := AReadOnly;
end;
4:with TDBDateTimeEditEh.create(FOwner) do
//日期编辑框
begin
Parent := FOwner;
AutoSize := false;
AutoSelect := true;
Left := x+LABLE_MAX_WIDTH;
Top := y;
Width := w;
Height := EDIT_HEIGHT;
DataSource := FDataSource;
DataField := FADS.Fields.FieldName;
Hint := s;
Flat := true;
ReadOnly := AReadOnly;
end;
5..7:with TDBComboBoxEh.Create(FOwner) do
//下拉列表框
begin
Parent := FOwner;
Left := x+LABLE_MAX_WIDTH;
Top := y;
Width := w;
Height := EDIT_HEIGHT;
DataSource := FDataSource;
DataField := FADS.Fields.FieldName;
Hint := s;
Flat := true;
ReadOnly := AReadOnly;
DropDownBox.Rows := iDropDownCount;
DropDownBox.Sizable := True;
if t<>6 then
Items:=GetRecordSetStrings(
rsTabFields.FieldByName(SField_DataSource).AsString);
if t=7 then
begin
pm:=TPopupMenu.Create(self);
for k:=0 to items.Count-1 do
begin
mi := TMenuItem.Create(self);
mi.Caption := items[k];
mi.Hint := items[k];
mi.Tag := i;
mi.OnClick := pmTempClick;
pm.Items.Add(mi);
end;
EditButtons.Add;
EditButtons[0].Style := ebsPlusEh;
EditButtons[0].DropdownMenu := pm;
end;
if t=6 then
OnEnter:=FieldEnter;
end;
else
continue;
end;
//case
//控件记数器,调整控件位置
j := j+1;
y := y+FIELD_MAX_HEIGHT;
if j=FIELD_MAX_LINES then
begin
j := 0;
x := x+FIELD_MAX_WIDTH;
y := 7;
end;
end;
//for
end;
begin
screen.Cursor:=crHourGlass;
if length(SqlString)>0 then
try
inherited Create(AOwner);
FMasterTabName := MasterTabName;
FDetailTabName := DetailTabName;
FSql := sqlstring;
FMasterFields := AMasterFields;
Caption := GetCaption(ACaption);
with ADSMaster do
begin
CommandText := Fsql;
CommandType := cmdText;
Open;
end;
if (length(DetailTabName)>0) and (length(FMasterFields)>0) then
begin
//存在从表
with ATBDetail do
begin
if DetailReadOnly then
LockType:=ltReadOnly;
TableName :=DetailTabName;
MasterFields:=FMasterFields;
Open;
end;
MDIMainForm.ProgressStart(0,adsMaster.FieldCount+ATBDetail.FieldCount);
panRight.Width :=Width div 2;
PanRight.Visible:=true;
splRight.Visible:=true;
SetDBGridWidth(DBGMaster{,2});
SetDBGridWidth(DBGDetail{,2});
CreateDBControl(ADSMaster,DSMaster,SlbMaster);
CreateDBControl(ATBDetail,DSDetail,SlbDetail,DetailReadOnly);
end else
begin
//不存在从表
MDIMainForm.ProgressStart(0,adsMaster.FieldCount);
SetDBGridWidth(DBGMaster);
CreateDBControl(ADSMaster,DSMaster,SlbMaster);
end;
except
msgbox(format(SEOpenQueryForm,[caption]),self.text,mb_iconstop);
screen.Cursor:=crDefault;
close;
end;
mdimainform.Progressend;
screen.Cursor:=crDefault;
end;
//===========================================
代码里面一些常量,函数参见
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1425701
里的第一个模块
 
实际上很简单,如果编辑器就是DBGrid一种编辑方式,你这个编辑窗口的接口函数
将表名带过去就行了,其它说明都一样,在不了DBGrid的Columns重新生成一下而已;
如果编辑还需要有字段编辑风格,那么根据表的字段和字段类型创建相应的编辑控件
,然后排列,这就有点麻烦了。
 
Use Fram ? OK ?
 
用Frame很好呀,如果你的控件是成组的话,很方便的
 
多人接受答案了。
 
后退
顶部