📄 pkdataqueueunit.pas
字号:
unit PkDataQueueUnit;
interface
uses
JwaWinnt, JwaWinBase,
SysUtils, Classes;
type
PPkData = ^TPkData;
TPkData = record
Ptr: Pointer;
Len: Cardinal;
PkDataType: Cardinal;
Characteristic: Cardinal;
Id: Array [0..15] of char;
end;
TPkDataQueue = class
private
FDataList: TList;
function GetCount: integer;
function GetData(index: integer): PPkData;
function GetLength: Cardinal;
procedure Clear;
public
constructor Create;
destructor Destroy; override;
function Add(Id: PChar): PPkData;
function Get(id: String): PPkData;
function GetOffset(id: String): Cardinal;
property Count: integer read GetCount;
property Len: Cardinal read GetLength;
property Data[index: integer]: PPkData read GetData; default;
end;
implementation
{ TPkDataQueue }
procedure TPkDataQueue.Clear;
var
i: integer;
begin
for i := FDataList.Count - 1 downto 0 do
begin
if PPkData(FDataList[i])^.Characteristic = 0 then
FreeMem(PPkData(FDataList[i])^.Ptr);
FreeMem(PPkData(FDataList[i]));
end;
FDataList.Clear;
end;
constructor TPkDataQueue.Create;
begin
inherited;
FDataList := TList.Create;
end;
destructor TPkDataQueue.Destroy;
begin
Clear;
FDataList.Free;
inherited;
end;
function TPkDataQueue.Add(Id: PChar): PPkData;
var
l: Cardinal;
begin
result := AllocMem(SizeOf(TPkData));
FDataList.Add(result);
l := Length(Id);
if l > 16 then
l := 16;
CopyMemory(@result^.Id, Id, l);
end;
function TPkDataQueue.Get(id: String): PPkData;
var
i: integer;
begin
result := nil;
for i := 0 to FDataList.Count - 1 do
if PPkData(FDataList[i])^.Id = id then
begin
result := PPkData(FDataList[i]);
break;
end;
end;
function TPkDataQueue.GetCount: integer;
begin
result := FDataList.Count;
end;
function TPkDataQueue.GetData(index: integer): PPkData;
begin
result := PPkData(FDataList[index]);
end;
function TPkDataQueue.GetOffset(id: String): Cardinal;
var
i: integer;
begin
result := 0;
for i := 0 to FDataList.Count - 1 do
begin
if PPkData(FDataList[i])^.Id = id then
break;
Inc(result, PPkData(FDataList[i])^.Len);
end;
end;
function TPkDataQueue.GetLength: Cardinal;
var
i: integer;
begin
result := 0;
for i := 0 to FDataList.Count - 1 do
Inc(result, PPkData(FDataList[i])^.Len);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -