• ベストアンサー

vb.net タイマーに引数を渡す

vb.net(visual studio 2010)です。趣味(もちろん素人です。)でソフトを作ってます。timerに引数を渡すことはできるのでしょうか。integer型の引数を渡したいです。的外れな質問かもしれませんが、実現できたらうれしいです。よろしくお願いします。

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

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

> 音量アップボタンをButton0、ダウンボタンをButton1とします。 > (1)Button0または、Button1を押す。 > (2)Button0または、Button1から、番号0または、1を取りだしてタイマーに渡し、タイマーを起動。インターバルは300msとしています。 > (3)番号0で、音量アップ。番号1で、音量ダウン。 であれば,「タイマーに引数を渡す」ではなく,クラスのフィールドを用意するのが普通の書き方だと思います。 音量変更メソッドの引数も,コントロールの番号ではなく,変更幅自体を渡したり, 「上げる」「下げる」をEnumとしておき,それをメソッドに渡すようにした方がよいでしょう。 Public Class Form1 Private _volumeChangeValue As Integer ' 音量の変更幅 Private Sub Button_MouseDown (sender As Object, e As MouseEventArgs) Handles Button0.MouseDown, Button1.MouseDown If e.Button <> MouseButton.Left Then Return ' 左ボタン以外は処理しない If Timer2.Enabled Then Return ' タイマーが有効であれば処理しない If sender Is Button0 Then _volumeChangeValue = 1 ' Button0が押された Else If sender Is Button1 Then _volumeChangeValue = -1 ' Button1が押された Else Return End If Timer2.Enabled = True End Sub Private Sub Button_MouseUp (sender As Object, e As MouseEventArgs) Handles Button0.MouseUp, Button1.MouseUp If e.Button <> MouseButton.Left Then Return ' 左ボタン以外は処理しない _volumeChangeValue = 0 Timer2.Enabled = False End Sub Private Sub Timer2_Tick (sender As Object, e As EventArgs) Handles Timer2.Tick ChangeVolume(_volumeChangeValue) ' 音量変更 End Sub End Class

goldengolds
質問者

お礼

何度も丁寧な御回答ありがとうございます。クラスのフィールドPrivate _volumeChangeValue As Integer ' 音量の変更幅を使った方がすっきりするようですね。それと、If e.Button <> MouseButton.Left Then Return ' 左ボタン以外は処理しない の処理は自分では気づきませんでした。御指摘ありがとうございました。早速使ってみたいと思います。

その他の回答 (4)

回答No.5

リピートボタンの実装と思われます。 こんな方法はどうですか? (イベント関数の引数などは省略して記載してません) Private ButtonMode As Integer = 0 'ボタン識別のモジュール変数 Private ButtonTime As Integer = 0 'ボタン押し時間のモジュール変数 '/********************************************************************* ' *音量ボタン長押しの場合の処理 ' ********************************************************************/ Private Sub Button0_MouseDown() ButtonMode = 1 'この場合はボタンごとにイベントを記載する 'ButtonMode = Object.Tag のようにButtonのTagプロパティをボタンの識別に使う方法も有り。(イベント関数を1つにすることができる) ret = SetVol(ButtonMode) '押した時の最初の処理 ButtonTime = 0 Timer2.Enabled = True End Sub Private Sub Button0_MouseUp() ButtonMode = 0 Timer2.Enabled = False End Sub '/********************************************************************* ' *タイマー起動 ' ********************************************************************/ Private Sub Timer2_Tick() If Button = 0 Then Return 'ボタン押されていない ButtonTime = ButtonTime + 1 If ButtonTime>10 Then 'リピート反応待ち Dim ret As String ret = SetVol(ButtonMode)'//ボタンの番号によって音量アップ、ダウンをセット End If End Sub

goldengolds
質問者

補足

返答が遅れて大変申し訳ありませんでした。 コーディングまでしていただきましてありがとうございました。 リピートボタンの実装は大変参考になりました。 ButtonTime = ButtonTime + 1 のところは使ってみたいと思います。

回答No.3

Timerに限らず、たいていのコントロールにはTagプロパティがあります。 MSDNでのTagの使用例 http://msdn.microsoft.com/ja-jp/library/system.windows.forms.timer.tag%28v=vs.80%29.aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1 '使用 Dim instance As Timer Dim value As Object value = instance.Tag instance.Tag = value ここのvalueをInteger型にすればよいと思います。

goldengolds
質問者

補足

ご回答ありがとうございます。NO.2のYune-Kichiさんの補足に書かせていただきましたが、何となくなんですが動きました。(動いてしまったといのが本当のところです。)Hayashi_Trekさんのようにインスタンスを使って実現するとすすっきりしたプログラムになるのかなと思います。NO.2のYune-Kichiさんの補足にも書きましたが、プログラムは以下です。Hayashi_Trekさんのようにインスタンスを使うには、どこでどうインスタンスを使用すればよろしいでしょうか。御面倒をおかけしてすみません。 '/********************************************************************* ' *音量ボタン長押しの場合の処理 ' ********************************************************************/ Private Sub Button0_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Button0.MouseDown, Button1.MouseDown Dim senderName As String = DirectCast(sender, Button).Name '//ボタンのベース名 長さの取得に使用 Dim strBut As String = "Button" '//Buttonxxのxxを取得して数字に直している Dim index As Integer = CInt(senderName.Substring(strBut.Length, senderName.Length - strBut.Length)) Timer2.Tag = index  '//Buttonxxのxxをタイマーに渡す Timer2.Enabled = True End Sub Private Sub Button0_MouseUp(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Button0.MouseUp, Button1.MouseUp Dim senderName As String = DirectCast(sender, Button).Name '//ボタンのベース名 長さの取得に使用 Dim strBut As String = "Button" '//Buttonxxのxxを取得して数字に直している Dim index As Integer = CInt(senderName.Substring(strBut.Length, senderName.Length - strBut.Length)) Timer2.Enabled = False End Sub '/********************************************************************* ' *タイマー起動 ' ********************************************************************/ Private Sub Timer2_Tick(sender As System.Object, e As System.EventArgs) Handles Timer2.Tick Dim ret As String ret = SetVol(Timer2.Tag)'//ボタンの番号によって音量アップ、ダウンをセット End Sub

回答No.2

a) Timerをフィールドに持つクラスに,専用のフィールドを持たせる b) (System.Windows.Forms.Timer専用) Tagプロパティに値を持たせる 基本的にはaで済みます。 タイマーのイベントをラムダ式で書いている場合には,外側の変数をキャプチャさせるだけで十分,という場合もありますが……。

goldengolds
質問者

補足

御回答ありがとうございます。実現したいのは音量を制御するプログラムです。 音量アップボタンをButton0、ダウンボタンをButton1とします。 (1)Button0または、Button1を押す。 (2)Button0または、Button1から、番号0または、1を取りだしてタイマーに渡し、タイマーを起動。インターバルは300msとしています。 (3)番号0で、音量アップ。番号1で、音量ダウン。 ※(2)でinteger型の引数で0か1かを渡したいです。 実際にプログラムをかいて実行してみたら、動いてしまったんですがこれでよいのでしょうか? 御迷惑でなかったら見ていただきたいのですが・・・ '/********************************************************************* ' *音量ボタン長押しの場合の処理 ' ********************************************************************/ Private Sub Button0_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Button0.MouseDown, Button1.MouseDown Dim senderName As String = DirectCast(sender, Button).Name '//ボタンのベース名 長さの取得に使用 Dim strBut As String = "Button" '//Buttonxxのxxを取得して数字に直している Dim index As Integer = CInt(senderName.Substring(strBut.Length, senderName.Length - strBut.Length)) Timer2.Tag = index  '//Buttonxxのxxをタイマーに渡す Timer2.Enabled = True End Sub Private Sub Button0_MouseUp(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Button0.MouseUp, Button1.MouseUp Dim senderName As String = DirectCast(sender, Button).Name '//ボタンのベース名 長さの取得に使用 Dim strBut As String = "Button" '//Buttonxxのxxを取得して数字に直している Dim index As Integer = CInt(senderName.Substring(strBut.Length, senderName.Length - strBut.Length)) Timer2.Enabled = False End Sub '/********************************************************************* ' *タイマー起動 ' ********************************************************************/ Private Sub Timer2_Tick(sender As System.Object, e As System.EventArgs) Handles Timer2.Tick Dim ret As String ret = SetVol(Timer2.Tag)'//ボタンの番号によって音量アップ、ダウンをセット End Sub 貴重なお時間すみません。御指摘いただけたら本当にうれしいです。

回答No.1

こんにちは すいません。 Private Sub Timer1_Tick(sender As Object, e As System.EventArgs) Handles Timer1.Tick ↓ Private Sub Timer1_Tick(sender As Integer , e As System.EventArgs) Handles Timer1.Tick にした場合 Timer1_Tick(300,new EventArgs) で引数に300の整数を渡せますが、 Timer1_のオブジェクトがなくなってしまいますので、Handles Timer1.Tickが機能しなくなってしまいます。 なんか、いい方法はないかな~? 引数の使用方法がわかりませんので、適当に Private Sub Timer1_Tick(sender As Object, e As System.EventArgs) Handles Timer1.Tick プロシージャに値を渡すサンプルを作成しました。(あまり意味がありませんが) 値を一度 Class timに渡して、再度Timer1_Tickイベントプロシージャに渡してラベルに表示しています。 Public Class Form1 Dim dotime As New tim 'Class timのインスタンス Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Shown Timer1.Enabled = True Timer1.Interval = 3000 Label1.Text = "test" Dim i1 As Integer = 200 dotime.num(i1) 'Class timに値を渡す End Sub Private Sub Timer1_Tick(sender As Object, e As System.EventArgs) Handles Timer1.Tick Label1.Text = CStr(dotime.timer) 'timerの値を取得してラベルに表示 End Sub End Class Public Class tim Private _it As Integer 'Class Form1から値を取得 Public Sub num(i As Integer) _it = i End Sub 'timerに値を読み取る Public ReadOnly Property timer() As Integer Get Return _it End Get End Property End Class

goldengolds
質問者

補足

御回答ありがとうございます。プログラムまで書いていただいて、本当にありがとうございました。 まず理解したいと思います。

関連するQ&A

  • vb.netでCreateEventの引数

    vb.netでCreateEventの引数 CreateEventを実行後、OpenEventをすると失敗してしまいます。 CreateEventの第一引数に問題があるような気がするのですが、vb.Netでのサンプルが少なく悩んでいます。 CreateEventの第一引数のSECURITY_ATTRIBUTESにはなにを指定してあげればよいでしょうか。 Structure SECURITY_ATTRIBUTES nLength As Integer lpSecurityDescriptor As Integer bInheritHandle As Integer End Structure lpSecurityDescriptor ってなにものでしょうか。

  • VBで作ったものを人にやらせるには?

    VBで簡単なゲームを作ったのですが これを知り合いにネット経由でやらせたいのですが どのようなソフトを使えばいいのでしょうか? Visual Studioの中のソフトでできるのでしょうか?

  • サービスに対し引数を付加して起動したい

    毎々お世話になります。 クライアント:WindowsXPSP2+Visual Basic6.0(SP6) サービス:WindowsXPSP2+Visual Studio .net 2003(VB) で開発をしています。 このクライアントよりサービスに対し、引数を渡して起動させたいのですが可能でしょうか?

  • VB.netでタイマーがスタートしません

    VB.netでの質問です。serialportコントロールを使って232Cのデータを受信したらTimer1.Enabeled=Trueを実行するようにしているのですが、タイマーがスタートしません、何か、良い方法はありますでしょうか?

  • VB6で配列を引数にするときの2通りの方法について

    VB6で引数に配列を渡す方法が2通りあるよう?ですが以下のような配列があり、渡し方によって引数の定義の仕方が異なると思うのですが、(2)番目の関数の書き方が知りたいです。 dim ary_dat(10) as integer (1)test_A( ary_dat ) は、sub test_A( byref ary() as integer)という関数を作れば動作することはわかりましたが、 (2)test_B( ary_dat(0) ) は、関すでどのような引数を定義すればできるのでしょうか?

  • visual studio2005でvb.NETとvb2005

    visual studio 2005を購入して現在その研究中です。最近の開発環境としてwindowsからは.net frameworkというベースの環境としてさまざまなプログラミングを行うようになっていることは分かりました。 vbでのソフト開発を試みているのですが、その環境下でのvb.NETとvb 2005の違いがよく分かりません。どちらも.net環境であるので単に新しいヴァージョンになっただけでしょうか。どちらでやった方が良いか何か知っている事がありましたら、些細な事でも構わないので教えて下さい。よろしくお願いします。

  • これから始めますが、VB6.0はもう流通してないのですか?

    これからVBを始める初心者です。 現状、MS AccessのデータベースとVB6.0で売上管理・顧客管理・受注管理などのシステム運用をしていますが、カスタマイズしようと思っています。 しかし、VBの経験が無いので一からのスタートです。 ネットで調べたところ、VB6.0は流通していないようで、VB.NETでカスタマイズするしか無いようです。 カスタマイズするシステムは将来的にWebで操作できるようになれば嬉しいので、VB.NETは適していると思いますが、 このような場合、Microsoft Visual Basic .NETStandard Version 2003 を購入するだけでよいのでしょうか? Visual Studio .NET 2003 というのもあり、どのグレードのソフトを購入すれば良いのか良く分かりません。 アドバイスをお願いします。

  • VBでコマンドラインから引数を受け取る方法・・・

    【Visual Basic6.0】 VBでバッチプログラムを作ろうと思っております。 それで、コマンドライン引数を受け取る方法は あるのでしょうか? C言語でいうargv[]のような類なのは存在するのでしょうか?? よろしくお願いいたします。

  • vb.net 違いは?

    vb.netをインストールしたのですが すべてのプログラムに Microsoft Visual Studio 2010 と Microsoft Visual Studio 2010 Express があるのですが、違いはなんでしょう? 実際プログラムを作成するときは Microsoft Visual Basic 2010 Expressを起動すればいいんですよね?

  • VBの種類

    VBをはじめました、会社ではVB 6.0ですが、自分でも買おうと思いまして。でも最近なんかVB#とかVB2005とかVB.NETとかVISUAL STUDIOとか、ビジュアルスタジオも色々とありまして、何がどう違うかまったく理解できません。 これ買えと、サルでも分かるようお願いします。 用途はいまんとこ不明です、仕事で使うどうでもいいゴミツールを作れればと。

専門家に質問してみよう