テキストボックス内で改行数を指定するには?

解決


ぷりお  2006-08-01 03:12:59  No: 132522

初めて質問させて頂きます。

テキストボックス内で指定行数まで改行したら、

指定行数以降は改行できないようにしたいです。

過去ログを拝見したり、調べたりしたのですが、

うまくいきません。

どの様なコードを入力すれば宜しいですか?

宜しくお願いします。


matsu  2006-08-01 03:55:49  No: 132523

VB6と仮定しての話です。
基本はKeyPressイベントで改行の数を数えればいいと思いますが、
貼り付けされた場合を考慮するなら、Changeイベントもコーディングの
対象になると思います。

Private Sub Text1_KeyPress(KeyAscii As Integer)
    Dim strCrlf()       As String
    Dim intCrlfCnt      As Integer
    
    If KeyAscii = vbKeyReturn Then
        'エンターが押下された場合
        strCrlf = Split(Text1.Text, vbCrLf)
        intCrlfCnt = UBound(strCrlf) + 1
        
        If intCrlfCnt > 20 Then
            '無効
            KeyAscii = 0
        End If
    End If
End Sub


ぷりお  2006-08-01 18:08:17  No: 132524

matsu様

ご返答ありがとうございます。

早速、ご指導頂いたコードを入力したのですが、

エンターが指定した改行数以降も押せてしまいます。

下記が入力したコードです。

当方、VB2005を使用しております。
(記載せず申し訳ありませんでした。)

Private Sub 備考textbox_keypress(ByVal keyascii As Integer)

   Dim strCrlf() As String
   Dim intCrlfCnt As Integer

     If keyascii = Keys.Enter Then
        'エンターが押下された場合
            strCrlf = Split(備考TextBox.Text, vbCrLf)
            intCrlfCnt = UBound(strCrlf) + 1

     If intCrlfCnt > 3 Then
                '無効
                keyascii = 0
            End If
        End If
End Sub

この「備考textbox」のプロパティの設定がいけないのでしょうか?

multilineはtureにしています。

宜しくお願いします。


KG  2006-08-01 18:27:17  No: 132525

VB2005のKeyPressイベントって引数が違うとおもいますが。

matsuさんのコードをコピーしてvb2005に以降しても、只の関数
扱いになってイベント時にその処理をしないと思うのですが、、

>If keyascii = Keys.Enter Then
ここにブレークポイントを挿入して、Enterキーを押してみてください。
そこで止まらなければ、その処理はしていません。


ぷりお  2006-08-01 18:58:38  No: 132526

KG様

ありがとうございます。

>If keyascii = Keys.Enter Then
>ここにブレークポイントを挿入して、Enterキーを押してみてください。
>そこで止まらなければ、その処理はしていません。

上記の部分を確認しましたら、
止まりませんでしたので、この処理はされていないのですね・・・

>VB2005のKeyPressイベントって引数が違うとおもいますが。

このご助言を頂き下記の様にコードを変えてみたのですが、
やはり希望通りには動いてくれません。
どの部分がおかしいのでしょうか?

Private Sub 備考textbox_keydown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles 備考TextBox.KeyDown

Dim keyascii As Integer

If keyascii = 13 Then
If UBound(Split(Me.備考TextBox.Text, vbCrLf)) >= 4 - 1 Then
keyascii = 0
End If
End If

End Sub

宜しくお願いします。


うなまな  URL  2006-08-01 19:19:51  No: 132527

TextBoxを継承したコントロールを利用すれば、以下のようになります。
(1)新規クラスを作成します。
(2)以下のコードと差し替えます。
Public Class Class1
    Inherits System.Windows.Forms.TextBox

    Protected Overrides Function ProcessDialogKey(ByVal keyData As System.Windows.Forms.Keys) As Boolean
        If keyData = Keys.Enter Then
            If UBound(Split(Me.Text, vbCrLf)) >= 4 - 1 Then
                Return True
            End If
        End If
        Return MyBase.ProcessDialogKey(keyData)
    End Function

End Class
(3)とりあえずビルドします。
(4)フォームデザイナにすると、ツールボックスに「Class1」といコントロールができています。
(5)(4)をフォームに貼り付けます。

あとはテキストボックスと同じ要領で利用できます。
クラス名は適宜修正してくださいね。


ぷりお  2006-08-01 19:50:09  No: 132528

うなまな様

ありがとうございます。

ご指導通りにしましたら、希望通りの動きになりました。

現在、データベースに接続して作業を行っているのですが、

このclass1のコントロールをフォームに貼り付けた場合、

DataBindingsを希望するデータベースにすれば宜しいのですか?

宜しくお願いします。


うなまな  2006-08-01 19:59:24  No: 132529

特別なコントロールではなく、基本はTextBoxコントロールなので、
通常のTextBoxと同様に利用できます。
ですから、DataBindingsに同様に設定できます。


ぷりお  2006-08-01 20:28:12  No: 132530

matu様、KG様、うなまな様

ありがとうございました。

無事希望通りの動きにする事ができました。

本当に助かりました。

また質問させて頂く際は、宜しくお願いします。


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

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






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