DOBON.NETプログラミング道掲示板
(現在 過去ログ2 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■33569 / inTopicNo.1)  vb.net複数行入力テキストでのRETURNでの改行ができない
  
□投稿者/ ぽち大好き 一般人(1回)-(2017/02/08(Wed) 11:44:16)
  • アイコン環境/言語:[vb.net] 
    分類:[.NET] 

    初めまして。
    よろしくお願いいたします。

    VB.NETで複数行入力可能なテキストボックスがあります。
    そのテキストボックスの中でENTERを押した場合は、そのテキストボックスの中で改行したいのですが出来ません。

    テキストボックス→textMemoとします。

    form_Loadで下記のように指定しています。
     textMemo.Multiline = True
     textMemo.ScrollBars = ScrollBars.Both
     textMemo.WordWrap = False
     textMemo.AcceptsReturn = True

    form_KeyDownでは下記のように指定しています。
     If e.KeyCode = Keys.Return Then
      ’メモの場合は処理を抜ける
       If Me.ActiveControl.Name = "textMemo" Then
        Exit Sub
      End If
      ’メモ以外の場合は次のコントロールに移動する
     End If

    textMemo入力中にENTERを押してもなにもカーソル移動はしません。
    Ctrl+EnterでtextMemoの中で改行されます。

    色々調べて上記のように設定したのですが、ENTERで改行されません。
    どなたか原因が分かる方はいらっしゃいますか?
    きっと単純なところなのでしょうが、初心者のため分かりません。
    どうぞよろしくお願いいたします。

引用返信 削除キー/
■33571 / inTopicNo.2)  Re[1]: vb.net複数行入力テキストでのRETURNでの改行ができない
□投稿者/ ぽち大好き 一般人(2回)-(2017/02/09(Thu) 10:59:02)
  • アイコン追記です。

    FormのKeyPreviewはTrueになっています。

    よろしくお願いいたします。
引用返信 削除キー/
■33572 / inTopicNo.3)  Re[1]: vb.net複数行入力テキストでのRETURNでの改行ができない
□投稿者/ 魔界の仮面弁士 大御所(1063回)-(2017/02/09(Thu) 12:22:19)
  • アイコンNo33569に返信(ぽち大好きさんの記事)
    > vb.net複数行入力テキストでのRETURNでの改行ができない
    正確には Return キーではなく Enter キーですね。
    (中には、同じキーに Return と Enter の両方が刻印されているキーボードもありますが)

    > form_KeyDownでは下記のように指定しています。
    本当に、これしか書かれていないのでしょうか?
    SelectNextControl や e.Handled が利用されているのかと推察したのですが。

    これだけのコードで移動処理が行われるのだとしたら、
    フォームかコントロールが標準のものではなく、
    それらを継承した自作クラスなのかもしれません。


    新規プロジェクトを作成し、そこに、 No33569No33571 に書かれた処理のみを
    記述してみて下さい。少なくとも当方では再現しませんでした。

    質問時に省略された部分が要因だとしたら、先の内容からでは判断が付きません。


    > If Me.ActiveControl.Name = "textMemo" Then
    コントロール名で判断するのではなく、
     If ActiveControl Is textMemo Then
    のようにオブジェクト参照で判断するか、あるいは
     If TypeOf ActiveControl Is TextBox AndAlso DirectCast(ActiveControl, TextBox).Multiline Then
    のように、Multiline プロパティで判断した方が良いかも。


    > textMemo入力中にENTERを押してもなにもカーソル移動はしません。
    > Ctrl+EnterでtextMemoの中で改行されます。
    Ctrl+J でも改行されるかも。
引用返信 削除キー/
■33573 / inTopicNo.4)  Re[2]: vb.net複数行入力テキストでのRETURNでの改行ができない
□投稿者/ ぽち大好き 一般人(3回)-(2017/02/09(Thu) 13:55:48)
  • アイコン魔界の仮面弁士さん、ありがとうございます。

    No33572に返信(魔界の仮面弁士さんの記事)
    > 正確には Return キーではなく Enter キーですね。
    はい、すみませんEnterです。


    >>form_KeyDownでは下記のように指定しています。
    > 本当に、これしか書かれていないのでしょうか?
    はい、それだけなのです。
    そんな簡単なことしか書かれていないのに動かなくて...
    ただコントロールが標準のものではありませんでした。

    > フォームかコントロールが標準のものではなく、
    > それらを継承した自作クラスなのかもしれません。

    Public Class TextBoxA
    Inherits TextBox

    Protected Overrides Sub OnEnter(ByVal e As System.EventArgs)
    If Not [ReadOnly] Then
    ' テキストを選択します。
    MyBase.SelectAll()
    End If
    MyBase.OnEnter(e)
    End Sub

    Protected Overrides Sub OnLeave(ByVal e As System.EventArgs)
    If Not [ReadOnly] Then
    End If
    MyBase.OnLeave(e)
    End Sub

    End Class

    これが何か悪さをしているのでしょうか?


    >>If Me.ActiveControl.Name = "textMemo" Then
    > コントロール名で判断するのではなく、
    >  If ActiveControl Is textMemo Then
    > のようにオブジェクト参照で判断するか、あるいは
    ありがとうございます。上記のように修正しました。


    > Ctrl+J でも改行されるかも。
    試してみたところ改行されました。

引用返信 削除キー/
■33574 / inTopicNo.5)  Re[3]: vb.net複数行入力テキストでのRETURNでの改行ができない
□投稿者/ 魔界の仮面弁士 大御所(1064回)-(2017/02/09(Thu) 19:34:56)
  • アイコン
    No33573に返信(ぽち大好きさんの記事)
    > If Not [ReadOnly] Then
    > End If
    
    この If 文は、何の役目も果たしていないように見えますが…?
    
    
    
    > ただコントロールが標準のものではありませんでした。
    
    このコードがあったとしても、Enter キーを押しただけで
    次のコントロールに移動することはありませんでした。
    
    他にも何か仕掛けが無いでしょうか?
    
    
    
    こちらで検証したコードは、下記の通りです。
    
    (既存のプロジェクトではなく)新規プロジェクトに
    以下のコードを貼ってみてください。
    
    TextBox2 に対して、Enter キーで改行になりますし、
    他のコントロールでも、Enter で移動にはならないはずです。
    
    
    
    '--- Form1.vb ---
    Public Class Form1
        Inherits Form
        Private TextBox1 As TextBoxA
        Private TextBox2 As TextBoxA
        Private TextBox3 As TextBoxA
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Controls.Clear()
    
            TextBox1 = New TextBoxA()
            TextBox2 = New TextBoxA()   'textMemo
            TextBox3 = New TextBoxA()
    
            KeyPreview = True
            TextBox2.Multiline = True
            TextBox2.ScrollBars = ScrollBars.Both
            TextBox2.WordWrap = False
            TextBox2.AcceptsReturn = True
    
            TextBox1.SetBounds(20, 20, 200, 20)
            TextBox2.SetBounds(20, 60, 200, 140)
            TextBox3.SetBounds(20, 220, 200, 20)
            Controls.Add(TextBox1)
            Controls.Add(TextBox2)
            Controls.Add(TextBox3)
        End Sub
    
        Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
            If e.KeyCode = Keys.Return Then
                If ActiveControl Is TextBox2 Then
                    Exit Sub
                End If
            End If
        End Sub
    End Class
    
    '--- TextBoxA.vb ---
    Public Class TextBoxA
        Inherits TextBox
    
        Protected Overrides Sub OnEnter(ByVal e As System.EventArgs)
            If Not [ReadOnly] Then
                ' テキストを選択します。
                MyBase.SelectAll()
            End If
            MyBase.OnEnter(e)
        End Sub
    
        Protected Overrides Sub OnLeave(ByVal e As System.EventArgs)
            If Not [ReadOnly] Then
            End If
            MyBase.OnLeave(e)
        End Sub
    
    End Class

引用返信 削除キー/
■33575 / inTopicNo.6)  Re[3]: vb.net複数行入力テキストでのRETURNでの改行ができない
□投稿者/ 魔界の仮面弁士 大御所(1065回)-(2017/02/09(Thu) 19:51:21)
  • アイコンNo33573に返信(ぽち大好きさんの記事)
    >> 本当に、これしか書かれていないのでしょうか?
    > はい、それだけなのです。

    Form 側も、自作の継承クラスではありませんか?

    「Enter で移動する」仕組みとしては、たとえば
    ProcessDialogKey を捕らえて ProcessTabKey に
    置き換えるといった手法があります。


    > これが何か悪さをしているのでしょうか?

    問題があるように見えます。
    「Enter で移動する」仕組みがどうなっているかにもよりますが。


    オーバーライドされた OnEnter の実装により、マウス以外の移動、
    具体的には Tab (あるいは何故か Enter) でフォーカスが移ってきた場合
    SelectAll メソッドが呼ばれるようになっています。

    このメソッドは、TextBox 内のテキストを全選択して
    反転表示にするためのものです。


    この状態で、textMemo の Enter キーが「改行」に
    割りあてられていたらどうなるでしょう?

    textMemo が TextBoxA クラスだった場合、フォーカス取得直後は
    現在入力されている文字列が選択されている状態になっているわけです。

    選択されたまま Enter を押すと、現在入力されている値が消えて、
    一個の改行だけに置き換わってしまうことになるわけですが、
    本当にそういう仕様で良いのでしょうか?
引用返信 削除キー/
■33578 / inTopicNo.7)  Re[4]: vb.net複数行入力テキストでのRETURNでの改行ができない
□投稿者/ ぽち大好き 一般人(4回)-(2017/02/13(Mon) 13:46:50)
  • アイコン魔界の仮面弁士さん、ありがとうございます。
    金曜日からお休みを頂いていて、お返事が遅くなり申し訳ありません。

    他の者が作成したものを引き継いで修正しているため、
    全体が良く分かっていないのが現状です。

    > Form 側も、自作の継承クラスではありませんか?

    もう一度、教えて頂いた内容をよく見て、プログラムを確認してみます。
    それから、分からない事を教えていただければ大変ありがたいです。
    少し時間がかかるかもしれませんが、どうぞよろしくお願いいたします。

引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Mode/  Pass/


- Child Tree -