查询条件的封装(一)
11631 点击·0 回帖
![]() | ![]() | |
![]() | 因为现行的项目是使用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. | |
![]() | ![]() |