⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dxdatalistbintree.pas

📁 Well known and usefull component for delphi 7
💻 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 + -