参照先から、参照元がFreeされたかどうかを確認するにはどうすればいいのでしょうか?
---------------------------------------------------------
例)
var S:string;
function Test(T:TObject;St:String):string;
var
s1,S2:string;
begin
If T=nil then s1:='T:nil'
else s1:='T:Not nil';
if assigned(T) then S2:='T:Assignd=True'
else S2:='T:Assignd=False';
S:=S+ ST+' '+s1+' '+s2 +#13+#10;
end;
procedure TForm1.Button1Click(Sender: TObject);
var T,P:TObject;
begin
T:=TObject.Create;
P:=T;
Test(T,'T:create');
Test(P,'P:create');
T.Free;
Test(T,'T:Free');
Test(P,'P:Free');
T:=Nil;
Test(T,'T:Nil');
Test(P,'P:Nil');
SHowmessage(S);
end;
結果:
---------------------------
T:create T:Not nil T:Assignd=True
P:create T:Not nil T:Assignd=True
T:Free T:Not nil T:Assignd=True
P:Free T:Not nil T:Assignd=True
T:Nil T:nil T:Assignd=False
P:Nil T:Not nil T:Assignd=True
---------------------------
PからTがFreeされているかどうかを知るにはどうするのでしょうか。
また、Assignedの必要性は何なのでしょうか。
If T<>nil then と If Assigned(T) then とは同じでしょうか。
> PからTがFreeされているかどうかを知るにはどうするのでしょうか。
nilかどうか確認すればいいと思いますけど。
ただ、nilではない無効なデータが入っているとき困るので、
Tを解放後、いちいちnilを代入しておいてもいいかもしれません。
> If?T<>nil?then と If?Assigned(T)?then
わたしは同じだと思っています。ヘルプにもそういう風にありますし。
ただ、他の演算と区別しやすくなるし、後ですりかえることもできる分、わたしはAssignedを使ってます。
>> PからTがFreeされているかどうかを知るにはどうするのでしょうか。
> nilかどうか確認すればいいと思いますけど。
> ただ、nilではない無効なデータが入っているとき困るので、
> Tを解放後、いちいちnilを代入しておいてもいいかもしれません。
Pしか見えない状態で、Pの参照先Tが解放されたかどうかを知ることは出来ないのでしょうか?
-------Unit2-----------------------------------
interface
uses Forms,Classes;
var B:TObject;
Procedure Roulette;
implementation
var A:TObject;
Procedure Roulette;
begin
if Random(100)>50 then A.Free;
end;
begin
A:=TComponent.create(Application);
B:=A;
Randomize;
end.
-------Unit1-----------------------------------
implementation
uses Unit2;
procedure TForm1.Button1Click(Sender: TObject);
begin
Roulette;
if B=nil? ...//ここでBの参照元が破棄されているか知るには...?
end;
-----------------------------------------------
わざとエラーを起こしてみて(プロパティを呼び出そうとするなど)、それをtry...exceptで捕まえればいいんじゃないでしょうか?
でも、Aの開放時に、Bに同時にnilを代入しておいたほうが、
お行儀がいい気もしますね。
ちょっと問題とはずれているかもしれませんが。
コンポーネントが、自分の所有しているコンポーネントが解放されたかどうか知りたい場合は、Notificationをオーバーライドして判断します。
引数Operationに、追加されたか、削除されたかの値が入ります。
このあたりはヘルプに出ています。ソースを見るとわかりやすいと思います。
もしコンポーネントを作成しているのであれば参考にしてください。
にしのさん、たかちみえさん、返答ありがとうございます。
参照先にもNilを入れる形でプログラムを作り直して、
問題は解決しました。
しかし、Notification(こんなものがあったんですね)
を使ったやり方も面白そうです。
まさにコンポーネントを作っているところなので、試してみることにします。
ツイート | ![]() |