あるフォームが別のフォームのイベントプロシージャを使用できるようにする方法はありますか?
たとえば、PongFormというフォームとObstPongFormという別のフォームがあります。PongFormにはティッカーがあり、ObstPongFormには別のティッカーがあります。ObstPongFormに、PongFormの「tick」イベントのコードを独自の「tick」イベントで使用させることは可能ですか?たぶん、ObstPongFormにPongFormから継承させることによって?
コードで簡単に割り当てることができます (両方のインスタンスにアクセスできる場合)。
ObstPongForm.Ticker.OnTick := PongForm.TickerTick;
両方のフォームで、両方で使用されるロジックを実装する別のクラスを呼び出す方がよいでしょう。OnTimerイベントハンドラーですべてのプログラムロジックを記述している場合、多くのデルファイプログラマーが悪い考えであることに気付くのに何年もかかる悪い道を進んでいます。
したがって、1つのフォームでメソッドを呼び出す必要があります。これは次のように行われます。
procedure TForm1.DoSomething;
begin
DataModule1.LogicMethod;
end;
他の場所にはタイマーがあります...
procedure TForm2.Timer1Timer(Sender:TObject);
begin
DataModule1.LogicMethod;
end;
そして、メソッド自体:
procedure TDataModule1.LogicMethod;
begin
// Everything that you used to have in Timer1Timer goes here, except the setting of
// UI properties in Form1 which is kept in Form1:
Inc(FCounter);// stupid example.
//
if Assigned(FOnResults) then
FOnResults(Self, FCounter, FDataObject1);
// Form2 is connected to FOnResults event, and stores the
// result in the UI somewhere.
end;
はい、フォームは他のクラスと同様に単なるクラスであり、Delphi は視覚的な継承をサポートしているため、継承されたメソッドを通常どおり呼び出すことができます。
ObstPongForm が PongForm の特殊化されたバージョンである場合、継承は理にかなっていますが、ObstPongForm は PongForm からすべてのビジュアル コントロールを継承するので注意してください。これには、将来追加する可能性のあるものも含まれます。
また、すでに両方のフォームを持っていると仮定しているため、一方を他方から継承することは可能ですが、手動で DFM を編集する必要があり、主に
Object ObstPongForm: TObstPongForm
に
Inherited ObstPongForm: TObstPongForm
再利用したいコードがいくつかの無関係なフォームで必要になる可能性がある場合、これらのフォームで使用される共通のユニットにコードを移動することが最善の解決策である可能性があります
イベント ハンドラーは、通常の手順です。ObstPongForm ティック ハンドラに、PongForm のコードに加えて実行する必要がある追加のコードがある場合、必要に応じて PongForm のティック ハンドラを手動で呼び出すことができます。次に例を示します。
uses
..., PongForm;
procedure ObstPongForm.TickHandler(Sender: TObject);
begin
...
PongForm.TickHandler(Self);
...
end;