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