こんにちは。
開発環境は、delphiXE3 enterprise(update2適用)、win7(sp1)、sqlite3です。
いつもお世話になっております。
DBオブジェクトを以下のようなコードでcreateしています。
slDB:=TSQLiteDatabase.Create(sFile);
createしているので、当然破棄が必要です。
その破棄は以下のようにしています。
slDB.Free;
この破棄をする前に、破棄されているかどうかを知りたいと思っています。
試しに
if Assigned(slDB)=true then
とか
if slDB<>nil then
を試してみたんですが、事前にfreeしたにもかかわらず、if文が実行されました。
createされているかどうか(破棄されているかどうか)知るにはどうしたら良いのでしょうか。
よろしくお願いします。
Free メソッドは,文字通り,自由にすることです.
このオブジェクトで使用しているメモリ領域を,他で使ってもいいですよ.という意味です.
オブジェクトの実体 (インスタンス) はまだ残っています.
例えば,以下のコードを実行すると,作成した aBtn の幅 (Width) の値は取得できます.
procedure TForm1.Button1Click(Sender: TObject);
var
aBtn : TButton;
begin
aBtn := TButton.Create(Self);
aBtn.Parent := Self;
aBtn.Free;
ShowMessage(IntToStr(aBtn.Width));
end;
オブジェクトの実体を無効 (nil) にするには,
FreeAndNil(aBtn);
とします.
>createされているかどうか(破棄されているかどうか)知るにはどうしたら良いのでしょうか。
Assigned や nil かを検出するには,
そのオブジェクトがどこで定義されているかによって処理を考慮する必要があります.
こんにちは。
なるほどですね。
freeandnilを使うことになるんですね。
sqliteのラップファイルのサンプルとかに、slDB.freeとか書いてあったので、
いろいろ関数を作っているんですが、そのすべてにslDB.freeを書いてしまい
ました。
僕はprocedureの中でslDBをcreateしてfreeをやっていたり、slDBをcreateする
procedureを作ってinsertなどのprocedureを作ってslDB.freeをするprocedure
を作る、2パターンをやっています。
お話されている「そのオブジェクトがどこで定義されているかによって処理を
考慮する必要があります」の意味が掴めていなくて。
申し訳ございませんが、どういうものなのか教えてもらえないでしょうか。
よろしくお願いします。
>申し訳ございませんが、どういうものなのか教えてもらえないでしょうか。
単語を頼りに検索エンジンで検索するとか,あるいは,
問題が発生した時に,質問されればよろしいのではないでしょうか.
その時は,これまでのような文章ではなく,具体的なコードを提示するといいのではないかと思います.
例えば,私の提示コードは,ボタンクリックイベント内の全てのコードが書いてあります.
一方,やまださんの文章では,どこでなにを定義しているかも,どの部分で,どのように,
ということが明確ではありません.
新規にプロジェクトを作成して,他の人がテスト可能な,必要最小限のコードを提示すると,
より具体的なアドバイスが得られるものと思います.
http://ht-deko.minim.ne.jp/tech045.html#tech095
http://www.hyuki.com/writing/techask.html
>sqliteのラップファイルのサンプルとかに、slDB.freeとか書いてあったので、
勘違いしないでください.私は,
>createされているかどうか(破棄されているかどうか)知るにはどうしたら良いのでしょうか。
に関して,参考になるかも知れないコードを提示してだけです.
Free だけでもいいのか,Free と nil の両方が必要なのか,
そのオブジェクトを,どこでどう生成しているのか,どこでどう使用しているのかによります.
遅くなりましてすみません。
おっしゃられる通りだと思いました。
以降、分かりやすいように質問を書くようにします。
freeandnilは有難かったです。
ありがとうございました。
ツイート | ![]() |