cxcustomdata.pas

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

PAS
1,436
字号

{********************************************************************}
{                                                                    }
{       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 cxCustomData;

{$I cxVer.inc}

interface

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

const
  cxNullEditingRecordIndex = -MaxInt;

type
  TcxCustomDataControllerInfo = class;
  TcxCustomDataController = class;
  TcxCustomDataProvider = class;
  TcxCustomDataField = class;
  TcxCustomDataFieldList = class;
  TcxCustomDataRelationList = class;
  TcxDataSummaryItem = class;
  TcxDataSummaryItems = class;
  TcxDataSummaryGroup = class;
  TcxDataSummaryGroups = class;
  TcxDataSummaryGroupItemLinks = class;
  TcxDataSummary = class;

  EcxInvalidDataControllerOperation = class(Exception);

  { TcxCustomDataSource }

  TcxDataRecordHandle = Pointer;
  TcxDataItemHandle = Pointer;

  TcxCustomDataSource = class
  private
    FCurrentProvider: TcxCustomDataProvider;
    FProvider: TcxCustomDataProvider;
    FProviders: TList;
    function GetDataController: TcxCustomDataController;
    function GetProvider: TcxCustomDataProvider;
    procedure AddProvider(AProvider: TcxCustomDataProvider);
    procedure RemoveProvider(AProvider: TcxCustomDataProvider);
    procedure RemoveFromProviders;
  protected
    function AppendRecord: TcxDataRecordHandle; virtual; // *
    procedure CustomSort; virtual; // when IsCustomSorting = True
    procedure DeleteRecord(ARecordHandle: TcxDataRecordHandle); virtual; // *
    function GetDefaultItemID(AItemIndex: Integer): Integer; virtual;
    function GetDetailHasChildren(ARecordIndex, ARelationIndex: Integer): Boolean; virtual;
    function GetDisplayText(ARecordHandle: TcxDataRecordHandle; AItemHandle: TcxDataItemHandle): string; virtual;
    function GetInfoForCompare(ARecordHandle: TcxDataRecordHandle; AItemHandle: TcxDataItemHandle; var PValueBuffer: PChar): Boolean; virtual;
    function GetItemHandle(AItemIndex: Integer): TcxDataItemHandle; virtual;
    function GetRecordCount: Integer; virtual; // *
    function GetRecordId(ARecordHandle: TcxDataRecordHandle): Variant; virtual; // Save Keys Required
    function GetRecordHandle(ARecordIndex: Integer): TcxDataRecordHandle; virtual;
    function GetValue(ARecordHandle: TcxDataRecordHandle; AItemHandle: TcxDataItemHandle): Variant; virtual; // *
    function InsertRecord(ARecordHandle: TcxDataRecordHandle): TcxDataRecordHandle; virtual; // *
    function IsCustomSorting: Boolean; virtual;
    function IsNativeCompare: Boolean; virtual;
    function IsNativeCompareFunc: Boolean; virtual;
    function IsRecordIdSupported: Boolean; virtual; // Save Keys Required
    procedure LoadRecordHandles; virtual;
    function NativeCompareFunc(ARecordHandle1, ARecordHandle2: TcxDataRecordHandle; AItemHandle: TcxDataItemHandle): Integer; virtual;
    procedure SetRecordCount(ARecordCount: Integer); virtual;
    procedure SetValue(ARecordHandle: TcxDataRecordHandle; AItemHandle: TcxDataItemHandle; const AValue: Variant); virtual; // *
    property CurrentProvider: TcxCustomDataProvider read FCurrentProvider write FCurrentProvider;
    // tree
    function AddRecordHandle(ARecordHandle: TcxDataRecordHandle): Integer;
  public
    destructor Destroy; override;
    procedure DataChanged; virtual;
    function GetRecordHandleByIndex(ARecordIndex: Integer): TcxDataRecordHandle;
    function GetRecordIndexByHandle(ARecordHandle: TcxDataRecordHandle): Integer;
    property DataController: TcxCustomDataController read GetDataController;
    property Provider: TcxCustomDataProvider read GetProvider;
  end;

  TcxCustomDataSourceClass = class of TcxCustomDataSource;

  { TcxCustomDataProvider }

  TcxDataChange = (dcField, dcRecord, dcNew, dcDeleted, dcTotal);
  TcxDataChangeInfo = record
    Kind: TcxDataChange;
    ItemIndex: Integer;
    RecordIndex: Integer;
  end;

  TcxDataLayoutChange = (lcStructure, lcData);
  TcxDataLayoutChanges = set of TcxDataLayoutChange;

  TcxDataSummaryCountValues = array of Integer;
  TcxDataSummaryValues = array of Variant;

  TcxCustomDataProvider = class
  private
    FActiveChanging: Boolean;
    FChanging: Boolean;
    FCustomDataSource: TcxCustomDataSource;
    FDataChangedLocked: Boolean;
    FDataController: TcxCustomDataController;
    FEditingRecordIndex: Integer;
    FEditingRecordIndex1: Integer; // After
    FEditingRecordIndex2: Integer; // Before
    FInsertedRecordIndex: Integer;
    FInUpdateData: Boolean;
    FLocateCount: Integer;
    FLockCount: Integer;
    FModified: Boolean;
    FRecreatedFieldsAfterFirst: Boolean;
    FSavedRecordIndex: Integer;
    procedure SetCustomDataSource(Value: TcxCustomDataSource);
  protected
    FInInserting: Boolean;
    FInserting: Boolean;
    FLoadAllNeeded: Boolean;
    // Mode
    procedure CustomSort; virtual; // when IsCustomSorting = True
    function IsCustomDataSourceSupported: Boolean; virtual;
    function IsCustomSorting: Boolean; virtual;
    function IsGridMode: Boolean; virtual;
    function IsDataSource: Boolean; virtual;
    function IsOtherInsert: Boolean; virtual;
    function IsRecordIdSupported: Boolean; virtual;
    function IsSyncMode: Boolean; virtual;
    // State
    function IsActive: Boolean; virtual;
    function IsActiveDataSet: Boolean; virtual;
    function IsBOF: Boolean; virtual;
    function IsChanging: Boolean; virtual;
    function IsEditing: Boolean; virtual;
    function IsEOF: Boolean; virtual;
    function IsGridModeUpdating: Boolean; virtual;
    function IsInserting: Boolean; virtual;
    function IsModified: Boolean; virtual;
    function IsUnboundColumnMode: Boolean; virtual;
    // Navigation
    procedure CorrectRecordIndex(ARecordIndex: Integer); virtual;
    procedure First; virtual;
    procedure Prev; virtual;
    procedure Next; virtual;
    procedure Last; virtual;
    procedure MoveBy(ADistance: Integer); virtual;
    procedure Scroll(ADistance: Integer); virtual;
    procedure SavePos; virtual;
    procedure RestorePos; virtual;
    // Editing
    function CanAppend: Boolean; virtual;
    function CanDelete: Boolean; virtual;
    function CanInitEditing(ARecordIndex: Integer): Boolean; virtual;
    function CanInsert: Boolean; virtual;
    function CanModify: Boolean; virtual;

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

    procedure BeginDeleting; virtual;
    procedure EndDeleting; virtual;

    procedure AssignItemValue(ARecordIndex: Integer; AField: TcxCustomDataField; const AValue: Variant); virtual;
    procedure ClearSavedRecord;
    procedure CreateSavedRecord(ARecordIndex: Integer);
    procedure DoInitInsertingRecord(AInsertingRecordIndex: Integer; const AGroupValues: TcxDataSummaryValues); virtual;
    procedure EditingRecord; virtual;
    procedure InsertingRecord(AIsAppending: Boolean); virtual;
    procedure ResetChanging; virtual;
    procedure ResetEditing; virtual;
    procedure ResetModified; virtual;
    procedure SetChanging; virtual;
    procedure SetEditing; virtual;
    procedure SetModified; virtual;
    // Lock Notify
    procedure BeginLocate; virtual;
    procedure EndLocate; virtual;
    procedure Freeze; virtual;
    procedure Unfreeze; virtual;
    // Data
    function AddRecordHandle(AData: Pointer): Integer;
    function AppendRecord: Integer; virtual;
    procedure DeleteRecord(ARecordIndex: Integer); virtual;
    function GetDetailHasChildren(ARecordIndex, ARelationIndex: Integer): Boolean; virtual;
    function GetDisplayText(ARecordIndex: Integer; AField: TcxCustomDataField): string; virtual;
//    function GetRecordCount: Integer; virtual;
    function GetExternalDataDisplayText(ARecordIndex: Integer; AField: TcxCustomDataField): string; virtual;
    function GetExternalDataValue(ARecordIndex: Integer; AField: TcxCustomDataField): Variant; virtual;
    function GetRecordId(ARecordIndex: Integer): Variant; virtual;
    function GetRecordIndex: Integer; virtual;
    function GetValue(ARecordIndex: Integer; AField: TcxCustomDataField): Variant; virtual;
    function GetValueDefReaderClass: TcxValueDefReaderClass; virtual;
    function InsertRecord(ARecordIndex: Integer): Integer; virtual;
    procedure LoadDataBuffer; virtual;
    procedure LoadRecordHandles;
    function NativeCompare(ARecordIndex1, ARecordIndex2: Integer; AField: TcxCustomDataField): Integer; virtual;
    function NativeCompareFunc(ARecordIndex1, ARecordIndex2: Integer; AField: TcxCustomDataField): Integer; virtual;
    procedure SetDisplayText(ARecordIndex: Integer; AField: TcxCustomDataField; const Value: string); virtual;
    procedure SetRecordCount(ARecordCount: Integer); virtual;
    procedure SetValue(ARecordIndex: Integer; AField: TcxCustomDataField; const Value: Variant); virtual;
    // Notification
    procedure ActiveChanged(AActive: Boolean); virtual;
    procedure DataChanged(ADataChange: TcxDataChange; AItemIndex, ARecordIndex: Integer); virtual;
    procedure DataScrolled(ADistance: Integer); virtual;
    procedure LayoutChanged(ADataLayoutChanges: TcxDataLayoutChanges); virtual;

    property ActiveChanging: Boolean read FActiveChanging write FActiveChanging;
    property CustomDataSource: TcxCustomDataSource read FCustomDataSource write SetCustomDataSource;
    property DataController: TcxCustomDataController read FDataController;
    property EditingRecordIndex: Integer read FEditingRecordIndex;
    property InsertedRecordIndex: Integer read FInsertedRecordIndex;
    property LocateCount: Integer read FLocateCount;
    property LockCount: Integer read FLockCount;
    property RecreatedFieldsAfterFirst: Boolean read FRecreatedFieldsAfterFirst write FRecreatedFieldsAfterFirst;
  public
    constructor Create(ADataController: TcxCustomDataController); virtual;
    destructor Destroy; override;
  end;

  TcxCustomDataProviderClass = class of TcxCustomDataProvider;

  { TcxCustomDataField }

  TcxCustomDataField = class
  private
    FFieldList: TcxCustomDataFieldList;
    FIsInternal: Boolean;
    FItem: TObject;
    FLockRecreateData: Integer;
    FNeedConversion: Boolean;
    FNeedConversionFlag: Integer; // 0 - undefined; -1 - not needed; 1 - needed; 2 - SortByDisplayText
    FPrepared: Boolean;
    FReferenceField: TcxCustomDataField;
    FTextStored: Boolean;
    FValueDef: TcxValueDef;
    FValueTypeClass: TcxValueTypeClass;
    function GetDataController: TcxCustomDataController;
    function GetIndex: Integer;
    function GetNotifier: TComponent;
    function GetTextStored: Boolean;
    function GetValueDef: TcxValueDef;
    function GetValueTypeClass: TcxValueTypeClass;
    procedure SetIndex(Value: Integer);
    procedure SetIsInternal(Value: Boolean);
    procedure SetReferenceField(Value: TcxCustomDataField);

⌨️ 快捷键说明

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