在delphi中将一个表单中的过程分配给一个通知事件



我正试图将表单中定义的过程分配给数据源的事件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;

相关内容

最新更新