動的配列を使おう

配列を動的に使って見ましょう。配列を動的に使うとは、つまり実行時に要素数を増やしたり減らしたりすることが出来ることを言います。

動的配列の宣言( Integer )は、以下のようになります。

  var
    iArr: array of Integer; // 動的配列の宣言
        

これで、宣言は完了しましたが実際はまだ使うことが出来ません。なぜなら、まだ実際には配列の大きさが決まっていないからです。

配列の大きさを決めるには SetLength を使います。

  SetLength(iArr, 10); // 要素数10に設定

これで配列 iArr は、要素数 10 の配列になりました。ここで、注意しなければならないのは、動的配列の添え字は常に0から始まるということです。ですから、iArr は iArr[0] から、iArr[9] まで要素数が確保されたことになります。

それでは実際に動的配列の練習をして見ましょう。フォームに Button, Memo, Edit, そして Win32 ページにある UpDown を貼り付けて下さい。

こんな感じになります。

次に、UpDown と Edit を結び付けます。オブジェクトインスペクタで UpDown を選択し、イベントページの Associate の欄で Edit を選びます。

Edit を選びます。

すると、Edit の横に UpDown がくっつきます。それでは次にオブジェクトインスペクタで、UpDown を選び Min プロパティを1, Max プロパティを 10 にして下さい。そして、Edit の ReadOnly プロパティを True にします。

ここで、コンパイルして実行し Edit の横にくっついている UpDown をいろいろいじってみて下さい。1から10までしか変更できなくっていると思います。Edit の方も入力が出来なくなっています。

これで準備が出来ました。それではフォームに貼り付けたボタンをダブルクリックして以下のコードを書いてください。

procedure TForm1.Button1Click(Sender: TObject);
var
  iArr: array of Integer;
  i: Integer;
begin
  Memo1.Clear; // Memo1という字を消すだけです
  
  SetLength(iArr, StrToInt(Edit1.Text)); // 配列の要素数は
                                         // Editの数字で決まる
  
  Memo1.Lines.Add('動的に配列を生成します');
  for i := Low(iArr) to High(iArr) do
  begin
    iArr[i] := i;
 
    Memo1.Lines.Add('iArr[' + IntToStr(i) +
                    '] = ' + IntToStr(iArr[i]));
  end;
end;

配列 iArr の要素数は Edit1 で表示されている数字と同じになります。このおかげで、実行時に配列の要素数を変化させることが出来ました。また、for 文で、High 関数を使っていることにも注目してください。このように動的配列でも High 関数が使えるようになっています。

また要素数は Length で取得する事が出来ます。

動的配列のメモリ管理はどうなっているの?

動的配列は、実行時にその要素数を決定しています。ですから、不要になった際には明示的に破棄するのではと考えてしまいますが、動的配列の管理は Delphi が行っています(※具体的には、Delphi は、参照カウントにより動的配列を管理しています)。ですから、動的配列がスコープから外れると、自動的に破棄されるようになっています。


up next
Last update 2002/10/18