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

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

■34039 / inTopicNo.1)  Function プロシージャからの文字選択
  
□投稿者/ つまようじ 一般人(1回)-(2018/11/24(Sat) 20:52:56)
  • アイコン環境/言語:[Win10 VB.NET .net4.6.1] 
    分類:[.NET] 

    やりたいこと

    Function プロシージャ内で
    TextBoxのテキストが数字かチェックして数字以外ならば対象のTextBoxにフォーカスを合わせて、文字を全選択状態にしたい


    1.組めたプログラム
    Function側で結果としてTrueかFalseを返すのでそれを元にフォーカスを合わせるタイプ

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    If CHK(TextBox1.Text) = False Then
    TextBox1.Focus()
    TextBox1.SelectAll()
    End If

    End Sub


    Function CHK(s As String) As Boolean
    Dim d As Double
    If Double.TryParse(s, d) Then
    Return True
    Else
    MessageBox.Show("数字を入力してください")
    Return False
    End If
    End Function

    ※これを複数のTextBox毎回やると
    If CHK(TextBox***.Text) = False Then
    TextBox***.Focus()
    TextBox***.SelectAll()
    End If
    がいたるところに乱立するのでFunction側でフォーカス合わせて文字の全選択までやりたいです



    2.とりあえず動くけどこれでいいのか?というプログラム
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    CHKObject(TextBox1)
      End Sub


    Function CHKObject(s As Object) As Boolean
    Dim d As Double
    If Double.TryParse(s.text, d) Then
    Return True
    Else
    s.focus()
    s.selectall()
    Return False
    End If
    End Function


    ボタンを押してチェックに行くのでActiveControlではどこのテキストをチェックしてるのか取得できませんよね?

    初心者がプログラム組んでるので色々雑な所が多いかと思いますがアドバイス頂けたら幸いです

引用返信 削除キー/
■34040 / inTopicNo.2)  Re[1]: Function プロシージャからの文字選択
□投稿者/ 魔界の仮面弁士 大御所(1169回)-(2018/11/26(Mon) 10:17:43)
  • アイコン2018/11/26(Mon) 10:20:57 編集(投稿者)

    No34039に返信(つまようじさんの記事)
    > If CHK(TextBox1.Text) = False Then

    "CHK" という Function 名は、.NET の流儀的には
    あまり良い名前の付け方では無かったりします。

    http://objectclub.jp/community/codingstandard/CodingStdVB.doc
    https://qiita.com/Ted-HM/items/7dde25dcffae4cdc7923
    https://dobon.net/vb/dotnet/beginner/namingrules.html
    https://docs.microsoft.com/ja-jp/dotnet/standard/design-guidelines/naming-guidelines


    > TextBoxのテキストが数字かチェックして数字以外ならば対象のTextBoxにフォーカスを合わせて、文字を全選択状態にしたい
    ここでいう「数字」というのが「数値」の意味なのだとしたら、
    TextBox コントロールの Text プロパティではなく、数値入力に特化した、
    NumericUpDown コントロールの Value プロパティを使うのはどうでしょう。


    > Dim d As Double
    > If Double.TryParse(s, d) Then

    この方法の場合、
     s = "NaN"
     s = " -.2e+3 "
     s = "∞"
    なども True になるのでご注意ください。


    また、今回は単一の TextBox が対象だったので、MeesageBox +フォーカス移動という手法も
    取れましたが、複数のテキストを同時に検査する必要があるような場合には、
    複数個所の入力ミスを同時に指摘するために、ErrorProvider を併用すると良いかもしれません。



    > 2.とりあえず動くけどこれでいいのか?というプログラム
    戻り値をチェックしていないのは、意図的なものでしょうか。


    > ボタンを押してチェックに行くのでActiveControlではどこのテキストをチェックしてるのか取得できませんよね?
    即時チェックで良い場合は、Leave イベントで追加検査する手もあります。
    不正値の場合、e.Cancel = True とすることでフォーカス遷移を抑制することができます。
    http://rucio.a.la9.jp/main/dotnet/shokyu/standard23.htm



    > Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    >  CHKObject(TextBox1)
    > End Sub
    > Function CHKObject(s As Object) As Boolean

    CHKObject の引数は
     s As Object
    よりも
     txt As TextBox
    の方が良いと思います。


    > ボタンを押してチェックに行くのでActiveControlではどこのテキストをチェックしてるのか取得できませんよね?
    『アクティブにならないボタン』を用意する、という手が一応あります。
    http://bbs.wankuma.com/index.cgi?mode=al2&namber=12748&KLOG=27

    しかしユーザーは TextBox を変更した「直後」に、Button を押すとは限らないので、
    今回のパターンにおいて、ActiveControl に頼るのは望ましくないと思います。

    たとえば TextBox を変更した後、ListBox や ComboBox を操作してから
    Button を押すパターンもあるでしょうが、この場合、ActiveControl から
    検索対象を探す手法では、TextBox にたどり着けないでしょう。

    あるいは、TextBox1 に「100」、TextBox2に「*」、TextBox3に「3.14」と入力してから
    Button を押した場合、TextBox2 が非数値であることを検査しようとするような場合も、
    ActiveControl 頼みのコードにはなりえませんよね。
引用返信 削除キー/



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

このトピックに書きこむ

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

Mode/  Pass/


- Child Tree -