質問者
コマンドボタンのテキスト取得について

質問
すべての返信
-
諸農です。
TI-cb400s さんからの引用 アクセスでは、質問の件は、「screen.activecontrol.caption」で取得することができたの
望まれているのがどう言った場面でそのような使われ方でどういう結果が出ればいいのか具体的によくわからなかったのですが、現在のアクティブなフォーム上のアクティブなコントロールのコントロールに表示されている文字列を取得するのであれば、
Form.ActiveForm.ActiveControl.Text
で、取得できるかと思います。
ただ、自クラスがフォームクラスでかつ自クラス内からと言う前提なのであればMeでも良いと思います。あと、コントロールがボタンかどうかと言うことを判定する工夫も忘れずにしてください。 -
ご回答ありがとうございます。
やりたいことですが、フォーム上に50音のテキストを表示した、コマンドボタンを50音分用意して、
ボタンをクリックするごとにクリックしたボタンのテキストを別に用意したテキストボックスに
あらかじめ入っている文字の最後に加えて表示をしたいのです。
たとえば、テキストボックスにはじめ何も入っていない状態で、テキスト表示が「あ」の
コマンドボタンを押すと、テキストボックスに「あ」が表示され、続けてテキスト表示が
「い」のコマンドボタンを押すと、テキストボックスの表示が「あい」となるようにしたいのです。
アクセスのときは、この部分をユーザー関数にしておき、コマンドボタンのClickイベントに
一括して指定すれば、各ボタンをクリックするごとにテキストボックスに文字を追加できたの
ですが、Visual Basic 2005ではどのようにしてをすればできるのでしょうか。
Private Function FuncFilter()
Me.txt_Kana.Text = Me.txt_Kana.Text & Me.ActiveControl.Text
End Functionと記述をして、コマンドボタンのClick時のイベントにセットしようとしたところ、
「プロパティが不正です。」とのエラーが出てしまいます。
-
?????
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?????????????????????
-
諸農です。
編集投稿したら変な状態になったので書き直します。
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イベントハンドラ型と一致しないからですね。
-
ご回答ありがとうございます。
教えていただいたコードを実行したところ、うまくできました。
しかし、すでにテキストボックス、コマンドボタンは配置済み)の場合では、どのように行うのでしょうか。
btn_Clickの場合は、おそらく、コマンドボタンをクリックするとこのイベントが発生するようですが、
btn自体は、どこで宣言がされているのでしょうか。
現在は、コマンドボタン自体には、配置時のままの名前にしてあり変更はしてありません。
AddHandler but.Click, AddressOf but_Click
をすべてのコマンドボタンに対して行う必要があるのでしょうか。
それとも何かほかの方法があるのでしょうか。
よろしくお願いします。
-
諸農です。
デザイナで既にボタンは配置済みなんですね。
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 SubForm_Loadイベントハンドラでフォーム上のコントロール配列からボタンオブジェクトを見つけ出して、そのオブジェクトのクリックイベントハンドラにbut_Clickメソッドをセットしています。もしもフォーム上にイベントをセットしたくないボタン(50音入力以外で使用するボタン?)があるのでしたら、Tagプロパティを使うとかText文字列で判定するとかの工夫が必要です。
btn_Clickの場合は、おそらく、コマンドボタンをクリックするとこのイベントが発生するようですが、
btn自体は、どこで宣言がされているのでしょうか。「btn自体」と言われている「btn」は「btn_Click」のbtnのことでしょうか?もしそうであるのなら、私のコードが少し紛らわしかったのかも知れません。VS2005のIDEを使って、デザイナフォーム上のボタンコントロールをダブルクリックするなどしてクリックイベントハンドラを作成すると、作成されるメソッドスケルトンの名前がコントロール名_Clickの様になりますが、コントロールの名前を使わなければ紐付かないと言うことではないのです。メソッド名が違っていてもメソッドのシグネチャが同じであれば(デリゲート型が一致すれば)紐付かせることが可能なのです。
-
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に比べてコストがかかると思います。