EditBoxへの入力制限をするには

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
yama
記事: 58
登録日時: 2005年5月31日(火) 21:11
お住まい: 新潟市
連絡する:

EditBoxへの入力制限をするには

#1 投稿記事 by yama »

こんにちはEditBoxコントロールで教えてください。

複数行、改行許可、垂直スクロールバーにそれぞれチェックすると
入力し改行するとキャレットが下に行き入力行数をどんどんふやすことが
できます。

そこで決めた行数以上入力できないように規制する方法はありますでしょうか。

キャレットの位置が制限にきていたとき
改行されたら1行前にスクロールさせる?改行はどやって判定?


過去ログでは検索できませんでした。よろしくお願いします。
hira
記事: 203
登録日時: 2005年5月31日(火) 20:14
お住まい: 兵庫県
連絡する:

Re: EditBoxへの入力制限をするには

#2 投稿記事 by hira »

サクっと作ってみました。
RADツールならば「複数行」「改行を許可」にチェックを入れてください。
上限オーバー時のBeep音などは鳴りませんが、適当にコードを編集すれば鳴らすこともできると思います。
※行数の上限を超えた瞬間にチラつきがあったりしますが(^^;;
(実装例)

コード: 全て選択

'API宣言はグローバル領域に記述
Declare Function CharPrev Lib "user32" Alias "CharPrevA" (lpszStart As *Byte,lpszCurrent As *Byte) As *Byte

Sub MainWnd_EditBox1_Change()
Dim sBuf As String
Dim nLineCount As Long,nCaretPos As Long,nSkippedReturnCount=0 As Long
Dim p As *Byte,pFirst As *Byte
	nLineCount=SendMessage(GetDlgItem(hMainWnd,EditBox1),EM_GETLINECOUNT,0,0)
	If nLineCount>10 Then '10の部分は行数の上限に変更
		sBuf=ZeroString(GetWindowTextLength(GetDlgItem(hMainWnd,EditBox1))+1)
		GetWindowText(GetDlgItem(hMainWnd,EditBox1),sBuf,Len(sBuf))
		nCaretPos=LOWORD(SendMessage(GetDlgItem(hMainWnd,EditBox1),EM_GETSEL,0,0))
		pFirst=StrPtr(sBuf)+nCaretPos
		p=pFirst
		Do
			p=CharPrev(StrPtr(sBuf),p)
			If memcmp(p,Ex"\r\n",2)=0 Then nSkippedReturnCount=nSkippedReturnCount+1
		Loop Until nLineCount-nSkippedReturnCount=10 '10の部分は行数の上限に変更
		nCaretPos=p-StrPtr(sBuf)
		memcpy(p,pFirst,StrPtr(sBuf)+Len(sBuf)-pFirst+1)
		SetWindowText(GetDlgItem(hMainWnd,EditBox1),sBuf)
		SendMessage(GetDlgItem(hMainWnd,EditBox1),EM_SETSEL,nCaretPos,nCaretPos)
	End If
End Sub
yama
記事: 58
登録日時: 2005年5月31日(火) 21:11
お住まい: 新潟市
連絡する:

#3 投稿記事 by yama »

hiraさん さくっとどうもありがとうございました。

CharPrev は 初めての命令です。
「文字列の中の 1 つ前の文字へのポインタを取得します。」

しっかり読み込んで見たいと思います。

サンプルは思いとおりの動作でした。EditBoxないでEnterすると
1行目に戻ってしまうところを修正するために、がんばって内容を
理解して見ます。
返信する