📄 tsdbgrid.pas
字号:
working with the BDE.}
TtsRowProp = record
Selected: Boolean;
SelectedSaved: Boolean;
Prop: TtsDBRowElement;
PropSaved: Boolean;
end;
PtsPropArray = ^TtsPropArray;
TtsPropArray = array[1..(MaxListSize div ((SizeOf(TtsRowProp) div SizeOf(Longint)) + 1))] of TtsRowProp;
TtsGridData = class(TObject)
protected
FGrid: TtsCustomDBGrid;
FDataset: TDataset;
FDatalink: TtsGridDataLink;
FCanDisableControls: Integer;
FControlsDisabled: Boolean;
FQueryText: string;
FQueryParams: TParams;
FFieldLayout: TList;
FPropBuffer: PtsPropArray;
FPropBufSize: Integer;
FPropBufferCleared: Boolean;
FIndexName: string;
FIndexFieldNames: string;
procedure ResetFieldLayout;
procedure SaveFieldLayout;
function FieldLayoutChanged: Boolean;
function FieldOrderChanged: Boolean;
function DatasetIndexName: string;
function DatasetIndexFieldNames: string;
function IndexChanged: Boolean;
procedure SaveCurIndex;
procedure InitGridDataSet; virtual;
function CompareBkm(Bkm1, Bkm2: TBookmarkStr): Integer;
function CheckCompareBkmPos(var BkmPos1, BkmPos2: TtsBkmPos;
var Found: Boolean): Integer;
function CompareBkmPos(var BkmPos1, BkmPos2: TtsBkmPos): Integer;
function GreaterEqualBkmPos(var BkmPos1, BkmPos2: TtsBkmPos): Boolean;
function LessEqualBkmPos(var BkmPos1, BkmPos2: TtsBkmPos): Boolean;
function GreaterBkmPos(var BkmPos1, BkmPos2: TtsBkmPos): Boolean;
function LessBkmPos(var BkmPos1, BkmPos2: TtsBkmPos): Boolean;
function RecIDRow(ID: Variant): Integer;
function BkmPosBookmark(const BkmPos: TtsBkmPos; var Bkm: TBookmarkStr): Boolean;
function ActualBkmPos(BkmPos: TtsBkmPos): TtsBkmPos;
function GetRecNo: Integer;
procedure SetRecNo(Value: Integer);
procedure CheckDisableControls;
procedure SetCanDisableControls(Value: Boolean);
function GetCanDisableControls: Boolean;
procedure CheckDatalinkBufferOk(OldSize: Integer);
procedure SetDatasetBufferCount(BufSize: Integer);
procedure LinkActive(Value: Boolean); virtual;
procedure ClearPropBuffer(FromRow, ToRow: Integer; Reset: Boolean);
procedure ResizePropBuffer(NewSize: Integer);
function GetBufferRows: Integer; virtual; abstract;
function GetActive: Boolean; virtual; abstract;
procedure MoveFirst; virtual; abstract;
procedure MoveLast; virtual; abstract;
procedure SetActiveRecord(Value: Integer); virtual; abstract;
function GetActiveRecord: Integer; virtual; abstract;
function GetActiveRecordNumber: Longint; virtual; abstract;
function GetActiveBookmark: TBookmarkStr; virtual; abstract;
function GetRecCount: Longint; virtual; abstract;
function FirstRow: Longint; virtual; abstract;
function CurrentBufRow: Integer; virtual; abstract;
function BufferPos(Bkm: TBookmarkStr): Integer; virtual; abstract;
function BufferRow(Bkm: TBookmarkStr): Integer; virtual; abstract;
function BufferBkmPos(BkmPos: TtsBkmPos): Integer; virtual; abstract;
function MoveActive(Count: Longint; var MovedBy: Longint): Longint; virtual; abstract;
function GetBookmark(BufRow: Integer): TBookmarkStr; virtual; abstract;
function GetRecId(BufRow: Integer): Variant; virtual; abstract;
function GetRecordId(BufRow: Integer): Variant; virtual; abstract;
function ResizeBuffer(NewSize: Integer; var Redraw: Boolean): Boolean; virtual; abstract;
function OnLastRecord: Boolean; virtual; abstract;
function NextBookmark(Bkm: TBookmarkStr; var NextBkm: TBookmarkStr): Boolean; virtual; abstract;
function PrevBookmark(Bkm: TBookmarkStr; var PrevBkm: TBookmarkStr): Boolean; virtual; abstract;
function PrevBkmPos(const BkmPos: TtsBkmPos): TtsBkmPos; virtual; abstract;
function NextBkmPos(const BkmPos: TtsBkmPos): TtsBkmPos; virtual; abstract;
function CheckPrevBkmPos(const BkmPos: TtsBkmPos): TtsBkmPos; virtual; abstract;
function CheckNextBkmPos(const BkmPos: TtsBkmPos): TtsBkmPos; virtual; abstract;
function FirstBookmark: TBookmarkStr; virtual; abstract;
function LastBookmark: TBookmarkStr; virtual; abstract;
function IsSequenced: Boolean; virtual;
function FirstBkmPos: TtsBkmPos; virtual;
function LastBkmPos: TtsBkmPos; virtual;
function BufferPositionChanged(Value: TtsDatasetPosition): Boolean; virtual;
function GetDatasetPosition: TtsDatasetPosition; virtual;
procedure SetDatasetPosition(Value: TtsDatasetPosition); virtual;
function MoveBy(Count: Longint): Longint; virtual; abstract;
function GetAtEnd: Boolean; virtual; abstract;
procedure SetAtEnd(Value: Boolean); virtual; abstract;
function GetAtStart: Boolean; virtual; abstract;
procedure SetAtStart(Value: Boolean); virtual; abstract;
function MoveToRecord(Bkm: TBookmarkStr): Boolean; virtual; abstract;
procedure RereadBuffer(TopRow: Longint; ForceRead: Boolean); virtual; abstract;
procedure SetProperties(Reread: Boolean); virtual; abstract;
function BookmarkValue(Fieldno: Longint; Bkm: TBookmarkStr): Variant; virtual; abstract;
function GetBookmarkRecID(RecBkm: TBookmarkStr; BufRownr: Integer): Variant; virtual; abstract;
function GetBkmValueAndRecordID(Fieldno: Integer; Bkm: TBookmarkStr; var FieldValue: Variant): Variant; virtual; abstract;
function DoRecCount(ReCount: Boolean): Longint; virtual; abstract;
function FindKey(Value: string; Fieldno: Integer; CompareType: TtsComboCompareType;
ParentGrid: TtsCustomDBGrid; FullCmpLen: Boolean; var Found: Boolean): TBookmarkStr; virtual; abstract;
function LocateValue(FromBkm, ToBkm: TBookmarkStr; Value: string; Fieldno: Integer;
CompareType: TtsComboCompareType; ParentGrid: TtsCustomDBGrid;
FullCmpLen: Boolean; var Found: Boolean): TBookmarkStr; virtual; abstract;
function GetPreviousBkms(var FromBkm: TBookmarkStr; ToBkm: TBookmarkStr; BkmList: TtsSelectedList;
StepSize: Integer; SelectingAll: Boolean; var Found: Boolean;
var Count, Total: Longint; var Canceled: Boolean): Boolean; virtual; abstract;
function GetNextBkms(var FromBkm: TBookmarkStr; ToBkm: TBookmarkStr; BkmList: TtsSelectedList;
StepSize: Integer; SelectingAll: Boolean; var Found: Boolean;
var Count, Total: Longint; var Canceled: Boolean): Boolean; virtual; abstract;
procedure SetBookmarkPos(Value: TBookmarkStr); virtual; abstract;
function GetBookmarkPos: TBookmarkStr; virtual; abstract;
property Dataset: TDataset read FDataset write FDataset;
property Datalink: TtsGridDataLink read FDatalink write FDatalink;
property BufferRows: Integer read GetBufferRows;
property Active: Boolean read GetActive;
property ActiveRecord: Integer read GetActiveRecord write SetActiveRecord;
property ActiveBookmark: TBookmarkStr read GetActiveBookmark;
property ActiveRecordNumber: Longint read GetActiveRecordNumber;
property RecCount: Longint read GetRecCount;
property RecId[BufRow: Integer]: Variant read GetRecId;
property Bookmark[BufRow: Integer]: TBookmarkStr read GetBookmark;
property RecordId[BufRow: Integer]: Variant read GetRecordId;
property RecNo: Integer read GetRecNo write SetRecNo;
property CanDisableControls: Boolean read GetCanDisableControls write SetCanDisableControls;
property DatasetPosition: TtsDatasetPosition read GetDatasetPosition write SetDatasetPosition;
property AtEnd: Boolean read GetAtEnd write SetAtEnd;
property AtStart: Boolean read GetAtStart write SetAtStart;
property BookmarkPos: TBookmarkStr read GetBookmarkPos write SetBookmarkPos;
public
constructor Create(Grid: TtsCustomDBGrid);
destructor Destroy; override;
end;
{TtsScrollDataset}
{The ScrollDataset provides independant scrolling behaviour of the
TtsCustomDBGrid. It maintains a clone of the original dataset which can be
positioned independantly from the dataset. All data for the grid comes
from the clone, except for records being edited. Edited values are read
from and written to the original dataset.}
PBookmarkStr = ^TBookmarkStr;
TtsScrollDataset = class(TtsGridData)
protected
FHandle: HDBICur;
FCursorProps: CurProps;
FActive: Boolean;
FBuffer: PChar;
FOldBuffer: PChar;
FReadBuffer: PChar;
FTempBuffer: PChar;
FLookupBuffer: PChar;
FBufRowSize: Integer;
FBufRecSize: Integer;
FBufBookmarkSize: Integer;
FBufBkmInfoSize: Integer;
FRecInfoStart: Integer;
FBufRecIDSize: Integer;
FRecIDStart: Integer;
FPBkmStart: Integer;
FBufPBkmSize: Integer;
FLookupSize: Integer;
FLookupStart: Integer;
FRecNoStatus: TRecNoStatus;
FBufRows: Integer;
FOldBufRows: Integer;
FBufFirstRow: Longint;
FBufLastRow: Longint;
FCursorRow: Longint;
FCursorPosition: TtsCursorPosition;
FRecCount: Longint;
FRowsCounted: Longint;
FCountPos: Longint;
FCountDirection: TtsCountDirection;
FActiveBufIndex: Integer;
FAtStart: Boolean;
FAtEnd: Boolean;
FBeenAtEnd: Boolean;
FRepositioned: Boolean;
FRepositionDirection: TtsCountDirection;
FInsertBkm: TBookmarkStr;
FActiveBookmark: TBookmarkStr;
FRecordInserted: Boolean;
FOnInsertRecord: Boolean;
FEnableCheckRowsCount: Integer;
FFilter: string;
FFiltered: Boolean;
FFilterOptions: TFilterOptions;
FMasterSource: TDataSource;
FMasterFields: string;
FMasterFieldValues: Variant;
FRecordTypes: Byte;
function CheckErr(Err: DbiResult): Boolean;
function DatasetHandle: HDBICur;
function DatasetLocale: TLocale;
procedure InitLookupFields(var LengthOfFields: Integer);
procedure InitGridDataSet; override;
procedure ResetRecCount;
procedure InitBuffer;
function PBookmark(BufRow: Integer): PBookmarkStr;
function PRecordId(BufRow: Integer): PVariant;
procedure SetRecId(BufRow: Integer; Value: Variant);
function GetRecId(BufRow: Integer): Variant; override;
procedure ClearRecIds(First, Last: Integer; Assign: Boolean);
procedure ClearBkm(First, Last: Integer; Assign: Boolean);
procedure CreateBuffer(Size: Integer);
procedure FreeBuffer;
function RecordBuffer(BufRow: Integer): PChar;
function GetRecCount: Longint; override;
function GetBufRecCount: Integer;
function GetActiveRecordBuffer: PChar;
function GetActiveBookmark: TBookmarkStr; override;
procedure SetActiveBookmark(Value: TBookmarkStr);
procedure GetLookupFields(BufRow: Integer);
procedure FetchRecordId(BufRow: Integer; Bkm: TBookmarkStr);
function GetRecord(BufRow: Integer; Direction: Integer): DbiResult;
procedure CheckOnInsertRecord(BufRow: Integer);
function CheckInsertPassed(var Err: DbiResult; FirstBkm, LastBkm: TBookmarkStr;
Direction: Integer; WasOnInsert: Boolean): Boolean;
function CheckInsertedRecord(PrevBkm, CurBkm: TBookmarkStr; BufRow: Integer;
Direction: Integer): Boolean;
function GetRecords(StartRow, EndRow: Integer; Direction: Integer;
var Count: Longint): DbiResult;
procedure SetToFirst(ReadData: Boolean);
procedure SetToEnd(ReadData: Boolean);
function SetToRecord(BufRow: Integer): DbiResult;
function DoRecCount(ReCount: Boolean): Longint; override;
procedure MoveBuffer(ToIndex, FromIndex, Count: Integer);
procedure CheckCountPosition(Err: DbiResult; Count: Integer);
procedure CheckCursorPosition(Err: DbiResult);
procedure CheckRowCount(Err: DbiResult);
procedure AdjustCountOnInsert;
procedure AdjustCountOnCancel;
procedure AdjustBufRange;
function CheckAtStart: Boolean;
function CheckAtEnd: Boolean;
function GetAtEnd: Boolean; override;
procedure SetAtEnd(Value: Boolean); override;
function GetAtStart: Boolean; override;
procedure SetAtStart(Value: Boolean); override;
function GetActive: Boolean; override;
function OnLastRecord: Boolean; override;
function IsSequenced: Boolean; override;
function MoveSequenced(Count: Longint; var MoveCount: Longint;
var Err: DbiResult): Boolean;
function MoveRelative(Count: Longint; var MoveCount: Longint): DbiResult;
function MoveForward(Count: Longint): Longint;
function MoveBackward(Count: Longint): Longint;
function MoveActiveBackward(Count: Longint; var MovedBy: Longint): Longint;
function MoveActiveForward(Count: Longint; var MovedBy: Longint): Longint;
procedure SetActiveRecord(Value: Integer); override;
function GetActiveRecord: Integer; override;
function GetActiveRecordNumber: Longint; override;
function GetRowCountKnown: Boolean;
function GetBufferRows: Integer; override;
function GetBufferBookmark(BufRow: Integer): TBookmarkStr;
function GetBookmark(BufRow: Integer): TBookmarkStr; override;
function GetSeqNumber(BufRow: Integer): Longint;
function GetRecordId(BufRow: Integer): Variant; override;
function FindKey(Value: string; Fieldno: Integer; CompareType: TtsComboCompareType;
ParentGrid: TtsCustomDBGrid; FullCmpLen: Boolean; var Found: Boolean): TBookmarkStr; override;
function LocateValue(FromBkm, ToBkm: TBookmarkStr; Value: string;
Fieldno: Integer; CompareType: TtsComboCompareType;
ParentGrid: TtsCustomDBGrid; FullCmpLen: Boolean; var Found: Boolean): TBookmarkStr; override;
function GetPreviousBkms(var FromBkm: TBookmarkStr; ToBkm: TBookmarkStr; BkmList: TtsSelectedList;
StepSize: Integer; SelectingAll: B
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -