Delphi の TList クラスに似たシーケンシャル リンク リスト クラスを実装しようとしていました。ここでは、ユーザーが count プロパティを設定できるようにする代わりに、クラスは count プロパティを自動的にインクリメント/デクリメントします。そのため、setcount プロシージャ内で配列を初期化する代わりに、クラスはオブジェクト参照を配列に追加する直前に配列要素を初期化します。コードは次のとおりです。
PObjectarray = ^TObjectarray;
TObjectarray = array of TObject;
TSequentialList = class
private
FObjects: PObjectarray;
FCapacity: Integer;
FCount: Integer;
protected
procedure GrowList;virtual;
procedure SetCapacity(aValue: Integer);
public
constructor Create(aCapacity: Integer); overload;
Constructor Create;overload;
procedure Add(aObject:TObject);
procedure Delete(aIndex:Integer);
destructor Destroy;override;
End;
実装: -
procedure TSequentialList.Add(aObject: TObject);
begin
if FCount=FCapacity then
GrowList;
FillChar(FObjects^[FCount],sizeof(TObject),0);//Initialize the FCount's member space
FObjects^[FCount]:=aObject;
Inc(FCount);
end;
constructor TSequentialList.Create(aCapacity: Integer);
begin
FCapacity := 0;
FCount := 0;
SetCapacity(aCapacity);
end;
constructor TSequentialList.Create;
begin
FCapacity := 0;
FCount := 0;
end;
procedure TSequentialList.Delete(aIndex: Integer);
var tmpObj:TObject;
i:Integer;
begin
if (aIndex>=FCount) or (aIndex<0) then raise ELinkedListException.Create('Invalid Index in Delete..!');
tmpObj:=FObjects^[aIndex];
tmpObj.Free;
System.Move(FObjects^[aIndex+1],FObjects^[aIndex],(FCount-aIndex)* SizeOf(TObject));
Dec(FCount);
end;
destructor TSequentialList.Destroy;
begin
SetCapacity(0);
inherited;
end;
procedure TSequentialList.GrowList;
var delta:Integer;
begin
if FCapacity>64 then
delta:=FCapacity div 64
else if FCapacity>16 then
delta:=8
else delta:=4;
SetCapacity(FCapacity+delta);
end;
procedure TSequentialList.SetCapacity(aValue: Integer);
var i:Integer;
begin
if FCapacity <> aValue then begin
if aValue<FCount then begin
for i := FCount-1 downto aValue do
Delete(i);
end;
ReallocMem(FObjects, aValue*sizeof(TObject));
FCapacity := aValue;
end;
end;
使用法: //機能しません
procedure TForm2.Button1Click(Sender: TObject);
var lst:TSequentialList;
obj:TIntObj;
begin
lst:=TSequentialList.Create(4);
obj:=TIntObj.Create(10);
lst.Add(obj);
lst.Add(TIntObj.Create(20));
lst.Free;
end;
上記の方法を終了すると、システムがハングします。プログラムの何が問題なのか教えてください。