3

Delphi 2009 では、フォームのラベルに書き込むプロシージャ MyProcedure を持つフォームがあります。フォームClientDataSet で DataModule を使用します。ClientDataSet の AfterScroll イベントが発生すると、MyProcedure を実行する必要があります。循環参照を避けるために、さらに重要なのは、DataModule を再利用可能にしたいので、DataModule はこの特定の Form を参照するべきではありません。

つまり、フォームから AfterScroll イベントにアクセスできることを願っています。フォームから DataModule の Afterscroll イベントをフックできますか? できるはずだと思ったのですが、やり方が思い出せません。前もって感謝します。

4

3 に答える 3

6

DataModule にイベント プロパティを配置します。

private
FOnAfterScroll : TNotifyEvent;
public
property OnAfterScroll   : TNotifyEvent read FOnAfterScroll write FOnAfterScroll;

次に、DataModule の AfterScroll プロシージャでそのイベントを呼び出します。

If Assigned(FOnAfterScroll) then FOnAfterScroll(Self);

In Form: イベント ハンドラーを宣言する

procedure HandleAfterScroll(Sender : TObject);

次に、DataModule の OnAfterScroll にプロシージャを割り当てます。

Datamodule1.OnAfterScroll := MyHandleAfterScroll;

もう 1 つの方法は、DataModule からカスタム Windows メッセージを送信し、フォームでそのメッセージに応答することです。

于 2009-05-25T14:18:04.480 に答える
2

次のようになります。

procedure TForm1.FormCreate(Sender: TObject);
begin
  DataModule1.MyCDS.AfterScroll := MyAfterScrollHandler;
end;
于 2009-05-25T14:15:34.127 に答える
1

フォームなどの別のユニットでイベント ハンドラーを宣言することだけが必要な場合は、Ulrich の提案に従ってください。デフォルトのイベント ハンドラーをデータ モジュールに配置できるようにしたいが、その動作を拡張できるようにしたい場合は、もう少し作業が必要です。これを行うには、データ モジュールにイベントを追加します。

次のように、適切なシグネチャを使用してメソッド ポインタを定義し、パブリック スコープでデータ モジュールに追加します。

type
  TMyEvent = procedure({arg list here}) of object;

  TMyDataModule = class(TDataModule)
  //definition goes here
    procedure MyTableAfterScroll({arg list here});
  private
    FExternalEvent: TMyEvent;
  public
    property ExternalEvent: TMyEvent read FMyEvent write FMyEvent
  end;

implementation

procedure TMyDataModule.MyTableAfterScroll({arg list here});
begin
  //do whatever
  if assigned(FExternalEvent) then
    FExternalEvent({whatever arguments});
  //do more stuff, if you'd like
end;

接続するには、フォームの OnCreate で、プロシージャを MyDataModule.ExternalEvent に割り当てるだけで準備完了です。

于 2009-05-25T14:23:24.220 に答える