• 查询条件的封装(一)


    因为现行的项目是使用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.






  • 相关阅读:
    软件安装的list(0918)
    putty配色备份
    曹工谈Spring Boot:Spring boot中怎么进行外部化配置,一不留神摔一跤;一路debug,原来是我太年轻了
    使用Hystrix的插件机制,解决在使用线程隔离时,threadlocal的传递问题
    曹工谈并发:Synchronized升级为重量级锁后,靠什么 API 来阻塞自己
    曹工力荐:调试 jdk 中 rt.jar 包部分的源码(可自由增加注释,修改代码并debug)
    曹工杂谈--只用一个命令,centos系统里装了啥软件,啥时候装的,全都清清楚楚
    曹工说Redis源码(7)-- redis server 的周期执行任务,到底要做些啥
    曹工说Redis源码(6)-- redis server 主循环大体流程解析
    曹工说Redis源码(5)-- redis server 启动过程解析,以及EventLoop每次处理事件前的前置工作解析(下)
  • 原文地址:https://www.cnblogs.com/codingnote/p/2432346.html
Copyright © 2020-2023  润新知