前段时间,做一个车队管理软件,对数据管理比较多,显示也比较多,N多个Edit,有时要显示很多数据,比如:
书上多是这样写的:
1 procedure TForm1.FormShow(Sender: TObject);
2 begin
3 with ClientDataSet1 do
4 begin
5 Edit1.Text:=FieldByName('a').AsString;
6 Edit2.Text:=FieldByName('b').AsString;
7 Edit3.Text:=FieldByName('c').AsString;
8 Edit4.Text:=FieldByName('d').AsString;
9 Edit5.Text:=FieldByName('e').AsString;
10 end;
11 end;
2 begin
3 with ClientDataSet1 do
4 begin
5 Edit1.Text:=FieldByName('a').AsString;
6 Edit2.Text:=FieldByName('b').AsString;
7 Edit3.Text:=FieldByName('c').AsString;
8 Edit4.Text:=FieldByName('d').AsString;
9 Edit5.Text:=FieldByName('e').AsString;
10 end;
11 end;
自己想出的特定通用(所有字段为字符串,不为字符串的字段,再在后面加相应代码)的方法。
1 uses StrUtils; //LeftStr,RightStr 所需要的单元
2
3 const
4 StrField='a/b/c/d/e/'
5 StrValue='Edit1/Edit2/Edit3/Edit4/Edit5/' //字段个数和控件个数要相同
6
7 procedure TFrmExp.ShowData(FieldStr: string; ValueStr: string);
8 var
9 SubFieldStr,SubValueStr:String;
10 begin
11 With ClientDataSet1 do
12 begin
13 while Pos('/',FieldStr)<>0 do
14 begin
15 SubFieldStr:=LeftStr(FieldStr,Pos('/',FieldStr)-1);
16 SubValueStr:=LeftStr(ValueStr,Pos('/',ValueStr)-1);
17 if SubValueStr<>'' then (Self.FindComponent(SubValueStr) as TEdit).Text:=FieldByName(SubFieldStr).AsString;
2
3 const
4 StrField='a/b/c/d/e/'
5 StrValue='Edit1/Edit2/Edit3/Edit4/Edit5/' //字段个数和控件个数要相同
6
7 procedure TFrmExp.ShowData(FieldStr: string; ValueStr: string);
8 var
9 SubFieldStr,SubValueStr:String;
10 begin
11 With ClientDataSet1 do
12 begin
13 while Pos('/',FieldStr)<>0 do
14 begin
15 SubFieldStr:=LeftStr(FieldStr,Pos('/',FieldStr)-1);
16 SubValueStr:=LeftStr(ValueStr,Pos('/',ValueStr)-1);
17 if SubValueStr<>'' then (Self.FindComponent(SubValueStr) as TEdit).Text:=FieldByName(SubFieldStr).AsString;
18 FieldStr:=RightStr(FieldStr,Length(FieldStr)-Pos('/',FieldStr));
19 ValueStr:=RightStr(ValueStr,Length(ValueStr)-Pos('/',ValueStr));
20 end;
21
22 Memo1.Lines.Text:=FieldByName('x')AsString; //不能在循环里面写,因为 as TMemo
23 Combobox1.ItemIndex:=FieldByName('y').AsInteger; //不能在循环里面写.因为数据为数字字段
24 DateTimePicker1.DateTime:=FieldByName('z').AsDateTime; //不能在循环里面写,控件和数据字段都有影响
25 end;
26 end;
27
28 procedure TForm1.FormShow(Sender:TObject);
29 begin
30 ShowData(StrField,StrValue);
31 end;
19 ValueStr:=RightStr(ValueStr,Length(ValueStr)-Pos('/',ValueStr));
20 end;
21
22 Memo1.Lines.Text:=FieldByName('x')AsString; //不能在循环里面写,因为 as TMemo
23 Combobox1.ItemIndex:=FieldByName('y').AsInteger; //不能在循环里面写.因为数据为数字字段
24 DateTimePicker1.DateTime:=FieldByName('z').AsDateTime; //不能在循环里面写,控件和数据字段都有影响
25 end;
26 end;
27
28 procedure TForm1.FormShow(Sender:TObject);
29 begin
30 ShowData(StrField,StrValue);
31 end;
上面这个代码中的函数,我可以只进行少量的修改(两个常量值和3种不能在循环里面的情况),就可以在下一个需要用到的地方使用,但是取值算法很繁琐,不容易修改。有时自己也会看花
经过学习,发现了一种取代方法。如下:
1 const
2 StrField='a/b/c/d/e'
3 StrValue='Edit1/Edit2/Edit3/Edit4/Edit5' //字段个数和控件个数要相同,注意这里最后面没有'/'。
4
5 procedure TFrmExp.ShowData(FieldStr: string; ValueStr: string);
6 var
7 StrListField:TStringList;
8 StrListValue:TStringList;
9 I:Integer;
10 begin
11 StrListField:=TStringList.Create;
12 StrListValue:=TStringList.Create;
13
14 StrListField.Delimiter:='/'
15 StrListValue.Delimiter:='/';
16 //这里注意,要先设置Delimiter属性,再设置DelimiterText属性。否则程序会报错,原因还没研究过,这里也正好做个标记。
17 StrListField.DelimiterText:=StrField;
18 StrListField.DelimiterText:=StrValue;
19
20 with ClientDataSet1 do
21 begin
22 for I:=0 to StrListField.Count - 1 do
23 begin
24 (Self.FindComponent(StrListValue[i]) as TEdit).Text:=FieldByName(StrListField[i]).AsString;
25 end;
26 end;
27
28 //这里添加其他处理
29
30 StrListField.Free;
31 StrListValue.Free;
32 end;
33
34 procedure TForm1.FormShow(Sender:TObject);
35 begin
36 ShowData(StrField,StrValue);
37 end;
2 StrField='a/b/c/d/e'
3 StrValue='Edit1/Edit2/Edit3/Edit4/Edit5' //字段个数和控件个数要相同,注意这里最后面没有'/'。
4
5 procedure TFrmExp.ShowData(FieldStr: string; ValueStr: string);
6 var
7 StrListField:TStringList;
8 StrListValue:TStringList;
9 I:Integer;
10 begin
11 StrListField:=TStringList.Create;
12 StrListValue:=TStringList.Create;
13
14 StrListField.Delimiter:='/'
15 StrListValue.Delimiter:='/';
16 //这里注意,要先设置Delimiter属性,再设置DelimiterText属性。否则程序会报错,原因还没研究过,这里也正好做个标记。
17 StrListField.DelimiterText:=StrField;
18 StrListField.DelimiterText:=StrValue;
19
20 with ClientDataSet1 do
21 begin
22 for I:=0 to StrListField.Count - 1 do
23 begin
24 (Self.FindComponent(StrListValue[i]) as TEdit).Text:=FieldByName(StrListField[i]).AsString;
25 end;
26 end;
27
28 //这里添加其他处理
29
30 StrListField.Free;
31 StrListValue.Free;
32 end;
33
34 procedure TForm1.FormShow(Sender:TObject);
35 begin
36 ShowData(StrField,StrValue);
37 end;
虽然不能说是最好的算法了,但是已经比我原来的写法看上去舒服多了,也简单多了,代码的可读性可是好了很多,出错后的检查和修改都变的简单。
请大家多多指教。呵呵