ほかのプロシージャで定義したボタンなどのコントロールを別のプロシージャで、操作するには?

タグの編集
投稿者 winvis  (学生) 投稿日時 2009/12/23 01:55:54
こんばんわ、winvisといいます。
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
dim a as new button
dim b as new form2
me.controls.add(a)
b.toplevel = false
me.controls.add(b)
b.show
end sub

Form1_Loadで、定義したボタン・フォームを、Button1_clickなどの、別のプロシージャで操作するにはどうすればいいですか?

操作する内容
ボタンの場合
form2のボタンを、controls.removeで、削除する
フォームの場合
最大化・最小化する

投稿者 トマト  (小学生) 投稿日時 2009/12/23 02:59:55
Form1のControlsコレクションに追加したのだから
Private Sub Button1_Click(sender As Object, e As EventArgs)
    Dim i As Integer = 番号
    Dim o = Me.Controls(i) 'VB2008でない場合はControl型で 
    '↓処理を書く 

End Sub

確か、iをString型にしてコントロールのNameプロパティの値にしても行くと思います。

もう1つ
Public Class Form1
    Dim a As New Button
    Dim b As New Form2
    Private Sub Form1_Load(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles MyBase.Load
        Me.Controls.Add(a)
        b.Toplevel = False
        Me.Controls.Add(b)
        b.Show()
    End Sub

投稿者 winvis  (学生) 投稿日時 2009/12/23 03:54:45
迅速な返答ありがとうございます。

Private Sub Button1_Click(sender As Object, e As EventArgs)
    Dim i As Integer = 番号
    Dim o = Me.Controls(i) 'VB2008でない場合はControl型で 
    '↓処理を書く 

End Sub
の番号って、何でしょうか?

>確か、iをString型にしてコントロールのNameプロパティの値にしても行くと思います。
とは、こういう事なのでしょうか?
Dim i As String = a.Name
        Dim o = Me.Controls(i)
        If o.Visible = True Then
            o.Visible = False
        Else
            o.Visible = True
        End If

それと、フォームは同じフォームを、複数表示させたいので
Form1_Loadの、外で dim b as new form2
と、
宣言すると、一つしか出ないのですが解決策ないですか?
投稿者 まだまだ  (中学生) 投稿日時 2009/12/23 06:43:34
コード未検証ですが、こんなのはどうでしょう。
ControlのNameプロパティを設定して、Ctypeで動かす。

Private Sub Button1_Click(....)
   Dim c As New Label
   c.Name = "Label1"
   Me.Controls.Add(c)
End Sub

Private Sub Button2_Click(....)
   Ctype("Label1" , Label).Text = "新しいLabel"
End Sub

こんなもんでいかがでしょうか。
投稿者 トマト  (小学生) 投稿日時 2009/12/23 23:35:26
わかりにくくてすいませんでした。
>番号って、何でしょうか?
追加した順番のことです。
Controlsプロパティはコレクションなので、ほぼArrayListと同じような使い方ができます。
Dim list As New ArrayList
MsgBox(list(0)) '0番の内容が表示される。 

     ↓
MsgBox(Me.Controls(0).Text) 'フォームのコントロール0番のTextプロパティを表示 

というように使えます。

>>確か、iをString型にしてコントロールのNameプロパティの値にしても行くと思います。
  とは、こういう事なのでしょうか?

そうです。詳しくはhttp://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard20.htmで。

>一つしか出ないのですが解決策ないですか?
???????????????????????
投稿者 nakaP  (社会人) 投稿日時 2009/12/24 00:27:05
こんにちは。

>Form1_Loadで、定義したボタン・フォームを、Button1_clickなどの、別のプロシージャで操作するにはどうすればいいですか?

この質問は、

>Form1_Loadで、定義したボタン・フォームで、Button1_clickなどのイベントを発生させるのにはどうすればいいですか?

と、

>Form1_Loadで、定義したボタン・フォームを、元々用意されているButton1_clickなどの、別のコントロールのイベントプロシージャで操作するにはどうすればいいですか?

の2通りの捉え方ができます。
前者ならAddHandlerで紐付け、後者ならプロシージャ変数をクラス変数にすれば解決できます。
投稿者 winvis  (社会人) 投稿日時 2009/12/24 07:33:30
nakaPさん、ご指摘ありがとうございます
後者ですね・・・
語弊を生むようなタイトルで、申し訳ございませんorz
投稿者 nakaP  (社会人) 投稿日時 2009/12/25 04:00:04
>フォームは同じフォームを、複数表示させたいので
>Form1_Loadの、外で dim b as new form2
>と、
>宣言すると、一つしか出ないのですが解決策ないですか? 

MDIFormみたいなことがしたいのでしょうか。
同一のものを複数利用したい場合は配列を使います。
クラス変数(Form_Loadなどのプロシジャ外で宣言した変数)の場合はDimステートメントではなくPrivateステートメントを利用したほうが良いです。
クラス変数の場合は、利用する直前にインスタンスの生成(New)をしたほうが良いです。

以上をまとめると以下のような感じ。
Public Class Form1
    Private f(2) As Form2

    Private Sub Button1_Click(Byval sender As Object, Byval e As System.EventArgs) Handles Button1.Click
        f(0) = New Form2()
        f.TopLebel = False
        Me.Controls.Add(f(0))
        f(0).Show()
    End Sub

    Private Sub Button2_Click(Byval sender As Object, Byval e As System.EventArgs) Handles Button2.Click
        f(1) = New Form2()
        f.TopLebel = False
        Me.Controls.Add(f(1))
        f(1).Show()
    End Sub

    Private Sub Button3_Click(Byval sender As Object, Byval e As System.EventArgs) Handles Button3.Click
        f(2) = New Form2()
        f.TopLebel = False
        Me.Controls.Add(f(2))
        f(2).Show()
    End Sub
End Class

手書きなので細かいところは間違ってるかも。
投稿者 winvis  (学生) 投稿日時 2009/12/25 08:48:07
nakaPさん、トマトさん返答ありがとうございます
こういう方法が、有るんですね、ありがとうございます。