ページ 11

文字カウント

Posted: 2006年2月13日(月) 22:20
by そこらのマニア
エディットボックスの文字の数を数えてステータスバーに出力するソースを
教えてください。

Posted: 2006年2月13日(月) 22:42
by hira
バイト数ならばGetWindowTextLength()で取れます(詳細はヘルプ参照)。
純粋に文字数を数えるならば実際にGetWindowText()で文字列を取得し、CharNext()を使うなどしてNULL文字にたどり着くまでカウントします。

後はご自分でコーディングされるとよいでしょう…。

※CharNext()は標準で定義されていません

コード: 全て選択

Declare Function CharNext Lib "user32" Alias "CharNextA" (lpsz As *Byte) As *Byte

Posted: 2006年2月13日(月) 23:03
by ゲスト
エディットボックス内の文字数を知るにはGetWindowTextLengthを使います。
ステータスバーの内容を指定するにはSB_SETTEXTを送ります。
合わせると次のようになります。
(メインウィンドウのハンドルをhMainWnd,エディットボックスのIDをEditBox1,ステータスバーのIDをID_STATUSとしています)

Posted: 2006年2月13日(月) 23:11
by イグトランス
たびたびすみません。上も私です。
ところで純粋に文字数を数えるならの話ですが,crtdll.dllの_mbslenも使えるのではないでしょうか。

Declare Function MbsLen CDECL Lib "crtdll" Alias "_mbslen" (string As *Byte) As SIZE_T

アドバイスをください。

Posted: 2006年2月13日(月) 23:15
by そこらのマニア
str = Str$(GetWindowTextLength(GetDlgItem(hMainWnd, EditBox1))

このコードで↓のような警告がでたのですが、解決するにはどうすればいいですか。

'( )'の相互関係が一致しません

Posted: 2006年2月13日(月) 23:26
by イグトランス
どうみても括弧の数があいませんね。失礼しました。

正しくはこうです。
str = Str$(GetWindowTextLength(GetDlgItem(hMainWnd, EditBox1)))

もう一回お願いします。

Posted: 2006年2月14日(火) 00:25
by ぶりっち
メニューからではなく、コマンドボタンをおして、Windowに移動してその

ウインドウにあるエディットボックスに文字を出力するソースを教えてください。

Posted: 2006年2月14日(火) 22:43
by イグトランス
そこらのマニアさんとぶりっちさんは何の関係ですか?
別人なら紛らわしいので同じトピックを使わず,新たにトピックを作ってください。
同一人物ならやはり紛らわしいので,1つの名前を名乗ってください。

> Windowに移動して
これはどういうことですか?何のウィンドウでしょうか?
ボタンを押すと新たにウィンドウ(ダイアログ)が作成されるのではないかと想像しましたが,
そんな想像で話を進めるわけにもいかないですし。

謝罪。

Posted: 2006年2月15日(水) 00:14
by そこらのマニア
ゴッチャになってすみません。

今後、そこらのマニアしか使いません。

Windowとは、MainWndのことでボタンはMainWnd内に配置されたボタンで
これを押すとMainWnd内に配置されたEditBoxに別のWindowのEditBox
の文字数を表示させると言うことです。

いろいろと迷惑をかけてすみませんでした。
今後ともお世話になりますので、どうぞよろしくお願いいたします。

Posted: 2006年2月16日(木) 15:00
by イグトランス
まずコマンドボタンが押されたらClickイベントが発生します。
つまりこれからのことはClickイベントのハンドラ内に書けばよいということです。
(詳しくはWin32プログラミング講座などを見てください)

次に文字数を数えたいエディットボックスのウィンドウハンドルが必要です。
ちなみにエディットボックスのIDと親のウィンドウハンドルを知っているのであれば
GetDlgItem(親のウィンドウハンドル, エディットボックスのID)と書けばエディットボックスのウィンドウハンドルが分かります。
(ヘルプには「ダイアログボックスのウィンドウハンドル」と書いてありますが,どんなウィンドウでも平気です)
それが無理なら場合によって色々と方法があるので,また聞いてください。

そうして得たウィンドウハンドルを引き数にしてGetWindowTextLength関数を呼べば文字数(バイト数)が分かります。

あとはこれをエディットボックスに表示させます。
それにはSetDlgItemTextと言いたいところですが,GetWindowTextLengthで得たものは数値であり文字列ではありませんからそのままでは使えません。
Str$などで文字列に変換する方法もありますが,ここでは数値のためのSetDlgItemInt関数を使います。

コード: 全て選択

' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
Declare Function SetDlgItemInt Lib "user32.dll" (hDlg As HWND, nIDDlgItem As Long, uValue As DWord, bSinged As Long) As Long 
これを書かないとコンパイルできません

コード: 全て選択

Sub MainWnd_CommandButton1_Click()
	Dim hwndEdit As HWND
	hwndEdit = GetDlgItem(...)
	Dim TextLength As Long
	TextLength = GetWindowTextLength(hwndEdit)
	SetDlgItemInt(hMainWnd, EditBox1, TextLength, TRUE)
End Sub
IDや関数名は違うでしょうから適宜修正してください。

ありがとうございました。

Posted: 2006年2月16日(木) 17:21
by ぶりっち
これが最後のお願いです。

MainWndのEditBox1の内容が書き込まれているのに保存せず終了しようとしたとき保存するかしないか、を表示する

つまりWindows標準仕様のメモ帳と同じような機能です。

ソースまたは情報の投稿をよろしくお願いします。

Posted: 2006年2月16日(木) 22:59
by イグトランス
そのようなことを行うにはMainWndのQueryCloseイベントが最適です。

EM_GETMODIFYをエディットボックスに送ると,内容が変更されているかどうかわかります。
変更されていればMessageBoxで保存するか聞いています。
QueryCloseイベントのハンドラの引数cancelにTRUEを代入すると終了をキャンセルできます。

なお,保存の処理は省かせてもらいました。
例によってIDやMessageBoxで表示する内容は当然適当に書き換えてください。

コード: 全て選択

Sub MainWnd_QueryClose(ByRef cancel As Integer)
	' エディットボックスの内容が変更されているかどうか
	If SendDlgItemMessage(hMainWnd, EditBox1, EM_GETMODIFY, 0, 0) <> FALSE Then
		' 保存するかユーザーに訊く。
		Dim ret As Long
		ret = MessageBox(hMainWnd, "テキストは変更されています。保存しますか?", "", MB_YESNOCANCEL)
		Select Case ret
			Case IDYES
				' ToDo: ここに保存する処理を書く。
			Case IDNO
				Exit Sub
			Case IDCANCEL
				cancel = TRUE
		End Select
	End If
End Sub

エラーがおきました。

Posted: 2006年2月17日(金) 17:29
by ぶりっち
あのソース(メモ帳の終了時の警告と同じ機能)を入れたらエラーが起こったのでメニューから実行できるものをください。

Posted: 2006年2月18日(土) 00:12
by ゲスト
ここは質問をする場所であって他の人にソフトを作らせるところではありません。ですからもう少しご自分で調べてみてはどうでしょう?
(十分調べてからのことでしたら、すみません。)
人に聞くのは楽ですが、自分で調べたほうが知識も付きますし、出来たときの喜びも一入です。

過去ログなども目を通すと、おもしろい発見がたくさんありますよ。

ちょっとえらそうなことを言ってしまいましたが、そういう私はまだまだ自称中級者です。ここのところの受験勉強でストレスが溜まっているのか、
ちょっと荒らしっぽくなってしまい申し訳ありません。

P.S. エラーが出たというだけでは、わかりにくいかもしれないので、どういったエラーが出たのかも書いたほうがいいかもしれません・・・まぁこれは聞き流してくださっても結構です。

エラーについて。

Posted: 2006年2月20日(月) 00:40
by konisi
ゲストsが言うとおり、一口に「エラー」といってもOS側から実行時に指摘されるようなエラーもあればコンパイル時に弾かれるエラーもあるわけで。
具体的なエラーメッセージくらいは載せるようにしましょう。