テキストボックス入力にて最大長を超えた文字を別なテキストボックスに貼り付けたい

解決


HogeHoge  2007-04-16 20:13:07  No: 98564

お世話になっております。
解りづらいタイトルで申し訳ありません。

FormにTextBoxを2つ縦に並べ、それぞれ
オブジェクト名をText(0)、Text(1)
MaxLengthプロパティを10
IMEModeプロパティを4(全角ひらがな)
とします。

Text(0)に「あいうえおかきくけこさ」と入力、Enterキー押下時に
TextBox(0)の最大長を超える文字(この場合「さ」)をTextBox(1)
に表示させたいのですが、そもそもそんなことはできるのでしょうか
ということと、できる場合ご教示を頂ければと思い質問させて頂き
ました。

よろしくお願い致します。


ぺぱお  2007-04-16 20:36:11  No: 98565

こんにちは、ぺぱおと申します。

以下のコードでいけるかと思います。

Private Sub Text1_KeyPress(KeyAscii As Integer)

    If Text1.MaxLength <= Len(Text1.Text) Then
        Text2.Text = Chr(KeyAscii)
    End If

End Sub


HogeHoge  2007-04-16 22:23:34  No: 98566

ぺぱおさん、レスありがとうございます。

>以下のコードでいけるかと

残念ながら望んだ結果は得られませんでした。


HogeHoge  2007-04-16 22:41:23  No: 98567

動作のイメージとしては、WORDでIMEをオンにして1行の設定文字数を
超えた入力です。

1行の設定文字数を超えた状態でENTERキーを押下しますと超えたぶんの文
字は次の行に表示されます。その状態で確定(ENTERキーを押下)しますと
次の行に現れた文字も一緒に確定されます。

これをFORM上のTextBoxコントロールでできないだろうか・・という話です。


SSY  2007-04-16 23:53:12  No: 98568

>動作のイメージとしては、WORDでIMEをオンにして1行の設定文字数を
Word?VBじゃなくて?
開発環境を明記してください。

>1行の設定文字数を超えた状態でENTERキーを押下しますと超えたぶんの文
>字は次の行に表示されます。その状態で確定(ENTERキーを押下)しますと
>次の行に現れた文字も一緒に確定されます。

MaxLengthは必ず10でなきゃ駄目なのかな?
もし制限がなければ以下のコードでお試しを

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
    Dim strOver As String   '超過分の文字を格納するstring変数
    
    '押されたのはエンターか
    If KeyCode = vbKeyReturn Then
        'Text1は10文字以上か
        If Len(Text1.Text) > 10 Then
            '変数strOverにText1の11文字目から末尾まで格納
            strOver = Mid(Text1.Text, 11)
            'Text2にstrOverを代入
            Text2.Text = strOver
            'Text1を10文字以内に収める
            Text1.Text = Left(Text1.Text, 10)
        End If
    End If
End Sub

で、問題なのがこのコードだと文字確定後にもう一度エンターを押さないと駄目だということ。
HogeHogeさんが言っているのは文字確定時のエンターで判断したいんだろうけど。(推測です)

'独り言
KeyDownイベントで発生させるよりはLostFocusイベントで発生させるべきかな?


HogeHoge  2007-04-17 00:59:40  No: 98569

SSYさん、レスありがとうございます。

>>動作のイメージとしては、WORDでIMEをオンにして1行の設定文字数を
>Word?VBじゃなくて?
>開発環境を明記してください。

XP,VB6です。
「動作のイメージとしては、WORDで・・」と申したのは、実際の動きと
してのイメージはWORDで入力してみたほうがイメージし易いかと思い、
例として持ち出しただけです。

>もし制限がなければ以下のコードでお試しを

ありがたく試させて頂きました。
文字確定のENTERを押したタイミングで(MaxLengthの設定が効いている
から当たり前と言えば当たり前なのですが)超過分の文字が捨てられま
す。

ですので、コードとしては

>        'Text1は10文字以上か
>        If Len(Text1.Text) > 10 Then    ←  【※】
>            '変数strOverにText1の11文字目から末尾まで格納
>            strOver = Mid(Text1.Text, 11)
>            'Text2にstrOverを代入
>            Text2.Text = strOver
>            'Text1を10文字以内に収める
>            Text1.Text = Left(Text1.Text, 10)
>        End If

【※】行のLen(Text1.Text)が10になり、それ以降のコードは通過しませ
ん。


SSY  2007-04-17 01:21:43  No: 98570

ちょっと質問させてください

>文字確定のENTERを押したタイミングで(MaxLengthの設定が効いている
>から当たり前と言えば当たり前なのですが)超過分の文字が捨てられま
>す。
MaxLengthの設定というのは必ず設けなければならない物でしょうか?

質問ここまで。

>【※】行のLen(Text1.Text)が10になり、それ以降のコードは通過しません。
提示したコードは文字数制限を設けていない事前提としています。


HogeHoge  2007-04-17 01:39:30  No: 98571

SSYさん、レスありがとうございます。

>MaxLengthの設定というのは必ず設けなければならない物でしょうか?

そうです。何文字であれ必ず設けられる類のものになります。

>提示したコードは文字数制限を設けていない事前提としています。

そうでしたか、納得しました。


SSY  2007-04-17 03:41:24  No: 98572

>そうです。何文字であれ必ず設けられる類のものになります。
了解です。
そうなるとAPIなんかで確定時の文字列を取得すればいいのかな。

http://www.alato.ne.jp/kazu-/vb/tip10.htm

上記のHPを見ますとフリガナ(半角フリガナ)を取得してます。
ここの

'バッフア確保のため入力した文字数を取得
nLEN = ImmGetCompositionString(himc, GCS_RESULTREADSTR, vbNullChar, 0)
'入力文字数分バッファ確保
WorkStr = Space(nLEN + 1)
'入力文字列取得
Call ImmGetCompositionString(himc, GCS_RESULTREADSTR, WorkStr, nLEN + 1)

の中のImmGetCompositionString関数内で設定しているGCS_RESULTREADSTRを
GCS_RESULTSTRにすれば確定時の文字列が取得できます。

#簡単なサンプル作りたかったけど食事に誘われたので勘弁してやってください。


HogeHoge  2007-04-17 05:13:11  No: 98573

SSYさん、レスありがとうございます。
ありがたく参考にさせて頂きます!

>簡単なサンプル作りたかったけど食事に誘われたので勘弁

全然OKです。気を使わせてすみませんでした。感謝感謝です。


HogeHoge  2007-04-19 00:31:45  No: 98574

SSYさん、仰せの通りでした。

>ImmGetCompositionString関数内で設定しているGCS_RESULTREADSTRを
>GCS_RESULTSTRにすれば確定時の文字列が取得できます

問題なく望みが達せられました。ありがとうございます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加