从DWScript调用类的过程

时间:2013-10-04 16:28:57

标签: delphi rtti dwscript

如何从主窗体中创建的类调用过程。它可以像这个伪代码一样显示吗?

type
  TDemo = class
    procedure test;
    constructor Create;
    destructor Destroy; override;
  end;

var
  Form28: TForm28;
  Demo:TDemo;

implementation

{$R *.dfm}

procedure TForm28.Button1Click(Sender: TObject);
var
   prog : IdwsProgram;
   exec : IdwsProgramExecution;
begin
   Demo := TDemo.Create;
   prog := DelphiWebScript1.Compile('Demo.Test;');
   exec := prog.Execute;
end;

2 个答案:

答案 0 :(得分:2)

有一个有限的RTTI曝光器和RTTI连接器,它允许通过RTTI访问Delphi类。

然而,这些RTTI工具尚未进行过多次探索,因为大多数Delphi类对于编写脚本并不“安全”。我认为这很容易导致主机崩溃或内存泄漏,因此“原始”Delphi类通常不适合最终用户脚本(即最终用户无法获得错误,您将无法使用提供稳定的调试等)。

TdwsUnit事件处理程序中公开类的手动曝光和强化的替代方法是将类公开为OLE自动化对象,然后可以使用DWScript COM连接器访问它们。然后好处是暴露自动化对象,你通常必须做至少最小的加强与内存泄漏和悬空指针,你的自动化类将可以从其他支持COM的环境访问。

作为RTTI出错的一个例子,考虑一个完全自动管理的VCL类,如TComponent或TCollection,如果你只有原始的RTTI曝光,而不是脚本做类似的事情:

item := myCollection.Add;
myCollection.Clear;
item.Caption := 'hello bug';

将导致主机应用程序中的随机内存覆盖,没有任何安全的方法来通知脚本用户潜在的错误。

即将推出的Delphi ARC编译器可能会提供一种方法来缓解某些类的内存覆盖(尽管不是全部,因为当前为TComponent和其他人实施/规避了ARC的方式)。 Delphi ARC编译器目前也不受支持(出于各种原因,最突出的一个是我目前无法访问它们。)

答案 1 :(得分:1)

为此,首先必须将本机类公开给脚本引擎。看看TdwsUnit组件。它声明了一个与外部代码接口的脚本单元。您可以在表单上删除一个,定义类,定义其方法,并在调用外部例程的OnEval事件上连接事件处理程序。