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の方法とは異なる解釈をされるため、エラーになりません。
|