• <noscript id="ecgc0"><kbd id="ecgc0"></kbd></noscript>
    <menu id="ecgc0"></menu>
  • <tt id="ecgc0"></tt>

    易語言快速統計編輯框字數

    有時我們需要對易說話編纂框的文本,進行字數統計,方式有良多,但要做到及時統計,要求處置速度夠快,(如,代碼寫在編纂框內容被改變事務下,有兩種環境會造當作該事務觸發很是快,一是長按粘貼快捷鍵內容瘋狂增添,二是長按退格鍵,內容幾次削減)

    本人測試這兩種行為觸發內容被改變的頻率是20多30毫秒擺布,就是說,若是統計字數的子法式執行一次跨越這個時候,法式就會卡頓。

    這里列出三個方式及測試,你可按照本身的需要選擇。代碼數據全數基于編纂框內容被改變事務下測試,并沒有效時鐘及點擊按鈕的體例。

    東西/原料

    • 電腦
    • 易說話及相關撐持庫(易自帶,為便利,可全數勾選)

    方式/步調

    1. 1

      一、土法實現

      1-1

      用易自帶最根基的幾個號令實現,相對實現簡單,字數上限最好在4萬以下,僅撐持ANSI編碼文本,不撐持Unnicode編碼。因為文本在ansi編碼下,所有字符轉換到全角都占用兩個字節,取其長度除2就是字符數。

       

    2. 2

      1-2 土法代碼如下:

      .版本 2.撐持庫 spec.撐持庫 iext

      .子法式 笨法子統計字數, , , 用易自帶根基號令實現.局部變量 全字數, 文本型, , , 去除了空格、和回車的所有字符數。.局部變量 時候, 整數型

      時候 = 取整 (取啟動時候 ())全字數 = 到文本 (取整 (取文本長度 (子文本替代 (到全角 (刪全數空 (編纂框1.內容)), 到全角 (#換行符), “”, , , 假)) ÷ 2))調試輸出 (“用時”, 取整 (取啟動時候 () - 時候), “字數”, 全字數)狀況條1.置文本 (1, 全字數)

    3. 3

      二、JScript劇本號令 挪用,下面是結果圖。

      2-1

      執行速度快了不少,用正則實現統計中文字數的統計。這個是單線程模式。當然也可以用易的劇本組件來挪用。此法字數不要跨越24萬擺布,不然同樣會卡頓。

    4. 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. 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. 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. 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. 8

      3-3

      建立一個進入許可證,用于多線程標的目的狀況條寫入字數數據。

      建立多線程統計字數子法式,代碼如下:

      .版本 2.撐持庫 spec.撐持庫 EThread.撐持庫 iext

      .子法式 多線程統計字數.局部變量 時候, 整數型.局部變量 文本, 文本型.局部變量 全字數, 文本型, , , 去除了空格、和回車的所有字符數。.局部變量 中文字數, 文本型, , , 只統計純中文(標點符號也不統計在內).局部變量 劇本, JS劇本類模塊

      時候 = 取啟動時候 ()劇本.劇本執行 (#JS號令)全字數 = 劇本.劇本運行 (“求字數全”, 編纂框1.內容)中文字數 = 劇本.劇本運行 (“求字數中文”, 編纂框1.內容)調試輸出 (“用時”, 取整 (取啟動時候 () - 時候), “字數”, 全字數)進入許可區 (許可證一字數顯示操作)  ' 許可證感化:防止多線程在統一時刻,寫組件屬性(等同于變量)。狀況條1.置文本 (1, 全字數)狀況條1.置文本 (3, 中文字數)退出許可區 (許可證一字數顯示操作)

    9. 9

      在編纂框1.內容被改變  事務下寫下代碼:

      啟動線程 (&多線程統計字數, , )  ' 這里并沒有供給線程句柄參數,目標是讓易內部處置線程句柄。

       

      至此,年夜功樂成。

    方式/步調2

    1. 1

      比來有伴侶反映,寫出一模一樣的法式,卻不統計字數,因為我的原法式沒了,我試著還原,還確實費了些功夫。

      原因是從經驗頁面復制到易說話窗口,法式會呈現錯誤,其實就是文本格局以及換行的問題。

      我測驗考試了一下,復制易代碼到記事本,然后再從記事本復制粘貼到經驗里邊就不會呈現問題。下邊我把整個代碼用這種方式按幾個部門粘貼鄙人面,需要的伴侶可以直接復制到易說話。

      把這部門列為第4部門,前面的也不改動了,此部門便利快速成立完整的測試法式。

      4-1  界面 這部門無法復制。

      如下圖

      1個編纂框  是否許可多行 設置為真  其它按照本身愛好

      3個單選框  用于測試3個方式。

      1個狀況條 添加6個項目,并將0、2、4項目按下圖設置好文字。狀況條用于顯示測試數據,不建議用調試輸出,字數太多的環境下,調試輸出會占用過多資本。

    2. 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. 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-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. 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. 6

      好了,測試是OK的

    注重事項

    • 若是更年夜長度的文本,要實實際時統計字數,只有尋他法了。
    • 經測試,代碼可以直接粘貼到易說話
    • 發表于 2018-07-07 00:00
    • 閱讀 ( 965 )
    • 分類:其他類型

    你可能感興趣的文章

    相關問題

    0 條評論

    請先 登錄 后評論
    聯系我們:uytrv@hotmail.com 問答工具
  • <noscript id="ecgc0"><kbd id="ecgc0"></kbd></noscript>
    <menu id="ecgc0"></menu>
  • <tt id="ecgc0"></tt>
    久久久久精品国产麻豆