動的配列を持つクラスの代入

解決


砂の祭典  2009-05-03 14:04:52  No: 34260  IP: 192.*.*.*

下のコードで(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;

編集 削除
igy  2009-05-03 14:29:11  No: 34261  IP: 192.*.*.*

>    X.Free;

で、メモリを解放するからでは?

編集 削除
砂の祭典  2009-05-03 15:46:22  No: 34262  IP: 192.*.*.*

> で、メモリを解放するからでは?
  ああ、そうか。
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;

編集 削除
えーと  2009-05-03 22:09:42  No: 34263  IP: 192.*.*.*

>procedure TestPerson(var X: TPerson);

手続きだって var はいらないよ

編集 削除
砂の祭典  2009-05-04 12:07:09  No: 34264  IP: 192.*.*.*

> 手続きだって var はいらないよ
  ああ、そうか。クラスは、ポインタですもんね。

編集 削除
えーと  2009-05-06 15:03:09  No: 34265  IP: 192.*.*.*

>ああ、そうか。クラスは、ポインタですもんね。

?? クラスのインスタンス参照がポインタです。最初の「関数」も返値はあまり意味ないですね。

編集 削除