こんにちはEditBoxコントロールで教えてください。
複数行、改行許可、垂直スクロールバーにそれぞれチェックすると
入力し改行するとキャレットが下に行き入力行数をどんどんふやすことが
できます。
そこで決めた行数以上入力できないように規制する方法はありますでしょうか。
キャレットの位置が制限にきていたとき
改行されたら1行前にスクロールさせる?改行はどやって判定?
過去ログでは検索できませんでした。よろしくお願いします。
EditBoxへの入力制限をするには
Re: EditBoxへの入力制限をするには
サクっと作ってみました。
RADツールならば「複数行」「改行を許可」にチェックを入れてください。
上限オーバー時のBeep音などは鳴りませんが、適当にコードを編集すれば鳴らすこともできると思います。
※行数の上限を超えた瞬間にチラつきがあったりしますが(^^;;
(実装例)
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
[hira]
http://hira.hopto.org/
http://hira.hopto.org/