DOBON.NET DOBON.NETプログラミング掲示板過去ログ

入力可能コンボボックスの入力文字数制限をバイトで制限したい

環境/言語:[XP, VB.NET, NET Framework1.1]
分類:[.NET]

入力可能なコンボボックス(DropDown)に対して、
バイト数で入力文字数を制限したいと思っています。

以前のVB6.0では、下記のようなAPIを使用するとできましたが、
VB.NETになってからは、同じようにソースを組んでも上手く行きません。

どなたか、実現方法を知っていましたら、教えて下さい。


<以前の方法>

[API宣言]
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any) As Long


[制限]
Private Sub Form_Load()
Const CB_LIMITTEXT = &H141

'Combo1の入力制限をを8バイトとする場合
Call SendMessage(Combo1.hWnd, CB_LIMITTEXT, 8, 0)

End Sub
■No5711に返信(シナシナさんの記事)
> 入力可能なコンボボックス(DropDown)に対して、
> バイト数で入力文字数を制限したいと思っています。
>
> 以前のVB6.0では、下記のようなAPIを使用するとできましたが、
> VB.NETになってからは、同じようにソースを組んでも上手く行きません。
>
> どなたか、実現方法を知っていましたら、教えて下さい。

確かに、VB6ではできるけど、VB.NETでは「文字数」制限になっており、
「バイト数」で見てないようですね。

[以下試したコード]
Private Declare Function SendMessage Lib "USER32.DLL" Alias "SendMessageA" (ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByRef lParam As Integer) As Long
Private Const CB_LIMITTEXT As Integer = &H141

Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
  Call SendMessage(ComboBox1.Handle.ToInt32, CB_LIMITTEXT, 5, &H0)
End Sub

となると、TextChanged()イベントで、UniCode変換をかまして、
無理矢理、MaxLengthで制御するか、超過した文字数を削るかになるでしょうか...
本題への回答じゃないですが・・・

> 確かに、VB6ではできるけど、VB.NETでは「文字数」制限になっており、
> 「バイト数」で見てないようですね。

EM_LIMITTEXT では下記のようにCommon Control 6.0から、仕様変更されています。
http://support.microsoft.com/default.aspx?scid=kb;ja;418099

CB_LIMITTEXT に対しても同じという文章については見つけていませんが、
同様の扱いである可能性が高いと思います。
お返事ありがとうございます。

VB.NETになったんで、API関連は
仕様変更されたみたいで、以前のように行きませんね(^^;

イベントで、Shift_JISに変換して、
バイト数でチェックし、超過する文字列を削除しようとしたのですが、
これだと、超過した分、つまり文字列の後ろからなら削除できますが、
文字列の間に挿入すると、挿入した文字列は入るが、
後ろの文字が消えていく・・・というような感じで
Maxlengthで制御した時と同じような動きではなくて・・・難しいです(^^;

DOBON.NET | プログラミング道 | プログラミング掲示板