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

解決


砂の祭典  2009-05-03 23:04:52  No: 34260

下のコードで(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 23:29:11  No: 34261

>    X.Free;

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


砂の祭典  2009-05-04 00:46:22  No: 34262

> で、メモリを解放するからでは?
  ああ、そうか。
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-04 07:09:42  No: 34263

>procedure TestPerson(var X: TPerson);

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


砂の祭典  2009-05-04 21:07:09  No: 34264

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


えーと  2009-05-07 00:03:09  No: 34265

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加