プロが教える店舗&オフィスのセキュリティ対策術

VB6です。
半角文字で65文字が2段に書けるTextBoxを用意しました。
1段目に"*12345678....1234" と65文字書きました。
2段目に"567890" と6文字書きました。

1段目の"*"の前に"a"を書き込む(挿入する)と
1段目の末尾は(66文字は入らないので)
2段目の最初に移動します。
これが普通ですよね。

しかし
1段目の"*"の前に" "(スペース)を書き込むと
1段目は空行になり
1段目の内容は2段目へ移動してしまいます。
これは困ります。

これは一例ですがスペースを挿入したり
BackspaceやDeleteキーを使うと変な配置になってしまいます。

これはVBでは仕方のないことでしょうか?
解決の方法がありましたら教えてください。

A 回答 (4件)

ごめんなさい m(__)m



MyBreakProcの最初の引数が String型ではダメでした

標準モジュール側
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
Public Const EM_SETWORDBREAKPROC = &HD0
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Public Function myBreakProc(ByRef lpch As Long, ByVal ichCurrent As Long, ByVal cch As Long, ByVal code As Long) As Long
  Dim ss As String, arByte() As Byte
  ss = Space(cch)
  arByte = ss
  CopyMemory arByte(0), lpch, cch
  ss = StrConv(arByte, vbUnicode)
  myBreakProc = 0
End Function

Function GetAddr(lpAddr As Long) As Long
  GetAddr = lpAddr
End Function

フォームのLoadイベントも変更が必要でした
dim lpProc as Long
lpProc = GetAddr( Addressof myBreakProc )
SendMessage Text1.hWnd, EM_SETWORDBREAKPROC, 0, ByVal lpProc
といった具合です ・・・
    • good
    • 0

TestBoxには『WordWarp』が無いんです


Labelにならあるんですが ・・・
    • good
    • 0

WordWrapプロパティってありませんでしたっけ?


# 記憶違いかも。
    • good
    • 0

VBというよりWindowsの仕様だったように思います


!%?)]などが文字列の途中にあって1行の長さがテキストボックスの横幅より大きい場合 前日の文字で自動的に改行します

やるとするなら EM_SETWORDBREAKPROCメッセージをテキストボックスコントロールに送信して
自前の区切りメッセージに対応しましょう

標準モジュールに
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
Public Const EM_SETWORDBREAKPROC = &HD0

Public Function myBreakProc( lpStr as String , ichCurrent as Long, cch as Long, code as Long ) as Long
myBreakProc = 0
End Function

フォームのLoadイベントで
SendMessage Text1.hWnd, EM_SETWORDBREAKPROC, 0, addressof MyBreakProc
を実行します

VB6のIDEから実行すると VB6自体が落ちてしまいますので
EXEファイルにして実行しましょう

myBreakProc( lpStr as String , ichCurrent as Long, cch as Long, code as Long )
の引数は lpStrがテキストボックス編集対象の文字列
ichCurrent が編集中の開始点
cchが編集テキストの文字数
codeはどうして呼ばれたかのデータ

VB6付属のMSDNなどで EM_SETWORDBREAKPROCやEditWordBreakProcなどを調べてみてください
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
難しいことなのですね・・・勉強させていただきます。

お礼日時:2008/11/07 11:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!