VB.NET2010 Timerの使用

このQ&Aのポイント
  • VB.NET2010にて、ボタンの上にマウスを載せた際に0.5秒カウントし、ボタンサイズを変更する処理を実装していますが、うまくいきません。
  • タイマーイベントの実装に困っています。ボタンの上にマウスが乗った時にタイマーをスタートさせる処理ができず、助言をいただきたいです。
  • プログラムにはタイマーイベントの実装を追加したいですが、ボタンのオブジェクトを取得することができていません。ご助力ください。
回答を見る
  • ベストアンサー

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 細かい処理は割愛していますが、大まかにはこの様な処理を作成しました。 インターネットからのコピーアンドペーストもあるので、少し不細工な形になっています。 これに、タイマーイベントを実装したいのですが ボタンの上にマウスが乗った際に、タイマーをスタートさせて 該当するボタンのオブジェクトを取得できず困っております。 ご教授のほど、よろしくお願いします。

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

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

再び失礼します Timerが必須だといけませんので、Timerを使用した場合のサンプルを作成しました。 かなり適当に作成してますのでWinterCat-Huyuさんの目的に合わせて調整してください。 Public Class Form1 Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Shown 'ボタンのサイズ共通化処理 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 Dim btn As Button ' Timer1_Tickで参照できるようにここで変数宣言 Private Sub Button_MouseEnter(sender As System.Object, e As System.EventArgs) btn = sender btn = CType(sender, Button) 'Timerの設定 Timer1.Interval = 1000 Timer1.Enabled = True 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 Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick 'マウスが乗った時 'ボタンの取得 btn.Size = New Size(100, 100) 'Timerを無効にする Timer1.Enabled = False End Sub End Class

WinterCat-Huyu
質問者

お礼

bybalsendercase様 ありがとうございます。 記入が入れ違いになってしまったようです・・・ ご指摘いただいた通り、 Dim btn As Button ' Timer1_Tickで参照できるようにここで変数宣言 が抜けておりました。 また、記述の方法も勉強になります。 貴重なお時間をありがとうございました。

その他の回答 (1)

回答No.1

こんばんは 今回はTimerが必須ですか? もしTimerが必須でなければ、下記のコードのように1行追加するだけですみますが、だめですか? Private Sub Button_MouseEnter(sender As System.Object, e As System.EventArgs) '0.5秒間お休み Threading.Thread.Sleep(500) 'Application.DoEvents() 'マウスが乗った時 'ボタンの取得 Dim btn As Button = CType(sender, Button) btn.Size = New Size(100, 100) End Sub ダメな場合は教えてください。 よろしくお願いします。

WinterCat-Huyu
質問者

お礼

bybalsendercase様 ありがとうございます。 文章として抜けておりました、ボタンに0.5秒の間マウスが乗っていなければ アクションをおこなさいという処理がほしかったのです。 ボタンが50個(5×10)ほど並んでおりマウスを目的のボタンに移動するたびに マウスの軌跡上にあるボタンが大きくなるので困っておりました。 この件は、先ほど解決しましたので記載します。 Dim btn As Button Private Sub Button_MouseEnter(sender As System.Object, e As System.EventArgs) 'Application.DoEvents() 'マウスが乗った時 'ボタンの取得 btn= CType(sender, Button) timer1.start End Sub Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick btn.Size = New Size(100, 100) Timer1.Stop End Sub Private Sub Button_MouseLeave(sender As System.Object, e As System.EventArgs) 'マウスが離れた時 Timer1.stop 'ボタンの取得 btn = CType(sender, Button) btn.Size = New Size(50, 50) End Sub ※タイマーインターバル=300ぐらい となりました Dim btn As Button を、グローバルで宣言するだけです^^; 灯台もと暗しでした・・・ お騒がせしてすみません、アドバイスありがとうございました。

関連するQ&A

  • 【VB2008】 コントロールのBackGroundImageがどれになっているかを把握

     今晩は,いつも勉強させていただいております. 質問させていただきます.どうぞよろしくお願いいたします.  使用されているアプリが今どのような状況にあるのかを把握するために (例えばButtonがOnになっているかどうか,など..) コントロールのBackGroundImageがどれになっているのかを取得いたしたく,  Private Sub Button1_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) _  Handles Button1.MouseEnter    If Button1.BackgroundImage Is My.Resources.Button1_ON Then     :    End If などといたしましたが,If文が反応いたしません. 何か画像ファイル名を取得するよい方法などございませんでしょうか??  他の手といたしましては,LabelをVisible = Falseで隠しておいて そこに入っている文字列を変える...などといった事も考えてみたのですが, Formや動作がどんどん重くなりそうですので...orz  もしお詳しい方がいらっしゃいましたら,是非ともアドバイスいただきたく どうぞよろしくお願いいたします.

  • VB添削

    このプログラムは 例えば3 3 4とテキストボックスに数字が打ち込まれると 3×3行列が4個分 のテキストボックスがでてきます。 ここに数字を打ち込んでいき、ボタン2を押すと3×3のテキスト トボックスが出てくると同時に足し算した結果が出てくるようにしたいです。 以下のプログラムはできたところまで作成しています。 どこを直せばよいのでしょうか。 Public Class Form1 Private number As Integer Private rows As Integer Private columns As Integer Private Sub Form11_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load For i As Integer = 1 To 3 AddHandler Me.Controls("TextBox" & i).TextChanged, AddressOf TextBox_TextChanged Next End Sub Private Sub TextBox_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) If System.Text.RegularExpressions.Regex.IsMatch(CType(sender, TextBox).Text, "[^0-9]") Then MessageBox.Show("数字で入力してください", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) With CType(sender, TextBox) .Text = .Text.Substring(0, .Text.Length - 1) .SelectionStart = .Text.Length End With End If Dim cnt1 As Integer Dim cnt2 As Integer Dim cnt3 As Integer If Integer.TryParse(TextBox1.Text, cnt1) And Integer.TryParse(TextBox2.Text, cnt2) And Integer.TryParse(TextBox3.Text, cnt3) Then For k = 1 To cnt3 For i = 1 To cnt1 For j = 1 To cnt2 Dim tb As TextBox = New TextBox() tb.Name = "tb" + i.ToString() Me.Controls.Add(tb) tb.Top = (i - 1) * 28 + 55 tb.Left = (j - 1) * 30 + 40 * (cnt2 * (k - 1)) + 10 tb.Width = 25 Next Next Next End If End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.Bounds = New Rectangle(10, 10, 1350, 800) Me.AutoScroll = True 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 = "tb" + 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 TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged End Sub Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged End Sub Private Sub TextBox3_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox3.TextChanged End Sub End Class

  • Vb.NetでFor~Nextの使い方

    登録したデータの中から該当するID(データの頭2つ)を抜き出し、それを参照にLabel5と6に名前と所属のデータを表示させています。 該当データがない場合はLabel4に該当なしと表示します。 下の様に作ってみたのですが、どのIDを打っても名前と所属はちゃんと出るのですが、該当なしまで一緒に表示されます。 これはどこを変更したらいいのでしょうか? Public Class Form1 Dim data(9) As String Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click End End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Data(0) = "01山田 花子     デバイス部" 以下Data(9)まで続く・・       End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click For i = 0 To 9 If Mid(ShainData(i), 1, 2) = TextBox1.Text Then Label5.Text = Mid(Data(i), 3, 9) Label6.Text = Mid(Data(i), 13, 2) Else Label4.Text = "該当なし。" End If Next

  • VB2010 コードの意味を教えてほしいです。

    VB2010を使って、基礎から勉強中です。 テキストに紹介してあるサンプルプログラムを作っているところですが、 どうしても、わからないところがあります。 乱数を発生させ、こんばんはという文字を、5つのボタンにランダムに表示させて ボタンをクリックして、なんという言葉か当てるゲームです。 その中で、For ~ Nextの中に入力されている内容の意味を 詳しく知りたいです。よろしくお願いします。 Public Class Form1 Private answer As String = "こんばんは" '答え Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load '答えを文字列の配列に変換 Dim moji() As Char = answer.ToCharArray() '文字入れ替え Dim rnd As New Random() '乱数を発生させる For i As Integer = 1 To 10 Dim n1 As Integer = rnd.Next(5) Dim n2 As Integer = rnd.Next(5) Dim m As Char = moji(n1) moji(n1) = moji(n2) moji(n2) = m Next Button1.Text = moji(0) Button2.Text = moji(1) Button3.Text = moji(2) Button4.Text = moji(3) Button5.Text = moji(4) '回答欄を初期化 Label2.Text = "" End Sub Private Sub btns_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, Button3.Click, Button4.Click, Button5.Click Dim btn As Button = CType(sender, Button) Label2.Text &= btn.Text btn.Visible = False If Label2.Text = answer Then MsgBox("おめでとう", 0, "正解") ElseIf Label2.Text.Length >= answer.Length Then MsgBox("残念!", 0, "不正解") End If

  • vb2010 Sleepを使うと調子が悪くなる

    次のプログラムでButton1を押さないで×を押すと仕事を残して終了した事になり,PCの調子が悪くなります。 なんとか回避できないでしょうか。 Public Class Form1 Private ExitFlag As Boolean = False Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click For I = 1 To 10000 System.Threading.Thread.Sleep(1000) Application.DoEvents() '他のWindows操作を可能にするため If ExitFlag Then Exit For Next ExitFlag = False MsgBox("中止されました") End Sub Private Sub Button1_Click(sender As Object, e As System.EventArgs) Handles Button1.Click ExitFlag = True End Sub End Class

  • 【VB2008】 .MouseEnter時にe.Graphics.DrawString~をする方法

     今晩は,いつも勉強させていただいております. 質問させていただきます.どうぞよろしくお願いいたします.  ボタンの文字を見やすくするため影付き文字にいたしておりますが (下のコード1になります),このボタンにMouseEnterした際に, クリックできることが分かりやすいよう影の色を変えようと思ったのですが やり方が見つけられません...  <コード1>  Private Sub Button1_Paint(ByVal sender As   Object, ByVal e As System.Windows.Forms.PaintEventArgs) _   Handles Button1.Paint     e.Graphics.DrawString("TEST", _     New Font("MS Pゴシック", 10), Brushes.Black, 81, 11)     e.Graphics.DrawString("TEST", _     New Font("MS Pゴシック", 10), Brushes.Red, 80, 10) End Sub  <トライしたコード>  Private Sub Button1_MouseEnter(ByVal sender As   Object, ByVal e As System.EventArgs) _   Handles Button1.MouseEnter     e.Graphics.DrawString("Test", _     New Font("MS Pゴシック", 10), Brushes.White, 81, 11)     e.Graphics.DrawString("Test", _     New Font("MS Pゴシック", 10), Brushes.Red, 80, 10)  End Sub  エラー「'Graphics'は'System.EventArgs'のメンバではありません」と なるのは当然だと思うのでございますが,引数「e As ~」を書き直すなどいたしましても 通りませんorz  別の方法で「.Paint時に描いた文字色はそのままで,.MouseEnter時に .ForeColorを変えれば...」などと考えましたが,ButtonのTextが .Paintで描いた文字より上にくるのでうまくできませんでした...  もしとんちんかんなご質問でしたら申し訳ございません.何かよさそうな 方法がございましたらご紹介いただけないでしょうか.  もしお詳しい方がいらっしゃいましたら,是非ともアドバイスいただきたく お願い申し上げます.

  • VB2013でのプログラム作成でつまづきました

    初めまして ご質問です 会社にて、職場改善のため VB2013でプログラムを作成していますが PCに詳しいのが自分しかいなく、指名されました。。。 もちろん自作PCとか作れるぐらいですが プログラムなんてやったことないし困っています 職場にプログラム専門の方がいるので教育を受けていますが 2.3回教えてもらって  「windowsの電卓を作ろう」と言われました 電卓作成は、初心者用の題材らしいですが とりあえず教えてもらった事を駆使し まずは、テキストボックスとテキストボックスに数字を入れ その二つを +や-ボタンを押し =ボタンを押すと、3つ目のテキストボックスに表示させるという 簡単なプログラムは、なんとかできましたが windowsぽくすると 例 11 + 12 - 9 とテキストに表示され =ボタンを押すと 表示が消え 計算結果が表示されます いまの問題 ・整数と文字列を表示させ、計算だけさせる ・変数宣言、IF、Serectしか教わってない(それだけでできる言われた笑) ・まだ、いまいちわかっていないため 詳しく知りたい 無論、教えてもらったコードをそのまま使いたいわけじゃなく どーいう流れで、どーいう風にというのを理解したいです 結局は自分が理解して、少しずつやらないといけないので 詳しい方、教えてください。 現在なにもできてないコードです ここにどう埋めるか教えてほしいです ------------------------------------------------------------------------------ Option Explicit On Public Class Form Public oboe As String '押されたボタンが数値以外を覚える変数 Public befor As String '押されたボタンが数値の場合 覚える変数 Public anser As Integer ' 計算結果を保存する 変数 Public number As Integer '入力された数値を保存する 変数 Private Sub Form_Load(sender As Object, e As EventArgs) Handles MyBase.Load End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click '1 befor = "1" ans.Text &= "1" End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click '2 befor = "2" ans.Text &= "2" End Sub Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click '3 befor = "3" ans.Text &= "3" End Sub Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click 'たし算 oboe = "+" ans.Text &= "+" number = befor + ans.Text End Sub Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click '掛け算 End Sub Private Sub Button4_Click_1(sender As Object, e As EventArgs) Handles Button4.Click '計算 End Sub Private Sub Button9_Click(sender As Object, e As EventArgs) Handles Button9.Click 'CLEAR End Sub Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click '引き算 End Sub Private Sub Button8_Click(sender As Object, e As EventArgs) Handles Button8.Click '割り算 End Sub Private Sub ans_TextChanged(sender As Object, e As EventArgs) Handles ans.TextChanged

  • VB2008EEのラジオボタンのチェック無し

    VB2008EEのラジオボタンのチェック無し     4つにチェックを入れてしまうと、全ての変数に値が入ってしまい、ボタンクリック時にチェックが 入っていないのを含めて、batファイル4つとも実行されてしまいます。 チェックボックスだと、下記でチェックされていないもの値を変えられます。 If CheckBox1.CheckState = CheckState.Unchecked Then   aaa = "9" End If ラジオボタンでチェックされていない所の変数を変える事は出来るでしょうか? Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If (aaa = "1") Then Shell("cmd /c xxx.bat", AppWinStyle.NormalFocus, True) End If If (bbb = "2") Then Shell("cmd /c yyy.bat", AppWinStyle.NormalFocus, True) End If If (ccc = "3") Then Shell("cmd /c zzz.bat", AppWinStyle.NormalFocus, True) End If If (ddd = "4") Then Shell("cmd /c www.bat", AppWinStyle.NormalFocus, True) End If End Sub Private Sub RadioButton1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton1.CheckedChanged aaa = "1" End Sub Private Sub RadioButton2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton2.CheckedChanged bbb = "2" End Sub Private Sub RadioButton3_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton3.CheckedChanged ccc = "3" End Sub Private Sub RadioButton4_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton4.CheckedChanged ddd = "4" End Sub

  • VB初心者です。コードの書き方が分かりません。

    VB初心者です。 VBで(zのn乗)-(xのn乗+yのn乗)の計算が出来るようにしたいのですが、答えが必ず-1になってしまいます。 Option Explicit On Public Class Form1 Dim x As Long Dim y As Long Dim z As Long Dim n As Long Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.Close() End Sub Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged End Sub Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged End Sub Private Sub TextBox3_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox3.TextChanged End Sub Private Sub TextBox4_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox4.TextChanged End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click TextBox5.Text = (z ^ n) - (x ^ n + y ^ n) End Sub End Class 正しいコードの書き方を教えて下さい。 また特定の答えのときにメッセージを表示したいのですが、どうすればいいですか?

  • VB2008EEラジオボタンにて、

    VB2008EEラジオボタンにて、 チェックされていない時、というのはif文で指定できるでしょうか? チェックボックスは、下記で出来ますが、ラジオボタンでは出来るでしょうか? Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If CheckBox1.CheckState = CheckState.Unchecked Then   aaa = "1" End If End Sub 複数のラジオボタンがあって1つ選んだ後に別のを選び直した後に、選ばれてないほうの値を変えたいです。 Private Sub RadioButton1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton1.CheckedChanged aaa = "1" End Sub Private Sub RadioButton2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton2.CheckedChanged bbb = "2" End Sub

専門家に質問してみよう