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.
エラー処理はシンプルにしてあります。