📄 dxdatalist.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 + -