現在、フォーム上に動的にコントロールを配置するようなアプリケーションを
作成しているのですが、
以下の様な問題が発生しているため、原因と解決方法がわかりましたらご教授いただきたいと思っています。
■問題点
当アプリケーションでは、主に以下の2つの機能を持っています。
1.あるフォーム上に、ユーザーが任意に、動的にボタン、エディットボックスなどのコントロールを追加
例えば、ボタンを追加した場合は、以下の様なソースで作成しています。
===================================================================
var
control : TControl;
.
begin
control := TButton.Create(nil);
control.Parent := TForm1;
control.Visible := True; .
.
===================================================================
また、追加後はジェネリックリスト(TList<TControl>)に
そのコントロールの参照を追加して、後でそのコントロールを参照できるようにしています。
2.1で追加したコントロールの論理削除(非表示)
ジェネリックリストからコントロールを検索後、
コントロールのVisibleプロパティをFalseにします。
※非表示にするのみとなり、後で復活(再表示)もできるようにしています。
しかしながら、上記の1と2を繰り返すうちに、
「1のコントロール動的生成時(Createメソッド)のタイミングで、
2で論理削除済みのコントロールと同じポインタが割り当てられる」
という現象が発生いたしました。
このとき、2のコントロールは、同じポインタで
上書きされてしまうため、参照が不可となってしまいます。
※1と2はまったく違う種類のコントロール(例えば1がパネルで2がボタン)の場合でも発生してしまいます。
※コントロール数は10個ぐらいでも発生いたします。
2は表示上は消えていますが、VisibleをFalseにしているだけで
解放(Free)などはしていないため、同じポインタが
割り当てられてしまう原因が不明な状態となっています。
■質問点
そこで、以下の2点をお伺いしてもよろしいでしょうか。
①一般的に、フォーム上に動的にコントロールの追加及び、非表示(VisibleをFalse)を繰り返すことにより、
同じポインタが重複して割り当てられるのは一般的なものなのでしょうか?(Delphi内部で、重複してポインタを割り当てられないように制御はされないものなのでしょうか?)
②回避方法はあるのでしょうか?
(例えば、Create時に割り当てるポインタの制御がプログラム側でできれば解決できると思っているのですが、
VCLソースのCreateのメソッドなどを追ってもそれらしき箇所は見当たりませんでした。。。)
#上記を実現する単純な再現サンプルソースを作成しようとしたのですが、
同じ手順でコントロールの追加、非表示を繰り返すプログラムでは、
同現象の再現ができませんでした。
(実際はもっと複雑なプログラムのため、その作り方に原因がある可能性もあるのですが…)
一般的な解決方法があるのでしたらお伺いしたいと思っています。
なお、DelphiのバージョンはXE2です。
よろしくお願いいたします。
ごめんなさい。続けて2回投稿してしまいました。。。
こちらは「解決済」にしておきます。
ツイート | ![]() |