若不是因为你

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

前段时间,做一个车队管理软件,对数据管理比较多,显示也比较多,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;

自己想出的特定通用(所有字段为字符串,不为字符串的字段,再在后面加相应代码)的方法。

 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;
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;

上面这个代码中的函数,我可以只进行少量的修改(两个常量值和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;

 

虽然不能说是最好的算法了,但是已经比我原来的写法看上去舒服多了,也简单多了,代码的可读性可是好了很多,出错后的检查和修改都变的简单。

请大家多多指教。呵呵

 

 

 

posted on 2010-02-08 16:22  若不是因为你  阅读(433)  评论(2编辑  收藏  举报