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 + -
显示快捷键?