我正试图将表单中定义的过程分配给数据源的事件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"one_answers"过程、非类型化指针或非类型化参数"
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.
将方法datasourceOnStateChange
分配给DataModule1.DataSource1.OnStateChange
的事件将起作用:
stateChange := SDIAppForm.datasourceOnStateChange;
DataModule1.DataSource1.OnStateChange := stateChange;
可以写成
DataModule1.DataSource1.OnStateChange := SDIAppForm.datasourceOnStateChange;
如果您不需要stateChange
用于其他目的。
SDIAppForm.datasourceOnStateChange(DataModule1.AdsTable1);
是以DataModule1.AdsTable1
作为Sender的方法的直接调用,而不是其自身的方法。
事件只是一个类型为方法的属性。
您正在尝试分配此事件属性。但是,与其简单地将事件处理程序分配给属性,不如调用事件处理程序。此代码包含关键错误:
SDIAppForm.datasourceOnStateChange(DataModule1.AdsTable1)
这是对事件处理程序的调用,您根本不想这样做。属性引用事件处理程序的组件是调用它的对象。
我能猜出你是怎么犯这个错误的。当您开始键入函数的名称时,IDE会为您自动完成它。您接受了这个帮助,但IDE愚蠢地认为您想调用该函数,并为函数调用提供了括号。但是你不想调用这个函数,你想引用它。这是IDE中最令人沮丧的方面之一。
所以,你的代码应该是:
DataModule1.AdsTable1.Active := true;
DataModule1.AdsTable2.Open;
DataModule1.DataSource1.OnStateChange := SDIAppForm.datasourceOnStateChange;