クラスのメンバーの内容をスワップするには?

解決


2310  2004-01-17 05:57:59  No: 6768

変数の内容のスワップは普通にできますが、

クラスのメンバーの内容をスワップするには
どうすればよいのでしょうか?

必要な部分のみですが、

コードは大体下記のようになっています。

----------------------------------------------
type
  TData = class
protected
  FField: Integer;
end;

procedure TForm1.FormCreate(Sender: TObject);
var 
  Data: array[0..1] of TData;
begin
  Data := TData.Create;
  TClass.swap;
  Data.Destroy;
end;

procedure TClass.swap;
var
  Temp: TData;
begin
  Temp := TData.Create;

  Temp.FField := Data[0].FField;

  Data[0].FField := Data[1].FField;
  Data[1].FField := Temp.FField;

  Temp.Destroy;
end;
-------------------------------------------

クラス型はアドレスを示してるだけなので(?)、
上記のコードではうまくいかないですよね。

参照先のアドレスが変わっているだけで、
つまりは上書きされてしまっているので。
(順を追って考えると混乱してきた(^^;)

値をスワップするにはどのようにしたらいいでしょうか?

よろしくお願いします。


jok  2004-01-17 06:04:27  No: 6769

FormCreate の内容も TClass.swap も意味不明です。
TClass クラスには swap などというメソッドが定義されていませんよ?

> 値をスワップするにはどのようにしたらいいでしょうか?

なにと何を swap させるのですか? Data[] はローカル変数になってるし。


jok  2004-01-17 06:11:24  No: 6770

こんなことですか?

type
TData = class
protected
  FField: Integer;
end;

var
  Data: array[0..1] of TData;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Data[0] := TData.Create;
  Data[0].FField := 1010;

  Data[1] := TData.Create;
  Data[1].FField := 1111;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Temp:integer;
begin
  // FField の swap
  Temp := Data[0].FField;
  Data[0].FField := Data[1].FField;
  Data[1].FField := Temp;

  // 表示
  Label1.Caption := IntToStr(Data[0].FField);
  Label2.Caption := IntToStr(Data[1].FField);
end;


jok  2004-01-17 06:13:05  No: 6771

追加です。

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Data[0].Free;
  Data[1].Free;
end;


2310  2004-01-17 06:46:20  No: 6772

すいません。
かなり省略してしまったので…。

わかりました!
クラスのフィールド、たとえば、integer型のフィールドなら、
普通にinteger型で宣言された変数に代入すればいいんですよね。
なにも同じクラス型じゃなくても。

ありがとうございました!!


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

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






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