ClientDataSet.Filtered := False;
ClientDataSet.Filter := FFields[ComboBox1.ItemIndex, 0] + '''''''''''''''' + Edit2.Text + '''''''''''''''';
ClientDataSet.Filtered := True;
end;
本方法无疑增加了代码的灵活性,同时增加了代码的复用度,因为代码很好的隔离了变化的数据。因此只要在另一个也是要实现这种的功能的FORM中增加私有字段FFields: array[0..20, 0..2] of string 和使用上面的动态加载数据集字段过程,就可以说方便的实现了重用。但是这种重用并不是很好的,因为我们没有实现很好的封装性。导致在你的程序中到处散落有重复的代码(你常常会通过COPY来获得这个函数的重用,因为上面的代码是没有好的封装性)。如果有一天你要修改数据装载函数你就必须到处去找那里拷贝了该函数——你也得修改散落在其他地方的代码。于是我进行了再一次的重构,并对代码进行了进一步的封装。
代码如下:
unit uDataSetFieldsInfo;
// Description:单元包括 TDataSetFieldsInfo 类,该类封装了获得数据集子段信息。
// 并提供了在combobox列表显示字段显示信息和获得对应子段名称的方法接口
// Created : wuchhao
// Date : 2003.5
interface
uses Classes, DBClient, StdCtrls;
type
TDataSetFieldsInfo = class
private
FFieldsList: TStrings;
public
constructor Create;
destructor Destroy; override;
procedure GetDataSetFields(Source: TClientDataSet);
procedure ShowFieldsInfo(Target: TComboBox);
function GetFieldsNameByDisplayLabel(DisplayLabel: string): string;
end;
implementation
{ TDataSetFieldsInfo }
constructor TDataSetFieldsInfo.Create;
begin
FFieldsList := TStringList.Create;
end;
destructor TDataSetFieldsInfo.Destroy;
begin
FFieldsList.Free;
inherited;
end;
procedure TDataSetFieldsInfo.GetDataSetFields(Source: TClientDataSet);
var
i: Integer;
begin
FFieldsList.Clear;
with Source do
begin
for i := 0 to Fields.Count - 1 do
if Fields[i].Visible then
begin
FFieldsList.Add(Fields[i].DisplayLabel);
FFieldsList.Add(Fields[i].FieldName);
end;
end;
end;
function TDataSetFieldsInfo.GetFieldsNameByDisplayLabel(
DisplayLabel: string): string;
var
index: Integer;
begin
Result := '''''''';
index := FFieldsList.IndexOf(DisplayLabel);
if index <> -1 then
Result := FFieldsList.Strings[index+1] ;
end;
procedure TDataSetFieldsInfo.ShowFieldsInfo(Target: TComboBox);
var
i: Integer;
begin
Target.Items.Clear;
i:=0;
while i < FFieldsList.Count do
begin
Target.Items.Add(FFieldsList.Strings[i]);
i:= i+ 2;
end;
end;
end.
单元uDataSetFieldsInfo 封装了与实现本文所述功能相关的数据和方法,把它们封装在一个类里面,从而实现了面向对象设计里面的 Open - Close 原则。类变成了一个黑盒,于是就可方便的重用(black-box reuse),而不必担心代码的重复。同时因为封装了与功能相关的信息,类的职责定义明确(单职责),并有了足够合适的粒度和好的封装性。TdataSetFieldsInfo 很好的把组合框与变化的数据隔离开来,最终提高了代码的复用程度,同时减少了FORM类的职责和 magic number硬编码的量。下面是新的代码:
首先在FORM中声明TdataSetFieldsInfo类的一个引用。
上一页 [1] [2] [3] 下一页 没有相关教程
|