4

TForm3つの同一の(TVehicleUnitFrame)をTFrames含む(TVehicleEditForm)があります。

フレームのすべてのインスタンスがフレーム内で独自のイベントを処理するという考え方でしたeventhandler。問題は、eventhandlerが呼び出されないことです。

eventhandlerCreateメソッドをオーバーライドして、フレーム内にbyコードを割り当てようとしましたが、その場合もハンドラーは呼び出されません。

eventhandlerしかし、フォームからフレームの外側を割り当てると、正常に機能します。このような:

fraVehicleUnitFrame1.cmdNewOwner.OnClick := fraVehicleUnitFrame1.cmdNewOwnerClick;
fraVehicleUnitFrame2.cmdNewOwner.OnClick := fraVehicleUnitFrame2.cmdNewOwnerClick;
fraVehicleUnitFrame3.cmdNewOwner.OnClick := fraVehicleUnitFrame3.cmdNewOwnerClick;

そして、これはボタン1つだけです!フレーム内に多くのコンポーネントがあるので、これは多くの割り当てになります...これをオブジェクトインスペクターで直接実行する必要がある場合は、非常に醜いコードです。

D2007を使用しています。原因のアイデアはありますか?

よろしくローランド

4

2 に答える 2

12

コードから行う場合に機能する理由は、以前に何があったかに関係なく、イベント ハンドラーへのポインターを置き換えるためです。

設計時には、ハンドラーを設定できる場所が 2 つあります。Unit1 に Frame1 があり、それを MyUnit の MyForm に配置すると、両方の場所でイベント ハンドラーを設定できます。

あなたの場合、イベント ハンドラーをフレーム自体 (私の例では Unit1) に設定する必要があります。これは、参照するコードがフレーム自体にあるためです。そうすれば、うまくいくはずです。イベント ハンドラーを使用する場所 (MyUnit) に設定すると、そこにイベント ハンドラーが割り当てられます。

Delphi は、フォームにイベント ハンドラを追加する前にそのイベント ハンドラが割り当てられていれば、フレームからイベント ハンドラを呼び出します。最初にフォームにハンドラーを追加してからフレームにハンドラーを追加した場合、フレームの最後のハンドラーは呼び出されません。さらに悪いことに、フォーム内のハンドラーを削除しても、フレーム上のハンドラーは呼び出されません。

あなたがする必要があるのはこれです:

フォームを右クリックし、[テキストとして表示] を選択します。フレームまでスクロールします。次のようになります。

inline FrameX: fraVehicleUnitFrame1

その下で、探してください

inherited cmdNewOwner: TButton

そこには次のようなものが表示されます。

OnClick = FormOldClickHandler

多分

OnClick = nil

この OnClick 割り当てを削除し、再度フォームとして表示して保存します。すべてがうまくいくはずです。フォームでボタン (または cmdNewOwner が何であれ) を選択すると、オブジェクト インスペクターはそのイベントの横に何も表示しません。

于 2009-07-10T14:02:46.563 に答える