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

时间:2013-08-16 04:48:21

标签: 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'和'过程,无类型指针或无类型参数'

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.

2 个答案:

答案 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;