[delphi-users:1322] Create時の引数に関して

1,456 views
Skip to first unread message

れお

unread,
Sep 12, 2010, 8:31:22 PM9/12/10
to delphi...@freeml.com
初投稿させて頂きます。

ちょっといまいち理解できていない所があり、メールを書かせて頂きました。

■ケース1
xxx := TTimer.Create( nil );

■ケース2
xxx := TTimer.Create( Self );

上記のようなケース1とケース2ではどのように動作が変わるのでしょうか?
ネットのサンプルソースには上記パターンがまちまちで、いまいちどちらが最適なのか理解できませんでした。もしも使用方法によって使い分けがならば、そのケースも教えて頂ければと思います。

以上、よろしくお願いいたします。

MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
メーリス初!freemlなら絵文字が友達に届く!
http://ad.freeml.com/cgi-bin/sa.cgi?id=fPRa2
-----------------------------------------------------[freeml by GMO]--

tetupei

unread,
Sep 12, 2010, 11:37:47 PM9/12/10
to delphi...@freeml.com
れおさんこんにちは、
赤尾です。

いわゆるクラスのCreateの引数は、クラスによって様々です、
今回はTTimerに限ってお答えすると、
引数はAOwnerですので、そこに指定するのは親コントロールになります。
TTimerの親クラスであるTComponentは自分の親であるAOwnerの破棄時にその子である
自分自身も破棄します。
Nilを指定すると親なし、Selfを指定すれば呼び出し元(通常はForm1)になります。
特に意識しないで使う場合はSelfを入れておくのが無難です。

赤尾鉄平


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
夏休みに撮った写真をMLにアップしよう!
http://ad.freeml.com/cgi-bin/sa.cgi?id=fPTD7

tetupei

unread,
Sep 12, 2010, 11:42:55 PM9/12/10
to delphi...@freeml.com
ミスタイプ失礼します

元)引数はAOwnerですので、そこに指定するのは親コントロールになります。
修)引数はAOwnerですので、そこに指定するのは親コンポーネントになります。

元)TTimerの親クラスであるTComponentは自分の親であるAOwnerの破棄時にその子で
ある
修)TTimerの派生元クラスであるTComponentは自分の親であるAOwnerの破棄時にその
子である

紛らわしくてすみません。


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
ベジモンゲットだぜ!ゆるカワなベジモンと新しい農場ライフ♪
http://ad.freeml.com/cgi-bin/sa.cgi?id=fPTHJ

れお

unread,
Sep 13, 2010, 12:07:48 AM9/13/10
to delphi...@freeml.com
赤尾さん、お返事ありがとうございます。

xxx := TTimer.Create( nil );

の場合、FreeAndNil( xxx );を記述しないと派生元を破棄してもxxxが解放されずメモリリークする。

xxx := TTimer.Create( Self );

の場合、FreeAndNil( xxx );を記述しないでも、派生元が破棄されると同時にxxxも破棄される為メモリリークしない、という理解で間違えてないでしょうか?

MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
ちょっとした連絡に♪メンバー掲示板を有効活用しよう!
http://ad.freeml.com/cgi-bin/sa.cgi?id=fPUgA

tetupei

unread,
Sep 13, 2010, 12:35:20 AM9/13/10
to delphi...@freeml.com
はい、そういう事になると思います。
単にFreeでも構いませんが。
普通、明示的にCreateしたコントロールは明示的にFreeすべきだと思いますので
そういったプログラムを組んでいればTTimerの場合はnilでも構わないと思います
が、
念には念を入れた方が他の人がコードを見たとき安心するかと思います。

赤尾鉄平


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
練習の予定も共有スケジュールに登録しよう!
http://ad.freeml.com/cgi-bin/sa.cgi?id=fPU4B

中村@ブレーン

unread,
Sep 13, 2010, 4:52:26 AM9/13/10
to delphi...@freeml.com
ちょっと気になったので補足します。

まず、Create で指定するコンポーネントは、コンポーネントの「オーナ」です。
「親」ではありません。
#派生元 というのも変ですね。

Createにオーナを指定すると、オーナはそのコンポーネントを「所有」し、
オーナが破棄されるとき、オーナが「所有」するコンポーネントも一緒に破棄されます。

オーナはどんなコンポーネントでもなれまずが、通常は、フォーム、データモジュール
又はフレームです。つまり、設計時にコンポーネントを貼ることができるものです。

つまり、オーナとは、設計時に貼りつけたコンポーネントをいちいち破棄しなくても
よいようにする仕組みです。設計時にコンポーネントを貼るとコンポーネントのオーナは
フォーム、データモジュール又はフレームになります。

コンポーネントを動的に Create で作成するとき、オーナの指定は、無難に貼り付け先の
フォーム等を選べばよいでしょう。
オーナを指定して作ったコンポーネントは随時 Free できます。

れお さんは書きました:

----------
東京都 日野市 中村拓男


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
メーリス初!freemlなら絵文字が友達に届く!
http://ad.freeml.com/cgi-bin/sa.cgi?id=fPXZ2

Reply all
Reply to author
Forward
0 new messages