The Delphi Bug List

Entry No.
112
コンパイラ
string 型の配列プロパティにアクセスする場合の問題
1.02 2.01 3.0 3.01 3.02 4.0 4.01 4.02 4.03 5.0 5.01 6.0 6.01 6.02 Kylix 1.0
N/A Gotcha Gotcha Gotcha Gotcha Gotcha Gotcha Gotcha Gotcha Gotcha Gotcha Gotcha Gotcha Gotcha Unknown
解説
By Jani Järvinen
実際のところ、これはどこかに文書化されているのかもしれません(マニュアルとヘルプファイルの簡単な検索では見つかりませんでした)。しかし、少なくともこれは、コンパイラの興味深い "特徴" です:
(TStrings.Strings プロパティのように)配列プロパティが string 型の場合、通常の配列にアクセスするコードを使って個々の文字にアクセスすることが出来ません。代わりに代替コードを使用する必要があります。
例:
   Type TMyArray = Array[1..2] of String;
   Var MyArray : TMyArray;
     ...
1:   If (MyArray[1,1] = 'A') Then ...      { 正しく動作する }
2:   If (MyArray[1][1] = 'A') Then ...     { これも正しく動作する }
     ...
3:   If (Memo1.Lines[1,1] = 'B') Then ...  { これは動作しない }
4:   If (Memo1.Lines[1][1] = 'B') Then ... { これなら正しく動作する }
上記のように、通常の string の配列は2つの方法(1と2)でアクセスできます。しかし、string 型の配列プロパティでは4の方法でしかアクセス出来ません。3の方法では、エラーメッセージ "実パラメータが多すぎます" が発生します。
問題の原因(推測):
コンパイラは配列のインデックスと read アクセスメソッドの引数とを比較し、引数が多すぎることに気づきます。しかしながらコンパイラは、プロパティの型が(string のような)インデックス可能な型かどうかを確認するのを忘れています。もう1つのインデックス方法(上記の4の方法)はコンパイラ内部で3の方法とは異なる解釈をされるため、エラーになりません。
解決策 / 回避方法
上記の4の方法を使用してください。もしくは最初にプロパティの値を string 型の変数に代入し、その文字列の個々の文字にアクセスしてください。
Latest update of this entry: before April 1998
本家 The Delphi Bug List のエントリーはこちら
The Delphi Bug List 日本語訳 へ