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

📄 dxdatalist.pas

📁 Well known and usefull component for delphi 7
💻 PAS
字号:
unit DXDataList;

interface

///////////////////////////////////////////////////////////////////////////////
// Component: TDXDataList
//    Author: G.E. Ozz Nixon Jr. (onixon@dxsock.com)
// ============================================================================
///////////////////////////////////////////////////////////////////////////////

uses
   Classes,
   Sysutils;

{$IFDEF VER90}
   {$DEFINE VER100} // Make D2 compile as D3!
{$ENDIF}

{$WARNINGS OFF}
type
  TDXDataList = class;

  TDXDataListItem = class(TCollectionItem)
  private
    FParent:TDXDataList;
    FDataOffSet:Cardinal;
    FBookMark:Integer;
  public
    property BookMark:Integer read FBookMark
                              write FBookMark;
    property DataOffSet:Cardinal read FDataOffSet
                                 write FDataOffSet;
  end;

  TDXDataList = class(TCollection)
  private
    fBaseAutoInc:Integer; // OZZ
    FRecordSize:Integer;
    FDataStream:TMemoryStream;
    procedure SetRecordSize(Value :Integer);
  protected
    procedure SetItem(Index: Integer; Value: TDXDataListItem);
    function GetItem(Index: Integer): TDXDataListItem;
    function Insert(Index:Integer): TDXDataListItem;
  public
    constructor Create;
    destructor Destroy; override;
    procedure ResetBookmarks;
    function GetData(Index, Start, Length: Integer): PChar;
    procedure SetData(Buffer :Pointer; Index, Start, Length: Integer);
    function BookMark(Index: Integer): Integer;
    procedure PutToBuffer(Buffer: Pchar; Index: Integer);
    procedure GetFromBuffer(Buffer: Pchar; Index: Integer);
    function Add: TDXDataListItem;
    function GetIndexFromBookMark(BookMark: Integer): Integer;
    procedure InsertRow(Index, TheBookMark: Integer);
    procedure AppendRow(TheBookMark: Integer);
    property Items[Index: Integer]: TDXDataListItem read GetItem write SetItem;
    property RecordSize :Integer read FRecordSize write SetRecordSize;
    property DataStream :TMemoryStream read FDataStream write FDataStream;
  end;

implementation

{ TDXDataList }

constructor TDXDataList.Create;
begin
   inherited Create(TDXDataListItem);
   FDataStream:=TMemoryStream.Create;
   fBaseAutoInc:=0;
end;

destructor TDXDataList.Destroy;
begin
   FDataStream.Free;
   inherited Destroy;
end;

function TDXDataList.Add: TDXDataListItem;
begin
   Result:=TDXDataListItem(inherited Add);
   with Result do begin
      Inc(fBaseAutoInc);
      FParent:=Self;
//      FDataOffSet:=FDataStream.Size; {Dec 22nd 2002 OZZ}
      FDataOffSet:=(fBaseAutoInc-1)*FRecordSize;
      FBookMark:=-1;
   end;
end;

procedure TDXDataList.AppendRow(TheBookMark: Integer);
begin
   with Add do FBookMark:=TheBookMark;
end;

function TDXDataList.BookMark(Index: Integer): Integer;
begin
   If Index>Count-1 then Result:=0
   Else Result:=Items[Index].FBookMark;
end;

procedure TDXDataList.SetData(Buffer :Pointer; Index, Start, Length: Integer);
begin
   FDataStream.Position:=Items[Index].FDataOffSet + Start;
   FDataStream.WriteBuffer(Buffer, Length);
end;

function TDXDataList.GetData(Index, Start, Length: Integer): PChar;
begin
   FDataStream.Position:=Items[Index].FDataOffSet + Start;
   FDataStream.ReadBuffer(Result, Length);
end;

procedure TDXDataList.GetFromBuffer(Buffer: Pchar; Index: Integer);
begin
   if Index<0 then Index:=0;
   FDataStream.Position:=Items[Index].FDataOffSet;
   FDataStream.ReadBuffer(Buffer^, FRecordSize);
end;

procedure TDXDataList.PutToBuffer(Buffer: Pchar; Index: Integer);
begin
   if Index<0 then Index:=0;
   FDataStream.Position:=Items[Index].FDataOffSet;
   FDataStream.WriteBuffer(Buffer^, FRecordSize);
end;

function TDXDataList.GetIndexFromBookMark(BookMark: Integer): Integer;
var
   i:Integer;

begin
   Result:=-1;
   if Count=0 then exit;
   for i:=0 to Count-1 do
      if Bookmark = Items[i].FBookMark then begin
         Result:=i;
         exit;
      end;
end;

function TDXDataList.GetItem(Index: Integer): TDXDataListItem;
begin
   Result:=TDXDataListItem(inherited Items[Index]);
end;

function TDXDataList.Insert(Index: Integer): TDXDataListItem;
begin
   Result:=Add;
   Result.Index:=Index;
end;

procedure TDXDataList.InsertRow(Index, TheBookMark: Integer);
begin
   if Count=0 then AppendRow(TheBookmark)
   Else Insert(Index).FBookMark:=TheBookMark;
end;

procedure TDXDataList.ResetBookmarks;
var
   i:Integer;
begin
   for i:=0 to Count-1 do Items[i].FBookMark:=i;
end;

procedure TDXDataList.SetItem(Index: Integer; Value: TDXDataListItem);
begin
   inherited Items[Index].Assign(Value);
end;

procedure TDXDataList.SetRecordSize(Value: Integer);
begin
   FRecordSize:=Value;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -