ページ 1 / 1
文字カウント
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」に文字数が表示されるようになっています。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Sub MainWnd_EditBox1_Change()
Dim Str As String
Dim S As String
Dim Length As Long
Length = GetWindowTextLength(GetDlgItem(hMainWnd, EditBox1))
Str$ = ZeroString(Length)
GetDlgItemText(hMainWnd, EditBox1, Str, Length)
'文字数取得
S = Str$(LenStr(Str))
'文字数を表示する
SetDlgItemText(hMainWnd2, EditBox1, StrPtr(S))
End Sub
Function LenStr(Str As String) As Long
'* 文字数を返します *
Dim Str2$ As String, Num As Long
'Unicodeに変換後、使用するバイト数の取得
Str2$ = ZeroString(MultiByteToWideChar(0, 0, Str, Len(Str), 0, 0) * 2)
'Unicodeに変換
Num = MultiByteToWideChar(0, 0, Str, Len(Str), StrPtr(Str2$), Len(Str2$))
LenStr = Num '文字数を返す
End Function
Re: 文字カウント
Posted: 2006年7月18日(火) 16:39
by 7
> 文字数をカウント。 (バイト数ではなく)
こういう関数を考えました。 [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Function mb_lstrlen(ByVal lpString As LPCSTR) As Long
Dim cnt=0 As Long
While lpString[cnt]<>0
If IsDBCSLeadByte(lpString[cnt])<>TRUE Then
mb_lstrlen++
End If
cnt++
Wend
End Function
' 使い方
Dim length As Long
' 16が格納されます。
length=mb_lstrlen("HogeFugaPiyoMoko")
' 10が格納されます。
length=mb_lstrlen("あかさたなはまやらわ")
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 を返してくれるんじゃないだろうかと勝手に妄想してました...。
これはどうでしょう? [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Declare Function CharNext Lib "user32" Alias "CharNextA" (
ByVal lpsz As LPCSTR) As LPSTR
Function mb_lstrlen(ByVal lpString As LPCSTR) As Long
Dim lpsz As LPSTR
lpsz=lpString
While lpsz[0]<>0
mb_lstrlen++
lpsz=CharNext(lpsz)
Wend
End Function