1

次のように、フォームで定義されたプロシージャをデータソースのイベント OnStateChange に割り当てようとしています。

unit SDIMAIN;

interface

uses Windows, ....., DB ;

type

  TSDIAppForm = class(TForm)
   ....
   procedure datasourceOnStateChange(Sender: TObject);

private
  stateChange : TNotifyEvent;
....

var
  SDIAppForm: TSDIAppForm;
...
end;

procedure TSDIAppForm.FormCreate(Sender: TObject);
begin
 DataModule1.AdsTable1.Active := true;
 DataModule1.AdsTable2.Open;
stateChange := SDIAppForm.datasourceOnStateChange(DataModule1.AdsTable1);
DataModule1.DataSource1.OnStateChange := stateChange;

.
.
.
procedure TSDIAppForm.datasourceOnStateChange(Sender: TObject);
begin...end;

最初に上記を実行しようとしたときに、エラーが発生しました! 互換性のない型: 'TNotifyEvent' および 'procedure, untyped pointer or untyped parameter'

I tried changing 
stateChange := SDIAppForm.datasourceOnStateChange(DataModule1.AdsTable1); to
stateChange := SDIAppForm.datasourceOnStateChange;

Now I don't get the error but it doesn't work. The OnStateChange event is not fired at all.

I tried with other methods like using

var
Method : TMethod;
.
.
.
Method.Data := Pointer(Self);
Method.Code := MethodAddress('datasourceOnStateChange'); and using pointers but it doesn't work.

私はデルファイが初めてで、現在学習中です。私は正確に何をすべきかを理解していなかったかもしれません。誰かがこの問題について私を助けることができれば、それは本当に役に立ちます.

Thanks.
4

2 に答える 2

2

イベントは、型がメソッドである単純なプロパティです。

このイベント プロパティを割り当てようとしています。ただし、単にイベント ハンドラーをプロパティに割り当てるのではなく、イベント ハンドラーを呼び出しています。このコードには重大なエラーが含まれています。

SDIAppForm.datasourceOnStateChange(DataModule1.AdsTable1)

これは、単に行いたくないイベント ハンドラーの呼び出しです。プロパティがイベント ハンドラを参照するコンポーネントは、それを呼び出すオブジェクトです。

どうやってこの間違いを犯したか推測できます。関数の名前を入力し始めると、IDE によってオートコンプリートが提案されました。あなたはこのヘルプを受け入れましたが、IDE はあなたが関数を呼び出したいと考え、関数呼び出しに括弧を付けました。しかし、関数を呼び出したくはありませんでした。関数への参照を取得したかったのです。これは、IDE の最も苛立たしい側面の 1 つです。

したがって、コードは次のようになります。

DataModule1.AdsTable1.Active := true;
DataModule1.AdsTable2.Open;
DataModule1.DataSource1.OnStateChange := SDIAppForm.datasourceOnStateChange;
于 2013-08-16T06:57:33.003 に答える