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