89644


**環境**  
windows10  
Visual studio

**使用言語**  
C#

**作成物**  
C#を使ってフォームアプリで簡単な目覚まし時計を作成しようと考えています。  
仕様は以下の通りです。  
①form1の中央に時間と分がわかる現在時刻を表示する。  
②「アラームを設定」と書かれているテキストボックスに中央の時計と同じ表記で（時間：分）  
で入力する。  
③テキストボックスの実行ボタンをクリックすると時間を入力した指定時刻を取得する。  
④ボタンをONにした状態で、現在時刻と指定時刻が同じになった場合、  
form2の画面を表示する。

_form1画面_  
[![form1レイアウト](https://i.stack.imgur.com/harZ9.png)](https://i.stack.imgur.com/harZ9.png)

_form2画面_  
[![画像の説明をここに入力](https://i.stack.imgur.com/7ZlJn.png)](https://i.stack.imgur.com/7ZlJn.png)

**問題点**  
①テキストボックスに時刻を入力すると、実行ボタンが表示される前にform2の画面が表示されてしまいます。  
実行ボタンをクリックしてから動くようにしたいのですがうまくいきません。  
②form2の画面が1分間にわたり複数表示されてしまいます。

この二点どうすれば改善できますでしょうか？

**実際のコード**  
〇form1.cs

[code]

    namespace Alarm_Clock
    {
        public partial class Form1 : Form
        {
            public static class Global 
            {
                public static string datetime_set = "";
                
            }
    
            public Form1()
            {
                InitializeComponent();
    
                
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                
                this.Text = Application.ProductName;
                timer1.Interval = 1000;//1000ミリ秒
                timer1.Enabled = true;
    
                
            }
    
            private void timer1_Tick(object sender, EventArgs e)
            {
                
                Form1 form1 = new Form1();
                //現在時を取得
                DateTime d = DateTime.Now;
                CTime.Text = d.Hour + ":" + d.Minute; //dで時間と分を表示
                String datetime_now = CTime.Text.ToString();//String型に変換する
    
                button_Click(sender, e);
                if (datetime_now == Global.datetime_set)
                {
                    Form2 form2 = new Form2();
                    form2.ShowDialog();
                    
                }
                
    
            }
    
            private void button_Click(object sender, EventArgs e)
            {
                if (okbutton.Checked == true)
                {
                    
                    String textValue = textbox.Text;
                    Global.datetime_set = textValue;
                    
                }
                else
                    return;
    
    
    
            }
    
            private void textbox_TextChanged(object sender, EventArgs e)
            {
                Global.datetime_set = textbox.Text;
                if (Global.datetime_set.Contains(":"))
                {
                String msg = "何分か入力してください";
                exc.Text = msg;
                
                    
                }
    
            }
    
            
            private void textBox2_KeyPress(object sender, KeyPressEventArgs e)
            {
                //backspaceの入力を可能にする
                if (e.KeyChar == '\b')
                {
                    return;
                }
                //コロンの入力を可能にする。
                if (e.KeyChar == ':')
                {
    
                    return;
                }
    
                //数値0～9以外のキーは入力不可にする
                if ((e.KeyChar < '0' || '9' < e.KeyChar))
                {
                    e.Handled = true;
                }
    
               
            }
    
        }
    }
    
[/code]

〇form2.cs

[code]

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace Alarm_Clock
    {
        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }
    
            private void button_Click(object sender, EventArgs e)
            {
                
                this.Close();
            }
        }
    }
    
[/code]

**試したこと**  
①で試したことは、button_Click（）メソッドが現在時刻と指定時刻の比較の前に持ってきましたが、  
うまくいきませんでした。

[code]

            **button_Click(sender, e);**
            if (datetime_now == Global.datetime_set)
            {
                Form2 form2 = new Form2();
                form2.ShowDialog();
                
            }
    
[/code]

②に関しましては、returnによってメソッドから抜けるなどを試してみましたがうまくいきませんでした。  
if (datetime_now == Global.datetime_set)  
{  
Form2 form2 = new Form2();  
form2.ShowDialog();  
**return;**  
}


CC BY-SA 4.0
2022-06-28T05:34:21.167
89643
2022-06-28T07:49:08.810
2022-06-28T06:21:11.303
2238
47546
question
c# visual-studio
アラーム画面が複数出てしまう。実行ボタンを押す前に実行してしまう。


> ①テキストボックスに時刻を入力すると、実行ボタンが表示される前にform2の画面が表示されてしまいます。  
>  実行ボタンをクリックしてから動くようにしたいのですがうまくいきません。

まず前提として、プログラムはあなたの書いた通りにしか動きません。  
時刻を入力するとform2が表示されたという事は、  
テキストボックスを変更した際に実行されるイベント(TextChangedなど）と連動して  
表示処理が実行されたというのは容易に想像が付きますよね。

[超初心者でもわかるデバッグ方法](https://docs.microsoft.com/ja-
jp/visualstudio/debugger/debugging-absolute-
beginners?view=vs-2022&tabs=csharp)

上記URLを参考にしてイベント処理にブレークポイントを設定し、  
一行づつステップ実行して処理を追って変数の値を確認し、どこが変わった事で  
フォーム表示処理が実行されるかを特定し、ボタンを押すまで表示処理に流れないように処理の流れを整理して修正しましょう。

> ②form2の画面が1分間にわたり複数表示されてしまいます。

これも同様に、form2の表示処理が複数回実行されるような処理の流れになっている筈です。一分経ったら出なくなるという事は、タイマーイベントに絡んでる処理なのは予想出来ますよね。そういった箇所で表示処理を行っていませんか？  
form2の表示処理の直前でブレークポイントを設定し、変数の値を確認したりして、正しく自分の想定する処理の流れになっているか確認しましょう。

ちなみに、ソースコードは一行も読んでいません。  
私がソースを読んで不具合箇所を特定するのはおそらく簡単ですが、  
この機会に、デバッグの方法を勉強してみてください。  
デバッグ方法を身に付けないと、今後も自力で調べればすぐ判る程度の質問を繰り返す事になります。

自分でデバッグしてみた上で、どうしても判らない事があれば回答しますので、コメントにお願いします。


CC BY-SA 4.0
2022-06-28T07:20:58.733
89644
2022-06-28T07:49:08.810
2022-06-28T07:49:08.810
41943
41943
89643
answer