我在DWSUnit中动态创建变量,如下所示:
v := dwsUnit.Variables.Add('c', 'float'); // etc
v.OnWriteVar := writeVar;
v.OnReadVar := readVar;
所有变量都指向相同的事件过程。
问题是我无法弄清楚如何确定哪个变量触发了事件。
该事件只给我一个TprogramInfo结构,但我找不到任何内容来识别实际变量。
如果我在设计时创建了变量,我可以为每个变量创建一个单独的事件,但是当动态创建变量时,这是不可能的。
我在这里遗漏了什么。
我刚刚开始使用DWS并且已经获得了我需要的大部分工作,但是我被困在这里!
答案 0 :(得分: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方法设为虚拟,并提供专门的实现。