1

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

2 回答 2

4

将方法分配给将起作用datasourceOnStateChange的事件:DataModule1.DataSource1.OnStateChange

   stateChange := SDIAppForm.datasourceOnStateChange;
   DataModule1.DataSource1.OnStateChange := stateChange;

可以写成

DataModule1.DataSource1.OnStateChange := SDIAppForm.datasourceOnStateChange;

如果您不需要stateChange其他用途。

SDIAppForm.datasourceOnStateChange(DataModule1.AdsTable1);

是直接调用DataModule1.AdsTable1作为 Sender 的方法,而不是它自己的方法。

于 2013-08-16T05:41:59.187 回答
2

事件只是一个属性,其类型是方法。

您正在尝试分配此事件属性。但不是简单地事件处理程序分配给属性,而是调用事件处理程序。此处的代码包含严重错误:

SDIAppForm.datasourceOnStateChange(DataModule1.AdsTable1)

这是您根本不想进行的事件处理程序的调用。其属性引用事件处理程序的组件是调用它的对象。

我能猜到你是怎么犯这个错误的。当您开始输入函数名称时,IDE 会自动为您完成。您接受了此帮助,但随后 IDE 愚蠢地假设您想要调用该函数并为函数调用提供括号。但是你不想调用这个函数,你想引用它。这是 IDE 更令人沮丧的方面之一。

所以,你的代码应该是:

DataModule1.AdsTable1.Active := true;
DataModule1.AdsTable2.Open;
DataModule1.DataSource1.OnStateChange := SDIAppForm.datasourceOnStateChange;
于 2013-08-16T06:57:33.003 回答