在delphi中将表单中的过程分配给notify事件

在delphi中将表单中的过程分配给notify事件,delphi,Delphi,我试图将表单中定义的过程分配给数据源的事件OnStateChange,如下所示: unit SDIMAIN; interface uses Windows, ....., DB ; type TSDIAppForm = class(TForm) .... procedure datasourceOnStateChange(Sender: TObject); private stateChange : TNotifyEvent; .... var SDIAppF

我试图将表单中定义的过程分配给数据源的事件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”和“过程、非类型指针或非类型参数”

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.

将方法
datasourceinstatechange
分配给
DataModule1.DataSource1.OnStateChange
的事件将起作用:

   stateChange := SDIAppForm.datasourceOnStateChange;
   DataModule1.DataSource1.OnStateChange := stateChange;
可以写成

DataModule1.DataSource1.OnStateChange := SDIAppForm.datasourceOnStateChange;
如果您不需要
状态更改
用于其他目的

SDIAppForm.datasourceOnStateChange(DataModule1.AdsTable1);

是以
DataModule1.AdsTable1
作为发送方的方法的直接调用,而不是它本身的方法。

将方法
datasourceinstatechange
分配给
DataModule1.DataSource1.OnStateChange
的事件将起作用:

   stateChange := SDIAppForm.datasourceOnStateChange;
   DataModule1.DataSource1.OnStateChange := stateChange;
可以写成

DataModule1.DataSource1.OnStateChange := SDIAppForm.datasourceOnStateChange;
如果您不需要
状态更改
用于其他目的

SDIAppForm.datasourceOnStateChange(DataModule1.AdsTable1);

是以
DataModule1.AdsTable1
作为发送方的方法的直接调用,而不是它本身的方法。

事件只是一个类型为方法的属性

您正在尝试分配此事件属性。但是,您不是简单地将事件处理程序分配给属性,而是调用事件处理程序。此处的代码包含严重错误:

SDIAppForm.datasourceOnStateChange(DataModule1.AdsTable1)
这是对事件处理程序的调用,您根本不想进行调用。属性引用事件处理程序的组件是调用它的对象

我能猜出你是怎么犯这个错误的。当您开始键入函数名时,IDE会自动为您完成它。您接受了这个帮助,但是IDE默认您想要调用函数,并为函数调用提供了括号。但是您不想调用该函数,而是想引用它。这是IDE最令人沮丧的方面之一

因此,您的代码应该是:

DataModule1.AdsTable1.Active := true;
DataModule1.AdsTable2.Open;
DataModule1.DataSource1.OnStateChange := SDIAppForm.datasourceOnStateChange;

事件只是类型为方法的属性

您正在尝试分配此事件属性。但是,您不是简单地将事件处理程序分配给属性,而是调用事件处理程序。此处的代码包含严重错误:

SDIAppForm.datasourceOnStateChange(DataModule1.AdsTable1)
这是对事件处理程序的调用,您根本不想进行调用。属性引用事件处理程序的组件是调用它的对象

我能猜出你是怎么犯这个错误的。当您开始键入函数名时,IDE会自动为您完成它。您接受了这个帮助,但是IDE默认您想要调用函数,并为函数调用提供了括号。但是您不想调用该函数,而是想引用它。这是IDE最令人沮丧的方面之一

因此,您的代码应该是:

DataModule1.AdsTable1.Active := true;
DataModule1.AdsTable2.Open;
DataModule1.DataSource1.OnStateChange := SDIAppForm.datasourceOnStateChange;

您的第二次尝试应该有效(
stateChange:=SDIAppForm.datasourceinstatechange;
DataModule1.DataSource1.OnStateChange:=stateChange;
)因为这两个答案都是正确的。如果未调用该处理程序,那不是因为未分配该处理程序。您的第二次尝试应该可以(
stateChange:=SDIAppForm.datasourceinstatechange;
DataModule1.DataSource1.OnStateChange:=stateChange;
)作为两个答案。如果没有调用处理程序,那不是因为没有分配处理程序。谢谢,谢谢你的responseThanks,谢谢你的responseThanks,谢谢你的responseThanks,谢谢你的responseThanks