当前位置:编程学习 > Delphi >>

查询条件的封装(小结)

截至今天,查询条件的封装第一阶段的工作基本完成了。在之前的基础上做了一些调整,由于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 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,