问题标签 [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.
delphi - 为什么我调用 DWScript 的 ExposeClassToUnit 时方法调用不起作用?
当暴露一个宿主类并从中调用一个过程时,我得到了这个异常:
第一次机会例外,$7513C41F。异常类 ECompileError 带有消息“没有名称为“GetUnitCount”的可访问成员”。处理 Project23.exe (12832)
如何解决这个问题?我正在使用来自 SVN 的最新版本。
delphi - DWScript: How to read a meta class parameter from Delphi side
I'm having trouble using meta classes in DWScript.
We are using scripting to enable VARs and end users to customize our application.
Our application data basically consist of a lot of small objects in a tree structure. Each object can either be "dumb" in that it just displays data or it can be intelligent in some way. The intelligence is implemented with scripting by associating different script classes with the tree objects.
The problem I'm having is that the script needs to communicate to the Delphi side framework what script class it should use to implement the object. Basically I need to pass a script meta class to the Delphi side and store the information there in a format that can be safely persisted (by type name, as a string probably). I also need to be able to go the other way; I.e. return the meta class to the script from the Delphi side.
TdwsUnit declaration
The script
Delphi implementation
Declaration of the meta class, TItemClass
. Done in TdwsUnit.OnAfterInitUnitTable
.
RegisterItemClass
implementation
So the question is How does one get a TSymbol from a meta class parameter?
Edit: I found the answer to one part of the problem in this old question.
In short the solution is to cast the parameter value to a TSymbol
:
However...
Now assuming that I store the class name as a string. How do I get from this class name back to a symbol? I need this because, just as the script can set the item class (using the code above), the script can also ask for an items' class.
I have tried looking in the symbol table with any of the four different methods that seem to do what I need but none of them can find the symbol.
So the question is Given the name of meta class, declared in script, how does one get the corresponding TSymbol from the Delphi side?
Edit: I have now found one possible solution to the last part.
The following seems to work but I'm unsure if that is the correct way to do it. I would have thought that I would need to limit the scope of the symbol search to the current script unit.
dwscript - DWScript 写/读一个简单的文本文件
我想使用 dwscript 编写/读取一个简单的文本文件。我的代码在下面……但我无法运行它,请有人帮忙……:(我正在使用 DWS 安装的 Demos 文件夹中的 Simple.exe)
delphi - 在 DWSWebServer 中使用脚本 RTTI
目前我正在使用 DWSWebServer。我真的很喜欢用帕斯卡风格的语言编写动态网站的想法。现在我想使用 script-side-RTTI 实现一个简单的 ORM。但是脚本编译器不知道任何 RTTI 函数或类。
例如,如果我尝试以下代码:
我会得到:
我已经成功编译了最新版本的网络服务器,那么 RTTI 支持是否需要一些选项或缺少库?
谢谢你的帮助
delphi - DWScript、Monkey Patching:在运行时添加方法或属性
目前我为 DWScript + SQLite 编写了一个 ORM 映射。我已经成功实现了普通属性(如字符串或整数)的映射,但现在我想添加外键和多对多关系。为此,我计划在 A 类中声明外键属性,然后在运行时向 B 类添加一个关系管理器,以对关系进行建模。我知道我可以将关系管理器放在源代码的 B 类中,但想象一下,如果我的应用程序中有一些模型具有用户模型的外键,并在框架中声明。为每个新应用程序修改框架是不切实际的。
我的问题:如何在脚本运行时向对象/类添加新属性、字段或函数?
这里有一些解释代码:
delphi - 记录属性的 DWScript 设置器
我的问题很简单。我有一个具有以下代码的 dwsUnit:
在 mc.Position.X(或 Position.Y 或 Z)我得到:
这是什么意思?如果是属性,记录是只读的吗?以及我如何从 Delphi Side 访问它。(第二个问题,没什么大不了的)
delphi - 从魔术函数传递对象
我需要在 dwscript 中使用 TStringList。
在编译的delphi代码中,我同时使用
和
其中 genSL 创建并填充 TStringList。
我想在 dwscript 中使用它,但我无法从 genSL 返回 TStringList。
显然有两种方法。
1 使用 RTTI
在德尔福我写
并在回调中
这确实允许我将外部创建的 TStringList 传递到脚本中。
问题:在脚本中,我需要将列表声明为 RTTIVariant。
这是一种误导,因为它实际上是一个 TStringList (我也想使用现有代码而不进行修改)。我更愿意在脚本中将 List 声明为 TStringList。
2 将 TStringList 暴露给 dwsUnit
在德尔福我写
在脚本中,我可以创建和使用 TStringList。
但我不能声明一个返回 TStringList-y 的魔法函数
德尔福代码:
和脚本代码:
问题:这将中止脚本编译,语法错误:不兼容的类型:无法将“TStringList”分配给“TStringList”
我想我错过了一些东西。什么是必要的
- 将对象声明为 RTTIVariant 以外的其他对象以将对象传递给它
或者
- 引入一种类型以便可以将其传递到脚本中?
我在 2013-07 年使用带有 dwscript-svn 的 Delphi 2010(最近的 svn 没有在 d2010 中编译)。任何建议表示赞赏。
json - 为什么多线程内存分配/释放密集型应用程序不随线程数扩展?
注意:
原帖标题
为什么来自 DWScript 的多线程 JSON 解析器不随线程数扩展?
已更改,因为此问题与使用 DWScript 处理 JSON 数据无关。问题出在 Delphi XE2 到 XE7 的默认内存管理器中(测试为 XE2 和试用 XE7),但问题首先出现在此类应用程序中。
我有在 Delphi XE2 中处理 JSON 数据的多线程 Win32/Win64 vcl 应用程序。
每个线程使用 DWScript 解析 JSON 数据TdwsJSONValue.ParseString(sJSON)
,使用 DWScript 方法读取值并将结果存储为记录。
出于测试目的,我在每个线程中处理相同的 JSON 数据。
单次线程运行需要N
几秒钟的时间来处理数据。将线程数增加到M
线性(大约M * N
)会增加处理相同数据所需的单个线程内的时间。
结果没有速度提高。此应用程序的其他部分(JSON 数据传输、在目标环境中存储结果) - 按预期扩展。
可能是什么原因?任何想法表示赞赏。
补充资料:
在 Win7/32 和 Win7/64、Win8/64 从 2 核到 12 核(w/w-out HT)系统上测试
DWScript 被选为最快的可用(测试了一堆,其中:Superobject,内置 Delphi)。SO 的行为类似于来自 DWS 的 JSON 单元。
下面是说明问题的完整控制台应用程序。要运行它,我们需要此处提供的示例 json 数据:https ://www.dropbox.com/s/4iuv87ytpcdugk6/json1.zip?dl=0此文件包含
json1.dat
第一个线程的数据。对于多达 16 个线程,只需将 json1.dat 复制到 json2.dat...json16.dat。程序和数据应该在同一个文件夹中。运行:convert.exe N,其中 N 是线程数。
程序以毫秒为单位将执行时间写入 stout - 在线程中花费的时间、解析数据的时间和释放(销毁)TdwsJSONValue 对象的时间。声明
_dwsjvData.Destroy;
不缩放。
delphi - 如何安装 DWScript
我正在尝试将 DWScript 安装到 Delphi XE4 中:(我确实将包文件复制到 DelphiXE4 文件夹并将包后缀属性更改为 XE4 ...)
在 packages 文件夹中有 3 个文件:
我设法安装了 dwsLibRuntime,然后安装了 dwsLib(尽管我收到了一些我忽略的警告),但是在尝试安装 dwsLibDesignOnly 时遇到了问题。
是要同时安装 dwsLib.dpk 和 dwsLibDesignOnly.dpk,还是只安装其中一个?(它们都引用了相同的寄存器单元,所以看起来应该只安装一个)。
delphi - DWScript:从 IScriptObj 到 IInfo 或 TProgramInfo
给定一个IScriptObj
参考,如何获得相应的IInfo
or TProgramInfo
?
我有一个包装 Delphi 对象的脚本对象。
为了管理脚本对象的生命周期,Delphi 对象存储了对脚本对象的引用。Script 对象是用一个TdwsUnit
组件声明的。这是非常标准的,是这样的:
德尔福
脚本
Delphi 对象的实例化和 Delphi/脚本链接的设置发生在脚本对象构造函数的 Delphi 实现中。也很标准:
德尔福
理想情况下,我会保存IInfo
引用,而不是IScriptObj
因为之后IInfo
会做我需要的一切,但从经验来看,该IInfo
对象似乎只在方法调用期间有效。
无论如何,稍后在TDelphiObject.DoSomething
Delphi 端调用时会出现问题。
TDelphiObject.DoSomething
旨在调用脚本对象上相应的虚拟方法:
德尔福
我尝试了很多不同的技术来获得可用的IInfo
或TProgramInfo
从存储的IScriptObj
,但每件事都失败了。那么这样做的正确方法是什么?