问题标签 [dwscript]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
460 浏览

delphi - 如何安装最新的 Subversion 版本的 DWScript?

DWScript 的最新预览版是两年前的10 月,由于该项目处于活动状态并且我想在 XE7 中使用它,我想我会查看最新的源代码(在撰写本文时为 r2653)并从中安装. 最新的看起来很合理:没有大量的代码搅动,XE7 支持只是在两个修订版之前添加的。

主要问题是:存在三个 .BPK:dwsLib、dwsLibRuntime 和 dwsLibDesignOnly。这些似乎具有循环依赖关系。dwsLib 需要 dwsLibRuntime。dwsLibDesignOnly 也可以。但是,dwsLib 和 dwsLibRuntime 打开时会出现许多错误:“找不到类 TdwsUnit。” 换句话说,它们似乎都依赖于已经安装的设计时包。

此外,还有一些奇怪的事情,例如没有项目 - 只有 .BPK 文件 - 不是问题,但它标志着最后一个“如何安装”答案(XE3)非常过时。另一个问题(XE2 时代)说要编译,尽管“找不到类 TdwsUnit”消息,但是如何提供正确的结果?但是,继续为运行时包执行此操作会导致找不到文件 dwsWebUtils.pas;这不在 Source 文件夹中。在 ..\Libraries\SimpleServer 中有一个同名文件,但项目管理器中显示的不存在 dwsWebUtils.pas 的路径表明这可能不是同一个文件。如果是,它不在项目路径中,它是唯一需要的非源文件。

总结一下:

  • 有三个包而不是正常的两个(不是问题,但在没有解释性文档的情况下会增加混乱)
  • DPK 具有奇怪的依赖关系,并且似乎会导致循环引用:根依赖项 (dswLib) 需要设计时包,如果没有运行时包就无法安装,它缺少设计时间类并需要 lib 包,其中.. .
  • 对于不在 Source 文件夹中的文件,忽略缺少的类错误编译运行时包会导致缺少文件错误。根据那里的路径,有一个三个文件夹,但它不是项目管理器中提到的那个。
  • 没有回答这些问题的安装文档,也没有构建脚本或类似的东西。

通常我会觉得问如何安装组件或库有点傻,但是在上面我感到有点困惑。其他两个问题似乎都不正确,即使我在缺少类的情况下进行编译,它似乎也不会提供完整/正确的安装。那么 - 你如何安装?

编辑:下面的评论者说,“我不知道你在哪里找到了你所指的 .bpk 文件。” 他们来了:

三个 DWS BPK 文件

可以看到,一共有三个,一个dwsLib,一个dwsRuntime,一个dwsDesigntimeOnly。

0 投票
0 回答
112 浏览

delphi - DWScript 在外部 TForm 实例上设置 TFormStyle 属性

我尝试在使用 TdwsRTTIConnector 和函数“注入”到脚本中的 TForm 实例上设置一些属性:

下一个脚本工作正常,除了f.FormStyle := 2;行 ,得到错误“无效的类类型转换”

如何设置 FormStyle 或 BorderStyle 等枚举属性

谢谢

0 投票
1 回答
369 浏览

delphi - 在dwscript中使用/注入Delphi实现的接口实例

我有一个我想以这种方式使用的接口(实际上是多个接口):

  • 使在 dwscript 脚本中声明接口的单元可用(如果需要)。

  • 在用 Delphi 编写的主机应用程序中创建实现接口的对象。

  • 以某种方式使这些接口可用于 dwscript 脚本。

  • 并在脚本中正常使用它们。

有没有可能这样做?

我试图在一个类中提供返回这些接口的方法,但是当我在 RTTI 上使用这个类时,那些找不到的方法。

0 投票
1 回答
1919 浏览

delphi - 如何声明从具有过程类型参数的脚本调用的 Delphi 对象的方法

让 Delphi 应用程序运行 DWS 脚本。Delphi 应用程序向脚本公开了一个对象实例,我们称之为“MyApplication”。暴露的对象有一个方法,它的一个参数是一个过程。

从根本上讲,目标是让 Delphi 方法进行一些计算,并在回调过程说完成时停止计算。回调过程在脚本内部。

我通过将回调函数的名称作为字符串传递来实现这一点。它工作得很好,只是在脚本编译时不进行类型检查。我想传递一个实际的过程,以便脚本编译器可以在编译时捕获任何错误。

怎么做?

为了帮助读者理解我的意思,我展示了一些 - 不起作用 - 代码:

首先是Delphi 端的简化版本:

其次,在脚本方面我有这个(也简化了):

Demo 方法参数很可能应该以不同的方式声明,并且应该以不同的方式调用。就是那个问题...

编辑:删除了额外的 Tag 参数(简化代码时出错,这不是问题)。

0 投票
0 回答
202 浏览

delphi - DWScript 是完全线程安全的吗?

Threaded script ExecuteDWScript thread safe对这种情况不是很清楚:

脚本在工作线程的上下文中运行。当脚本函数正在执行时,由工作线程调用,它调用 Delphi 代码进行一些处理。此处理使用 IPC 与另一个线程(实际上是主线程)通信,该线程最终将调用同一脚本中的过程。这很好用,至少从我进行的简单测试来看。但这真的允许吗?

0 投票
1 回答
508 浏览

delphi - DWScript:传递一组枚举类型将传递一个整数数组

从 DWScript 脚本中,我调用 Delphi 端公开的对象实例的方法。除其他外,该方法采用一个参数,该参数是一组枚举数据类型。这个枚举数据类型从 Delphi 公开给脚本。

我从脚本编译时生成的错误消息中看到,DWScript 将这样的参数作为整数数组传递,并且 Delphi 端接收变量数组(TData)。

我不得不在 Delphi 端编写一个包装器,它循环遍历数组并重建相应的变量集以将其传递给实际的 Delphi 函数。使用“ProgramInfo.Vars['MsgFlags'].GetData”访问数组。

这工作得很好,但这是正确的做法吗?我错过了什么?

脚本端代码:

德尔福端代码:

0 投票
1 回答
408 浏览

delphi - DWScript:从 Delphi 函数向脚本公开和返回对象?

在我的 Delphi (2010) 代码中,我有一个 TImageItem 类,我通过以下方式向 DWScript 公开了它:

在 dwsUnit 中,我声明了一个从 Delphi 端获取 TImageItem 的函数:

在德尔福方面:

但是,当我运行以下脚本时:

我在 GetImage 调用期间收到 EScriptError 消息“对象已销毁”。

我究竟做错了什么?我是在暴露对象还是错误地返回它?

0 投票
0 回答
114 浏览

delphi - DWScript:TdwsFileNotifier 中可能存在的错误

在过程 TdwsFileNotifier.Execute 中,当 ReadDirectoryChanges 调用失败时,通过调用 Terminate 来终止线程,但不会立即退出循环。IMO 应该在终止后立即休息,如下所示:

0 投票
1 回答
289 浏览

delphi - 如何检查 DWScript FileCreate 函数的返回值?

使用 DWScript,我看不到检查 FileCreate 函数返回值的明显方法。

示例(不工作)脚本:

从 DWScript 源代码中提取:

如您所见,在内部调用了 Delphi CreateFile,失败时结果值为 -1。此数值将转换为 IdwsFileHandle。

0 投票
1 回答
357 浏览

delphi - 是否可以使用 DWScript 创建 Read-eval-print 循环 (REPL)?

我正在尝试使用 DWScript 创建一个读取-评估-打印循环 (REPL),但我不确定这是否可行。

根据名称,我认为RecompileInContext在这种情况下可以正常工作,但我遇到了一些限制:

  • 程序中永远包含有错误的行:将来的运行将始终由于该行而失败
  • 我没有找到一种方法来简单地通过键入来输出变量的值。例如,当键入var test = "content";then时testcontent应显示。据我所知,使用printprintln无法工作,因为它们将在每次运行时执行

所以我的问题是:是否可以使用 DWScript 创建 REPL ?

这是我到目前为止所得到的: