tetデータの読み込み・メッセージ表示 への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 葉月  () 投稿日時 2008/7/24 11:45:00
問題は解決済みのようですが、一部気になるところがあったので書き込みました。 
曜日ごとにtxtファイルで保存しているようですが、xml形式で保存・読込できるクラスがあるので紹介します。 
保存項目が少なければ一つのファイルで読み書きして問題ないと思います。 
 
>参考ページ 
ttp://msdn.microsoft.com/ja-jp/library/system.xml.serialization.xmlserializer(VS.80).aspx 
※ 先頭のhを省略しています。
投稿者 rs000008  () 投稿日時 2008/7/24 10:08:00
>>16 
 
るしぇさん 
 
試験があった為、アラームシステム作成を一時 
中断していました。 
お礼の書き込み遅くなりすみませんでした。 
 
追加のアドバイス本当にありがとうございます。 
Timer1.Interval はデフォルトの 100 (ミリ秒) 
としているので、何度も書き込み処理をしている 
ようです。 
 
いただいたアドバイスを参考に、やってみます!
投稿者 るしぇ  () 投稿日時 2008/7/5 02:23:00
ここからは解決にある程度の発想力が必要となります。 
 
さて、Timer1.Interval はデフォルトの 100 (ミリ秒)でしょうか? 
単純計算で1秒間に10回イベントが起こります。条件が合えば10回ファイルへの 
書込み処理が発生します。書込み処理は同じ内容になるでしょうから無駄ですね。 
 
これを避けるには、 
アラームメッセージの一覧を管理し、実行したらフラグを立てる。 
フラグが立っているアラームメッセージは実行しない。(フラグは 
日付が変わった時点でリセットする)としても良いでしょうし、 
それほど細かくアラームメッセージが設定されていないのであれば、 
ファイルの更新日付が1分以内なら実行しない。。。というのでも 
うまくいくでしょう。 
もちろんもっと良いアイデアはいくらでもあるでしょう。 
 
では逆に Timer1.Interval を3分にしたら?。。。秒まで時刻が 
一致するのは稀です。アラームメッセージが全く実行されなくなります。 
 
これを避けるには、 
If 文に不等号を使って範囲指定にします。 
  If genzai.Hour = strTime.Hour AndAlso Math.Abs(genzai.Minute - strTime.Minute) <= 5 Then 
    '時が一致・分が前後5分以内の処理 
  End If 
この考え方は重要です。Timer1.Interval が1秒でアラームメッセージを1秒単位で 
登録した場合、実行されないアラームメッセージが必ず出てきます。条件をゆるくする 
ことが必要な場合の考え方です。 
応用すれば格闘ゲームの当たり判定を甘くして難易度を下げることもできるかも 
しれません。
投稿者 るしぇ  () 投稿日時 2008/7/5 02:22:00
>>14 
更なるステップアップのために 
 
>Dim genzai As Date  
>Dim strTime As Date  
>Dim toyoubi As String  
カプセル化の意味から、Private 宣言で問題無い変数に関しては Dim 宣言を 
避け Private 宣言することを推奨します。 
 
>Dim strTime As Date  
変数の命名規則としてPREFIX(接頭子)を使う場合、str は String 型を意味 
します。Date 型に変更したのであれば接頭子も dat とかに変更します。 
他の変数名と命名規則が違いますが、可読性を高めるために「コーディング規約」 
について調べることをお勧めします。 
 
データ型を意識したプログラミングをするために、ファイルの先頭に 
Option Strict On 
と書いてみてください。 
>genzai = TimeValue(Now) 
の Now にエラー 
「Option Strict On で 'Date' から 'String' への暗黙的な変換はできません。」 
が出ましたか?関数 TimeValue の引数は文字列です。つまり、ここでは 
Now(Date型)⇒文字列(String型)への暗黙の変換処理が行われます。 
 
そして関数 TimeValue で再び Date 型へ。Date 型は数値と同じような 
内部構造をしてますから、数値⇔文字列を行うのと同じくらいのコストが 
掛かります。PCの性能が格段に良くなっている現在では、1度や2度の変換コスト 
を重く感じることは無いでしょう。ただし上級者になって数千万件のデータを 
扱った場合、このような無駄な処理は避けるべきです。 
 
TimeValue 関数は日付情報が 1 年 1 月 1 日に設定された日付型を返すので 
時刻だけ抜き出す処理としては面白い発想です。 
ただし、効率よいプログラムを作成したいなら、せっかく日付型になっている 
ものを他の型に変換するのは避けます。 
 
考え方として時と分が合えばいいのであれば、 
  genzai = Now 
  strTime = TimeValue("4:00:00") 
  If genzai.Hour = strTime.Hour AndAlso genzai.Minute = strTime.Minute Then 
    '時・分が一致の処理 
  End If 
と書けます。秒まで一致なら更に Second の条件を追加します。 
 
ここまではプログラミングの基礎的な部分に関しての改善点です。 
基礎的な知識を身につければ解決案も出せるでしょう。
投稿者 rs000008  () 投稿日時 2008/7/3 14:16:00
>>13 
るしぇさん 
 
おっしゃる通りです。 
お叱りありがとうございます。反省しました。 
下記のようにする事で解決しました。 
 
    Dim genzai As Date 
    Dim strTime As Date 
    Dim toyoubi As String 
 
Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) 
 Handles MyBase.Load 
 
Dim today As System.DateTime 
Dim tomorrow As System.DateTime 
 
today = System.DateTime.Now 
tomorrow = today.AddDays(1) 
 
toyoubi = tomorrow.ToString("dddd") 
 
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs)  
Handles Timer1.Tick 
 
Dim Fname1 As String = (toyoubi & ".txt") 
Dim Fname2 As String = ("翌日データ.txt") 
 
        genzai = TimeValue(Now) 
        strTime = TimeValue("4:00:00") 
         
        If genzai = strTime Then 
            IO.File.Copy(Fname1, Fname2, True) 
        End If
投稿者 るしぇ  () 投稿日時 2008/7/2 20:14:00
>>11 
>System.Console.WriteLine("dddd", answer)  
answer って何ですか? 
 
>Stringで文字列データに変換し、例えば  
>結果が水曜日という情報を得るには  
>どのようにすればいいでしょうか? 
既に 3. で temp さんが回答済では? 
何故、動作確認できたコードを使うことを 
やめてしまったのでしょうか?それとも 
動作確認をやめたのですか? 
 
こちらの環境では temp さんのコードそのまま 
で問題なく動作しましたが? 
 
もう一度最初から丁寧に読み直してはいかが? 
>初歩的な質問ですみません。  
本気でそう思ってるなら、このスレッドの内容 
及びリンク先の内容を「声に出して」3回読んで 
みては? 
目で見てるだけ(もしくは丸っきり読んでないか) 
だから、答えが書いてあるのに読み飛ばすのでしょう? 
声に出して読めば、読み飛ばすことができませんから、 
ちゃんと読めるのでは?
投稿者 るしぇ  () 投稿日時 2008/7/2 18:57:00
>>10 
>質問②に関してですが、以下のように  
>4:00:00に月曜日.txtを今日データ.txt  
>に上書きするように考えてみましたが、  
>うまくいきません・・・。  
同じコードでも環境によって結果は異なります。 
『うまくいきません』では説明になっていません。 
 
また、If 文が実行されないのであれば、条件が 
成り立っていないのですから、変数の値を確認して 
ください。例えば以下のコードで確認できます。 
>        Debug.Print(genzai.ToString("yyyy/MM/dd HH:mm:ss")) 
>        Debug.Print(strTime.ToString("yyyy/MM/dd HH:mm:ss")) 
 
既に回答済ですが、日付は「年月日時分秒」全て 
そろって初めて成り立ちます。 
>If genzai = strTime Then 
全て一致しないと条件は成り立ちません。 
 
[DateTime メンバ] に使えるプロパティがないか、ちゃんと 
読むことから始めてください。
投稿者 rs000008  () 投稿日時 2008/7/2 10:13:00
>>10 
質問①ですが、下記のようにして次の日 
のデータが取得できると思いますが、 
Stringで文字列データに変換し、例えば 
結果が水曜日という情報を得るには 
どのようにすればいいでしょうか?  
初歩的な質問ですみません。 
 
Dim today As System.DateTime 
Dim tomorrow As System.DateTime 
 
today = System.DateTime.Now 
tomorrow = today.AddDays(1) 
 
System.Console.WriteLine("dddd", answer)
投稿者 rs000008  () 投稿日時 2008/7/2 08:51:00
>>9 
るしぇさん 
アドバイスありがとうございますm(__)m 
 
質問②に関してですが、以下のように 
4:00:00に月曜日.txtを今日データ.txt 
に上書きするように考えてみましたが、 
うまくいきません・・・。 
何度もすみませんが、どなたかアドバイス 
よろしくお願いします。 
 
Public Class Form3 
   Dim genzai As Date 
   Dim strTime As Date 
 
 Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick 
 
 Dim Fname1 As String = ("月曜日.txt")  
 Dim Fname2 As String = ("今日データ.txt") 
 
     genzai = Now 
     strTime = TimeValue("4:00:00")     
        If genzai = strTime Then 
            IO.File.Copy(Fname1, Fname2, True) 
        End If 
    End Sub
投稿者 るしぇ  () 投稿日時 2008/6/27 02:15:00
>>8 
>① 
日付型の変数の操作サンプルが、このサイトの 
[Visual Basic.NET  サンプル集] 
http://homepage1.nifty.com/rucio/main/dotnet/Samples/SmpleCnt.htm 
ページにあります。 
 
ただし、基本はヘルプ(MSDN)で確認になります。[VB.NET]以降、データ型の 
メンバに関数がまとめられました。 
[DateTime メンバ] 
http://msdn.microsoft.com/ja-jp/library/system.datetime_members(VS.80).aspx 
説明の一覧表から自分の実行したい命令を探してください。 
 
>② 
日付型は時刻も含みます(分割できません)。時・分を比較して一致してれば 
ファイル出力するだけですね。
投稿者 rs000008  () 投稿日時 2008/6/14 21:49:00
全て表示