「これはヤバかったな」という遅刻エピソード

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

A 回答 (5件)

> 音量アップボタンを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
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/03/13 02:50

リピートボタンの実装と思われます。


こんな方法はどうですか?
(イベント関数の引数などは省略して記載してません)

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

この回答への補足

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

補足日時:2013/03/15 04:18
    • good
    • 0

Timerに限らず、たいていのコントロールにはTagプロパティがあります。




MSDNでのTagの使用例
http://msdn.microsoft.com/ja-jp/library/system.w …
'使用
Dim instance As Timer
Dim value As Object
value = instance.Tag
instance.Tag = value

ここのvalueをInteger型にすればよいと思います。

この回答への補足

ご回答ありがとうございます。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

補足日時:2013/03/12 04:19
    • good
    • 0

a) Timerをフィールドに持つクラスに,専用のフィールドを持たせる


b) (System.Windows.Forms.Timer専用) Tagプロパティに値を持たせる

基本的にはaで済みます。
タイマーのイベントをラムダ式で書いている場合には,外側の変数をキャプチャさせるだけで十分,という場合もありますが……。

この回答への補足

御回答ありがとうございます。実現したいのは音量を制御するプログラムです。
音量アップボタンを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

貴重なお時間すみません。御指摘いただけたら本当にうれしいです。

補足日時:2013/03/12 04:06
    • good
    • 0

こんにちは




すいません。
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

この回答への補足

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

補足日時:2013/03/12 03:54
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報