0

DWS 可以从样品单元调用函数吗?例如:

FExecution.Info.Func['Test.ClickProc'].Call(AParams); (This is not working)

FExecution - IdwsProgramExecution;

脚本代码中声明的函数:

unit Test;
Uses UTestUnit;
procedure TestFunc(LParam: string);
begin
  ShowMessage(LParam);
end;
procedure ClickProc(Sender: TObject);
begin
  ShowMessage('DWS');
end;
var  S: TStringList;
var  btn: TButton;
begin
  btn := TButton.Create(MainForm);
  btn.OnClick := ClickProc;
  btn.Parent(MainForm);
end.

此示例中的 ClickProc。

4

1 回答 1

1

我不认为它可以做到。

调用中的符号查找Info.Func[]不会将名称解析为单元范围和标识符,而是对名为“Test.ClickProc”的符号进行简单查找。但是,由于ClickProc过程符号被命名为“ClickProc”,因此查找找不到它。

我认为也许可以通过符号表手动找到过程符号......

var
  FExecution: IdwsProgramExecution;
  UnitSymbol: TUnitMainSymbol;
  FuncSymbol: TFuncSymbol;
  Info: IInfo;
begin
  ...
  UnitSymbol := FExecution.Prog.UnitMains.Find('Test');
  FuncSymbol := UnitSymbol.Table.FindSymbol('ClickProc', cvPublic) as TFuncSymbol; // Returns nil :-(
  Info := FExecution.Info.FuncBySym[FuncSymbol];
  Info.Call;
  ...

...但是在查阅了“文档”(阅读:研究源代码,逐步使用调试器并反复试验)之后,我得出的结论是,目前无法可靠地完成。可以在众多符号表之一找到“ClickProc”符号,但我无法找到一种可靠的方法来使用单位名称/符号来限定符号。

于 2016-08-30T00:23:47.680 回答