灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:9214回复:0

查询条件的封装(一)

楼主#
更多 发布于:2012-09-08 13:06

因为现行的项目是使用cxGrid作为主要的控件,通用的查询条件模块也是依赖cxGrid来实现的。但是现行的实现方式和设计思路的灵活性和维护性都比较差,存在每次改动代码量较大、修改处多且分散的问题,所以我考虑重构一下,从设计上改变目前的方式。初步的想法是,cxGrid不动,通过一个UI类来控制cxGrid的显示;设计一个条件项类和条件项列表类,用于程序员在设计器可视化设计查询条件;最后有一个业务逻辑控制类,可以控制每一个查询条件项,定义其获取条件值的方式,通过这种设计将界面与逻辑分离。以前有前辈指点过,也有大牛强调过,界面、业务、数据必须分离,但是,我以为对于业务逻辑来讲,它本身就是和数据紧密结合的,逻辑本身就依赖数据的不同而采取不同的分支,所以没必要将数据和逻辑分得特别清楚,那样的话,可能适得其反。当然,数据访问层(DAL)是可以考虑分离出来的,便于扩展和平台移植。
由于是临时起意,所以工作进度比较慢,目前仅初步写了部分代码,现记录于此。
  查询条件项

1   TConditionItem = class(TCollectionItem)
2   private
3     FConditionName: string;
4     FConditionLabel: string;
5     FConditionValueType: TConditionItemDataType;
6     FConditionEditType: TConditionEditType;
7     FConditionValue: Variant;
8     procedure SetConditionEditType(const Value: TConditionEditType);
9     procedure SetConditionLabel(const Value: string);
10     procedure SetConditionName(const Value: string);
11     procedure SetConditionValueType(const Value: TConditionItemDataType);
12     procedure SetConditionValue(const Value: Variant);
13   protected
14     procedure SetIndex(Value: Integer); override;
15   public
16     constructor Create(Collection: TCollection); override;
17     procedure Assign(Source: TPersistent); override;
18     property ConditionValue : Variant read FConditionValue write SetConditionValue;
19   published
20     property ConditionName : string read FConditionName write SetConditionName;
21     property ConditionLabel : string read FConditionLabel write SetConditionLabel;
22     property ConditionEditType : TConditionEditType read FConditionEditType write SetConditionEditType;
23     property ConditionValueType : TConditionItemDataType read FConditionValueType write SetConditionValueType;
24   end;

  查询条件项列表

1   TConditionItems = class(TCollection)
2   private
3     FConditionUI: TConditionUI;
4     function GetItems(Index: Integer): TConditionItem;
5     procedure SetItems(Index: Integer; const Value: TConditionItem);
6   protected
7     function GetOwner: TPersistent; override;
8     procedure Update(Item: TCollectionItem); override;
9     // TCollection遍历时是按照ID来进行的,也就是List中的存储位置进行。实际上,我们需要的是按照我们自己的排列顺序。
10     function FindItemIndex(index: Integer): TConditionItem;
11     function FindItemName(AConditionName : string) : TConditionItem;
12   public
13     constructor Create(AConditionUI: TConditionUI; ItemClass: TItemClass);
14     function  Add: TConditionItem;
15     property Items[Index: Integer]: TConditionItem read GetItems write SetItems;
16   end;

  查询条件表格显示控制类

1   TConditionUI = class(TComponent)
2   private
3     FConditionGrid: TcxGridTableView;
4     FConditionItems: TConditionItems;
5     FSelectedStyle: TcxStyle;
6     FNormalStyle: TcxStyle;
7     procedure SetConditionGrid(const Value: TcxGridTableView);
8     procedure SetConditionItems(const Value: TConditionItems);
9     procedure SetNormalStyle(const Value: TcxStyle);
10     procedure SetSelectedStyle(const Value: TcxStyle);
11     { Private declarations }
12   protected
13     { Protected declarations }
14     function CreateConditionItems : TConditionItems; dynamic;
15     procedure BuildConditionGridByItems; virtual;
16     procedure CustomDrawIndicatorCell(
17       Sender: TcxGridTableView; ACanvas: TcxCanvas;
18       AViewInfo: TcxCustomGridIndicatorItemViewInfo; var ADone: Boolean);
19   public
20     { Public declarations }
21     constructor Create(AOwner : TComponent); override;
22     destructor Destroy; override;
23     function GetConditionValue(AConditionName : string) : Variant; // 根据条件名称获取条件值s
24   published
25     { Published declarations }
26      property ConditionGrid :  TcxGridTableView read FConditionGrid write SetConditionGrid;
27      property ConditionItems : TConditionItems read FConditionItems write SetConditionItems;
28      property SelectedStyle : TcxStyle read FSelectedStyle write SetSelectedStyle;
29      property NormalStyle : TcxStyle read FNormalStyle write SetNormalStyle;
30   end;

  数据类型定义

1 {本单元用于定义基本的数据类型}
2
3 unit ConditionConst;
4
5 interface
6
7 type
8   // 查询条件项的编辑模式
9   TConditionEditType = (cetEdit, cetButtonEdit, cetDatePicker, cetComboBox);
10
11   // 查询条件项的值的数据类型
12   TConditionItemDataType = (cidtString, cidtInt, cidtFloat, cidtDouble,
13     cidtDate, cidtDateTime, cidtBool);
14
15 implementation
16
17 end.



喜欢0 评分0
游客

返回顶部