文字カウント

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
そこらのマニア

文字カウント

#1 投稿記事 by そこらのマニア »

エディットボックスの文字の数を数えてステータスバーに出力するソースを
教えてください。
hira
記事: 203
登録日時: 2005年5月31日(火) 20:14
お住まい: 兵庫県
連絡する:

#2 投稿記事 by hira »

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

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

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

コード: 全て選択

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

#3 投稿記事 by ゲスト »

エディットボックス内の文字数を知るにはGetWindowTextLengthを使います。
ステータスバーの内容を指定するにはSB_SETTEXTを送ります。
合わせると次のようになります。
(メインウィンドウのハンドルをhMainWnd,エディットボックスのIDをEditBox1,ステータスバーのIDをID_STATUSとしています)
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#4 投稿記事 by イグトランス »

たびたびすみません。上も私です。
ところで純粋に文字数を数えるならの話ですが,crtdll.dllの_mbslenも使えるのではないでしょうか。

Declare Function MbsLen CDECL Lib "crtdll" Alias "_mbslen" (string As *Byte) As SIZE_T
そこらのマニア

アドバイスをください。

#5 投稿記事 by そこらのマニア »

str = Str$(GetWindowTextLength(GetDlgItem(hMainWnd, EditBox1))

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

'( )'の相互関係が一致しません
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#6 投稿記事 by イグトランス »

どうみても括弧の数があいませんね。失礼しました。

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

もう一回お願いします。

#7 投稿記事 by ぶりっち »

メニューからではなく、コマンドボタンをおして、Windowに移動してその

ウインドウにあるエディットボックスに文字を出力するソースを教えてください。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#8 投稿記事 by イグトランス »

そこらのマニアさんとぶりっちさんは何の関係ですか?
別人なら紛らわしいので同じトピックを使わず,新たにトピックを作ってください。
同一人物ならやはり紛らわしいので,1つの名前を名乗ってください。

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

謝罪。

#9 投稿記事 by そこらのマニア »

ゴッチャになってすみません。

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

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

いろいろと迷惑をかけてすみませんでした。
今後ともお世話になりますので、どうぞよろしくお願いいたします。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#10 投稿記事 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や関数名は違うでしょうから適宜修正してください。
ぶりっち

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

#11 投稿記事 by ぶりっち »

これが最後のお願いです。

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

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

ソースまたは情報の投稿をよろしくお願いします。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#12 投稿記事 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
ぶりっち

エラーがおきました。

#13 投稿記事 by ぶりっち »

あのソース(メモ帳の終了時の警告と同じ機能)を入れたらエラーが起こったのでメニューから実行できるものをください。
ゲスト

#14 投稿記事 by ゲスト »

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

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

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

P.S. エラーが出たというだけでは、わかりにくいかもしれないので、どういったエラーが出たのかも書いたほうがいいかもしれません・・・まぁこれは聞き流してくださっても結構です。
konisi
記事: 893
登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:

エラーについて。

#15 投稿記事 by konisi »

ゲストsが言うとおり、一口に「エラー」といってもOS側から実行時に指摘されるようなエラーもあればコンパイル時に弾かれるエラーもあるわけで。
具体的なエラーメッセージくらいは載せるようにしましょう。
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
返信する