Delphi 2006 で、独立した TFrame 上のコンポーネントにイベント ハンドラを割り当てることができません。
TComboFrame
TCombo を含むフレームがあり、Combo1
これをメイン フォームのいくつかの場所で使用するとします。
TComboFrame のインスタンスをMyFrame1
メイン フォームに配置し、コンボにイベント ハンドラーを割り当てたい場合はMyFrame1
、フォームに配置したフレーム内の TCombo をクリックし、空の
OnChange
フィールドをダブルクリックします。オブジェクト インスペクタの [イベント] タブにあります。
通常、 は次のような名前で新しいハンドラーを作成します。
procedure TMainForm.MyFrame1Combo1Change(Sender: TObject);
また、イベント ハンドラ名は、祖先 TComboFrame のコンポーネントの名前 ( Combo1
) と、フォームに配置したインスタンスの名前( ) の両方から派生しMyFrame1
ます。つまり、TComboFrame のそのインスタンスに固有です。次に、メイン フォームに配置したフレームの他のインスタンスに対してこれを行うと、それぞれが独自のイベント ハンドラーを取得します。
フレームのすべてのインスタンスに対して発生するイベント ハンドラーが必要な場合は、祖先フレーム自体を開いてそこで実行します。
これがどのように機能するかについての私の理解ですが、どこかで何かが間違っています。メイン フォームのフレームのいくつかのインスタンスのうち、独自のイベント ハンドラーを持つものもあれば、共通のイベント ハンドラーを持つものもあります。
procedure TDMainForm.ComboFrame1Combo1Change(Sender: TObject);
私が試したことはありませんが、いくつかのフレームで共有されているこの共通のイベント ハンドラと Delphi が持っているように見えるこのファントム リンクを壊していません。
この状態を修復するにはどうすればよいですか? また、そもそも何が原因でしょうか?
** 更新 1 **
回答を読み、少し実験した結果、次の手順で問題のあるコンポーネントを修復できることがわかりました。
1) フレームのすべてのイベント ハンドラーを削除します。
2) フレームの名前を覚えて、フレームを削除します。
3) OK であることがわかっている別のものをコピーします (つまり、「個別」の独自のイベント名を持っています)。
4)削除したものの代わりにそれを貼り付けます。
5) 元の名前に戻します。
6) イベント ハンドラを作成します。
...少なくとも、少なくとも一度はうまくいきました...
** 更新 2 **
それを解決する別の方法は、オブジェクト インスペクタの空のイベント フィールドをダブルクリックしたときに作成されるイベント ハンドラ名を新しい一意の名前で上書きし、その名前を再度ダブルクリックすることです。次に、Delphi は一意の名前で空のハンドラを作成します。