📄 cxvgrid.pas
字号:
TcxvgResizeKind = (rkNone, rkRowSizing, rkDivider, rkBandSizing);
TcxvgController = class(TcxCustomControlController, IUnknown, IcxDragSizing)
private
FAutoScrollObject: TcxControllerAutoScrollingObject;
FCellIndex: Integer;
FDragFromCustomizingForm: Boolean;
FDragRow: TcxCustomRow;
FForceShowEditor: Boolean;
FFocusedRow: TcxCustomRow;
FLockIncSearch: Boolean;
FProcessMultiEditorRow: Boolean;
FResizeKind: TcxvgResizeKind;
FScrollDown: Boolean;
FScroller: TcxvgScroller;
FScrollTimer: TTimer;
FSizingRow: TcxCustomRow;
FSizingValue: Integer;
FTrackingEnabled: Boolean;
FWasScroll: Boolean;
procedure CheckMoveToCustomizationForm;
function GetHitTest: TcxvgHitTest;
function GetVerticalGrid: TcxCustomVerticalGrid;
function GetViewInfo: TcxvgCustomViewInfo;
procedure SetFocusedRow(Value: TcxCustomRow);
procedure SetResizeKind(Value: TcxvgResizeKind);
procedure OnScrollTimer(Sender: TObject);
procedure StartScrollTimer;
procedure StopScrollTimer;
protected
FLockUpdate: Boolean;
ResizeDirection: TcxDragSizingDirection;
// IUnknown
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
// IcxDragSizing
function CanSizing(ADirection: TcxDragSizingDirection): Boolean; virtual;
function GetSizingBoundsRect(ADirection: TcxDragSizingDirection): TRect; virtual;
function GetSizingIncrement(ADirection: TcxDragSizingDirection): Integer; virtual;
function IsDynamicUpdate: Boolean; virtual;
procedure SetSizeDelta(ADirection: TcxDragSizingDirection; ADelta: Integer); virtual;
// drag'n'drop
procedure DragDrop(Source: TObject; X, Y: Integer); override;
procedure DragOver(Source: TObject; X, Y: Integer; State: TDragState;
var Accept: Boolean); override;
procedure EndDrag(Target: TObject; X, Y: Integer); override;
procedure StartDrag(var DragObject: TDragObject); override;
procedure BeforeMouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
procedure BehaviorChanged; override;
function CanAppend(ACheckOptions: Boolean): Boolean; virtual;
function CanChangeRecord: Boolean; virtual;
function CanDelete(ACheckOptions: Boolean): Boolean; virtual;
function CanInsert(ACheckOptions: Boolean): Boolean; virtual;
procedure CheckPostData;
procedure DoCancelMode; override;
procedure DoMouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
procedure DoMouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
procedure DoNextPage(AForward: Boolean; Shift: TShiftState); override;
procedure DoUpdateRowAndCell(ANewRow: TcxCustomRow; ANewCellIndex: Integer); virtual;
procedure FocusedItemChanged(APrevFocusedItem: TcxCustomInplaceEditContainer); override;
function GetCancelEditingOnExit: Boolean; override;
function GetDragAndDropObjectClass: TcxDragAndDropObjectClass; override;
function GetFocusedCellViewInfo(AEditContainer: TcxCustomInplaceEditContainer): TcxEditCellViewInfo; override;
function GetImmediateEditor: Boolean; override;
function GetNavigatorClass: TcxCustomCellNavigatorClass; override;
function GetPostDataOnChangeItem: Boolean; virtual;
function GetResizeDirection: TcxDragSizingDirection; override;
procedure InternalSetRowAndCell(ARow: TcxCustomRow; ACellIndex: Integer);
function IsImmediatePost: Boolean; override;
function IsInternalDragging: Boolean;
function IsKeyForController(AKey: Word; AShift: TShiftState): Boolean; override;
procedure RefreshFocusedRow; virtual;
procedure SetFocusedCellEdit(ACellEdit: TcxCellEdit);
procedure SetFocusedRowAndCell(Value: TcxCustomRow; ACellIndex: Integer); virtual;
procedure UpdatePaintStyle; virtual;
procedure UpdateRecord(ARecordIndex: Integer); override;
property DragRow: TcxCustomRow read FDragRow;
property DragFromCustomizingForm: Boolean read FDragFromCustomizingForm;
property ForceShowEditor: Boolean read FForceShowEditor;
property ProcessMultiEditorRow: Boolean read FProcessMultiEditorRow;
property ResizeKind: TcxvgResizeKind read FResizeKind write SetResizeKind;
public
// override
constructor Create(AOwner: TcxEditingControl); override;
destructor Destroy; override;
// IUnknown
function QueryInterface(const IID: TGUID; out Obj): HResult; virtual; stdcall;
procedure Clear; override;
function GetCursor(X, Y: Integer): TCursor; override;
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
procedure MakeFocusedItemVisible; override;
procedure MakeFocusedRecordVisible; override;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
// drag and drop
function CanDrag(X, Y: Integer): Boolean; override;
procedure EndDragAndDrop(Accepted: Boolean); override;
function StartDragAndDrop(const P: TPoint): Boolean; override;
// scrolling
procedure InitScrollBarsParameters; override;
procedure Scroll(AScrollBarKind: TScrollBarKind; AScrollCode: TScrollCode;
var AScrollPos: Integer); override;
procedure AppendRecord; virtual;
procedure DeleteSelection; virtual;
procedure InsertRecord; virtual;
procedure MakeRowVisible(ARow: TcxCustomRow); virtual;
function MakeRecordVisible(AIndex: Integer): Boolean; virtual;
property CellIndex: Integer read FCellIndex;
property FocusedRow: TcxCustomRow read FFocusedRow write SetFocusedRow;
property HitTest: TcxvgHitTest read GetHitTest;
property Scroller: TcxvgScroller read FScroller;
property VerticalGrid: TcxCustomVerticalGrid read GetVerticalGrid;
property ViewInfo: TcxvgCustomViewInfo read GetViewInfo;
end;
{ TcxvgMultiRecordsController }
TcxvgMultiRecordsController = class(TcxvgController)
private
function GetOptionsBehavior: TcxvgMultiRecordsOptionsBehavior;
function GetOptionsData: TcxvgMultiRecordsOptionsData;
function GetVerticalGrid: TcxVirtualVerticalGrid;
protected
function CanAppend(ACheckOptions: Boolean): Boolean; override;
function CanChangeRecord: Boolean; override;
function CanDelete(ACheckOptions: Boolean): Boolean; override;
function CanInsert(ACheckOptions: Boolean): Boolean; override;
procedure FocusedRecordChanged(APrevFocusedRowIndex, AFocusedRowIndex: Integer); override;
function GetCancelEditingOnExit: Boolean; override;
function GetFocusedRecordIndex: Integer; override;
function GetPostDataOnChangeItem: Boolean; override;
function IncSearchKeyDown(AKey: Word; AShift: TShiftState): Word; override;
function IsImmediatePost: Boolean; override;
procedure RefreshIncSearchItem; virtual;
procedure SetFocusedRecordIndex(Value: Integer); override;
property OptionsBehavior: TcxvgMultiRecordsOptionsBehavior read GetOptionsBehavior;
property OptionsData: TcxvgMultiRecordsOptionsData read GetOptionsData;
property VerticalGrid: TcxVirtualVerticalGrid read GetVerticalGrid;
public
procedure DeleteSelection; override;
end;
{ TcxCustomVerticalGrid }
TcxVerticalGridDrawHeaderEvent = procedure(Sender: TObject;
ACanvas: TcxCanvas; APainter: TcxvgPainter;
AHeaderViewInfo: TcxCustomRowHeaderInfo;
var Done: Boolean) of object;
TcxVerticalGridDrawValueEvent = procedure(Sender: TObject;
ACanvas: TcxCanvas; APainter: TcxvgPainter;
AValueInfo: TcxRowValueInfo;
var Done: Boolean) of object;
TcxVerticalGridDrawBackgroundEvent = procedure(Sender: TObject;
ACanvas: TcxCanvas; const R: TRect; const AViewParams: TcxViewParams;
var Done: Boolean) of object;
TcxVerticalGridEditingEvent = procedure(Sender: TObject;
ARowProperties: TcxCustomEditorRowProperties; var Allow: Boolean) of object;
TcxVerticalGridChangedEvent = procedure(Sender: TObject;
ARowProperties: TcxCustomEditorRowProperties) of object;
TcxVerticalGridItemChangedEvent = procedure(Sender: TObject;
AOldRow: TcxCustomRow; AOldCellIndex: Integer) of object;
TcxCustomVerticalGrid = class(TcxExtEditingControl, IcxStoredObject,
IcxStoredParent)
private
FCategoryFont: TFont;
FCustomizing: TcxVerticalGridCustomizing;
FImageChangeLink: TChangeLink;
FImages: TImageList;
FNewLoadMode: Boolean;
FRootRow: TcxCustomRow;
FRows: TcxVerticalGridRows;
FSaveDragCursor: TCursor;
FStoringName: string;
FStylesEvents: TNotifyEvent;
FOnCustomizationVisibleChanged: TNotifyEvent;
FOnDrawBackground: TcxVerticalGridDrawBackgroundEvent;
FOnDrawRowHeader: TcxVerticalGridDrawHeaderEvent;
FOnDrawValue: TcxVerticalGridDrawValueEvent;
FOnEdited: TcxVerticalGridChangedEvent;
FOnEditing: TcxVerticalGridEditingEvent;
FOnEditValueChanged: TcxVerticalGridChangedEvent;
FOnItemChanged: TcxVerticalGridItemChangedEvent;
FOnLayoutChanged: TNotifyEvent;
FOnLeftVisibleBandIndexChanged: TNotifyEvent;
FOnLeftVisibleRecordIndexChanged: TNotifyEvent;
FOnTopRowIndexChanged: TNotifyEvent;
procedure CategoryFontChanged(Sender: TObject);
function GetController: TcxvgController;
function GetDragHeaderInfo: TcxCustomRowHeaderInfo;
function GetFocusedRow: TcxCustomRow;
function GetHitTest: TcxvgHitTest;
function GetInplaceEditor: TcxCustomEdit;
function GetIsEditing: Boolean;
function GetLeftVisibleBand: Integer;
function GetLeftVisibleRecord: Integer;
function GetOptionsBehavior: TcxvgOptionsBehavior;
function GetOptionsView: TcxvgOptionsView;
function GetPainter: TcxvgPainter;
function GetRecordCount: Integer;
function GetStyles: TcxVerticalGridStyles;
function GetTopVisibleRowIndex: Integer;
function GetViewInfo: TcxvgCustomViewInfo;
procedure ImageListChange(Sender: TObject);
procedure SetFocusedRow(Value: TcxCustomRow);
procedure SetImages(Value: TImageList);
procedure SetLeftVisibleBand(Value: Integer);
procedure SetLeftVisibleRecord(Value: Integer);
procedure SetOptionsBehavior(Value: TcxvgOptionsBehavior);
procedure SetOptionsView(Value: TcxvgOptionsView);
procedure SetStyles(Value: TcxVerticalGridStyles);
procedure SetTopVisibleRowIndex(Value: Integer);
procedure CMDrag(var Message: TCMDrag); message CM_DRAG;
protected
// IcxStoredObject
function GetObjectName: string; virtual;
function GetProperties(AProperties: TStrings): Boolean; virtual;
procedure GetPropertyValue(const AName: string; var AValue: Variant); virtual;
procedure SetPropertyValue(const AName: string; const AValue: Variant); virtual;
// IcxStoredParent
function CreateChild(const AObjectName, AClassName: string): TObject; virtual;
procedure DeleteChild(const AObjectName: string; AObject: TObject); virtual;
procedure IcxStoredParent.GetChildren = GetStoredChildren;
procedure GetStoredChildren(AChildren: TStringList); virtual;
// vcl methods
procedure DoEndDrag(Target: TObject; X, Y: Integer); override;
procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
procedure Loaded; override;
procedure SetName(const Value: TComponentName); override;
// cxControls
procedure BoundsChanged; override;
procedure FontChanged; override;
procedure InitControl; override;
procedure LookAndFeelChanged(Sender: TcxLookAndFeel;
AChangedValues: TcxLookAndFeelValues); override;
// cxControls - drag'n'drop
function GetDragObjectClass: TDragControlObjectClass; override;
// cxExtEditingControl
procedure CreateSubClasses; override;
procedure DataChanged; override;
procedure DestroySubClasses; override;
procedure DoEdited(AItem: TcxCustomInplaceEditContainer); override;
function DoEditing(AItem: TcxCustomInplaceEditContainer): Boolean; override;
procedure DoEditValueChanged(AItem: TcxCustomInplaceEditContainer); override;
procedure DoInplaceEditContainerItemRemoved(AItem: TcxCustomInplaceEditContainer); override;
procedure DoLayoutChanged; override;
function DragDropImageDisplayRect: TRect; override;
procedure DrawDragDropImage(ADragBitmap: TBitmap; ACanvas: TcxCanvas); override;
function GetControllerClass: TcxCustomControlControllerClass; override;
function GetControlStylesClass: TcxCustomControlStylesClass; override;
function GetDragImageHelperClass: TcxDragImageHelperClass; override;
function GetEditCellDataBindingClass: TcxItemDataBindingClass; virtual;
function GetHitTestControllerClass: TcxHitTestControllerClass; override;
function GetOptionsBehaviorClass: TcxControlOptionsBehaviorClass; override;
function GetOptionsViewClass: TcxControlOptionsViewClass; override;
function GetPainterClass: TcxCustomControlPainterClass; override;
function HasDragDropImages: Boolean; override;
procedure RecreateViewInfo; override;
// virtuals
procedure AfterLoadedRows;
procedure BeforeLoadedRows;
function CanBandSizing: Boolean; virtual;
procedure CheckRowClass(ARowClass: TcxCustomRowClass); virtual;
procedure CheckGridModeBufferCount;
procedure DoCustomizationVisibleChanged; virtual;
function DoDrawBackgroundPart(const R: TRect; const AViewParams: TcxViewParams): Boolean; virtual;
function DoDrawRowHeader(AHeaderViewInfo: TcxCustomRowHeaderInfo): Boolean; virtual;
function DoDrawValue(AValueInfo: TcxRowValueInfo): Boolean; virtual;
procedure DoItemChanged(AOldRow: TcxCustomRow; AOldCellIndex: Integer); virtual;
procedure DoLeftVisibleBandIndexChanged; virtual;
procedure DoLeftVisibleRecordIndexChanged; virtual;
procedure DoTopRowIndexChanged; virtual;
function GetCalcHelperClass: TcxvgCustomPaintStyleCalcHelperClass; virtual;
function GetCellAutoHeight: Boolean; virtual;
function GetCustomizingClass: TcxVerticalGridCustomizingClass; virtual;
procedure GetDefaultViewParams(Index: Integer; AData: TObject; out AParams: TcxViewParams); virtual;
function GetEditorRowClass: TcxCustomRowClass; virtual;
function GetMultiEditorRowClass: TcxCustomRowClass; virtual;
function GetScrollStrategyClass: TcxvgCustomScrollStrategyClass; virtual; abstract;
procedure InitDataCon
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -