none
コマンドボタンのテキスト取得について RRS feed

  • 質問

  • おはようございます。

    今まで、アクセスを使っていまして、現在VB.NET+SQLServer Expressの開発を

    勉強中です。

    アクセスでは、質問の件は、「screen.activecontrol.caption」で取得することができたの

    ですが、VB.NET Expressではどのようにすれば取得できるのでしょうか。

    取得した結果をテキストボックスへ入れたいものですから。

    どうか、よろしくお願いします。

    2006年9月3日 1:19

すべての返信

  • 諸農です。

     TI-cb400s さんからの引用

    アクセスでは、質問の件は、「screen.activecontrol.caption」で取得することができたの

    望まれているのがどう言った場面でそのような使われ方でどういう結果が出ればいいのか具体的によくわからなかったのですが、現在のアクティブなフォーム上のアクティブなコントロールのコントロールに表示されている文字列を取得するのであれば、

    Form.ActiveForm.ActiveControl.Text

    で、取得できるかと思います。
    ただ、自クラスがフォームクラスでかつ自クラス内からと言う前提なのであればMeでも良いと思います。あと、コントロールがボタンかどうかと言うことを判定する工夫も忘れずにしてください。

    2006年9月3日 2:58
  • ご回答ありがとうございます。

    やりたいことですが、フォーム上に50音のテキストを表示した、コマンドボタンを50音分用意して、

    ボタンをクリックするごとにクリックしたボタンのテキストを別に用意したテキストボックスに

    あらかじめ入っている文字の最後に加えて表示をしたいのです。

    たとえば、テキストボックスにはじめ何も入っていない状態で、テキスト表示が「あ」の

    コマンドボタンを押すと、テキストボックスに「あ」が表示され、続けてテキスト表示が

    「い」のコマンドボタンを押すと、テキストボックスの表示が「あい」となるようにしたいのです。

    アクセスのときは、この部分をユーザー関数にしておき、コマンドボタンのClickイベントに

    一括して指定すれば、各ボタンをクリックするごとにテキストボックスに文字を追加できたの

    ですが、Visual Basic 2005ではどのようにしてをすればできるのでしょうか。

    Private Function FuncFilter()
            Me.txt_Kana.Text = Me.txt_Kana.Text & Me.ActiveControl.Text
        End Function

    と記述をして、コマンドボタンのClick時のイベントにセットしようとしたところ、

    「プロパティが不正です。」とのエラーが出てしまいます。

     

    2006年9月3日 4:11
  • ?????

     TI-cb400s ???????

    ????????????????50????????????????????50???????

    ???????????????????????????????????????????

    ?????????????????????????????

    ????????????????????????



        Dim tbox As TextBox
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim CharArray() As Char = "???????????????????????????????????? ? ????????".ToCharArray()
            Dim sz As Integer = 25
            Dim px As Integer = 0
            Dim py As Integer = 33
            Dim but As Button
            For i As Integer = 0 To CharArray.Length - 1
                If (i Mod 5) = 0 Then
                    px += sz
                    py = 33
                End If
                but = New System.Windows.Forms.Button
                but.Location = New System.Drawing.Point(px, py)
                but.Name = String.Format("But{0}", i)
                but.Size = New System.Drawing.Size(sz, sz)
                but.TabIndex = 0
                but.Text = CharArray(i).ToString()
                but.UseVisualStyleBackColor = True
                AddHandler but.Click, AddressOf but_Click
                Me.Controls.Add(but)
                py += sz
            Next
            tbox = New System.Windows.Forms.TextBox
            tbox.Location = New System.Drawing.Point(25, 13)
            tbox.Name = "tbox"
            tbox.Size = New System.Drawing.Size(400, 20)
            tbox.TabIndex = 0
            Me.Controls.Add(tbox)
        End Sub
        Private Sub but_Click(ByVal sender As Object, ByVal e As EventArgs)
            tbox.Text = tbox.Text + CType(sender, Control).Text
        End Sub


     

    ??????????????????????????????
    (?????????????????????)

    ???????????????????????????????????????????????
    ??????????????????Form_Load??????????????????(????)????????????????????????????tbox????but_click?????????

    ???????????????????????????????????????????????????????????(????VisualStudio?????????????????> Form1.Designer.vb)?

    ????????????????????????????????????????????????????????????????????Control????????(Button??????)??????????????????????

    ?????????????????????

    #????VB??????????????????????>ALL

    Private Function FuncFilter()
            Me.txt_Kana.Text = Me.txt_Kana.Text & Me.ActiveControl.Text
        End Function

    ???????????????Click????????????????????

    ???????????????????????????

    ???????Click?????????????????????

     

    2006年9月3日 7:05
  • 諸農です。

    編集投稿したら変な状態になったので書き直します。

     TI-cb400s さんからの引用

    やりたいことですが、フォーム上に50音のテキストを表示した、コマンドボタンを50音分用意して、

    ボタンをクリックするごとにクリックしたボタンのテキストを別に用意したテキストボックスに

    あらかじめ入っている文字の最後に加えて表示をしたいのです。

    時間があるのでちょっとコードを起こしてみました。



        Dim tbox As TextBox
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim CharArray() As Char = "あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもや ゆ よらりるれろわん".ToCharArray()
            Dim sz As Integer = 25
            Dim px As Integer = 0
            Dim py As Integer = 33
            Dim but As Button
            For i As Integer = 0 To CharArray.Length - 1
                If (i Mod 5) = 0 Then
                    px += sz
                    py = 33
                End If
                but = New System.Windows.Forms.Button
                but.Location = New System.Drawing.Point(px, py)
                but.Name = String.Format("But{0}", i)
                but.Size = New System.Drawing.Size(sz, sz)
                but.TabIndex = 0
                but.Text = CharArray(i).ToString()
                but.UseVisualStyleBackColor = True
                AddHandler but.Click, AddressOf but_Click
                Me.Controls.Add(but)
                py += sz
            Next
            tbox = New System.Windows.Forms.TextBox
            tbox.Location = New System.Drawing.Point(25, 13)
            tbox.Name = "tbox"
            tbox.Size = New System.Drawing.Size(400, 20)
            tbox.TabIndex = 0
            Me.Controls.Add(tbox)
        End Sub
        Private Sub but_Click(ByVal sender As Object, ByVal e As EventArgs)
            tbox.Text = tbox.Text + CType(sender, Control).Text
        End Sub


     

    すみません。追加編集です。肝心なことを書いていませんでした。
    (点滴の取り替え時間だったのです。ごめんなさい)

    新規でアプリケーションプロジェクトを作成して、最初に表示されたフォームをダブルクリックします。
    そうするとコードエディタに切り替わりForm_Loadイベントハンドラメソッドのスケルトン(宣言部分)が出来上がりますので、上記のコードを貼り付けてください。tboxの宣言とbut_clickを忘れないように。

    ボタンをデザイナで作成するのが面倒くさかったので、上記のコードではコード上でボタンを作成してフォーム上に配置しています(実際にはVisualStudioも内部のコードで同じことしています> Form1.Designer.vb)。

    ボタンがクリックされたらクリックされたオブジェクトが引数としてイベントハンドラメソッドに渡されるので、その時に引き渡されたオブジェクトをControlクラスに見立てて(Buttonクラスでも可)コントロールのテキスト文字を取得しています。

    また、判らないことがあれば尋ねてください。

    #ちなみにVBでの匿名メソッドの使い方ってどうでしたっけ?>ALL

    Private Function FuncFilter()
            Me.txt_Kana.Text = Me.txt_Kana.Text & Me.ActiveControl.Text
        End Function

    と記述をして、コマンドボタンのClick時のイベントにセットしようとしたところ、

    「プロパティが不正です。」とのエラーが出てしまいます。

    このメソッドはClickイベントハンドラ型と一致しないからですね。

     

    2006年9月3日 7:23
  • ご回答ありがとうございます。

    教えていただいたコードを実行したところ、うまくできました。

    しかし、すでにテキストボックス、コマンドボタンは配置済み)の場合では、どのように行うのでしょうか。

    btn_Clickの場合は、おそらく、コマンドボタンをクリックするとこのイベントが発生するようですが、

    btn自体は、どこで宣言がされているのでしょうか。

    現在は、コマンドボタン自体には、配置時のままの名前にしてあり変更はしてありません。

    AddHandler but.Click, AddressOf but_Click

    をすべてのコマンドボタンに対して行う必要があるのでしょうか。

    それとも何かほかの方法があるのでしょうか。

    よろしくお願いします。

     

    2006年9月3日 9:40
  • 諸農です。

    デザイナで既にボタンは配置済みなんですね。
    50音以外のボタンも配置しているのでしょうか?配置していないとするなら次の方法でイベントハンドラをセットすることが可能です。

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        For Each c As Control In Me.Controls
            If c.GetType() Is GetType(Button) Then
                AddHandler CType(c, Button).Click, AddressOf but_Click
            End If
        Next
    End Sub

    Private Sub but_Click(ByVal sender As Object, ByVal e As EventArgs)
        tbox.Text = tbox.Text + CType(sender, Control).Text
    End Sub

     

    Form_Loadイベントハンドラでフォーム上のコントロール配列からボタンオブジェクトを見つけ出して、そのオブジェクトのクリックイベントハンドラにbut_Clickメソッドをセットしています。もしもフォーム上にイベントをセットしたくないボタン(50音入力以外で使用するボタン?)があるのでしたら、Tagプロパティを使うとかText文字列で判定するとかの工夫が必要です。


    btn_Clickの場合は、おそらく、コマンドボタンをクリックするとこのイベントが発生するようですが、
    btn自体は、どこで宣言がされているのでしょうか。

    「btn自体」と言われている「btn」は「btn_Click」のbtnのことでしょうか?もしそうであるのなら、私のコードが少し紛らわしかったのかも知れません。VS2005のIDEを使って、デザイナフォーム上のボタンコントロールをダブルクリックするなどしてクリックイベントハンドラを作成すると、作成されるメソッドスケルトンの名前がコントロール名_Clickの様になりますが、コントロールの名前を使わなければ紐付かないと言うことではないのです。メソッド名が違っていてもメソッドのシグネチャが同じであれば(デリゲート型が一致すれば)紐付かせることが可能なのです。

     

    2006年9月3日 13:38
  • ご回答ありがとうございました。

    教えていただいたコードで、実際にうまくいきました。

    アクセスのVBAばかりやっていたので、イベントをプログラムで追加することができるなんて

    目からうろこでした。

    また、わからないことがありましたら、よろしくお願いします。

    2006年9月5日 12:35
  • 細かいんですが、VBAだと

     Me.txt_Kana.Text = Me.txt_Kana.Text & Me.ActiveControl.Text

    という書き方に慣れていらっしゃると思いますが、VBだと

     Me.txt_Kana.Text += Me.ActiveControl.Text

    という風にも書けます。それだけです。(^^;

    2006年9月5日 15:30
    モデレータ
  • 揚げ足取りです。

     trapemiya さんからの引用
    細かいんですが、VBAだと

     Me.txt_Kana.Text = Me.txt_Kana.Text & Me.ActiveControl.Text

    という書き方に慣れていらっしゃると思いますが、VBだと

     Me.txt_Kana.Text += Me.ActiveControl.Text

    という風にも書けます。それだけです。(^^;

    なぜ、後者だけ + 演算子? (w

    Me.txtKana.Text &= Me.ActiveControl.Text

    が適切なのでは?

    2006年9月5日 23:06
  •  じゃんぬねっと さんからの引用

    Me.txtKana.Text &= Me.ActiveControl.Text

    が適切なのでは?


    お~、確かに。MSDN見ました。
    フォローありがとうございます。

    # C#の感覚で書いてしまった。Orz

    2006年9月6日 0:41
    モデレータ
  • System.Windows.Forms.TextBoxやったら
    Me.txtKana.AppendText(Me.ActiveControl.Text)
    ありかな?
    2006年9月6日 2:23
  • ありでしょうね。

    IL 解析してみるとわかると思いますが、
    結局、Concat あたりを使っていると予想しています。

    なので、&= 演算子を使っても使わなくても、速度は変わらないでしょうね。

    VB6 以前は、&= 演算子が使えませんでしたから、A = A & B もアリだと思いますよ。
    見やすいもので統一さえすれば良いのです。(外野が強制することではないでしょうね)

    2006年9月6日 3:16
  •  take-sea さんからの引用

    System.Windows.Forms.TextBoxやったら
    Me.txtKana.AppendText(Me.ActiveControl.Text)
    ありかな?

    かなりありだと思います。

    Me.txtKana.AppendText(Me.ActiveControl.Text)

    の場合ですと、

    Me.txtKana &= Me.ActiveControl.Text

    と書いてもあまり違いはないと思いますが、

    1. Me.txtKana.AppendText("hoge")
    2. Me.txtKana &= "hoge"

    2の場合は、"hoge"からstringオブジェクトが作成されるはずなので、1に比べてコストがかかると思います。

    2006年9月6日 6:05
    モデレータ
  • Click イベントハンドラに記述するなら

    Me.txt_Kana.Text.AppendText(DirectCast(sender, Button).Text)

    でもいいかなと。

    Handles の後に50音分のボタンのClickを追加するのがちょっとめんどくさいけど。

    2006年9月6日 9:27