有时我们需要对易说话编纂框的文本,进行字数统计,方式有良多,但要做到及时统计,要求处置速度够快,(如,代码写在编纂框内容被改变事务下,有两种环境会造当作该事务触发很是快,一是长按粘贴快捷键内容疯狂增添,二是长按退格键,内容几次削减)
本人测试这两种行为触发内容被改变的频率是20多30毫秒摆布,就是说,若是统计字数的子法式执行一次跨越这个时候,法式就会卡顿。
这里列出三个方式及测试,你可按照本身的需要选择。代码数据全数基于编纂框内容被改变事务下测试,并没有效时钟及点击按钮的体例。
东西/原料
- 电脑
- 易说话及相关撑持库(易自带,为便利,可全数勾选)
方式/步调
- 1
一、土法实现
1-1
用易自带最根基的几个号令实现,相对实现简单,字数上限最好在4万以下,仅撑持ANSI编码文本,不撑持Unnicode编码。因为文本在ansi编码下,所有字符转换到全角都占用两个字节,取其长度除2就是字符数。
- 2
1-2 土法代码如下:
.版本 2.撑持库 spec.撑持库 iext
.子法式 笨法子统计字数, , , 用易自带根基号令实现.局部变量 全字数, 文本型, , , 去除了空格、和回车的所有字符数。.局部变量 时候, 整数型
时候 = 取整 (取启动时候 ())全字数 = 到文本 (取整 (取文本长度 (子文本替代 (到全角 (删全数空 (编纂框1.内容)), 到全角 (#换行符), “”, , , 假)) ÷ 2))调试输出 (“用时”, 取整 (取启动时候 () - 时候), “字数”, 全字数)状况条1.置文本 (1, 全字数)
- 3
二、JScript剧本号令 挪用,下面是结果图。
2-1
执行速度快了不少,用正则实现统计中文字数的统计。这个是单线程模式。当然也可以用易的剧本组件来挪用。此法字数不要跨越24万摆布,不然同样会卡顿。
- 4
2-2 JScript剧本号令 代码如下:
.版本 2.撑持库 spec.撑持库 iext
.子法式 取字符串长度.局部变量 JS剧本, 对象, , , JScript.局部变量 时候, 整数型.局部变量 全字数, 文本型.局部变量 中文字数, 文本型
时候 = 取整 (取启动时候 ())JS剧本.建立 (“ScriptControl”, )JS剧本.写属性 (“Language”, “JScript”)JS剧本.数值方式 (“ExecuteStatement”, #JS号令)全字数 = JS剧本.通用方式 (“Run”, “求字数全”, 编纂框1.内容).取文本 ()中文字数 = JS剧本.通用方式 (“Run”, “求字数中文”, 编纂框1.内容).取文本 ()调试输出 (“用时”, 取整 (取启动时候 () - 时候), “字数”, 全字数)状况条1.置文本 (1, 全字数)状况条1.置文本 (3, 中文字数)
需增添个 长文本常量 这里定名为: #JS号令
内容鄙人一步。
- 5
2-3 JScript剧本号令 长文本常量 : #JS号令 内容如下:
function 求字数全(参1){参1=参1.replace(new RegExp(" ","gm"),"") //先删全数空格return 参1.replace(new RegExp("[\n\r]+","gm"),"").length; //再删换行求字数};function 求字数中文(参1)//删去所有非中文求字数。{return 参1.replace(new RegExp("[^\u4e00-\u9fa5]+","gm"),"").length;};function 删除指心猿意马文本(参1,参2) //参数2可所以表达式{return 参1.replace(new RegExp(参2,"gm"),"");};
- 6
三、多线程js体例。
3-1
易在多线程下挪用JS剧本,会没有任何结果,返回空文本或返回0。
解决法子是增添两个dll能解决(CoUninitialize 和 CoInitialize)
运行是正常了,但新问题又来了,多线程当作单线程。
百度是如许诠释这对夫妻DLL(必需配对利用)的:
CoInitialize告诉 Windows以单线程的体例建立com对象。
颠末测试也确实是如许,同时启动多个线执行简单代码,法式立即死失落。
最终,解决法子是,用类模块体例。
插入两个DLL,代码如下:
.版本 2
.DLL号令 卸载COM, , "ole32.dll", "CoUninitialize", , 卸载COM 同加载COM配对利用
.DLL号令 加载COM, , "ole32.dll", "CoInitialize", , 加载COM 告诉 Windows以单线程的体例建立com对象,解决多线程内JS剧本代码无效问题 .参数 pvReserved, 整数型, , 值为0
- 7
3-2
选择易本家儿菜单-插入-类模块 ,点击,并把下面的代码粘贴进方才新建的类模块
注:粘贴前删除两个默认子法式 _初始化 和 _销毁 防止反复。粘贴完点窜一下类名。
代码如下:
.版本 2
.法式集 JS剧本类模块.法式集变量 JS剧本, 对象
.子法式 _初始化, , , 当基于本类的对象被建立后,此方式会被主动挪用,
加载COM (0)JS剧本.建立 (“ScriptControl”, )JS剧本.写属性 (“Language”, “JScript”)
.子法式 _销毁, , , 当基于本类的对象被销毁前,此方式会被主动挪用
JS剧本.断根 ()卸载COM ()
.子法式 剧本说话, 文本型, 公开, 设置或获取剧本引擎诠释的说话,可供选择的属性值:JScript VBScript.参数 说话名, 文本型, 可空, 若是,供给的参数文本,既不等于 JScript 也不等于 VBScript 会设置为 JScript
.判定起头 (是否为空 (说话名) = 真) 返回 (JS剧本.读文本属性 (“Language”, )).默认
.若是真 (说话名 ≠ “JScript” 且 说话名 ≠ “VBScript”) 说话名 = “JScript” .若是真竣事 返回 (到文本 (JS剧本.写属性 (“Language”, 说话名))).判定竣事
.子法式 超时, 整数型, , Timeout,设置或返回时候(毫秒),此时候后用户可选择中止剧本代码的执行或许可代码继续执行。.参数 欲写入属性值, 整数型, 可空, -1 暗示直到执行完才返回。
.判定起头 (是否为空 (欲写入属性值) = 真) 返回 (JS剧本.读数值属性 (“Timeout”, )).默认 返回 (到整数 (JS剧本.写属性 (“Timeout”, 欲写入属性值))).判定竣事
.子法式 错误信息, 对象, 公开, Error 若是剧本执行犯错返回犯错申明。
返回 (JS剧本.读对象型属性 (“Error”, ))
.子法式 剧本执行, 整数型, 公开, ExecuteStatement,返回0为执行正常,返回非0为犯错,错误信息可以从“错误码信息”属性中取得。本号令为初级对象当作员号令。.参数 Statement, 文本型, , 包含要执行的剧本代码,如为空则默认为执行前次的剧本代码。若是剧本代码中包罗函数或过程,执行此方式后可以用“运行”方式来零丁执行。
返回 (JS剧本.数值方式 (“ExecuteStatement”, Statement))
.子法式 剧本运行, 文本型, 公开, Run,若有返回值返回响应文本,不然返回空文本。本号令为初级对象当作员号令。号令参数表中最后一个参数可以被反复添加。.参数 ProcedureName, 文本型, , 所要运行的过程或函数名。.参数 P1, 文本型, 可空, 可以被扩展。.参数 P2, 文本型, 可空.参数 P3, 文本型, 可空.参数 P4, 文本型, 可空.参数 P5, 文本型, 可空.参数 P6, 文本型, 可空.参数 P7, 文本型, 可空.参数 P8, 文本型, 可空
.判定起头 (是否为空 (P1) = 真) 返回 (JS剧本.通用方式 (“Run”, ProcedureName).取文本 ()).判定 (是否为空 (P2) = 真) 返回 (JS剧本.通用方式 (“Run”, ProcedureName, P1).取文本 ()).判定 (是否为空 (P3) = 真) 返回 (JS剧本.通用方式 (“Run”, ProcedureName, P1, P2).取文本 ()).判定 (是否为空 (P4) = 真) 返回 (JS剧本.通用方式 (“Run”, ProcedureName, P1, P2, P3).取文本 ()).判定 (是否为空 (P5) = 真) 返回 (JS剧本.通用方式 (“Run”, ProcedureName, P1, P2, P3, P4).取文本 ()).判定 (是否为空 (P6) = 真) 返回 (JS剧本.通用方式 (“Run”, ProcedureName, P1, P2, P3, P4, P5).取文本 ()).判定 (是否为空 (P7) = 真) 返回 (JS剧本.通用方式 (“Run”, ProcedureName, P1, P2, P3, P4, P5, P6).取文本 ()).判定 (是否为空 (P8) = 真) 返回 (JS剧本.通用方式 (“Run”, ProcedureName, P1, P2, P3, P4, P5, P6, P7).取文本 ()).默认 返回 (JS剧本.通用方式 (“Run”, ProcedureName, P1, P2, P3, P4, P5, P6, P7, P8).取文本 ()).判定竣事
- 8
3-3
建立一个进入许可证,用于多线程标的目的状况条写入字数数据。
建立多线程统计字数子法式,代码如下:
.版本 2.撑持库 spec.撑持库 EThread.撑持库 iext
.子法式 多线程统计字数.局部变量 时候, 整数型.局部变量 文本, 文本型.局部变量 全字数, 文本型, , , 去除了空格、和回车的所有字符数。.局部变量 中文字数, 文本型, , , 只统计纯中文(标点符号也不统计在内).局部变量 剧本, JS剧本类模块
时候 = 取启动时候 ()剧本.剧本执行 (#JS号令)全字数 = 剧本.剧本运行 (“求字数全”, 编纂框1.内容)中文字数 = 剧本.剧本运行 (“求字数中文”, 编纂框1.内容)调试输出 (“用时”, 取整 (取启动时候 () - 时候), “字数”, 全字数)进入许可区 (许可证一字数显示操作) ' 许可证感化:防止多线程在统一时刻,写组件属性(等同于变量)。状况条1.置文本 (1, 全字数)状况条1.置文本 (3, 中文字数)退出许可区 (许可证一字数显示操作)
- 9
在编纂框1.内容被改变 事务下写下代码:
启动线程 (&多线程统计字数, , ) ' 这里并没有供给线程句柄参数,目标是让易内部处置线程句柄。
至此,年夜功乐成。
方式/步调2
- 1
比来有伴侣反映,写出一模一样的法式,却不统计字数,因为我的原法式没了,我试着还原,还确实费了些功夫。
原因是从经验页面复制到易说话窗口,法式会呈现错误,其实就是文本格局以及换行的问题。
我测验考试了一下,复制易代码到记事本,然后再从记事本复制粘贴到经验里边就不会呈现问题。下边我把整个代码用这种方式按几个部门粘贴鄙人面,需要的伴侣可以直接复制到易说话。
把这部门列为第4部门,前面的也不改动了,此部门便利快速成立完整的测试法式。
4-1 界面 这部门无法复制。
如下图
1个编纂框 是否许可多行 设置为真 其它按照本身爱好
3个单选框 用于测试3个方式。
1个状况条 添加6个项目,并将0、2、4项目按下图设置好文字。状况条用于显示测试数据,不建议用调试输出,字数太多的环境下,调试输出会占用过多资本。
- 2
4-2 DLL
插入一条新的DLL, 如 DLL号令1 ,选中它,然后把下面文本粘贴上去。
.版本 2
.DLL号令 卸载COM, , "ole32.dll", "CoUninitialize", , 卸载COM 同加载COM配对利用
.DLL号令 加载COM, , "ole32.dll", "CoInitialize", , 加载COM 告诉 Windows以单线程的体例建立com对象,解决多线程内JS剧本代码无效问题
.参数 pvReserved, 整数型, , 值为0
- 3
4-3 常量 注重事项:不要添加当作通俗常量。
1.进入常量界面,单击右键。并从右键菜单中选择 新长文本常量,建立一个长文本常量。并将常量名更名: JS号令
2.双击 JS号令 常量值部门(此时显示为: <文本长度: 0>)进入:请输入文本窗口。
3.把下边内容粘贴到 请输入文本窗口 确认后主动退出请输入文本窗口。
function 求字数全(参1)
{
参1=参1.replace(new RegExp(" ","gm"),"") //先删全数空格
return 参1.replace(new RegExp("[\n\r]+","gm"),"").length; //再删换行求字数
};
function 求字数中文(参1)//删去所有非中文求字数。
{
return 参1.replace(new RegExp("[^\u4e00-\u9fa5]+","gm"),"").length;
};
function 删除指心猿意马文本(参1,参2) //参数2可所以表达式
{
return 参1.replace(new RegExp(参2,"gm"),"");
};
4.此时,JS号令 常量值部门显示为: <文本长度: 393>
参考下图
- 4
4-4 类模块
1.点击易说话插入菜单,选择 类模块 如: 类1
2.把类1下的两个默认添加的2个方式,_初始化 和 _销毁删除,只留下一个类头部。
3.把类1名称改为: JS剧本类模块
4.因为粘贴不会生当作类当作员,需要自行添加1个类当作员
点击 JS剧本类模块名称位置,然后回车,在私有当作员名输入: JS剧本
类型输入 对象。
4.把下面代码粘贴在 JS剧本类模块 下面 【参考下图:】
.版本 2
.法式集 JS剧本类模块
.子法式 _初始化, , , 当基于本类的对象被建立后,此方式会被主动挪用,
加载COM (0)
JS剧本.建立 (“ScriptControl”, )
JS剧本.写属性 (“Language”, “JScript”)
.子法式 _销毁, , , 当基于本类的对象被销毁前,此方式会被主动挪用
JS剧本.断根 ()
卸载COM ()
.子法式 剧本说话, 文本型, 公开, 设置或获取剧本引擎诠释的说话,可供选择的属性值:JScript VBScript
.参数 说话名, 文本型, 可空, 若是,供给的参数文本,既不等于 JScript 也不等于 VBScript 会设置为 JScript
.判定起头 (是否为空 (说话名) = 真)
返回 (JS剧本.读文本属性 (“Language”, ))
.默认
.若是真 (说话名 ≠ “JScript” 且 说话名 ≠ “VBScript”)
说话名 = “JScript”
.若是真竣事
返回 (到文本 (JS剧本.写属性 (“Language”, 说话名)))
.判定竣事
.子法式 超时, 整数型, , Timeout,设置或返回时候(毫秒),此时候后用户可选择中止剧本代码的执行或许可代码继续执行。
.参数 欲写入属性值, 整数型, 可空, -1 暗示直到执行完才返回。
.判定起头 (是否为空 (欲写入属性值) = 真)
返回 (JS剧本.读数值属性 (“Timeout”, ))
.默认
返回 (到整数 (JS剧本.写属性 (“Timeout”, 欲写入属性值)))
.判定竣事
.子法式 错误信息, 对象, 公开, Error 若是剧本执行犯错返回犯错申明。
返回 (JS剧本.读对象型属性 (“Error”, ))
.子法式 剧本执行, 整数型, 公开, ExecuteStatement,返回0为执行正常,返回非0为犯错,错误信息可以从“错误码信息”属性中取得。本号令为初级对象当作员号令。
.参数 Statement, 文本型, , 包含要执行的剧本代码,如为空则默认为执行前次的剧本代码。若是剧本代码中包罗函数或过程,执行此方式后可以用“运行”方式来零丁执行。
返回 (JS剧本.数值方式 (“ExecuteStatement”, Statement))
.子法式 剧本运行, 文本型, 公开, Run,若有返回值返回响应文本,不然返回空文本。本号令为初级对象当作员号令。号令参数表中最后一个参数可以被反复添加。
.参数 ProcedureName, 文本型, , 所要运行的过程或函数名。
.参数 P1, 文本型, 可空, 可以被扩展。
.参数 P2, 文本型, 可空
.参数 P3, 文本型, 可空
.参数 P4, 文本型, 可空
.参数 P5, 文本型, 可空
.参数 P6, 文本型, 可空
.参数 P7, 文本型, 可空
.参数 P8, 文本型, 可空
.判定起头 (是否为空 (P1) = 真)
返回 (JS剧本.通用方式 (“Run”, ProcedureName, P1).取文本 ())
.判定 (是否为空 (P2) = 真)
返回 (JS剧本.通用方式 (“Run”, ProcedureName, P1, P2).取文本 ())
.判定 (是否为空 (P3) = 真)
返回 (JS剧本.通用方式 (“Run”, ProcedureName, P1, P2, P3).取文本 ())
.判定 (是否为空 (P4) = 真)
返回 (JS剧本.通用方式 (“Run”, ProcedureName, P1, P2, P3, P4).取文本 ())
.判定 (是否为空 (P5) = 真)
返回 (JS剧本.通用方式 (“Run”, ProcedureName, P1, P2, P3, P4, P5).取文本 ())
.判定 (是否为空 (P6) = 真)
返回 (JS剧本.通用方式 (“Run”, ProcedureName, P1, P2, P3, P4, P5, P6).取文本 ())
.判定 (是否为空 (P7) = 真)
返回 (JS剧本.通用方式 (“Run”, ProcedureName, P1, P2, P3, P4, P5, P6, P7).取文本 ())
.默认
返回 (JS剧本.通用方式 (“Run”, ProcedureName, P1, P2, P3, P4, P5, P6, P7, P8).取文本 ())
.判定竣事
- 5
4-5 启动窗口法式集部门
1.进入启动窗口法式集,删除所有内容(包罗启动窗口建立完毕事务子法式),只留一个法式集中的头部。
2.同粘贴模块的私有当作员名一样,法式集的变量名是粘贴不上去的。这里出格申明下,从一个易法式复制粘贴到另一个易法式是完美没有任何问题的。
所以,先自行添加一个法式集变量
变量名:许可证一字数显示操作
类型:整数型 留空默认就是整数型
2.把下面内容粘贴到启动窗口法式集。
.版本 2
.撑持库 EThread
.撑持库 iext
.法式集 窗口法式集_启动窗口
.法式集变量 许可证一字数显示操作, 整数型
.子法式 __启动窗口_建立完毕
许可证一字数显示操作 = 建立进入许可证 ()
.子法式 __启动窗口_将被销毁
删除进入许可证 (许可证一字数显示操作)
.子法式 笨法子统计字数, , , 用易自带根基号令实现.局部变量 全字数, 文本型, , , 去除了空格、和回车的所有字符数。.局部变量 时候, 整数型
.局部变量 全字数, 整数型
.局部变量 时候, 整数型
时候 = 取整 (取启动时候 ())
全字数 = 取整 (取文本长度 (子文本替代 (到全角 (删全数空 (编纂框1.内容)), 到全角 (#换行符), “”, , , 假)) ÷ 2)
状况条1.置文本 (1, 到文本 (全字数))
状况条1.置文本 (5, 到文本 (取整 (取启动时候 () - 时候)))
.子法式 JS计较文本长度
.局部变量 JS剧本, 对象, , , JScript
.局部变量 时候, 整数型
.局部变量 全字数, 文本型
.局部变量 中文字数, 文本型
时候 = 取整 (取启动时候 ())
JS剧本.建立 (“ScriptControl”, )
JS剧本.写属性 (“Language”, “JScript”)
JS剧本.数值方式 (“ExecuteStatement”, #JS号令)
全字数 = JS剧本.通用方式 (“Run”, “求字数全”, 编纂框1.内容).取文本 ()
中文字数 = JS剧本.通用方式 (“Run”, “求字数中文”, 编纂框1.内容).取文本 ()
状况条1.置文本 (1, 全字数)
状况条1.置文本 (3, 中文字数)
状况条1.置文本 (5, 到文本 (取整 (取启动时候 () - 时候)))
.子法式 多线程统计字数
.局部变量 时候, 整数型
.局部变量 文本, 文本型
.局部变量 全字数, 文本型, , , 去除了空格、和回车的所有字符数。
.局部变量 中文字数, 文本型, , , 只统计纯中文(标点符号也不统计在内)
.局部变量 剧本, JS剧本类模块
时候 = 取启动时候 ()
剧本.剧本执行 (#JS号令)
全字数 = 剧本.剧本运行 (“求字数全”, 编纂框1.内容)
中文字数 = 剧本.剧本运行 (“求字数中文”, 编纂框1.内容)
进入许可区 (许可证一字数显示操作) ' 许可证感化:防止多线程在统一时刻,写组件属性(等同于变量)。
状况条1.置文本 (1, 全字数)
状况条1.置文本 (3, 中文字数)
状况条1.置文本 (5, 到文本 (取整 (取启动时候 () - 时候)))
退出许可区 (许可证一字数显示操作)
.子法式 _编纂框1_内容被改变
.判定起头 (单选框土法统计.选中 = 真)
清空状况条 ()
笨法子统计字数 ()
.判定 (单选框JS统计.选中 = 真)
清空状况条 ()
JS计较文本长度 ()
.默认
清空状况条 ()
启动线程 (&多线程统计字数, , )
.判定竣事
.子法式 清空状况条
状况条1.置文本 (1, “”)
状况条1.置文本 (3, “”)
状况条1.置文本 (5, “”)
- 6
好了,测试是OK的
注重事项
- 若是更年夜长度的文本,要实实际时统计字数,只有寻他法了。
- 经测试,代码可以直接粘贴到易说话
来源:百闻(微信/QQ号:9397569),转载请保留出处和链接!
本文链接:https://www.ibaiwen.com/web/230362.html
- 上一篇: 如何使用Excel记账,教你使用excel财务记账系统
- 下一篇: 今日头条怎么搜索找到别人
猜你喜欢
-
监管人员是做什么的(What Regulatory Officer Do)?
-
什么是低度肿瘤(Low-Grade Neoplasm)?
-
面板生成器是做什么的(What Panel Builder Do)?
-
什么是浆液性乳头状腺癌(Serous Papillary Adenocarcinoma)?
-
什么是呼叫中心工作(Call Center Job)?
-
什么是种子疣(What Seed Warts)?
-
念珠菌病有哪些不同的治疗方法(Different Types of Candidiasis Treatment)?
-
事务协调器是做什么的(What Transaction Coordinator Do)?
-
什么是定量免疫球蛋白(Quantitative Immunoglobulin)?
-
我如何成为人才获取专家(Become a Talent Acquisition Specialist)?
- 热门文章
-

faceu激萌怎么把瘦脸开到最大

WB蒙特利尔(WB Montreal)——欧美十大最差视频游戏开发商

迅猛龙(Velociraptor)——欧美史前十大死亡动物

什么是果酱猫(What Marmalade Cats)?

神奇蜘蛛侠2(The Amazing Spider-Man 2)——欧美最佳蜘蛛侠电影

希瑟(Heather)——欧美十大最佳柯南灰歌

奥兹奥斯本(Ozzy Osbourne)——欧美十大高估歌手

《教父》第三部分(The Godfather Part III)——欧美最佳阿尔帕西诺电影

二人梭哈

然后就没有了——阿加莎·克里斯蒂(And Then There Were None - Agatha Christie)——欧美有史以来十大小说
- 热评文章
- 最新评论
-
- 最近访客
-
- 站点信息
-
- 文章总数:285367
- 页面总数:9
- 分类总数:1
- 标签总数:0
- 评论总数:0
- 浏览总数:142187










