有時我們需要對易說話編纂框的文本,進行字數統計,方式有良多,但要做到及時統計,要求處置速度夠快,(如,代碼寫在編纂框內容被改變事務下,有兩種環境會造當作該事務觸發很是快,一是長按粘貼快捷鍵內容瘋狂增添,二是長按退格鍵,內容幾次削減)
本人測試這兩種行為觸發內容被改變的頻率是20多30毫秒擺布,就是說,若是統計字數的子法式執行一次跨越這個時候,法式就會卡頓。
這里列出三個方式及測試,你可按照本身的需要選擇。代碼數據全數基于編纂框內容被改變事務下測試,并沒有效時鐘及點擊按鈕的體例。
一、土法實現
1-1
用易自帶最根基的幾個號令實現,相對實現簡單,字數上限最好在4萬以下,僅撐持ANSI編碼文本,不撐持Unnicode編碼。因為文本在ansi編碼下,所有字符轉換到全角都占用兩個字節,取其長度除2就是字符數。
 1-2 土法代碼如下:
.版本 2.撐持庫 spec.撐持庫 iext
.子法式 笨法子統計字數, , , 用易自帶根基號令實現.局部變量 全字數, 文本型, , , 去除了空格、和回車的所有字符數。.局部變量 時候, 整數型
時候 = 取整 (取啟動時候 ())全字數 = 到文本 (取整 (取文本長度 (子文本替代 (到全角 (刪全數空 (編纂框1.內容)), 到全角 (#換行符), “”, , , 假)) ÷ 2))調試輸出 (“用時”, 取整 (取啟動時候 () - 時候), “字數”, 全字數)狀況條1.置文本 (1, 全字數)
 二、JScript劇本號令 挪用,下面是結果圖。
2-1
執行速度快了不少,用正則實現統計中文字數的統計。這個是單線程模式。當然也可以用易的劇本組件來挪用。此法字數不要跨越24萬擺布,不然同樣會卡頓。
 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號令
內容鄙人一步。
 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"),"");};
 三、多線程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
 
 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).取文本 ()).判定竣事
 3-3
建立一個進入許可證,用于多線程標的目的狀況條寫入字數數據。
建立多線程統計字數子法式,代碼如下:
.版本 2.撐持庫 spec.撐持庫 EThread.撐持庫 iext
.子法式 多線程統計字數.局部變量 時候, 整數型.局部變量 文本, 文本型.局部變量 全字數, 文本型, , , 去除了空格、和回車的所有字符數。.局部變量 中文字數, 文本型, , , 只統計純中文(標點符號也不統計在內).局部變量 劇本, JS劇本類模塊
時候 = 取啟動時候 ()劇本.劇本執行 (#JS號令)全字數 = 劇本.劇本運行 (“求字數全”, 編纂框1.內容)中文字數 = 劇本.劇本運行 (“求字數中文”, 編纂框1.內容)調試輸出 (“用時”, 取整 (取啟動時候 () - 時候), “字數”, 全字數)進入許可區 (許可證一字數顯示操作) ' 許可證感化:防止多線程在統一時刻,寫組件屬性(等同于變量)。狀況條1.置文本 (1, 全字數)狀況條1.置文本 (3, 中文字數)退出許可區 (許可證一字數顯示操作)
 
 在編纂框1.內容被改變 事務下寫下代碼:
啟動線程 (&多線程統計字數, , ) ' 這里并沒有供給線程句柄參數,目標是讓易內部處置線程句柄。
至此,年夜功樂成。
比來有伴侶反映,寫出一模一樣的法式,卻不統計字數,因為我的原法式沒了,我試著還原,還確實費了些功夫。
原因是從經驗頁面復制到易說話窗口,法式會呈現錯誤,其實就是文本格局以及換行的問題。
我測驗考試了一下,復制易代碼到記事本,然后再從記事本復制粘貼到經驗里邊就不會呈現問題。下邊我把整個代碼用這種方式按幾個部門粘貼鄙人面,需要的伴侶可以直接復制到易說話。
把這部門列為第4部門,前面的也不改動了,此部門便利快速成立完整的測試法式。
4-1 界面 這部門無法復制。
如下圖
1個編纂框 是否許可多行 設置為真 其它按照本身愛好
3個單選框 用于測試3個方式。
1個狀況條 添加6個項目,并將0、2、4項目按下圖設置好文字。狀況條用于顯示測試數據,不建議用調試輸出,字數太多的環境下,調試輸出會占用過多資本。
 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
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 類模塊
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).取文本 ())
.判定竣事
 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, “”)
好了,測試是OK的
0 篇文章
如果覺得我的文章對您有用,請隨意打賞。你的支持將鼓勵我繼續創作!