查询条件的封装(小结)
截至今天,查询条件的封装第一阶段的工作基本完成了。在之前的基础上做了一些调整,由于D7与XE/XE2的差异,某些思路也做了调整。查询条件项的驱动控制由于是使用TCollection和TCollectionItem来实现的,所以不能作为查询条件项的属性来进行选择(应该是只有继承自TComponent的组件才可以作为属性的选择对象),取而代之的是采用Index的方式来进行绑定,这个我觉得是设计上的一个缺陷,并没有完全符合我最初的设想,在使用上不够简便直观。如果是在XE2下可以有更好的选择,可以用TCustomAttribute加反射机制来实现持久化配置数据的动态绑定。
常量单元ConditionConst.pas
1 {本单元用于定义基本的数据类型}
2
3 unit ConditionConst;
4
5 interface
6
7 uses
8 Controls;
9
10 type
11 TConditionActionIndex = integer;
12 // 查询条件项的编辑模式
13 TConditionEditType = (cetEdit, cetButtonEdit, cetDatePicker, cetComboBox);
14
15 // 查询条件项的值的数据类型
16 TConditionItemDataType = (cidtString, cidtInt, cidtFloat, cidtDouble,
17 cidtDate, cidtDateTime, cidtBool);
18
19 { 定义一组事件 }
20 (* 单击编辑框按钮事件 *)
21 TPropertiesButtonClickEvent = procedure(Sender: TObject; AButtonIndex: Integer) of object;
22 (* 编辑值合法性检测事件 *)
23 TPropertiesValidate = procedure(Sender: TObject;
24 var DisplayValue: Variant; var ErrorText: TCaption;
25 var Error: Boolean) of object;
26 (* 下拉框菜单关闭事件 *)
27 TPropertiesCloseUp = procedure(Sender: TObject) of object;
28 { 查询条件类型 }
29 TConditionType = (cdtCustom, cdtBeginDate, cdtEndDate, cdtUnit, cdtProduct, cdtEmployee,
30 cdtStock, cdtDepartment, cdtArea, cdtBillSN, cdtBillJSR, cdtBillAuditor);
31
32 TConditionTypeItem = record
33 ConditionName : string;
34 ConditionTypeName : string;
35 ConditionEditType : TConditionEditType;
36 ConditionItemDataType : TConditionItemDataType;
37 end;
38
39 const
40 gConditionName : array[0..11] of string = ('TConditionItemX', 'BeginDate', 'EndDate', 'UnitFullID', 'ProdFullID', 'EmpFullID',
41 'StockFullID', 'DeptFullID', 'AearFullID', 'BillSN', 'BillJSR', 'BillAuditor');
42
43 gConditionTypeName : array[0..11] of string = ('查询条件', '开始日期', '结束日期', '往来单位', '商品', '职员',
44 '仓库', '部门', '地区', '单据编号', '经手人', '审核人');
45
46 gConditionEditType : array[0..11] of TConditionEditType = (cetButtonEdit, cetDatePicker, cetDatePicker, cetButtonEdit, cetButtonEdit, cetButtonEdit,
47 cetButtonEdit, cetButtonEdit, cetButtonEdit, cetButtonEdit, cetButtonEdit, cetButtonEdit);
48
49 gConditionItemDataType : array[0..11] of TConditionItemDataType = (cidtString, cidtString, cidtString, cidtString, cidtString, cidtString,
50 cidtString, cidtString, cidtString, cidtString, cidtInt, cidtInt);
51 implementation
52
53 initialization
54
55 end.
这里对预置的标准查询条件项采取了数组定义的方式,只是为了验证技术环节是否通畅,这里最终应该考虑和数据的绑定。
查询条件项定义TConditionItem
1 TConditionItem = class(TCollectionItem)
2 private
3 FConditionName: string;
4 FConditionLabel: string;
5 FConditionValueType: TConditionItemDataType;
6 FConditionEditType: TConditionEditType;
7 FConditionValue: Variant;
8 FItems: TStrings;
9 FConditionActionIndex: TConditionActionIndex;
10 FConditionType: TConditionType;
11 procedure SetConditionEditType(const Value: TConditionEditType);
12 procedure SetConditionLabel(const Value: string);
13 procedure SetConditionName(const Value: string);
14 procedure SetConditionValueType(const Value: TConditionItemDataType);
15 procedure SetConditionValue(const Value: Variant);
16 procedure SetItems(const Value: TStrings);
17 procedure SetConditionActionIndex(const Value: TConditionActionIndex);
18 procedure SetConditionType(const Value: TConditionType);
19 protected
20 procedure SetIndex(Value: Integer); override;
21 public
22 constructor Create(Collection: TCollection); override;
23 destructor Destroy; override;
24 procedure Assign(Source: TPersistent); override;
25 property ConditionValue : Variant read FConditionValue write SetConditionValue;
26 published
27 property ConditionName : string read FConditionName write SetConditionName;
28 property ConditionLabel : string read FConditionLabel write SetConditionLabel;
29 property ConditionEditType : TConditionEditType read FConditionEditType write SetConditionEditType;
30 property ConditionValueType : TConditionItemDataType read FConditionValueType write SetConditionValueType;
31 property Items : TStrings read FItems write SetItems;
32 property ConditionActionIndex : TConditionActionIndex read FConditionActionIndex write SetConditionActionIndex;
33 property ConditionType : TConditionType read FConditionType write SetConditionType;
34 end;
查询条件项实现TConditionItem
1 { TConditionItem }
2
3 procedure TConditionItem.Assign(Source: TPersistent);
4 begin
5 if Source is TConditionItem then
6 begin
7 if Assigned(Collection) then Collection.BeginUpdate;
8 try
9 //RestoreDefaults;
10 ConditionName := TConditionItem(Source).ConditionName;
11 ConditionLabel := TConditionItem(Source).ConditionLabel;
12 ConditionEditType := TConditionItem(Source).ConditionEditType;
13 ConditionValueType := TConditionItem(Source).ConditionValueType;
14 finally
15 if Assigned(Collection) then Collection.EndUpdate;
16 end;
17 end
18 else
19
补充:软件开发 , Delphi ,