📄 joedata.pas
字号:
unit joeData;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TjoeStack = class(TComponent)
private
{ Private declarations }
FList: TList;
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
{ Published declarations }
function PopData(): Pointer;
procedure PushData(Data: Pointer);
function GetDataCount(): integer;
function FindData(Data: Pointer): integer;
procedure Clear();
property
Count: integer read GetDataCount;
end;
TjoeFIFO = class(TComponent)
private
{ Private declarations }
FList: TList;
FStart: integer;
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
{ Published declarations }
function GetData(): Pointer;
procedure PutData(Data: Pointer);
function GetDataCount(): integer;
function FindData(Data: Pointer): integer;
procedure Clear();
property
Count: integer read GetDataCount;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('joe Controls', [TjoeStack]);
RegisterComponents('joe Controls', [TjoeFIFO]);
end;
constructor TjoeStack.Create(AOwner: TComponent);
begin
inherited;
FList := TList.Create();
end;
destructor TjoeStack.Destroy;
begin
FList.Free();
inherited;
end;
function TjoeStack.PopData(): Pointer;
begin
if FList.Count = 0 then
Result := nil // no data in stack
else
begin
Result := FList[FList.Count-1];
FList.Count := FList.Count-1;
end;
end;
procedure TjoeStack.PushData(Data: Pointer);
begin
FList.Add(Data);
end;
function TjoeStack.GetDataCount(): integer;
begin
Result := FList.Count;
end;
function TjoeStack.FindData(Data: Pointer): integer;
var
i: integer;
begin
for i := 0 to FList.Count-1 do
if FList[i] = Data then
begin
Result := i;
Exit;
end;
Result := -1;
end;
procedure TjoeStack.Clear();
begin
FList.Clear();
end;
constructor TjoeFIFO.Create(AOwner: TComponent);
begin
inherited;
FList := TList.Create();
FStart := 0;
end;
destructor TjoeFIFO.Destroy;
begin
FList.Free();
inherited;
end;
function TjoeFIFO.GetData(): Pointer;
var
i: integer;
begin
if FList.Count > FStart then
begin
Result := FList[FStart];
Inc(FStart);
if FStart >= 64 then
begin
for i := FStart to FList.Count-1 do
FList[i-FStart] := FList[i];
FList.Count := FList.Count-FStart;
FStart := 0;
end;
end
else
Result := nil // no data in stack
end;
procedure TjoeFIFO.PutData(Data: Pointer);
begin
FList.Add(Data);
end;
function TjoeFIFO.GetDataCount(): integer;
begin
Result := FList.Count - FStart;
end;
function TjoeFIFO.FindData(Data: Pointer): integer;
var
i: integer;
begin
for i := FStart to FList.Count-1 do
if FList[i] = Data then
begin
Result := i;
Exit;
end;
Result := -1;
end;
procedure TjoeFIFO.Clear();
begin
FList.Clear();
FStart := 0;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -