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を持たないオブジェクトをこのように代入してしまった場合、どうやって解放すればいいのでしょうか?
そんなコーディングをする理由、目的はナニ?
>TStringListのようにownerを持たないオブジェクトをこのように代入してしまった場合、どうやって解放すればいいのでしょうか?
それはできません。インスタンスの参照が行方不明になれば、そのメソッドを呼ぶことはできません。
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]);
>SG := DummyG;
でSGのいままでのインスタンスが無くなって、迷子になって解放できません。
解放しようと思えば、オーナーが参照を保持してるので
for i := 0 to Form1.ComponentCount - 1 do
begin
if Form1.Components[i].Name = 'aaa' then begin
Form1.Components[i].Free;
Break;
end;
end;
とすればできますが、質問の内容を見る限りオブジェクト参照(ポインタ)に
ついてよく分かっていないみたいなので、その辺を勉強した方が宜しいかと
みなさん御回答ありがとうございます。
グリッドの解放は単純にさんの方法で解決してました。
なのでStringListだったらという質問になったんです。
質問というよりは疑問でした。すみませんでした。
具体的に困っているわけではなく、
二つのStringListを比較して条件に合うものを処理する場合
片方のStringListに代入?してしまえば以下のコーディングを
一つのインスタンスにしてしまえるなぁと思ったんです。
というかそうしてたんですが、質問のプログラムを試した際に
元のSGが消えるわけではないのがわかったので、
行方不明になったオーナーのないインスタンスの解放って出来るのかなぁと疑問が湧いた次第です。
StringListの問題は関数にするなり色々解決方法はあると思います。
行方不明なインスタンスの解放は出来ないということで解決とさせていただきます。
ありがとうございました。
ツイート | ![]() |