喫茶XRAYトップページ

[スレッド全体
]

[744] こんなの有効?返信 削除
2006/4/21 (金) 14:40:45 Syake
マスターこんにちは

めっきり暖かくなりまして、山々は新緑の季節です。
ですが、新葉は毒素を多く含むと言われます。
(組織が軟らかいうちは、害虫から身を守るためらしい)
この季節、山歩きなどをされる方は、かぶれなどに気をつけましょう。

おっと、本題・・・・

//-------------------------------------------------------
  Unit1 //(UnitFile)

・・・・
 frmMain := TfrmMain.Create(App・・・);
 try
   frmMain.ShowModal;
 finally
   if frmSub <> nil then
   begin
     frmSub.Release;
   end;
   frmMain.Release;
 end;

//------------------------------------------------------
 Unit2 //(frmMain)

 //・・・Button1のクリック
   frmSub := TfrmSub.Create(App・・・);
   frmSub.Show;
   frmMain.Hide;

 //OnShowイベント
   if frmSub <> nil then
   begin
     frmSub.Release;
     frmSub := nil;
   end;

//----------------------------------------------------
 Unit3 //(frmSub)
 
 //・・・Button1のクリック
   Close;
 
 //OnCloseイベント
   if bFlg = False then
   begin
     frmMain.Show;//呼び出し元で破棄される
   end else begin
     frmMain.Close;//呼び出し元では破棄されない(Unit1で破棄)
   end;
 
ちなみにDLLです。
今更のようですが、このプログラムは有効なのでしょうか?
@生成前なら必ずオブジェクトの参照はnilである。
A破棄してもオブジェクトの参照はnilにはならない。
BReleaseの後ならオブジェクトの参照をnilにしても一向に構わない。
などと、勝手な推論でできた記述です。
(Flgで判断させるのも面倒なので・・・)




[752] Re:こんなの有効?返信 削除
2006/4/24 (月) 22:16:08 Mr.XRAY
▼ Syakeさん どもども。

> @生成前なら必ずオブジェクトの参照はnilである。
> A破棄してもオブジェクトの参照はnilにはならない。
> BReleaseの後ならオブジェクトの参照をnilにしても一向に構わない。


私自身、コードは問題ないと思うのですが。
上の(1),(2)はその通りでしょうね。
(3)はnilにしないと、nilにならないのではないかと(何か変な表現だけど)。

ところで、フォームのイベントでは、FreeではなくReleaseを使用するべき
というは、多くの参考書、ヘルプでもあるのですが、結構Freeを使ったりし
ているんです。私の場合。やっぱりマズイのでしょうか。


[758] Re2:こんなの有効?返信 削除
2006/4/25 (火) 15:40:25 Syake
▼ Mr.XRAYさん

> 私自身、コードは問題ないと思うのですが。
> 上の(1),(2)はその通りでしょうね。
> (3)はnilにしないと、nilにならないのではないかと(何か変な表現だけど)。

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

確かにMasteringDelphi6にそのような記述がありました。
//-------------------------------------------------------------//
nilに設定するのはプログラマの仕事なのだ。
(略)
オブジェクトを自動的にnilに設定するのは不可能である。
それは、同じオブジェクトが複数の変数から参照されている可能性があり
Delphiはそれらの参照を追跡管理しないからだ。
Freeなどのメソッド内部ではオブジェクトの操作はできるが、そのオブジ
ェクトの参照(そのメソッドの呼び出しに利用した変数のメモリアドレス)
については何もわからない。
メソッドの内部ではオブジェクトのメモリアドレスを知ることはできるが
そのオブジェクトを参照している変数のメモリアドレスまではわからない
とういことだ。
//--------------------------------------------------------------//
だ、そうでございます。
本を読んでると3分で寝てしまう私はまったく頭に入ってませんでした。

Release
//-------------------------------------------------------------//
フォームのReleaseメソッドは、オブジェクトのFreeメソッドと同じよう
なものだ。
違いは、全てのイベントハンドらがその実行を完了するまで、フォーム
の破棄が延期されることだ。
フォームの中でFreeを使うと、アクセス違反が発生する可能性がある。
・・・・
//--------------------------------------------------------------//
フォームの中でFreeを使うと・・・・え゛っ?どういうこと。
例えばOnCloseの中でFreeを使うって事?
自分で自分をFreeしちゃうんですね(自殺)。
怖くてできません。
で、フォームの外なら良いのですかね(他殺)。
表現悪m(__)m




[760] Re3:こんなの有効?返信 削除
2006/4/25 (火) 16:00:37 Syake
マスター

読んでませんね。
>フォームのイベントでは、FreeではなくReleaseを使用するべき
フォームの中つまり(自殺)ですね。

マスターがエラーにならないのは、その辺を見極めて適切に処理
されているからでしょう。
私がエラーになったのは・・・・です。(;_;)

[773] Re4:こんなの有効?返信 削除
2006/4/26 (水) 10:16:31 ちいんけ
▼ Syakeさん

> >フォームのイベントでは、FreeではなくReleaseを使用するべき
> フォームの中つまり(自殺)ですね。


さらに、Delphi-MLでこんな記事をみつけました。

[Delphi-ML:36522] Re: 動的なフォームの作成について
http://www2.big.or.jp/~osamu/Delphi/delphi-browse.cgi?index=036522

ノンモーダルなフォームのときは参考にさせていただいてます。

ちいんけ@

[774] Re5:こんなの有効?返信 削除
2006/4/26 (水) 20:42:35 Syake
▼ ちいんけさん

勉強になります。
ありがとうございます。m(__)m


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82