3

我在 DWSUnit 中动态创建变量,如下所示:

v := dwsUnit.Variables.Add('c', 'float'); // etc
v.OnWriteVar := writeVar;
v.OnReadVar := readVar;

所有变量都指向同一个事件过程。

问题是我不知道如何确定哪个变量触发了事件。

该事件只给了我一个 TprogramInfo 结构,但我在其中找不到任何东西来识别实际变量。

如果我在设计时创建了变量,我可以为每个变量设置一个单独的事件,但是当动态创建变量时这是不可能的。

我在这里错过了什么吗?

我才刚刚开始使用 DWS 并且已经得到了我需要的大部分工作,但我被困在这里!

4

1 回答 1

2

你应该有一个附加到变量的事件。如果您正在动态创建它们并希望跟踪变量,您可以将事件移动到一个类,创建该类并将其用于事件,例如

type
   TVariableEventHandler = class
      Name : String; // store variable name here (or better, something more relevant)
      procedure DoWrite(info: TProgramInfo; var value : Variant);
      procedure DoRead(info: TProgramInfo; const value : Variant);
   end;

然后在声明变量时

handler := TVariableEventHandler.Create; 
handler.Name := 'c'; // etc
v := dwsUnit.Variables.Add('c', 'float'); // etc
v.OnWriteVar := handler.DoWrite;
v.OnReadVar := handler.DoRead;

实际上,与其将 Name 存储在处理程序实例中,不如存储对您真正公开的任何内容的更直接引用可能会更好。

您还可以将处理程序的 DoWrite/DoRead 方法设为虚拟,并提供专门的实现。

于 2013-05-21T12:04:02.407 回答