C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: アプリの起動日時でルーチンのスタートを変えたい


(過去ログ 124 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■74012 / inTopicNo.1)  アプリの起動日時でルーチンのスタートを変えたい
  
□投稿者/ 月桃茶 (1回)-(2014/11/22(Sat) 16:16:13)

分類:[.NET 全般] 

<環境>
 VisualStudio2013(Community)
 Windows8.1

はじめまして。
少し相談させてください。

スケジュールが決められた日替わり定食があったとします。
これを毎日12時更新で表示させたいのですが、アプリ起動時の日時から判断し
ルーチンをスタートする方法がわかりません。

例:
 11/26 かつ丼
 11/27 焼きさんま
 11/28 餃子
 11/29 オムライス
 11/31 生姜焼き
 12/01 パスタ
 12/02 かつ丼
    ・
    ・
    ・

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick

        Label1.Text = Today & " " & TimeString

        Dim a() As String = {"かつ丼", "焼きさんま", "餃子", "オムライス", "生姜焼き", "パスタ"}
        Dim b As Integer
        Dim i As Integer = -1

        For i = 0 To 5
            If a(i).ToString() = Label2.Text Then Exit For
        Next
        If i < 5 Then b = i + 1

        If TimeString = "12:00:00" Then
            Label2.Text = a(b).ToString()
        End If

    End Sub


こんな感じで12時更新の日替わり表示させてみたもの、これでは起動日時がいつであれ
「かつ丼」から始まってしまう為、考え方そのものが違うのでは? と躓いてます。

どの様な解決方法がありますでしょうか。
宜しくお願いします。



引用返信 編集キー/
■74013 / inTopicNo.2)  Re[1]: アプリの起動日時でルーチンのスタートを変えたい
□投稿者/ 魔界の仮面弁士 (178回)-(2014/11/22(Sat) 16:45:42)
No74012 (月桃茶 さん) に返信
> スケジュールが決められた日替わり定食があったとします。

そのスケジュールとは、土日休祝無しでしょうか?

であれば、「スケジュールの起算日」からの「経過日数」を求め、
それを「定食メニューの数」で割った余りを求めれば良いかと。


> これを毎日12時更新で表示させたいのですが、アプリ起動時の日時から判断し
計算に必要なのは「アプリ起動時の日時」ではなく、
「現在の日付」と「基準日(メニューの提供開始日)」ではありませんか。


アプリの起動日を基準日とすることもできますが、その場合、
アプリを起動しなおしたときに提供順がリセットされてしまうので、
初回起動時に、基準日を記録しておく必要が生じますね。


>  11/31 生姜焼き
何故。(^_^;)


> Dim a() As String = {"かつ丼", "焼きさんま", "餃子", "オムライス", "生姜焼き", "パスタ"}
とりあえず考え方。
この場合、a(0) 〜 a(5) までの 6 メニューがあるわけですよね。

たとえば、2014/11/26 が最初のメニュー提供日だとすると
 2014/11/26 … 経過日数 0 … 0 Mod 6 = 0 … a(0) = "かつ丼"
 2014/11/27 … 経過日数 1 … 1 Mod 6 = 1 … a(1) = "焼きさんま"
 2014/11/28 … 経過日数 2 … 2 Mod 6 = 2 … a(2) = "餃子"
 2014/11/29 … 経過日数 3 … 3 Mod 6 = 3 … a(3) = "オムライス"
 2014/11/30 … 経過日数 4 … 4 Mod 6 = 4 … a(4) = "生姜焼き"
 2014/12/01 … 経過日数 5 … 5 Mod 6 = 5 … a(5) = "パスタ"
 2014/12/02 … 経過日数 6 … 6 Mod 6 = 0 … a(0) = "かつ丼"
 2014/12/03 … 経過日数 7 … 7 Mod 6 = 1 … a(1) = "焼きさんま"
のように計算すれば良いわけで。
引用返信 編集キー/
■74014 / inTopicNo.3)  Re[2]: アプリの起動日時でルーチンのスタートを変えたい
□投稿者/ ?????? (2回)-(2014/11/22(Sat) 17:49:26)
No74013 (魔界の仮面弁士 さん) に返信
早速のレス ありがとうございますっ

> そのスケジュールとは、土日休祝無しでしょうか?
>
> であれば、「スケジュールの起算日」からの「経過日数」を求め、
> それを「定食メニューの数」で割った余りを求めれば良いかと。

はい 休みなしで365日ずっとループし続けます。
『剰余演算子』ってやつなんですね。


> 計算に必要なのは「アプリ起動時の日時」ではなく、
> 「現在の日付」と「基準日(メニューの提供開始日)」ではありませんか。
>
> アプリの起動日を基準日とすることもできますが、その場合、
> アプリを起動しなおしたときに提供順がリセットされてしまうので、
> 初回起動時に、基準日を記録しておく必要が生じますね。

やはりそうですよね。
基準日的な楔を置いてそっから・・・ とは思ったんですが。
魔界の仮面弁士さんの仰る通りです。


>> 11/31 生姜焼き
> 何故。(^_^;)

あ・・・ 間違えました。。。


> とりあえず考え方。
> この場合、a(0) 〜 a(5) までの 6 メニューがあるわけですよね。
>
> たとえば、2014/11/26 が最初のメニュー提供日だとすると
>  2014/11/26 … 経過日数 0 … 0 Mod 6 = 0 … a(0) = "かつ丼"
>  2014/11/27 … 経過日数 1 … 1 Mod 6 = 1 … a(1) = "焼きさんま"
>  2014/11/28 … 経過日数 2 … 2 Mod 6 = 2 … a(2) = "餃子"
>  2014/11/29 … 経過日数 3 … 3 Mod 6 = 3 … a(3) = "オムライス"
>  2014/11/30 … 経過日数 4 … 4 Mod 6 = 4 … a(4) = "生姜焼き"
>  2014/12/01 … 経過日数 5 … 5 Mod 6 = 5 … a(5) = "パスタ"
>  2014/12/02 … 経過日数 6 … 6 Mod 6 = 0 … a(0) = "かつ丼"
>  2014/12/03 … 経過日数 7 … 7 Mod 6 = 1 … a(1) = "焼きさんま"
> のように計算すれば良いわけで。

ありがとうございますっ。
考えるべき方向が見えてきました。

もう少し格闘してみます。
また来ますので解決済みは保留とさせてください。

引用返信 編集キー/
■74019 / inTopicNo.4)  Re[3]: アプリの起動日時でルーチンのスタートを変えたい
□投稿者/ 月桃茶 (2回)-(2014/11/23(Sun) 21:44:46)
できましたっ・・・ と思います。
すみません 遅くなってしまって。

なんとなく期待通りの動きをするっぽいんですが
すごくコレジャナイ感でして。。。


提供開始日を2014/11/20とした時(26日スタートは検証できなかったので)

 2014/11/20 "かつ丼"
 2014/11/21 "焼きさんま"
 2014/11/22 "餃子"
 2014/11/23 "オムライス"
 2014/11/24 "生姜焼き"
 2014/11/25 "パスタ"
 2014/11/26 "かつ丼"
 2014/11/27 "焼きさんま"


Public Class Form1

    Dim a() As String = {"かつ丼", "焼きさんま", "餃子", "オムライス", "生姜焼き", "パスタ"}
    Dim b As Integer
    Dim i As Integer = -1

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick

        Label1.Text = Today & " " & TimeString

        b = DateDiff("d", "2014/11/20", DateTime.Today)
        i = b Mod 6

        If TimeString = "12:00:00" Then
            Label2.Text = a(i).ToString()
        End If

    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim c As Integer

        b = DateDiff("d", "2014/11/20", DateTime.Today)
        i = b Mod 6
        c = i - 1

        If TimeString < "12:00:00" Then
            Label2.Text = a(c).ToString()
        ElseIf TimeString >= "12:00:00" Then
            Label2.Text = a(i).ToString()
        End If

    End Sub
    
End Class


アプリ起動が12時前だと前日のメニューを、12時以降だと
本日のメニューを表示させるところでずっと悩んでまして、
Private Sub Form1_Load に入れてみたところ期待通りの
表示になりました。(と思います。。。)

しかし、なんだかスマートさに欠けると言うかコレジャナイ感が
思い切りでてると言うか。。。
できましたら もう少し綺麗な記述をご教示いただけると
とても助かります。

宜しくお願いします。

引用返信 編集キー/
■74020 / inTopicNo.5)  Re[4]: アプリの起動日時でルーチンのスタートを変えたい
□投稿者/ Azulean (369回)-(2014/11/23(Sun) 22:12:28)
2014/11/23(Sun) 22:16:35 編集(投稿者)

No74019 (月桃茶 さん) に返信
> なんとなく期待通りの動きをするっぽいんですが
> すごくコレジャナイ感でして。。。

DateTime.Now.Subtract(TimeSpan.FromHours(12)) と書けたような気もする。
この一文の意味は「今の日時から 12 時間前の日時を取得する」です。
これを使えば、Form1_Load の条件文を排除できるでしょう。


Timer1_Tick のもイマイチと感じるのであれば、次のような感じでしょうか。

1.現在日時を元にラベルにメニューを設定するメソッドを別途作る
 (Form1_Load に書いているようなものです)
2.Form1_Load も Timer1_Tick も同じメソッドを呼ぶようにする。

条件が変わっていないときにも Label.Text に代入して気持ち悪いと感じるかもしれませんが、同じ文字列を設定する限り、害はないはずです。
(コードのきれいさを重視する。実行されるコードの無駄の排除を優先するなら似たようなコードが広まるかもしれませんが)
引用返信 編集キー/
■74029 / inTopicNo.6)  Re[5]: アプリの起動日時でルーチンのスタートを変えたい
□投稿者/ 月桃茶 (3回)-(2014/11/24(Mon) 12:27:26)
No74020 (Azulean さん) に返信
早速のレス ありがとうございますっ。

> DateTime.Now.Subtract(TimeSpan.FromHours(12)) と書けたような気もする。
> この一文の意味は「今の日時から 12 時間前の日時を取得する」です。
> これを使えば、Form1_Load の条件文を排除できるでしょう。

すごい。
こんな記述もあるんですね。
ありがとうございますっ。

> Timer1_Tick のもイマイチと感じるのであれば、次のような感じでしょうか。
>
> 1.現在日時を元にラベルにメニューを設定するメソッドを別途作る
>  (Form1_Load に書いているようなものです)
> 2.Form1_Load も Timer1_Tick も同じメソッドを呼ぶようにする。
>
> 条件が変わっていないときにも Label.Text に代入して気持ち悪いと感じるかもしれませんが、同じ文字列を設定する限り、害はないはずです。
> (コードのきれいさを重視する。実行されるコードの無駄の排除を優先するなら似たようなコードが広まるかもしれませんが)

なるほど。
Label側にですね。
ありがとうございますっ。

つまりは、『誤った記述をする=期待通りに動かない』でなければ
そんなに気にする必要はないと言う感じですね。
コードを書いた人のクセとか個人差なんだろうなと納得しました。
もちろん、他の人が見てすぐに理解できるようなシンプルさ等が
前提での話になるんでしょうけど。
自分が書いたものが「言う程コレジャナイ感ではないよ」と言って
いただけたような気がしてホっとしました。(勘違いでしたか・・・?)


魔界の仮面弁士 さん
Azulean さん
本当にありがとうございます。
また躓いたらこちらに相談させてください。

宜しくお願いします。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -