VBのEVENT発生とCONTROLの有効範囲について

このQ&Aのポイント
  • 初心者で苦労している方へ。Visual Basicのeventとcontrolに関する質問です。
  • subroutineが変わるとformのcontrolは消えるのか、またその場合の対処方法について教えてください。
  • STARTDIALOG1の初めのRADIO BUTTONの変更のcodeについて、eventの発生と更新処理のタイミングに関しての質問です。
回答を見る
  • ベストアンサー

VBのEVENT発生とCONTROLの有効範囲

visual basicのeventとcontrolについての質問です。  初心者で苦労しています。以下のようなcodeingをしましたが上手く行きません。宜しくお願いします。 1.下記のcall updatefileによりupdatefile内でcombobox内のdataを設定します。これは次のdialogで   設定どおりに出ています。しかし元のsub startdialog1に帰ってdialogを表示してみるとcombobox   内は空となっています。  subroutineが変わるとformの controlは消えるのでしょうか。   もしそうならどの様にすれば良いのでしょうか。   (pushdata変数等をpublicとして再度comboに入れることもやりましたがNG) 2.STARTDIALOG1の初めに RADIO BUTTONの変更のCODEが有りますが、此処でEVENTが    発生しUPDATEFILEに行きます。    DIALOGを出すまでは初期値を設定しDIALOG上でCLICK等して変更をするCODEなので    不具合です。 (ほかにもいろいろ同じCODEが入っていますので)    CODE上の設定変更はEVENTが発生しないように、DIALOGからの変更はEVENT発生としたい    のですがどの様にしたら良いでしょうか。(普通そうなので何か勘違いしてるかも)   INTERNETで見るとAddHandler,AddressOf,REmoveHandlerなどが記載されていますが、    書き方と何処に書くのか判りません。(本当に必要かも?)    よろしくお願いします。    (以下のcodeは読みやすいように簡略化しています、code errorは大目に見て下さい。 ---------------------Form1.vbに記載---------------------------------------    Sub STARTDIALOG1()    '此処から処理が始まる with cform2 as Fform2 .Radio_btn1.Checked = True  ’ここへくるとbuttonのeventが発生,routineにいき,updatefileへいく Call UpdatePfile(1) 'ここはcomboboxの初期値を設定する(UPDATEPFILEを使う) .ShowDialog()     ’UpdatateFileでは入っていたがCOMOBOXの中は空になっている               この後comboboxのdataの選択などをdialogue上で設定値を変更する。 end with end sub -----------------------form1.vbに記載---------------------------------- sub UpdatePfile(ByVal cntlNO) 'PushDataはこの前にREADして設定している、keがそのDATAの個数 For k = 1 To ke cForm2.Combo_P.Items.Add(pushdata(k)) ’COMBOBOX Comb_Pに一覧として入れる Next k cForm2.ShowDialog()   'ここではCOMBOBOXにPUSHDATAが入ったLISTがでる end sub --------------------------------------------------------------------------- DisalogはForm2に作成    radioボタン Radio_btn1とRadio_btn2,combobox combo_P等をsetしている '---------------------------Form2.vbに記載------------------------------------ Private Sub push_button(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Radio_BTN1.CheckedChanged,Radio_BTN2.CheckChanged Dim cls As Form1 RDBTN = 1 If RDBTN > 0 Then Call cls.UpdatePfile(RDBTN) end Sub

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

ちょっと確認していませんが > .Radio_btn1.Checked = True  ’ここへくるとbuttonのeventが発生, イベントは節制しますが、実際に対応するルーチンが実行されるのは、このSubを抜けた後だったように思います。 デバッガでステップ実行したらどうなってますか?

Doubleboggy
質問者

お礼

kmeeさん  ご回答ありがとうございました。結局removehandler/addhandlerを見よう見まねで入れて出ないようになりました。また1のsub間のdataについてはdim cform2 as new form2()が両方のsubに定義されていました。 これって別のformになっていたのではないかと思います。 これを両方のsubとも直接 with form2---end with にて setしたところうまくいくようになりました。解決しました。 長文の質問読んでいただいてありがとうございました。

関連するQ&A

  • 継承したコントロールのイベント

    VB2005を使用しています。 form1にbutton1が設置(ツールボックスからの貼り付け)されているとして、 form2で継承「Inherits form1」します。でリビルド。 この時点で、form2はform1と全く同じデザインです。 form2で継承したbutton1は  Public Class Form2   ~  End Class 内で Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click のようにイベントを設定できないのでしょうか? いろいろ検索等はして、「オーバライド」なるものがあることはわかったのですが、具体的な使い方などが全くわかりません。 できれば簡単なコードなんかを教えていただければとても助かるのですが。オーバーライド以外でもなにか可能な方法があれば是非アドバイスください。 宜しくお願いいたします。

  • FormClosing イベント から終了を取り消すには VB2005

    VB2005で開発しているのですが。 FormClosingイベントの中で。Formの終了イベントを取り消すにはどうしたらよいでしょうか? たとえば。こんなコードがあったら 終了イベントの取り消しにはなんと書いたらよいでしょうか? Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing  If TextBox1.Text = "01" Then    MsgBox("完了!!", MsgBoxStyle.OkCancel)  Else   ' ここに取消終了のコードを書いたらいいのですか? End If End Sub すいませんが。アドバイスをお願いします。 開発環境: XinXP Pro SQL Server2005 Express VS2005 Pro VB2005

  • VBAから変更した時だけイベントを発生させない方法

    Excel VBA で、コンボボックスの選択をユーザーが変更した時はイベントハンドラが呼び出されて処理をしていますが、VBAのコードからコンボボックスの選択を変更した時には、このイベントハンドラが呼び出されないようにしたいのですが、どのように記述すればよいでしょうか。 例えば、下記のコードの (A) の部分で、VBAのコードからコンボボックスの選択を変更していますが、ここでイベントが発生しないようにしたいのですが、Application.EnableEvents = False を記述してもイベントが発生していますがなぜでしょうか。どのように記述すれば (A) の部分でイベントが発生しなくなりますでしょうか。 よろしくお願いします。(Windows7 , Excel2010 ) ---Module1---------- Option Explicit Sub main()  UserForm1.Show End Sub ---UserForm1-------- Option Explicit Private Sub UserForm_Initialize()  Dim i As Integer  ComboBox1.Style = fmStyleDropDownList  For i = 1 To 30   ComboBox1.AddItem Format(i, "00")  Next i End Sub Private Sub CommandButton1_Click()  Dim num As Integer  Dim index As Integer  num = ComboBox1.ListCount  index = ComboBox1.ListIndex  If index = num - 1 Then   Application.EnableEvents = False   ComboBox1.ListIndex = -1 '<----------(A)   Application.EnableEvents = True  Else   ComboBox1.ListIndex = index + 1  End If End Sub Private Sub ComboBox1_Change()  MsgBox ("ComboBox1_Changeイベント発生") End Sub ------------------------------------

  • vb コンボボックスのイベントについて

    こんばんわ。 コンボボックスで、 指定の値をマウス操作でクリックしたときと、 キーボードの上下で、移動後returnを押したときだけ、 MsgBox "処理実行" を実行したいです。 keystateを使ってみたのですが、前の情報が残っているのかうまくいきません。keystateの情報をクリアさせるか、シンプルに上記を動作させる何かよい方法はありますでしょうか。 Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer Dim flg1 As Boolean Private Sub form_load() Combo1.AddItem (11) Combo1.AddItem (22) Combo1.AddItem (33) Combo1.AddItem (44) End Sub Private Sub Combo1_Keyup(KeyCode As Integer, Shift As Integer) If KeyCode = 13 Then 'return flg1 = True Call Combo1_click End If End Sub Private Sub Combo1_click() If (GetKeyState(&H26) <> 0) Or (GetKeyState(&H28) <> 0) Then ' ↑↓ If flg1 = False Then Exit Sub End If End If MsgBox "処理実行" flg1 = False End Sub

  • VB205のPicturebox上でのMousewheelイベント

    VB2005で、Form1にPanel1をはりつけ、その中にPicturebox1をはりつけ、Pictureboxの範囲の中で、マウスをホィールしても、イベントが発生しません。ためしに、Picturebox1とPanel1について書いてみましたが、だめでした!(Form1では、発生します) 何がダメなんでしょうか?どなたか詳しい方がいらっしゃいましたら教えて頂けないでしょうか?宜しくお願い致します。 Private Sub PictureBox1_MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseWheel MsgBox("TEST_Picturebox") End Sub Private Sub Panel1_MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Panel1.MouseWheel MsgBox("TESUT_Panel") End Sub

  • ExcelVBAでユーザーフォームのイベント対応

    Excel2010です。ユーザーフォーム上に配置した6個のComboBox(1から6)があります。 それぞれのComboBox上にマウスポインターを当てた際、そこが選択されていれば(="名称" 以外であれば)同じユーザーフォーム上にあるLabel23に説明の文字を表示させたいのです。 以下のようにComboBox1からComboBox6までComboBoxの番号以外は全く同じコードを書けばそうできると思いますが、これをもっと簡単に書くことはできないでしょうか?教えてください。 あと、もう1点 下記のコードの変数(Button、Shift、X、Y)の意味と役割は何でしょうか? Private Sub ComboBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) If Me.ComboBox1.Value = "名称" Then Exit Sub Me.Label23.Caption = Me.ComboBox1.Value & Range(Me.ComboBox1.ControlSource).Offset(, 9).Value End Sub 途中ComboBox 2から5は省略 Private Sub ComboBox2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) If Me.ComboBox6.Value = "名称" Then Exit Sub Me.Label23.Caption = Me.ComboBox6.Value & Range(Me.ComboBox6.ControlSource).Offset(, 9).Value End Sub

  • VB.NET スレッドからのイベント受信について

    はじめて質問させていただく、VB.NET初心者です。 ただいまスレッド、イベント処理を作成中で Form1にButton1、Label1を貼り付け以下の様なプログラムを記述しました。 (スレッドにて5秒ごとにイベントを発生させます。) 'イベント引数 Public Class EventArgs Inherits System.EventArgs Public nowTime As String End Class 'イベント発行 Public Class EventTest Public Event _event(ByVal sender As Object, ByVal e As EventArgs) Public Sub Go() Dim args As New EventArgs() args.nowTime = Now.ToString RaiseEvent _event(Me, args) End Sub End Class 'フォーム内処理 'スレッド宣言 Dim MyThread As New System.Threading.Thread(AddressOf _Thread) Private WithEvents _test As New EventTest() 'イベント受信   Private Sub Handler(ByVal sender As System.Object, ByVal e As EventArgs) Handles _test._event Label1.Text = e.nowTime End Sub 'スレッド(5秒間隔でイベント発行) Private Sub _Thread() Dim i As Integer For i = 0 To 99 System.Threading.Thread.Sleep(5000) _test.Go() Next End Sub 'スレッド起動 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click MyThread.Start() End Sub End Class 開発環境から普通に実行すれば正常に動作している様なのですが、 イベント受信部(Handler)のLabel1.Text = e.nowTime部に ブレークポイントを置いてLabel1のウォッチをするとその時点で 処理がとまってしまいます。なぜとまるのかが知りたいです。 作成方法がまずいのでしょうか? 皆様よろしくお願いいたします。

  • コントロールにイベントを発生させるには?

    VB.NET2005のWEBユーザーコントロールで下記のようにプロパティやメソッドをつくることはできたのですが、コンボボックスの選択がへんこうされたとか、テキストボックスの内容が変更されたとかのイベントをとることができません。いったいどうすればできるのでしょうか? Public Property TEST() As String Get Return "" End Get Set(ByVal value As String) _Test=value End Set End Property

  • 他のFormのクリックイベント

    教えてください! 他のFormのクリックイベントを実行できますか? Form2のButton2をクリックした時に、Form1の「Button1_Click」を実行させることができますか? 出来るとしたら、Form2の「Button2_Click」にはどのように記載したらいいのでしょうか? [Form1]より Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs)・・・ [Form2]より Private Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs)・・・ End Sub 宜しくお願いします。

  • VB2010において同様のイベントを設定する。

    現在、VisualBasic2010を用いてPanel1~Panel4をPanel5へ移動させて図形を作成させるコードを書いております。 今後Panel1~Panel4をPanel5だけでなく、Panel6,Panel7にも同様に移動させたいと考えておりますが、やりかたがわかりません。 画像はPanel5へ移動させたものです。同様に下に配置したPanel6へも移動させたいです。 わかる方がおられましたら、お力添えいただけると助かります。 Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Panel5.AllowDrop = True End Sub Private Sub Panel1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Panel1.MouseDown, Panel2.MouseDown, Panel3.MouseDown, Panel4.MouseDown sender.DoDragDrop(sender, DragDropEffects.Move) End Sub Private Sub Panel5_DragDrop(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles Panel5.DragDrop Dim srsPnl As Panel = e.Data.GetData(GetType(Panel)) Dim dstPnl As New Panel dstPnl.Size = srsPnl.Size dstPnl.Location = Panel5.PointToClient(CursorPosition) 'New Point(e.X, e.Y) dstPnl.BackColor = srsPnl.BackColor AddHandler dstPnl.MouseDown, AddressOf dstPnl_MouseDown AddHandler dstPnl.MouseMove, AddressOf dstPnl_MouseMove Panel5.Controls.Add(dstPnl) End Sub Private Sub Panel5_DragEnter(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles Panel5.DragEnter If e.Data.GetDataPresent(GetType(Panel)) Then e.Effect = DragDropEffects.Move End If End Sub Private previousPos As Point Private Sub dstPnl_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Panel1.MouseDown previousPos = CursorPosition() End Sub Private Sub dstPnl_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) If e.Button = Windows.Forms.MouseButtons.Left Then Dim nowPos As Point = CursorPosition() DirectCast(sender, Panel).Left += nowPos.X - previousPos.X DirectCast(sender, Panel).Top += nowPos.Y - previousPos.Y Console.WriteLine(nowPos.X & "-" & previousPos.X) previousPos = nowPos End If End Sub Function CursorPosition() As Point Return New Point(CInt(Cursor.Position.X / 10) * 10, CInt(Cursor.Position.Y / 10) * 10) End Function End Class これが現在書いているコードです。

専門家に質問してみよう