2012年11月5日月曜日

Delphiには値が変更できる定数があったりする話

「定数」とはその名の通り「あらかじめ定められた一定の数」
のはずなのだが、Delphiでは「定数」と呼ばれてるくせに
値を変更できるようにする方法が存在したりする。


まず普通の定数。

const
  TEST = 'てすと';

次に型付き定数。

const
  IDX : integer = 100;
  ARY : array[0..4] of string = ('A','B','C','D');

この2種類の定数のうち型指定のない「普通の定数」は
何をどうやろうと値の変わらない、正真正銘の定数なのだが、
「型付き定数」はコンパイルオプションを変更することで
「Static変数」に変身させることができてしまう。

【例】
procedure TForm1.Button1Click(Sender: TObject);
const
  IDX : integer = 1;
begin
  IDX := 2; ←通常はNG
  Inc(IDX); ←通常はNG
end;

ここでプロジェクトのオプションから
[Delphiコンパイラ]-[コンパイル]-[割り当て可能な型付き定数]
を選択しTrueにすると、上記の代入ができるようになる。

【例】
procedure TForm1.Button1Click(Sender: TObject);
const
  IDX : integer = 1;
begin
  IDX := 2; ←代入できる
  Inc(IDX); ←Static変数と同じなのでボタンクリックの度に値が加算される
end;

定数のくせに値が変更できていいのか?という思いはあるが
DelphiでどうしてもStatic変数が使いたいときはありかもしれない。