下のコードで(1)でOKで(2)でダメなのはなぜなのでしょうか?
const
DATA_MAX = 10000;
type
sInt = 0..1500;
TPerson = Class
public
No: 0..DATA_MAX;
Ten: array of sInt;
constructor Create;
destructor Destroy; override;
end;
constructor TPerson.Create;
begin
inherited Create;
SetLength(Ten, DATA_MAX);
end;
destructor TPerson.Destroy;
begin
Ten := Nil;
inherited Destroy;
end;
//データをセット
function TestPerson: TPerson;
var
X: TPerson;
begin
try
X := TPerson.Create;
X.No := 17;
X.Ten[1] := 1100;
X.Ten[2] := 250;
Result := X; //(1)これはOK
finally
X.Free;
end;
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
W: TPerson;
S: string;
begin
try
W := TPerson.Create;
W := TestPerson; //(2)正しく代入されない
S := 'No:'+IntToStr(W.No)+' Ten:'
+IntToStr(W.Ten[1])+', '+IntToStr(W.Ten[2]);
Edit1.Text := S;
finally
W.Free;
end;
end;
> X.Free;
で、メモリを解放するからでは?
> で、メモリを解放するからでは?
ああ、そうか。
function TestPerson(X: TPerson): TPerson;
begin
X.No := 17;
X.Ten[1] := 1100;
X.Ten[2] := 250;
Result := X;
end;
でいけると思うけど、これくらいだったら手続きの方がマシですね。
procedure TestPerson(var X: TPerson);
begin
X.No := 17;
X.Ten[1] := 1100;
X.Ten[2] := 250;
end;
>procedure TestPerson(var X: TPerson);
手続きだって var はいらないよ
> 手続きだって var はいらないよ
ああ、そうか。クラスは、ポインタですもんね。
>ああ、そうか。クラスは、ポインタですもんね。
?? クラスのインスタンス参照がポインタです。最初の「関数」も返値はあまり意味ないですね。
ツイート | ![]() |