📄 dxdatalistbintree.pas
字号:
unit DXDataListBinTree;
interface
///////////////////////////////////////////////////////////////////////////////
// Component: TDXDataList
// Author: G.E. Ozz Nixon Jr. (onixon@dxsock.com)
// ============================================================================
///////////////////////////////////////////////////////////////////////////////
uses
Classes,
DXBinaryTree,
Sysutils;
{$IFDEF VER90}
{$DEFINE VER100} // Make D2 compile as D3!
{$ENDIF}
Type
PDXLinkList=^TDXLinkList;
TDXLinkList=Record
RowID:Cardinal;
Data:Pointer;
DataSize:Integer;
FBookMark:Cardinal;
End;
TDXDataListArray=Array [0..$FFFF] of Char;
TDXDataList = class
private
BinTree:TDXBinarySearchTree;
fBaseAutoInc:Integer; // OZZ
FRecordSize:Integer;
FLastRowID:Cardinal;
procedure SetRecordSize(Value :Integer);
protected
Function FindRow(Index:Cardinal):PDXLinkList;
Function GetCount:Cardinal;
public
constructor Create;
destructor Destroy; override;
function Add: PDXLinkList;
procedure AppendRow(TheBookMark:Cardinal);
Procedure Delete(Index:Cardinal);
Procedure Clear;
// function GetData(Index:Cardinal;Start,Length:Integer):PChar;
// procedure SetData(Buffer:Pointer;Index:Cardinal;Start,Length:Integer);
procedure PutToBuffer(Buffer:Pchar;Index:Cardinal);
procedure GetFromBuffer(Buffer:Pchar;Index:Cardinal);
procedure ResetBookmarks;
function BookMark(Index:Cardinal):Cardinal;
function GetIndexFromBookMark(BookMark:Cardinal):Cardinal;
property RecordSize :Integer read FRecordSize write SetRecordSize;
Property Count:Cardinal read GetCount;
end;
implementation
Uses
DXString;
{ TDXDataList }
procedure DXDisposeProc(aData:pointer);
Begin
FreeMem(PDXLinkList(aData)^.Data,PDXLinkList(aData)^.DataSize);
Dispose(PDXLinkList(aData));
End;
Function DXCompareFunc(aData1,aData2:pointer):integer;
Begin
If PDXLinkList(aData1)^.RowID<PDXLinkList(aData2)^.RowID then Result:=-1
Else If PDXLinkList(aData1)^.RowID>PDXLinkList(aData2)^.RowID then Result:=1
Else Result:=0;
End;
Function TDXDataList.FindRow(Index:Cardinal):PDXLinkList;
Var
QueryRec:TDXLinkList;
Begin
If Index<1 then Index:=1;
QueryRec.RowID:=Index;
Result:=BinTree.Find(@QueryRec);
End;
Function TDXDataList.GetCount:Cardinal;
Begin
Result:=BinTree.Count;
End;
constructor TDXDataList.Create;
begin
inherited Create;
fBaseAutoInc:=0;
FLastRowID:=0;
BinTree:=TDXBinarySearchTree.Create(DXCompareFunc,DXDisposeProc);
end;
destructor TDXDataList.Destroy;
begin
BinTree.Free;
inherited Destroy;
end;
function TDXDataList.Add:PDXLinkList;
begin
New(Result);
Result^.FBookMark:=0;
Inc(FLastRowID);
Result^.RowID:=FLastRowID;
Result^.DataSize:=FRecordSize;
GetMem(Result^.Data,FRecordSize);
BinTree.Insert(Result);
end;
procedure TDXDataList.AppendRow(TheBookMark:Cardinal);
begin
with Add^ do FBookMark:=TheBookMark;
end;
function TDXDataList.BookMark(Index:Cardinal):Cardinal;
Var
FoundRec:PDXLinkList;
begin
If Index>Count then Result:=0
Else Begin
FoundRec:=FindRow(Index);
If FoundRec=Nil then Result:=0
Else Result:=FoundRec^.FBookMark;
End;
end;
{
procedure TDXDataList.SetData(Buffer:Pointer;Index:Cardinal;Start,Length:Integer);
Var
FoundRec:PDXLinkList;
begin
FoundRec:=FindRow(Index);
If FoundRec=Nil then Exit;
FastMove(TDXDataListArray(Buffer^)[0],TDXDataListArray(FoundRec^.Data^)[Start],Length);
end;
function TDXDataList.GetData(Index:Cardinal;Start,Length:Integer):PChar;
Var
FoundRec:PDXLinkList;
begin
FoundRec:=FindRow(Index);
If FoundRec=Nil then Exit;
end;
}
procedure TDXDataList.GetFromBuffer(Buffer:Pchar;Index:Cardinal);
Var
FoundRec:PDXLinkList;
begin
FoundRec:=FindRow(Index);
If FoundRec=Nil then Exit;
FastMove(FoundRec^.Data^,Buffer^,FRecordSize);
end;
procedure TDXDataList.PutToBuffer(Buffer:Pchar;Index:Cardinal);
Var
FoundRec:PDXLinkList;
begin
FoundRec:=FindRow(Index);
If FoundRec=Nil then Exit;
FastMove(Buffer^,FoundRec^.Data^,FRecordSize);
end;
function TDXDataList.GetIndexFromBookMark(BookMark:Cardinal):Cardinal;
var
i:Integer;
begin
Result:=0;
if Count=0 then exit;
for i:=1 to Count do
If FindRow(I).FBookMark=BookMark then Begin
Result:=i;
exit;
end;
end;
Procedure TDXDataList.Clear;
Begin
FLastRowID:=0;
BinTree.Clear;
End;
Procedure TDXDataList.Delete(Index:Cardinal);
var
i:Integer;
begin
BinTree.Delete(FindRow(Index));
for i:=Index+1 to Count+1 do
FindRow(I)^.RowId:=I-1;
end;
procedure TDXDataList.ResetBookmarks;
var
i:Integer;
begin
for i:=1 to Count do
FindRow(I)^.FBookMark:=i;
end;
procedure TDXDataList.SetRecordSize(Value: Integer);
begin
FRecordSize:=Value;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -