我正在尝试将表单中定义的过程分配给数据源的事件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.
我是delphi的新手,我正在学习。我可能还不明白应该做什么。如果有人可以帮我解决这个问题,那将非常有帮助。
Thanks.
答案 0 :(得分:4)
将方法datasourceOnStateChange
分配给DataModule1.DataSource1.OnStateChange
的事件将起作用:
stateChange := SDIAppForm.datasourceOnStateChange;
DataModule1.DataSource1.OnStateChange := stateChange;
可以写成
DataModule1.DataSource1.OnStateChange := SDIAppForm.datasourceOnStateChange;
如果您不需要stateChange
用于其他目的。
SDIAppForm.datasourceOnStateChange(DataModule1.AdsTable1);
是使用DataModule1.AdsTable1
作为发件人的方法的直接调用,而不是它自己的方法。
答案 1 :(得分:2)
事件只是一个类型为方法的属性。
您正尝试分配此事件属性。但是,不是简单地将事件处理程序分配给属性,而是调用事件处理程序。此处的代码包含严重错误:
SDIAppForm.datasourceOnStateChange(DataModule1.AdsTable1)
这是您不想制作的事件处理程序的调用。属性引用事件处理程序的组件是调用它的对象。
我猜你是怎么犯这个错误的。当您开始键入函数的名称时,IDE会为您自动完成它。你接受了这个帮助,但是IDE愚蠢地假设你想要调用函数并为函数调用提供括号。但是你不想调用这个函数,你想要引用它。这是IDE中令人沮丧的方面之一。
所以,你的代码应该是:
DataModule1.AdsTable1.Active := true;
DataModule1.AdsTable2.Open;
DataModule1.DataSource1.OnStateChange := SDIAppForm.datasourceOnStateChange;