TStringList を用いて、配列要素の追加と取り出し操作を「末尾」と 「先頭要素」に対してできるような簡単な配列クラスを作成してみましょう。
ここでは、TStrArray クラスを作成し、以下のメソッドを持たせます。
unit Unit2;
interface
uses Classes, SysUtils;
type
TStrArray = class
private
fStrList: TStringList;
procedure SetItem(index: Integer; const Value: string);
function GetItem(index: Integer): string;
public
constructor Create;
destructor Destroy; override;
procedure Clear;
function GetCount: Integer;
procedure Push(Item: string);
function Pop: string;
procedure UnShift(Item: string);
function Shift: string;
property Items[index: Integer]: string read GetItem write SetItem; default;
end;
implementation
{ TStrArray }
procedure TStrArray.Clear;
begin
fStrList.Clear;
end;
constructor TStrArray.Create;
begin
fStrList := TStringList.Create;
end;
destructor TStrArray.Destroy;
begin
fStrList.Free;
inherited;
end;
function TStrArray.GetCount: Integer;
begin
Result := fStrList.Count;
end;
function TStrArray.GetItem(index: Integer): string;
begin
Result := fStrList.Strings[index];
end;
function TStrArray.Pop: string;
var
str: string;
LastIndex: Integer;
begin
if fStrList.Count = 0 then
raise Exception.Create('インデックスを超えています');
LastIndex := fStrList.Count-1;
str := fStrList.Strings[LastIndex];
Result := str;
fStrList.Delete(LastIndex);
end;
procedure TStrArray.Push(Item: string);
begin
fStrList.Add(Item);
end;
procedure TStrArray.SetItem(index: Integer; const Value: string);
begin
fStrList.Strings[index] := Value;
end;
function TStrArray.Shift: string;
var
str: string;
begin
if fStrList.Count = 0 then
raise Exception.Create('インデックスを超えています');
str := fStrList.Strings[0];
Result := str;
fStrList.Delete(0);
end;
procedure TStrArray.UnShift(Item: string);
begin
fStrList.Insert(0, Item);
end;
end.
Unit1 について
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Spin, Unit2; // 追加
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
ListBox1: TListBox;
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private 宣言 }
StrArray: TStrArray;
public
{ Public 宣言 }
procedure DisplayList;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Button1.Caption := 'Push';
Button2.Caption := 'Pop';
Button3.Caption := 'Shift';
Button4.Caption := 'UnShift';
StrArray := TStrArray.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
StrArray.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
StrArray.Push(Edit1.Text);
DisplayList;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ShowMessage(StrArray.Pop + 'を取り出しました');
DisplayList;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
ShowMessage(StrArray.Shift + 'を取り出しました');
DisplayList;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
StrArray.UnShift(Edit1.Text);
DisplayList;
end;
procedure TForm1.DisplayList;
var
i: Integer;
begin
ListBox1.Clear;
if StrArray.GetCount = 0 then
begin
ListBox1.Items.Add('リストは、カラです');
exit;
end;
for i := 0 to StrArray.GetCount-1 do
ListBox1.Items.Add(StrArray[i]);
end;
end.
エラー処理はシンプルにしてあります。