如何从主窗体中创建的类调用过程。它可以像这个伪代码一样显示吗?
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;
答案 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
事件上连接事件处理程序。