cxdbdata.pas

来自「胜天进销存源码,国产优秀的进销存」· PAS 代码 · 共 1,895 行 · 第 1/5 页

PAS
1,895
字号

{********************************************************************}
{                                                                    }
{       Developer Express Visual Component Library                   }
{       ExpressDataController                                        }
{                                                                    }
{       Copyright (c) 1998-2008 Developer Express Inc.               }
{       ALL RIGHTS RESERVED                                          }
{                                                                    }
{   The entire contents of this file is protected by U.S. and        }
{   International Copyright Laws. Unauthorized reproduction,         }
{   reverse-engineering, and distribution of all or any portion of   }
{   the code contained in this file is strictly prohibited and may   }
{   result in severe civil and criminal penalties and will be        }
{   prosecuted to the maximum extent possible under the law.         }
{                                                                    }
{   RESTRICTIONS                                                     }
{                                                                    }
{   THIS SOURCE CODE AND ALL RESULTING INTERMEDIATE FILES            }
{   (DCU, OBJ, DLL, ETC.) ARE CONFIDENTIAL AND PROPRIETARY TRADE     }
{   SECRETS OF DEVELOPER EXPRESS INC. THE REGISTERED DEVELOPER IS    }
{   LICENSED TO DISTRIBUTE THE EXPRESSDATACONTROLLER AND ALL         }
{   ACCOMPANYING VCL CONTROLS AS PART OF AN EXECUTABLE PROGRAM ONLY. }
{                                                                    }
{   THE SOURCE CODE CONTAINED WITHIN THIS FILE AND ALL RELATED       }
{   FILES OR ANY PORTION OF ITS CONTENTS SHALL AT NO TIME BE         }
{   COPIED, TRANSFERRED, SOLD, DISTRIBUTED, OR OTHERWISE MADE        }
{   AVAILABLE TO OTHER INDIVIDUALS WITHOUT EXPRESS WRITTEN CONSENT   }
{   AND PERMISSION FROM DEVELOPER EXPRESS INC.                       }
{                                                                    }
{   CONSULT THE END USER LICENSE AGREEMENT FOR INFORMATION ON        }
{   ADDITIONAL RESTRICTIONS.                                         }
{                                                                    }
{********************************************************************}

unit cxDBData;

{$I cxVer.inc}

interface

uses
  SysUtils, Classes, {$IFDEF DELPHI6}Variants, {$ENDIF} DB, cxDataUtils,
  cxCustomData, cxDataStorage, cxVariants, cxFilter, cxDBFilter, cxDB;

type
  TcxDBDataController = class;
  TcxDBDataProvider = class;
  TcxDBDataModeController = class;
  TcxDBDataFilterCriteria = class;
  TGetListProc = procedure(AList: TList) of object;

  { TcxDBProviderDetailFilterAdapter }

  TcxDBProviderDetailFilterAdapter = class(TcxDBAdapterItem)
  public
    function IsCurrentQuery(ADataSet: TDataSet; const AParamNames: string; const AParamValues: Variant): Boolean; virtual;
    procedure ReopenSQL(ADataSet: TDataSet; const AParamNames: string; const AParamValues: Variant; var AReopened: Boolean); virtual;
    procedure SetFilter(ADataSet: TDataSet; const AMasterDetailKeyFieldNames: string;
      const AMasterDetailKeyValues: Variant; AIsSQLMode: Boolean; var AReopened: Boolean); virtual;
  end;

  { TcxDBDataLink }
               
  TcxDBDataLink = class(TDataLink)
  private
    {$IFDEF DELPHI7}
    FLayoutChangedFlag: Boolean;
    FPreventLayoutChanged: Boolean;
    {$ENDIF}
    FProvider: TcxDBDataProvider;
    procedure DoInsertingRecord;
  protected
    procedure ActiveChanged; override;
    {$IFDEF DELPHI7}
    procedure DataEvent(Event: TDataEvent; Info: Integer); override;
    {$ENDIF}
    procedure DataSetChanged; override;
    procedure DataSetScrolled(Distance: Integer); override;
    procedure EditingChanged; override;
    procedure FocusControl(Field: TFieldRef); override;
    procedure LayoutChanged; override;
    procedure RecordChanged(Field: TField); override;
    procedure UpdateData; override;
    property Provider: TcxDBDataProvider read FProvider;
  public
    constructor Create(AProvider: TcxDBDataProvider);
  end;

  { TcxDBDataProvider }

  TcxDBDataProviderSavePosInfo = record
    Bookmark: TBookmarkStr;
    Bof: Boolean; // conflicts with C++ macro
    Eof: Boolean; // conflicts with C++ macro
    ActiveRecord: Integer;
  end;

  TcxDBDataAssignedFields = class
  private
    FFields: TList;
  public
    constructor Create;
    destructor Destroy; override;
    procedure AddField(AField: TField);
    procedure AddFieldsByFieldList(AFieldList: TList);
    procedure AddFieldsByFieldNames(ADataSet: TDataSet; const AFieldNames: string);
    procedure Clear;
    function IsEmpty: Boolean;
    function IsFieldExists(AField: TField): Boolean;
  end;

  TcxDBDataProvider = class(TcxCustomDataProvider)
  private
    FAssignedFields: TcxDBDataAssignedFields;
    FDataLink: TcxDBDataLink;
    FInCanInitEditing: Boolean;
    FInSetDataSource: Boolean;
    FIncrementalSearching: Boolean;
    FInFirst: Boolean;
    FInInsert: Boolean;
    FInsertOperation: Boolean;
    FInUpdateGridMode: Boolean;
    FIsDataSetCurrent: Boolean;
    FInNotify: Boolean;
    FListeners: TList;
    FPostLocateFlag: Boolean;
    FRecordIndex: Integer;
//    FNearestRecordID: Variant;
    FSavePosInfo: TcxDBDataProviderSavePosInfo;
    FUpdatingPrevFocusedRecordIndex: Integer;
    FUpdatingRecordIndex: Integer;
    FUpdatingRecordIsInserting: Boolean;
    FUpdatingNewRecordIndex: Integer;
    procedure AddNewRecord(AOperation: TDataOperation);
    function GetDataController: TcxDBDataController;
    function GetDataSet: TDataSet;
    function GetDataSource: TDataSource;
    function GetIsDataSetCurrent: Boolean;
    function GetIsSmartRefresh: Boolean;
    procedure RemoveFromListeners;
    procedure SetDataSource(Value: TDataSource);
    procedure SetIsDataSetCurrent(Value: Boolean);
  protected
    function IsCustomDataSourceSupported: Boolean; override;
    function IsGridMode: Boolean; override;
    function IsDataSource: Boolean; override;
    function IsKeyNavigation: Boolean;
    function IsOtherInsert: Boolean; override;
    function IsSyncInsert: Boolean;
    function IsSyncMode: Boolean; override;
    // DataSet
    function DataSet_ActiveRecord: Integer;
    function DataSet_BookmarkAvailable: Boolean;
    function DataSet_BufferCount: Integer;
    // State
    function IsActive: Boolean; override;
    function IsActiveDataSet: Boolean; override;
    function IsBOF: Boolean; override;
    function IsChanging: Boolean; override;
    function IsEditing: Boolean; override;
    function IsEOF: Boolean; override;
    function IsGridModeUpdating: Boolean; override;
    function IsInserting: Boolean; override;
    function IsModified: Boolean; override;
    function IsDataSetModified: Boolean; virtual;
    // Navigation
    function BookmarkValid(const ABookmark: TBookmarkStr): Boolean; virtual;
    function CompareBookmarks(const AItem1, AItem2: TBookmarkStr): Integer; virtual;
    procedure CorrectRecordIndex(ARecordIndex: Integer); override;
    procedure First; override;
    procedure Prev; override;
    procedure Next; override;
    procedure Last; override;
    procedure MoveBy(ADistance: Integer); override;
    procedure Scroll(ADistance: Integer); override;
    procedure SavePos; override;
    procedure RestorePos; override;
    // Editing
    function CanDelete: Boolean; override;
    function CanInitEditing(ARecordIndex: Integer): Boolean; override;
    function CanModify: Boolean; override;

    procedure Append; override;
    procedure InternalCancel; virtual;
    procedure Cancel; override;
    procedure Delete; override;
    procedure DeleteRecords(AList: TList); override;
    procedure DeleteSelection; override;
    procedure Edit; override;
    function GetEditValue(ARecordIndex: Integer; AField: TcxCustomDataField;
      AEditValueSource: TcxDataEditValueSource): Variant; override;
    procedure Insert; override;
    procedure Post(AForcePost: Boolean = False); override;
    procedure PostEditingData; override;
    function SetEditValue(ARecordIndex: Integer; AField: TcxCustomDataField; const AValue: Variant; AEditValueSource: TcxDataEditValueSource): Boolean; override;

    procedure BeginDeleting; override;
    procedure EndDeleting; override;

    procedure AssignItemValue(ARecordIndex: Integer; AField: TcxCustomDataField; const AValue: Variant); override;
    procedure DoInitInsertingRecord(AInsertingRecordIndex: Integer; const AGroupValues: TcxDataSummaryValues); override;
    // Notification
    procedure ActiveChanged(AActive: Boolean); override;
    procedure AddListener(AProvider: TcxDBDataProvider);
    procedure BeginLocate; override;
    procedure DataScrolled(ADistance: Integer); override;
    procedure Freeze; override;
    procedure LayoutChanged(ADataLayoutChanges: TcxDataLayoutChanges); override;
    procedure RecordChanged(Field: TField); virtual;
    procedure ResetPostLocateFlag;
    procedure ResetSmartRefresh;
    procedure SetPostLocateFlag;
    procedure Unfreeze; override;
    // Smart Refesh
    procedure SmartDataChanged;
    // GridMode
    procedure CheckExpandedDetails;
    function DoLocate(const ASubText: string; AForward, ANext: Boolean): Boolean;
    function GetDataBufferCount: Integer;
    function GetDataRecordCount: Integer;
    function GetExternalDataDisplayText(ARecordIndex: Integer; AField: TcxCustomDataField): string; override;
    function GetExternalDataValue(ARecordIndex: Integer; AField: TcxCustomDataField): Variant; override;
    procedure LoadDataBuffer; override;
    procedure UpdateGridMode;
    // Master Detail
    function GetDetailHasChildren(ARecordIndex: Integer; ARelationIndex: Integer): Boolean; override;
    // Structure
    function GetRecordIndex: Integer; override;
    function GetValueDefReaderClass: TcxValueDefReaderClass; override;
    property DataController: TcxDBDataController read GetDataController;
    property DataLink: TcxDBDataLink read FDataLink;
    property UpdatingRecordIndex: Integer read FUpdatingRecordIndex;
  public
    constructor Create(ADataController: TcxCustomDataController); override;
    destructor Destroy; override;
    function IsCanInitEditingBusy: Boolean;
    function IsDataSetBusy: Boolean;
    function IsDetailDataSetBusy: Boolean;
    function IsOtherDataControllerUpdating: Boolean;
    function IsOtherDetailDataSetInInsert: Boolean;
    function IsOtherDetailChanged: Boolean;
    function IsUniDirectional: Boolean;
    property DataSet: TDataSet read GetDataSet;
    property DataSource: TDataSource read GetDataSource write SetDataSource;
    property IsDataSetCurrent: Boolean read GetIsDataSetCurrent write SetIsDataSetCurrent;
    property IsSmartRefresh: Boolean read GetIsSmartRefresh;
  end;

  TcxValueDefDBReader = class(TcxValueDefReader)
  public
    function GetDisplayText(AValueDef: TcxValueDef): string; override;
    function GetValue(AValueDef: TcxValueDef): Variant; override;
    function IsInternal(AValueDef: TcxValueDef): Boolean; override;
  end;

  { TcxDBDataField }

  TcxDBDataField = class(TcxCustomDataField)
  private
    FField: TField;
    FFieldName: string;
    FFields: TList;
    FIsCurrency: Boolean;
    FParentField: TcxDBDataField;
    function GetDataController: TcxDBDataController;
    function GetField: TField;
    function GetFieldItem(Index: Integer): TcxDBDataField;
    function GetFieldCount: Integer;
    function GetIsLookup: Boolean;
    function GetProvider: TcxDBDataProvider;
    procedure SetField(Value: TField);
  protected
    procedure AddField(ADataField: TcxDBDataField);
    procedure ClearFields;
    procedure DoPropertiesChanged;
    procedure Reassign(ASource: TcxCustomDataField); override;
    procedure RemoveField(ADataField: TcxDBDataField);
    procedure RemoveNotification(AComponent: TComponent); override;
    procedure SetPropertiesByField(AField: TField; AFieldChanged: Boolean);
    property DataController: TcxDBDataController read GetDataController;
    property Field: TField read GetField write SetField;
    property FieldCount: Integer read GetFieldCount;
    property FieldName: string read FFieldName write FFieldName;
    property Fields[Index: Integer]: TcxDBDataField read GetFieldItem; default;
    property IsCurrency: Boolean read FIsCurrency; 
    property IsLookup: Boolean read GetIsLookup;
    property ParentField: TcxDBDataField read FParentField;
    property Provider: TcxDBDataProvider read GetProvider;
  public
    destructor Destroy; override;
    function CanModify(AEditValueSource: TcxDataEditValueSource): Boolean; override;
    function IsUnbound: Boolean; override;
    function IsValueDefInternal: Boolean; override;
  end;

  { TcxDBDataRelation }

  TcxDBDataRelation = class(TcxCustomDataRelation)
  private
    FMasterKeyField: TcxDBDataField;
    function GetDataController: TcxDBDataController;
    function GetDetailKeyFieldNames: string;
    function GetMasterKeyFieldNames: string;
  protected
    procedure GetMasterKeyFields(AList: TList);
    function IsLinked: Boolean; virtual;
    procedure RemoveDataField(ADataField: TcxCustomDataField); override;
    procedure RemoveMasterKeyField;
    procedure UpdateMasterDetailKeyFieldNames;
  public
    destructor Destroy; override;
    function GetMasterRecordID(ARecordIndex: Integer): Variant;
    property DataController: TcxDBDataController read GetDataController;
    property DetailKeyFieldNames: string read GetDetailKeyFieldNames;
    property MasterKeyFieldNames: string read GetMasterKeyFieldNames;
  end;

  { DB Filter }

  TcxDBDataFilterCriteriaItem = class(TcxDataFilterCriteriaItem)
  private
    function GetDataController: TcxDBDataController;
    function GetDBField: TcxDBDataField;
  protected
    function GetFilterOperatorClass: TcxFilterOperatorClass; override;
  public
    property DataController: TcxDBDataController read GetDataController;
    property DBField: TcxDBDataField read GetDBField;
  end;

  TcxDBDataFilterBeforeChangeEvent = procedure(Sender: TcxDBDataFilterCriteria;
    ADataSet: TDataSet; const AFilterText: string) of object;
  TcxDBDataFilterFormatFilterTextValueEvent = procedure(Sender: TcxDBDataFilterCriteria;
    const AValue: Variant; var ADisplayValue: string) of object;

  TcxDBDataFilterCriteria = class(TcxDataFilterCriteria)
  private
    FAutoDataSetFilter: Boolean;
    FIgnoreOrigin: Boolean; 
    FOnBeforeChange: TcxDBDataFilterBeforeChangeEvent;
    FOnFormatFilterTextValue: TcxDBDataFilterFormatFilterTextValueEvent;
    function GetDataController: TcxDBDataController;
    procedure SetAutoDataSetFilter(Value: Boolean);
    procedure SetIgnoreOrigin(Value: Boolean);
  protected
    procedure FormatFilterTextValue(AItem: TcxFilterCriteriaItem; const AValue: Variant;
      var ADisplayValue: string); override;
    function GetItemClass: TcxFilterCriteriaItemClass; override;
    procedure Update; override;
  public
    constructor Create(ADataController: TcxCustomDataController); override;
    procedure Assign(Source: TPersistent; AIgnoreItemNames: Boolean = False); override;
    procedure AssignEvents(Source: TPersistent); override;
    function IsAutoDataSetFilter: Boolean;
    function IsFiltering: Boolean; override;
    procedure RestoreDefaults; override;
    property DataController: TcxDBDataController read GetDataController;
  published
    // TODO: add property CustomFiltering -> IsFiltering = False!
    property AutoDataSetFilter: Boolean read FAutoDataSetFilter write SetAutoDataSetFilter default False;
    property DateTimeFormat;
    property IgnoreOrigin: Boolean read FIgnoreOrigin write SetIgnoreOrigin default True;
    property TranslateBetween;
    property TranslateIn;
    property TranslateLike;
    property SupportedLike;
    property OnBeforeChange: TcxDBDataFilterBeforeChangeEvent read FOnBeforeChange write FOnBeforeChange;
    property OnFormatFilterTextValue: TcxDBDataFilterFormatFilterTextValueEvent read FOnFormatFilterTextValue write FOnFormatFilterTextValue;
  end;

  { DB Summary }

  TcxDBDataSummaryItem = class(TcxDataSummaryItem)
  private
    FDataField: TcxDBDataField;
    FFieldName: string;
    function GetDBDataController: TcxDBDataController;
    procedure SetFieldName(const Value: string);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?