関数の戻り値を文字列の配列にしたくて、以下のようにコーディングしたのですが、
”識別子が必要な場所に'ARRAY'があります”というエラーになってしまいます。
どなたか、解決法がわかる方いましたら、回答お願いします。
type
TForm1 = class(TForm)
procedure FormShow(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
Function ArrayFunc() : Array [1..3] of String;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormShow(Sender: TObject);
var
SArr : Array [1..3] of String;
begin
SArr := ArrayFunc();
end;
Function ArrayFunc() : Array [1..3] of String
begin
ArrayFunc[1] := 'Name';
ArrayFunc[2] := 'Address';
ArrayFunc[3] := 'Tel';
end;
end.
Delphi(Pascal)は型に厳格な言語なので、
type TMyArray = array[1..3] of String;
と型宣言してから、
Function ArrayFunc() : TMyArray;
などと関数宣言します。
使うときも、
var
SArr : Array [1..3] of String;
begin
SArr := ArrayFunc();
end;
などとすると、型が違いますと起こられます。
var
SArr : TMyArray;
begin
SArr := ArrayFunc();
end;
と同じ型の変数に代入しないとダメなんです。
配列を戻り値に持つ関数を作るときは、そういう方法もありますけど、
オープン配列を変数のひとつに、varで指定する方法もあります。
ただ、オープン配列パラメータは、SetLengthで大きさを変更することができないので、
ちょっと面倒ですけど、準備用関数で、配列が用意すべきサイズを返すといいです。
うちのホームページのうら、おんぷむらのうらに、stdMenuItemという、
TMeinMenuの配列を作成するユニットがあります。
参考にしてみてください。
http://TakamiChie.tripod.co.jp/(おんぷ村のうらへの直接のリンク)
おんぷ村倉庫>Delphiユニット>stdMenuItem.pas です。
配列の大きさが固定されたものは、試していませんけど、
同じ要領でできると思います。
procedure ArrayFunc(var Str:Array [1..3] of String);
begin
Str[1] := 'Name';
Str[2] := 'Address';
Str[3] := 'Tel';
end;
とか。
>procedure ArrayFunc(var Str:Array [1..3] of String);
>begin
> Str[1] := 'Name';
> Str[2] := 'Address';
> Str[3] := 'Tel';
>end;
残念ながら、これはコンパイル通りません。
オープン配列パラメータは、大きさは指定できません。
procedure ArrayFunc(var Str:Array of String);
としないとダメです。しかし、これだと要素数が3以外の
配列でも渡せてしまうので、あまり使い勝手がよくないと
思います。
やはり型宣言してから、引数にする方がバグに強いコードに
なります。
type TMyArray = array[1..3] of String;
procedure ArrayFunc(var MyArray: TMyArray);
みなさん、回答ありがとうございました。
以下のようにプログラムを変更してみましたが、
TMyArray = array[1..3] of String;
のところで、":が必要ですが、=が見つかりました"というエラーになってしまいました。
そこで、"="の部分を":"に変えてみたら、今度は"識別子が必要ですが、ARRAYが見つかりました"というエラーになってしまいました。
お手数ですが、対処法が分かる方がいましたら、またご教授お願いします。
type
TForm1 = class(TForm)
TMyArray = array[1..3] of String;
procedure FormShow(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
Function ArrayFunc() : TMyArray;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormShow(Sender: TObject);
var
SArr : TMyArray;
begin
SArr := ArrayFunc();
end;
Function ArrayFunc():TMyArray;
var
SArr : TMyArray;
begin
SArr[1] := 'Name';
SArr[2] := 'Address';
SArr[3] := 'Tel';
ArrayFunc := SArr;
end.
type
TForm1 = class(TForm)
TMyArray = array[1..3] of String;
の部分が間違っています。
type
TMyArray = array[1..3] of String;
TForm1 = class(TForm)
です。
type以降に型やクラスの定義がきますが、TForm1の定義は、最初のend;までです。
もし、TMyArrayをTForm1の後に定義するのであれば、end;の後に入れる必要があります。
# 今回は、Function ArrayFunc() : TMyArray;で使っているのでTForm1の前に入れないとだめです
あと、ArrayFuncをTForm1のメソッドとして宣言してますので、
implementation部での実装は、TForm1. がいりますね。
Function TForm1.ArrayFunc():TMyArray;
^^^^^^^
TForm1 に依存しないのなら、
type
TMyArray = array[1..3] of String;
TForm1 = class(TForm)
procedure FormShow(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
Function ArrayFunc() : TMyArray;
というように、TForm1 の外にだせば、実装でTForm1.は
いらなくなります。
ありがとうございました。
解決しました。