少しだけ便利な配列を作ろう その1(文字列)

TStringList を用いて、配列要素の追加と取り出し操作を「末尾」と 「先頭要素」に対してできるような簡単な配列クラスを作成してみましょう。

ここでは、TStrArray クラスを作成し、以下のメソッドを持たせます。

Push
配列の末尾に要素を追加します
Pop
末尾の要素を取り出します
UnShift
配列の先頭に要素を追加します
Shift
先頭の要素を取り出します
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.

エラー処理はシンプルにしてあります。


up next
Last update: 2003/3/2