オブジェクトの解放

解決


りんぐ  2007-08-20 17:26:13  No: 27441  IP: 192.*.*.*

var
  i,j : integer;
  SG : TStringGrid;
  DummyG : TStringGrid;
begin
  SG := TStringGrid.Create(self);
  DummyG := TStringGrid.Create(Self);
  with SG do begin
    Name := 'aaa';
    SG.Cells[3,3] := 'a';
  end;
  ShowMessage(DummyG.Cells[3,3] + '|' + SG.Cells[3,3]);
  SG := DummyG;
  ShowMessage(DummyG.Cells[3,3] + '|' + SG.Cells[3,3]);
  SG.Cells[3,3] := 'a';
  ShowMessage(DummyG.Cells[3,3] + '|' + SG.Cells[3,3]);
  ShowMessage(DummyG.Name + '|' + SG.Name);
  i := 1;
  j := 2;
  i := j;
  i := 1;
  ShowMessage(IntToStr(i) + '|' + IntToStr(j));

これを実行すると
|a
|
a|a
|
1|2
という結果になりました。

で、その後に
var
  i : integer;
begin
  for i := 0 to Form1.ComponentCount - 1 do
  begin
    ShowMessage('*'+Form1.Components[i].Name);
  end;
end;
を実行すると
*aaa
*
となりました。

これでは例えば上記のプログラム実行後に
SG.Free
DummyG.Free(エラーになりますが)
としても始めSGとして作ったStringGridは解放されません。
TStringListのようにownerを持たないオブジェクトをこのように代入してしまった場合、どうやって解放すればいいのでしょうか?

編集 削除
謎の2乗  2007-08-20 17:47:53  No: 27442  IP: 192.*.*.*

そんなコーディングをする理由、目的はナニ?

編集 削除
えーと  2007-08-20 18:36:10  No: 27443  IP: 192.*.*.*

>TStringListのようにownerを持たないオブジェクトをこのように代入してしまった場合、どうやって解放すればいいのでしょうか?

それはできません。インスタンスの参照が行方不明になれば、そのメソッドを呼ぶことはできません。

編集 削除
簡単にやるなら  2007-08-21 15:58:52  No: 27444  IP: 192.*.*.*

TForm1のprivateあたりに変数を宣言してはどうですか?
これならForm1のどのイベントでもアクセスが可能です。

以下は新規プロジェクトを使った例。

TForm1

private
  SL: TStringList;

(Form1のOnCreateイベント)
  SL := TStringList.Create;

(Form1のOnCloseイベント)
  SL.Free;

→この例では,アプリケーションが動いている間は,SLでこのStringListに
  アクセスできます。

(例:Form1.Button1のOnClickイベント)
  SL.add('1111');
  ShowMessage(SL.Strings[0]);

編集 削除
HOta  2007-08-21 20:32:17  No: 27445  IP: 192.*.*.*

>SG := DummyG;
でSGのいままでのインスタンスが無くなって、迷子になって解放できません。

編集 削除
単純に  2007-08-22 10:36:52  No: 27446  IP: 192.*.*.*

解放しようと思えば、オーナーが参照を保持してるので
  for i := 0 to Form1.ComponentCount - 1 do
  begin
    if Form1.Components[i].Name = 'aaa' then begin
      Form1.Components[i].Free;
      Break;
    end;
  end;
とすればできますが、質問の内容を見る限りオブジェクト参照(ポインタ)に
ついてよく分かっていないみたいなので、その辺を勉強した方が宜しいかと

編集 削除
りんぐ  2007-08-22 11:53:44  No: 27447  IP: 192.*.*.*

みなさん御回答ありがとうございます。
グリッドの解放は単純にさんの方法で解決してました。
なのでStringListだったらという質問になったんです。
質問というよりは疑問でした。すみませんでした。

具体的に困っているわけではなく、
二つのStringListを比較して条件に合うものを処理する場合
片方のStringListに代入?してしまえば以下のコーディングを
一つのインスタンスにしてしまえるなぁと思ったんです。

というかそうしてたんですが、質問のプログラムを試した際に
元のSGが消えるわけではないのがわかったので、
行方不明になったオーナーのないインスタンスの解放って出来るのかなぁと疑問が湧いた次第です。
StringListの問題は関数にするなり色々解決方法はあると思います。
行方不明なインスタンスの解放は出来ないということで解決とさせていただきます。
ありがとうございました。

編集 削除