作成者 |
メッセージ |
|
|
記事の件名: |
Re: EditBoxのサブクラス化による文字入力制限について |
引用付きで返信する |
|
たかせ様
どうも、お久しぶりです。
キーコードとダブっているとは思いませんでした。
ご指摘ありがとうございます。
メインの開発環境はWin7 64Bitですが、押入れの奥に有るXpを久しぶり出してみます。
redfox様
うまく行きました、ありがとうございます。
何度か別の言語にも浮気したのですが、ABが一番しっくり来るんですょねぇ~
たかせ様
どうも、お久しぶりです。 キーコードとダブっているとは思いませんでした。 ご指摘ありがとうございます。
メインの開発環境はWin7 64Bitですが、押入れの奥に有るXpを久しぶり出してみます。
redfox様
うまく行きました、ありがとうございます。
何度か別の言語にも浮気したのですが、ABが一番しっくり来るんですょねぇ~
|
|
|
投稿記事 |
Posted: 2017年5月10日(水) 10:13 |
|
|
![](images/spacer.gif) |
|
|
記事の件名: |
Re: EditBoxのサブクラス化による文字入力制限について |
引用付きで返信する |
|
WindowProc内でキー入力を無視するのであれば 引数のmessageがWM_CHARの場合に対処するようにしてみましょう
コード: Function LimitedEditProc(hWnd As HWND, message As DWORD, wParam As WPARAM, lParam As LPARAM) As DWORD
Dim LimitChar As String
'OK LimitChar=" !#$&()*+,/<=>?@[\]^_`{|}~"+Chr$(&H22)
'NG LimitChar=" !#$%&'()*+,/<=>?@[\]^_`{|}~"+Chr$(&H22)
LimitChar=" !#$&()*+,/<=>?@[\]^_`{|}~"+Chr$(&H22)
if message = WM_CHAR then
If InStr(1, LimitChar, Chr$(wParam As Byte)) Then
LimitedEditProc=0
Exit Function
End If
End If
LimitedEditProc=CallWindowProc(DefEditProc , hWnd, message, wParam, lParam)
End Function
WindowProc内でキー入力を無視するのであれば 引数のmessageがWM_CHARの場合に対処するようにしてみましょう
[code]Function LimitedEditProc(hWnd As HWND, message As DWORD, wParam As WPARAM, lParam As LPARAM) As DWORD Dim LimitChar As String
'OK LimitChar=" !#$&()*+,/<=>?@[\]^_`{|}~"+Chr$(&H22) 'NG LimitChar=" !#$%&'()*+,/<=>?@[\]^_`{|}~"+Chr$(&H22)
LimitChar=" !#$&()*+,/<=>?@[\]^_`{|}~"+Chr$(&H22)
if message = WM_CHAR then If InStr(1, LimitChar, Chr$(wParam As Byte)) Then LimitedEditProc=0 Exit Function End If End If LimitedEditProc=CallWindowProc(DefEditProc , hWnd, message, wParam, lParam) End Function [/code]
|
|
|
投稿記事 |
Posted: 2017年4月09日(日) 11:02 |
|
|
![](images/spacer.gif) |
|
|
記事の件名: |
Re: EditBoxのサブクラス化による文字入力制限について |
引用付きで返信する |
|
お久しぶりです。
1について
%の16進表現は&H25、'の16進表現は&H27となります。
またABのHELPにあるInkey$関数のサンプルプログラムを実行すると、
左カーソルキーを押下すると&H25(VK_LEFT)が返却されます。
右カーソルキーを押下すると&H27(VK_RIGHT)が返却されます。
なので規制文字に%と'を加えて左右カーソルキーを動かそうとしてもそれが禁止文字と一致したためカーソル移動ができなくなると思います。
2について
TAKOさんのPCはWindows 7(32Bit/64Bit)ですか?
私のPCはWindows 7(32Bit)です。
Windows XPだと問題なくDebugモードにて起動できました。
Windows 7だとなぜかDebugモードにすると異常終了することがあります。
Windows 8.1/10についてはわかりませんが。
原因がわからないので私はあきらめています。
ご確認よろしくお願いいたします。
お久しぶりです。
1について %の16進表現は&H25、'の16進表現は&H27となります。 またABのHELPにあるInkey$関数のサンプルプログラムを実行すると、 左カーソルキーを押下すると&H25(VK_LEFT)が返却されます。 右カーソルキーを押下すると&H27(VK_RIGHT)が返却されます。 なので規制文字に%と'を加えて左右カーソルキーを動かそうとしてもそれが禁止文字と一致したためカーソル移動ができなくなると思います。
2について TAKOさんのPCはWindows 7(32Bit/64Bit)ですか? 私のPCはWindows 7(32Bit)です。 Windows XPだと問題なくDebugモードにて起動できました。 Windows 7だとなぜかDebugモードにすると異常終了することがあります。 Windows 8.1/10についてはわかりませんが。 原因がわからないので私はあきらめています。
ご確認よろしくお願いいたします。
|
|
|
投稿記事 |
Posted: 2017年4月04日(火) 21:20 |
|
|
![](images/spacer.gif) |
|
|
数年ぶりにプログラムを書いています。
AB4にて、EditBoxのサブクラス化による文字入力制限をしていますが問題が有ります。
1、規制文字に"%"と"'"を加えると、EditBox内で左右キーによるカーソル移動ができなくなる。
2、Debugモードにて起動すると、EditBoxを選択すると例外処理エラーとなる。
(実行形式にコンパイルすると動作する。)
よろしくお願いします。
コード:
Dim DefEditProc As VoidPtr
Function LimitedEditProc(hWnd As HWND, message As DWORD, wParam As WPARAM, lParam As LPARAM) As DWORD
Dim LimitChar As String
'OK LimitChar=" !#$&()*+,/<=>?@[\]^_`{|}~"+Chr$(&H22)
'NG LimitChar=" !#$%&'()*+,/<=>?@[\]^_`{|}~"+Chr$(&H22)
LimitChar=" !#$&()*+,/<=>?@[\]^_`{|}~"+Chr$(&H22)
If InStr(1, LimitChar, Chr$(wParam As Byte)) Then
LimitedEditProc=0
Exit Function
End If
LimitedEditProc=CallWindowProc(DefEditProc , hWnd, message, wParam, lParam)
End Function
Sub MainWnd_Destroy()
SetWindowLong(GetDlgItem(hMainWnd, EditBox1), GWL_WNDPROC, DefEditProc As Long)
---------省略----------
End Sub
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
DefEditProc=SetWindowLong(GetDlgItem(hMainWnd, EditBox1), GWL_WNDPROC, AddressOf(LimitedEditProc) As Long) As VoidPtr
End Sub
数年ぶりにプログラムを書いています。
AB4にて、EditBoxのサブクラス化による文字入力制限をしていますが問題が有ります。
1、規制文字に"%"と"'"を加えると、EditBox内で左右キーによるカーソル移動ができなくなる。 2、Debugモードにて起動すると、EditBoxを選択すると例外処理エラーとなる。 (実行形式にコンパイルすると動作する。)
よろしくお願いします。
[list][code] Dim DefEditProc As VoidPtr Function LimitedEditProc(hWnd As HWND, message As DWORD, wParam As WPARAM, lParam As LPARAM) As DWORD Dim LimitChar As String
'OK LimitChar=" !#$&()*+,/<=>?@[\]^_`{|}~"+Chr$(&H22) 'NG LimitChar=" !#$%&'()*+,/<=>?@[\]^_`{|}~"+Chr$(&H22)
LimitChar=" !#$&()*+,/<=>?@[\]^_`{|}~"+Chr$(&H22)
If InStr(1, LimitChar, Chr$(wParam As Byte)) Then LimitedEditProc=0 Exit Function End If LimitedEditProc=CallWindowProc(DefEditProc , hWnd, message, wParam, lParam) End Function
Sub MainWnd_Destroy() SetWindowLong(GetDlgItem(hMainWnd, EditBox1), GWL_WNDPROC, DefEditProc As Long) ---------省略---------- End Sub
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT) DefEditProc=SetWindowLong(GetDlgItem(hMainWnd, EditBox1), GWL_WNDPROC, AddressOf(LimitedEditProc) As Long) As VoidPtr End Sub [/code][/list]
|
|
|
投稿記事 |
Posted: 2017年3月08日(水) 16:42 |
|
|
![](images/spacer.gif) |
|