ページ 11

文字カウント

Posted: 2006年7月17日(月) 19:51
by I am 馬鹿
*icrosoft社のWo*dやディスカバーソフトのThe Text のように
文字カウントの機能を入れたいのですがどうすればいいでしょうか。

ソースを教えていただけませんか。

情報

MainWnd の EditBox1 の文字数をカウント。 (バイト数ではなく)
カウントした文字数を別のWindow (例 MainWnd2 )のEditBox1 に表示する。

お願いいたします。

Re: 文字カウント

Posted: 2006年7月17日(月) 20:22
by Sinryow
SendMessage・SendDlgItemMessageのUNICODE版であるSendMessageW・SendDlgItemMessageW関数を使うのがよいかと思います。
Windows 95あたりではうまく動かない可能性がありますが・・・

コード: 全て選択

Declare Function SendMessageW Lib "user32" _
   (hWnd As HWND, _
    Msg As DWord, _
    wParam As WPARAM, _
    lParam As LPARAM) As LONG_PTR

Declare Function SendDlgItemMessageW Lib "user32" _
   (hDlg As HWND, _
    nIDDlgItem As Long, _
    Msg As DWord, _
    wParam As WPARAM, _
    lParam As LPARAM) As LONG_PTR

Dim nChars As DWord, bufChars As String
nChars = SendDlgItemMessageW(hMainWnd, EditBox1, WM_GETTEXTLENGTH, 0, 0)
bufChars = Str$(nChars)
SetDlgItemText(hMainWnd, Static1, StrPtr(bufChars))
※EditBox1の文字数を取得し、Static1にセットするとした。

Posted: 2006年7月17日(月) 22:30
by 卓漏
すでに「MainWnd2」が表示されているときを想定して作りました。
「MainWnd」の「EditBox1」に文字が入力されると、
リアルタイムに「MainWnd2」の「EditBox1」に文字数が表示されるようになっています。

Re: 文字カウント

Posted: 2006年7月18日(火) 16:39
by 7
> 文字数をカウント。 (バイト数ではなく)

Posted: 2006年7月18日(火) 18:56
by situmon
>7さん
この関数だと、たとえば2バイト開始コードが2つ並んでしまうような文字が含まれると
正確にカウントできないと思いますが・・・
やるのであれば以下のようなコードになると思います。

コード: 全て選択


Function mb_lstrlen(ByVal lpString As LPCSTR) As Long 
Dim cnt=0 As Long 
    While lpString[cnt]<>0 
        If IsDBCSLeadByte(lpString[cnt]) = TRUE Then 
             cnt++
        End If 
        mb_lstrlen++
        cnt++ 
    Wend 
End Function 

Posted: 2006年7月18日(火) 21:09
by 7
> この関数だと、たとえば2バイト開始コードが2つ並んでしまうような文字が含まれると
> 正確にカウントできないと思いますが・・・
マジっすか( ̄□ ̄ノ;)ノ
2バイト文字の先頭バイトが2つ並んでる文字の存在すら知りませんでしたし、並んでたとしても後ろが2バイト文字の先頭バイトで、一つ前にも2バイト文字の先頭バイトがある場合、 FALSE を返してくれるんじゃないだろうかと勝手に妄想してました...。