VB2008 時間指定

タグの編集
投稿者 ももも  (学生) 投稿日時 2009/8/3 20:30:44
VB初心者のものです
今、時間を指定してその時間になったら、メッセージボックスが起動して、警告が表示される
ようなものを作りたいのですが調べてもコードがわかりません
誰かわかる人がいたら教えてください
投稿者 デフォルト  (社会人) 投稿日時 2009/8/3 21:41:26
時間をセットして、その時間になったら点滅するようにしました。
参考にしてください
Public Class Form1

    Dim pos1 As Boolean = False
    Dim pos2 As Boolean = False



    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim pos1 As Boolean = False

    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        If Now >= DateTimePicker1.Value Then
            Timer2.Enabled = True
            Button1.Enabled = True
        Else
            Button1.Enabled = False
        End If
        
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Timer1.Enabled = True
        DateTimePicker1.Enabled = False
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Timer2.Enabled = False
        Timer1.Enabled = False
        Button1.Enabled = True
        Me.Text = "じこくをセットしてください"
        DateTimePicker1.Enabled = True
    End Sub

    Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
        Beep()
        If pos1 = False Then
            Me.Text = ""
            pos1 = True
        Else
            Me.Text = "おべんきょう おわりです"
            pos1 = False

        End If
        If pos2 = False Then
            Button2.BackColor = System.Drawing.Color.Red
            pos2 = True
        Else
            Button2.BackColor = System.Drawing.Color.Yellow
            pos2 = False
        End If
    End Sub

    
End Class
投稿者 るきお  (社会人) 投稿日時 2009/8/3 22:25:41
デフォルトさんのサンプルですべてが語られています。
少し補足します。

このサンプルでは時刻の指定はDateTimePickerをフォームに配置してユーザーが入力できるようになっています。DateTimePickerを使用せずプログラムに直接日時を埋め込むこともできます。
指定した時間になっているか監視するためにTimer1を使用しています。
Timer2は点滅の制御のためにあるので、時間監視のためには必要ありません。
Timer1、Timer2はツールバーからTimerフォームに配置すると生成されます。

1つのTimer以外のコントロールに依存せず1日1回17:30に処理を実行する例を書いてみました。
簡単に書けると思ったのですが思ったより考慮すべきことが多いです。
    
'次回処理を行う年・月・日 (起動時はNow、つまり当日) 
Dim nextYear As Integer = Now.Year
Dim nextMonth As Integer = Now.Month
Dim nextDay As Integer = Now.Day

'次回処理を行う日時 (ここでは当日の17:30を指定) 
Dim dummyTime As New Date(nextYear, nextMonth, nextDay, 17, 30, 0)

Private Sub Timer1_Tick(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Timer1.Tick

    Dim thisTime As Date = Now

    If dummyTime <= thisTime Then
        Timer1.Enabled = False

        '▼ここに行いたい処理を書く 
        '▲ 

        '次回処理を行う年月日を更新(次の日をセット) 
        Dim nextTime As Date = thisTime.AddDays(1)
        nextYear = nextTime.Year
        nextMonth = nextTime.Month
        nextDay = nextTime.Day
        '次回処理を行う日時 (ここでは明日の17:30を指定) 
        dummyTime = New Date(nextYear, nextMonth, nextDay, 17, 30, 0)
        Timer1.Enabled = True
    End If
End Sub

もっと良いやり方ありますか?


一般的にはプログラムで指定した時間になったら処理を実行するようにするには、
そのプログラムは指定した時間になったか監視するために24時間365日起動している必要があり非効率です。
Windowsの機能として指定した時間になったらアプリケーションを起動するというものがあるので、
自分でプログラムして実現するのではなく、このWindowsの機能を使用することが多いです。
この機能の正式な名前はちょっと自信がないのですが普段「タスク」と呼んでいます。
コントロールパネルにあると思います。
投稿者 トマト  (小学生) 投稿日時 2009/8/3 22:43:50
クラス化してみました。

    ''' <summary>設定した時間になったことをお知らせします。</summary> 
    Public Class DateTimer
        Inherits System.ComponentModel.Component
        Protected Timer As New Timers.Timer(50.0R)
        ''' <param name="SetingDateTime">設定時刻を指定します。</param> 
        Public Sub New(ByVal SetingDateTime As Date)
            AddHandler Timer.Elapsed, AddressOf TimeCheck
            Me.SettingDateTime = SetingDateTime
            Timer.Enabled = True
        End Sub
        ''' <summary>設定した時間になった時に発生します。</summary> 
        ''' <param name="Enabled">時間になった時にEnabledプロパティを変更できるように参照型でプロパティを送ります。</param> 
        Public Event ItWasTime(ByVal sender As ObjectByVal e As EventArgs, ByRef Enabled As Boolean)
        Dim _settingDateTime As Date
        ''' <summary>設定時刻を指定します。</summary> 
        Public Property SettingDateTime() As Date
            Get
                Return _settingDateTime
            End Get
            Set(ByVal value As Date)
                _settingDateTime = value
            End Set
        End Property
        Protected Overridable Sub TimeCheck(ByVal sender As ObjectByVal e As Timers.ElapsedEventArgs)
            If Now >= SettingDateTime Then
                Me.Enabled = False
                OnItWasTime(New EventArgs)
            End If
        End Sub
        Protected Overrides Sub Dispose(ByVal disposing As Boolean)
            RemoveHandler Timer.Elapsed, AddressOf TimeCheck
            MyBase.Dispose(disposing)
        End Sub
        Protected Overridable Sub OnItWasTime(ByVal e As EventArgs)
            RaiseEvent ItWasTime(Me, e, Me.Enabled)
        End Sub
        Protected Overrides Sub Finalize()
            RemoveHandler Timer.Elapsed, AddressOf TimeCheck
            MyBase.Finalize()
        End Sub
        Public Property Enabled() As Boolean
            Get
                Return Timer.Enabled
            End Get
            Set(ByVal value As Boolean)
                Timer.Enabled = value
            End Set
        End Property
    End Class
投稿者 トマト  (小学生) 投稿日時 2009/8/4 02:46:05
使い方を書くのを忘れてました・・・。

'宣言 
Dim WithEvents Timer As DateTimer 'DateTimerクラスは、同じ名前空間にあるとして 

Private Sub Form1_Load(ByVal sender As ObjectByVal e As System.EventArgs) Handles MyBase.Load
   '初期化 
    Timer = New DateTimer(#8/3/2009 6:00:00 PM#) '2009年8月3日 午後6時にセット 
End Sub

Private Sub Timer_ItWasTime(ByVal sender As ObjectByVal e As System.EventArgs, ByRef Enabled As BooleanHandles Timer.ItWasTime
   Enabled = False
   'ここから下に処理を書く 

    '設定時間を変えてもう一度スタートするには 
    'Timer.SettingDateTime = #8/3/2009 7:00:00 PM# '2009年8月3日 午後6時にセット 
    'Enabled = True 
   '↑実際に使うにはコメントを外してください。 
End Sub

テストしていないので、もしかしたら、エラーがあるかもしれません。
投稿者 ももも  (学生) 投稿日時 2009/8/4 19:43:25
返信遅れましたが
みなさん、たくさんのご意見をありがとうございました!

皆さんが答えてくれたコードを使用することによって
作ることができました。

また、何か困ったことがある場合にここを利用するかもしれませんが
そのときも、よろしくお願いします!