2009-07-10 3 views
4

私はTForm(TVehicleEditForm)を持っていて、3つの同じものがTVehicleUnitFrame内にあります。TFrame内のEventHandler?

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

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

しかし、フォームから枠の外にeventhandlerを割り当ててもうまく動作します。 このように:

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

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

私はD2007を使用しています。原因の考えですか?

よろしくローランド

答えて

11

あなたがコードからそれを行うとき、それが動作する理由、あなたは関係なく、前にあったものを、イベントハンドラへのポインタを交換することです。

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

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

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

右Clcikフォームやテキストとして表示]を選択:あなたがする必要がどのような

はこれです。フレームまでスクロールします。

OnClick = FormOldClickHandler 

または多分

OnClick = nil 

は、これを削除する:あなたのようなものが表示されるはずがあり

inherited cmdNewOwner: TButton 

を探し、その下に

inline FrameX: fraVehicleUnitFrame1 

:それは次のようになりますオンクリック割り当て、次のように表示もう一度フォームを作成して保存します。すべてがうまくいくはずです。フォーム上のボタン(またはcmdNewOwnerが何であれ)を選択した場合、オブジェクトインスペクタはそのイベントの横に何も表示しません。

+0

アドバイスありがとうございます!私はそれが再び働いた:) 多くのおかげで –

+0

私は助けることができた喜び! –

+0

私はフォームからフレームインスタンスを削除して再度追加することでこの問題を解決しますが、フレームインスタンスに変更が加えられた場合は特に解決策があります。 –