プログラム実行中に作成したオブジェクトの動作

このQ&Aのポイント
  • プログラム実行中に作成したオブジェクトの動作について困っています。
  • 作成したオブジェクトに引数を付ける方法や複数の作成したコントロールに対しての処理方法がわかりません。
  • 派生クラスでプロパティを作成し、値を入れておくことで参照する方法も考えています。
回答を見る
  • ベストアンサー

プログラム実行中に作成したオブジェクトの動作

初めて投稿させていただきます。 現在、コントロール・配列の学習をしていて以下のようなプログラムを作っています。 プログラムを実行するとあるファイルからデータを読み込み、そのデータ数の配列を作成。 データ数分のButtonを作成。 作成したボタンに応じて違った処理を行う。 このときにボタンに応じた処理を行えずに困っています。MSDNなどでは作成したオブジェクトが1個のときの処理(AddHandler~addressOf・・・)はあったのですが、これに引数をつけたり、複数の作成したコントロールに対しての処理が見つかりませんでした。 下に作成途中のサンプルを掲載しますので、ご支援おねがいします Dim myButton as New new_button() '//ボタンを継承したクラス Dim Array(5) As String      '//データ格納配列 ***データの読み込み(データ数(item_cnt))*** ReDim Preserve Array(item_cnt) For i = 0 to item_cnt myButton = new New_button() myButton.Text = "Button" & i Me.Controls.Add(myButton) AddHandler myButton.Click,AddressOf new_click Next Private Sub new_click(ByVal sender As System.Object, ByVal e As System.EventArgs) MessageBox.show("押されたのは" & ○○ & "です") End sub ここで押されたボタンごとに処理を変更したいのですが、AddHandlerで引数を付るとエラーが出ます。 もし、読み出し元のプロパティが参照できるのあれば、派生クラスでプロパティを作成、値を入れておき呼び出し元のオブジェクトを参照するっという回避方法もあるかと思いますが、方法がわかりません。 ご存知の方ご教授お願いします

  • tyosu
  • お礼率29% (7/24)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

senderが押されたボタンなので,senderをnew_button型にキャストして使ってください。 senderは「イベントを発生させたオブジェクト」を保持します。 この場合はClickイベントを発生させたオブジェクト,つまりは押されたボタンになります。

tyosu
質問者

お礼

ありがとうございます。 無事に解決しました。 今回はnew_button型でやりましたが、応用すればLabelやTextBoxにも使えそうですね! ActiveForm.ActiveControlでも似たような処理ができましたが、デバックしながらだとエラーが出てしまい、四苦八苦してました。 本当にありがとうございます

関連するQ&A

  • VB.NET2010 Timerの使用

    こんにちは、冬の猫と申します。 VB.NET2010にて、教えて頂きたく投稿します。 現在作成中のプログラムの簡易仕様は、 (1)フォーム上に複数のボタンが配置されている。 (2)ボタンの上にマウスを載ったタイミングで0.5秒カウントする。 (3)0.5秒のカウントが終わるまでマウスがボタンの上にあれば、ボタンのサイズを大きくする。 (4)ボタンの上からマウスがなくなれば、ボタンを元のサイズに戻す。 という形になっているのですが(3)の実装がうまくいきません。 以下にソースコードを貼り付けます。 Public Class Form1 Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 'ボタンのサイズ共通化処理 Dim o As Control For Each o In Me.Controls If o.GetType Is GetType(Button) Then o.Size = New Size(50, 50) End If Next For Each ctl As Control In Me.Controls If TypeOf ctl Is Button Then AddHandler CType(ctl, Button).MouseEnter, AddressOf Button_MouseEnter End If Next For Each ctl2 As Control In Me.Controls If TypeOf ctl2 Is Button Then AddHandler CType(ctl2, Button).MouseLeave, AddressOf Button_MouseLeave End If Next End Sub Private Sub Button_MouseEnter(sender As System.Object, e As System.EventArgs) 'マウスが乗った時 'ボタンの取得 Dim btn As Button = CType(sender, Button) btn.Size = New size(100, 100) End Sub Private Sub Button_MouseLeave(sender As System.Object, e As System.EventArgs) 'マウスが離れた時 'ボタンの取得 Dim btn As Button = CType(sender, Button) btn.Size = New Size(50, 50) End Sub End Class 細かい処理は割愛していますが、大まかにはこの様な処理を作成しました。 インターネットからのコピーアンドペーストもあるので、少し不細工な形になっています。 これに、タイマーイベントを実装したいのですが ボタンの上にマウスが乗った際に、タイマーをスタートさせて 該当するボタンのオブジェクトを取得できず困っております。 ご教授のほど、よろしくお願いします。

  • 【VB2005】 実行時に動的にコントロールを作成した後のコントロールへの処理

    こんばんわ、VB5.0を1週間ほどかじって現在2005に乗り換えたばかりのド初心者です。 (用語の使い方などが間違っている可能性があるかもしれません。おかしなところは指摘していただけるとありがたいです) VB5.0を使っていたときはコントロール配列を使って簡単にできた事が2005になってコントロール配列を使えなくなったため行き詰ってしまいました。 内容は、ある操作をすると画面にコントロールが1つずつ追加されていき、そのコントロールのプロパティを他のコントロールから操作できるようにする物です。 検索などで情報を集めて、なんとかコントロールを追加していくことができるようにはなったのですが、プロパティを変更するためにコントロールにアクセスする際にエラーになってしまって困っています。 一つだけコントロールが追加された場合は、問題なくプロパティをいじれるのですが、2つ以上追加した場合に最新のコントロール以外のプロパティをいじろうとするとエラーになってしまうのです。 下に私の作りたいプログラムを簡潔にしたサンプルソースを記述させていただきます。 間違いの指摘やアドバイスをいただければ幸いです。 FormにはAddButtonというボタンが一つだけあります。 Dim Index As Integer Private Buttons() As System.Windows.Forms.Button Private Labels() As System.Windows.Forms.Label Private Sub AddButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AddButton.Click Index += 1 Me.Buttons = New System.Windows.Forms.Button(Index) {} Me.Labels = New System.Windows.Forms.Label(Index) {} Me.SuspendLayout() Me.Buttons(Index - 1) = New System.Windows.Forms.Button Me.Buttons(Index - 1).Text = Index - 1 Me.Buttons(Index - 1).Size = New Size(30, 30) Me.Buttons(Index - 1).Location = New Point((Index - 1) * 30, 50) Me.Labels(Index - 1) = New System.Windows.Forms.Label Me.Labels(Index - 1).Text = Index - 1 Me.Labels(Index - 1).Size = New Size(30, 30) Me.Labels(Index - 1).Location = New Point((Index - 1) * 30, 100) AddHandler Me.Buttons(Index - 1).Click, _ AddressOf Me.Buttons_Click Me.Controls.AddRange(Me.Buttons) Me.Controls.AddRange(Me.Labels) Me.ResumeLayout(False) End Sub Private Sub Buttons_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Labels(sender.text).ForeColor = Color.Red End Sub

  • 動的に作成したボタンオブジェクトのプロパティ

    以下のようにして動的にボタンオブジェクトを作成しました。 Dim NewButton = New Button NewButton.ID = "NewButton1" NewButton.CommandName = "ComName" NewButton.Text = "NewButton" form1.Controls.Add(NewButton) ここまではいいのですが、このボタンを押したときに処理されるルーチンを指定するための方法がわかりません。 NewButton.onClick = "NewButton_Click" としても、 NewButton.onCommand = "NewButton_Command" としても、「…はProtectedであるため、このコンテキストではアクセスできません」と怒られます。 どうすればいいでしょうか?

  • VBプログラムエラー

    Private number As Integer Private rows As Integer Private columns As Integer Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim form2 As New Form() ' Create a button to add to the new form. Dim button1 As New Button() ' Set text for the button. button1.Text = "Scrolled Button" ' Set the size of the button. button1.Size = New Size(1000, 800) ' Set the location of the button to be outside the form's client area. button1.Location = New Point(form2.Size.Width + 200, form2.Size.Height + 200) ' Add the button control to the new form. form2.Controls.Add(button1) ' Set the AutoScroll property to true to provide scrollbars. form2.AutoScroll = True ' Display the new form as a dialog box. form2.ShowDialog() If Not Integer.TryParse(TextBox1.Text, rows) OrElse _ Not Integer.TryParse(TextBox2.Text, columns) OrElse _ Not Integer.TryParse(TextBox3.Text, number) Then MessageBox.Show("数字で入力してください", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End If Me.Bounds = New Rectangle(10, 10, 1300, 900) Dim cnt As Integer = 0 For k As Integer = 1 To number For i As Integer = 1 To rows For j As Integer = 1 To columns Dim tb As TextBox = New TextBox() cnt += 1 tb.Name = "tb" + cnt.ToString() Me.Controls.Add(tb) tb.Top = (i - 1) * 30 + 80 tb.Left = (j - 1) * 60 + 70 * (columns * (k - 1)) + 10 tb.Width = 50 Next Next Next End Sub スクロール画面を作成し、 そのスクロール画面上にボタンを1つ作り、 テキストボックスが出てくるようにしたいです。 どうすればできるのでしょうか 。 これはわかるところまで作成しています。

  • ASP.NET2.0でのコントロール配列

    早速質問させていただきます。 VB2005のWindowsアプリではtagプロパティを使ってオブジェクトの特定ができたので コントロール配列が可能でした。 '---ハンドラー作成 For i = 0 To 9 '//コイル1 AddHandler txt_(i).MouseDoubleClick, AddressOf txt_MouseDoubleClick txt_(i).Tag = i Next '---イベント処理 Private Sub txt_MouseDoubleClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Dim i As Integer i = CType(sender, TextBox).Tag end sub しかしASP.NET2.0のテキストボックスやコマンドボタンにはtagプロパティがない?ため、 イベント元オブジェクトを特定できません。これは代わりとなるプロパティがあるのでしょうか? それとも、ASP.NET2.0ではWindowsアプリのようなコントロール配列はできないのでしょうか? ご教授のほどよろしくお願い致します。

  • VBプログラム エラーが出ます

    Public Class Form1 Private number As Integer Private rows As Integer Private columns As Integer Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If Not Integer.TryParse(TextBox1.Text, rows) OrElse _ Not Integer.TryParse(TextBox2.Text, columns) OrElse _ Not Integer.TryParse(TextBox3.Text, number) Then MessageBox.Show("数字で入力してください", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End If Me.Bounds = New Rectangle(10, 10, 1300, 800) Dim cnt As Integer = 0 For k As Integer = 1 To number For i As Integer = 1 To rows For j As Integer = 1 To columns Dim tb As TextBox = New TextBox() cnt += 1 tb.Name = "tb" + cnt.ToString() Me.Controls.Add(tb) tb.Top = (i - 1) * 30 + 80 tb.Left = (j - 1) * 60 + 70 * (columns * (k - 1)) + 10 tb.Width = 50 Next Next Next End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim sum As Double Dim cnt As Integer = 0 For i As Integer = 1 To rows For j As Integer = 1 To columns Dim tb As TextBox = New TextBox() cnt += 1 : If cnt > rows * columns Then cnt = 1 tb.Name = "tbA" + cnt.ToString Me.Controls.Add(tb) tb.Top = (i - 1) * 30 + (80 + 40 * rows) tb.Left = (j - 1) * 60 + 10 tb.Width = 40 sum = 0 For k As Integer = 1 To number sum += Double.Parse(CType(Me.Controls("tb" + (cnt + (rows * columns * k-1))).ToString(), TextBox).Text)    エラー Next tb.Text = sum.ToString() Next Next End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click Do Until Me.Controls.Count <= 6 For Each tbD As Object In Me.Controls If CType(tbD, Control).Name Like "tb*" Then Me.Controls. Remove(tbD) Next Loop End Sub End Class エラーと書いている箇所 どう直したらよいのでしょうか。 縮小変換しないで呼び出されるアクセス可能なitemがないためオーバーロードの解決に失敗しました と出ます。 あとwindowsの画面の大きさを入力される値が小さければ少し小さいwindowsになるように変えたいのですがどうしたよいのでしょう。

  • オブジェクトとは、わかりやすくいうと何なのでしょうか?

    いつも習ってばかりで申し訳ありません。 質問なのですが、本でVB6を勉強していて、疑問が出ました。 コマンドボタンや、ラベルなどは、コントロールと言います、 と書いてあります。しかし、進んでいくにつれて、いつの間にか それらをオブジェクトと書いてあります。これはコントロール=オブジェクト と考えて問題ないのでしょうか?さらに進んでいくと、 Dim Cn As ADODB.Connection Dim Rs As ADODB.Recordset というので、アクセスに接続するためのものだというのは漠然とわかるのですが、 深く考えていったら、最初の方にはasの後はデータ型を指定しますと あるのですが、ADODB~はデータの型なんでしょうか? さらに、これをレコードセットオブジェクトと言いますとあります。 えぇ!これがオブジェクト!?オブジェクトって一体何なんだろうと 悩み始めました(>_<)調べても、明確には理解できませんでした。 どうか、こんな僕に教えて下さい、よろしくお願いします<(_ _)>

  • 【vb2005】 動的に作成されたComboBoxをイベントハンドラへ関連づけする際の問題

    おはようございます。 VB5.0を1週間ほどかじって現在2005に乗り換えたばかりのド初心者です。 (用語の使い方などが間違っているかもしれません。おかしなところは指摘していただけるとありがたいです) 実行時に動的(?)に作成されたComboBoxをイベントハンドラへ関連付けようとしているのですが、ClickやLeaveなどで関連づけると正常に動作するのにTextChangedの場合になぜか認識してもらえません。 原因の見当がまったくつかず、困り果てています。 内容は、まずボタンを押すとコンボボックスが2つずつ追加されます。そのコンボボックスのリストを選ぶ際、追加されたふたつが同じものを選んでいると色が変わるようにするものです。 下にそのソースを簡潔にしたサンプルを記述させていただきます。 間違いの指摘や、うまくいかない原因、アドバイスなど頂ければ幸いです。 (formにはButton1というボタンが一つだけあります。) Dim Index As Integer Private CBox1() As ComboBox Private CBox2() As ComboBox Private Sub CBB_LT_SameErroCheck(ByVal sender As System.Object, ByVal e As System.EventArgs) Dim T As Integer T = sender.Tag If CBox1(T).Text = "" Then Exit Sub End If If CBox1(T).Text = CBox2(T).Text Then CBox1(T).BackColor = Color.Red CBox2(T).BackColor = Color.Red Else CBox1(T).BackColor = Color.White CBox2(T).BackColor = Color.White End If End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ReDim Preserve CBox1(Index) ReDim Preserve CBox2(Index) SuspendLayout() CBox1(Index) = New ComboBox CBox2(Index) = New ComboBox With CBox1(Index) .Location = New Point(105, Index * 20) .Size = New Size(95, 20) .DropDownStyle = ComboBoxStyle.DropDownList .Tag = Index .Items.Add("List1") .Items.Add("List2") End With With CBox2(Index) .Location = New Point(200, Index * 20) .Size = New Size(95, 20) .DropDownStyle = ComboBoxStyle.DropDownList .Tag = Index .Items.Add("List1") .Items.Add("List2") End With 'AddHandler CBox1(Index).Click, AddressOf CBB_LT_SameErroCheck 'AddHandler CBox2(Index).Click, AddressOf CBB_LT_SameErroCheck AddHandler CBox1(Index).TextChanged, AddressOf CBB_LT_SameErroCheck AddHandler CBox2(Index).TextChanged, AddressOf CBB_LT_SameErroCheck Me.Controls.Add(CBox1(Index)) Me.Controls.Add(CBox2(Index)) ResumeLayout(False) Index += 1 End Sub

  • VB.net エラー「オブジェクト参照がオブジェクトインスタンスに設定されていません」

    タイトル通り『オブジェクト参照がオブジェクトインスタンスに設定されていません』というエラーが発生し、全く僕の脳では解決しないので、ここに質問させて頂きます。 VB.netでフォームロード時に、Accessに登録されている件数分だけテキストコントロールを動的に配置(配列処理をしています)、そこにAccessからデータを取り込みます。 追加ボタンで一件分のテキストコントロールを一番下の行になるよう配置。そこにユーザがデータを入力し、更新ボタンを押すことで、Access上にINSERTする。 というような処理です。 で、INSERTはされるのですが、その後textboxの中身を配列の最初から確認しようしたり、データを入れようとしたり、空にしようとしたりすると上のエラーが表示されます。 'テキストの配列' Private field_text(,) As System.Windows.Forms.TextBox Sub s_insert() ' ’ 更新ボタン時の処理 ' Const strinsert As String = "INSERT INTO 社員マスター (SNO,SNAME) VALUES (@sCode,@sName)" Dim oConn As New System.Data.OleDb.OleDbConnection Dim oCommand As New OleDbCommand Dim i As Integer Dim j As Integer Dim insert_ok As Integer 'DB接続のための処理(省略)      'SQL文の設定 oCommand.CommandText = strinsert insert_ok = 0 oCommand.Parameters.Add(New OleDbParameter("@sCode", OleDbType.Char, 10)) oCommand.Parameters("@sCode").Value = field_text(更新する行の値, 0).Text oCommand.Parameters.Add(New OleDbParameter("@syainName", OleDbType.Char, 20)) oCommand.Parameters("@sName").Value = field_text(更新する行の値, 1).Text insert_ok = oCommand.ExecuteNonQuery() 'SQL文を実行' If insert_ok > 0 Then MessageBox.Show("新規登録完了", "メッセージ") End If 'DB接続を閉じる処理(省略) For i = 0 To 登録行数 - 1 For j = 0 To 1 f_text(i, j).Text = ""  ←ここでエラー Next j Next i End Sub 随分と省いてあり、意味の分からない部分が多数あると思いますが、何か気付いたことや他の部分を書け!という場所があれば教えてください。 一日やっても解決せずに、本当に困り果てています。

  • XMLHttpRequestオブジェクトが思うように動作しない

    XMLHttpRequestオブジェクトが思うように動作しない 質問させてください。 JAVASCRIPTでRSSリーダーを作成しているのですが、うまく作れません。 処理は以下のように行っています。 1. RSSのURLを配列に格納する。 2. XMLHttpRequestオブジェクトを作成する。 3. 配列の要素数だけforループを行い、ループ内でopen処理とコールバック関数の設定を行う。 僕の行っている処理では、なぜか最後に登録したURLのRSSだけが表示されます。(push,popしているので最後に登録=最初にopenする) 参考までにコードを以下に記載します。 どうかお知恵をお貸しください。 //ファイルにアクセスし受信内容を確認します methodは'GET' function requestFile( data , method ) { URLList = new Array(); URLList.push(URL1); URLList.push(URL2); //XMLHttpRequestオブジェクト生成 httpoj = createHttpRequest() //[1] for (i = 0; i < URLList.length; i++) { //open メソッド // HTTP上のXMLでないと駄目・・・? URL = URLList.pop(); document.getElementById('test1').innerHTML += URL; httpoj.open( method , URL , 'false'); //[2] //受信時に起動するイベント httpoj.onreadystatechange = function() //[4] { //readyState値は4で受信完了 if (httpoj.readyState==4) //[5] { //コールバック on_loaded(httpoj); } } } //send メソッド httpoj.send( data ); //[3] }