掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
動的フレームの再作成でエラー (ID:22631)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
zebra 2006/09/06(水) 07:38:22 >ただ細かいことですが、抽象化という言葉の意味がちょっと引っかかりました。 >>相手クラスから、実際にどのクラスが生成されているか分からないと言う意味で抽象化されているとおもいますよ >私の考える抽象化とは、文字通りabstractなクラスでありメソッドであると思っています。 >例えば、クラスを生成する抽象化されたメソッドとすれば、(Factory Methodだったかな?)があると思いますけど、これはメソッド自身がどのクラス(サブクラス)を生成するのか知らないって事が抽象化なのかなと。 Abstract Factoryパターンの事ですかね?、確かにそのパターンは抽象化が分かり易いですね。 多分zebraさんが抽象化されていないと思うのは、zebraさんが内部構造(Singleton)を 知っているからだと思います、つまりzebraさんの目線になっています。 これをForm1を中心に考えた場合、Abstract FactoryもSingletonも変わりありませんよね。 クラス(オブジェクト)中心に考える事が大事だと思います。 逆に抽象化反対は具体化ですよね、具体化ではForm1が作成するインスタンスを知っていると言う事になり つまり「a := TFrame2.Create(self);」これですね、これに比べれば抽象化されている事になると思います。 ん〜なんか言葉遊びみたいになっていますね、上手く説明出来ていませんね 車に例えて簡単に説明すると、カローラ・BMWなど車種が違っても車と抽象化することで運転出来ますね これが、Abstract Factoryパターンです。次にSingletonパターンですが これは、カローラはカローラでも新車と中古車の違いですね、これをカローラと抽象化することで運転出来ますよね。 >あと、最後の >>>Freeが使えなくなる場合とはどのような場合なんでしょうか? >>>また、その様な場合でもReleaseは使えるのですか? >>Frameさんが発言しているパターンの時ではないですか? >>> そのフォームまたはその子フォームのイベントハンドラ以外からで、Freeをすることはかまわない >>つまり、Freeの呼出し元がフォームまたは子フォームのイベントハンドラから呼ばれる場合ですね >>その場合は、Releaseを使います。 >これは、例えばそれぞれ独立したフォームとしてForm1とForm2があるとして、Form2からForm1の解放をしていたとします。(Form1はメインフォームではない) >ここで、オブ脳さんの言われる"プログラムを拡張(継承)してFreeが使えなくなった場合"とはForm2がForm1の子フォームになった場合エラーが発生するってことなんでしょうか? そうですね、この説明だと分かりにくいですね、すみません。 簡単なソースを書きます。 procedure TForm1.Edit1Change(Sender: TObject); begin if Edit1.Text = '終了' then begin FreeAndNil(Form2); end; end; procedure TForm1.Button1Click(Sender: TObject); begin Edit1.Text := '終了'; end; このままでは、Form2を解放するのにFreeAndNilを使っても大丈夫ですが この後Form2が拡張されて procedure TForm2.Button1Click(Sender: TObject); begin Form1.Edit1.Text := '終了'; end; になったとします、こうなる解放処理の起点が「Form2フォームのイベントハンドラ」になり Releaseを使わないといけなくなります。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.