teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

PC環境でソースを追記してテストしました。

2019/12/06 11:34

投稿

退会済みユーザー
answer CHANGED
@@ -1,9 +1,106 @@
1
- ちょっと今スマホなのでテストする環境がないのですが
1
+ ~~ちょっと今スマホなのでテストする環境がないのですが~~加筆・修正しました。
2
2
  ```C#
3
3
  if(b){
4
- MessageBox.Show("10秒立ったので処理を終了します");
4
+ MessageBox.Show("10秒立ったので処理を終了します");
5
- this.Close();
5
+ this.Close();
6
6
  }
7
7
  ```
8
8
  を何度も書くのはいくら何でもナンセンスなので
9
- Timerとflagと上記処理をまとめて1つのクラスにしてインスタンスをメンバとして持たせればと、イベントで呼び出される各メソッドインスタンスのCloseするかチェックするメソッドを呼び出よくなるので綺麗になると思います
9
+ Timerとflagと上記処理をまとめて1つのクラスにして、イベントで呼び出される各メソッドがそのインスタンスのCloseチェックメソッドを呼び出す形にすれば綺麗になると思います。
10
+
11
+ ```C#
12
+ using System;
13
+ using System.Collections.Generic;
14
+ using System.ComponentModel;
15
+ using System.Data;
16
+ using System.Drawing;
17
+ using System.Linq;
18
+ using System.Text;
19
+ using System.Threading.Tasks;
20
+ using System.Windows.Forms;
21
+
22
+ namespace WindowsFormsApp
23
+ {
24
+ public partial class Form1 : Form
25
+ {
26
+ CloseTimer closeTimer;
27
+ public Form1()
28
+ {
29
+ InitializeComponent();
30
+
31
+ closeTimer = new CloseTimer(this, 10000, "10秒立ったので処理を終了します");
32
+ }
33
+
34
+ private void Button1_Click(object sender, EventArgs e)
35
+ {
36
+ closeTimer.Start();
37
+ MessageBox.Show("ボタン1");
38
+ }
39
+
40
+ private void Button2_Click(object sender, EventArgs e)
41
+ {
42
+ if (closeTimer.CloseIfCan())
43
+ return;
44
+ MessageBox.Show("ボタン2");
45
+ }
46
+
47
+ private void button3_Click(object sender, EventArgs e)
48
+ {
49
+ if (closeTimer.CloseIfCan())
50
+ return;
51
+ MessageBox.Show("ボタン3");
52
+ }
53
+ }
54
+
55
+ public class CloseTimer : IDisposable
56
+ {
57
+ bool canClose;
58
+ Timer timer;
59
+ string message;
60
+ Form target;
61
+
62
+ public CloseTimer(Form target, int delay, string message)
63
+ {
64
+ this.target = target;
65
+
66
+ timer = new Timer();
67
+ timer.Interval = delay;
68
+ timer.Tick += (object sender, EventArgs e) =>
69
+ {
70
+ timer.Stop();
71
+ canClose = true;
72
+ };
73
+
74
+ this.message = message;
75
+ }
76
+
77
+ public void Start()
78
+ {
79
+ if (canClose)
80
+ return;
81
+ timer.Start();
82
+ }
83
+
84
+ public bool CloseIfCan()
85
+ {
86
+ if (canClose)
87
+ {
88
+ MessageBox.Show(message);
89
+ target.Close();
90
+ return true;
91
+ }
92
+ return false;
93
+ }
94
+
95
+ public void Dispose()
96
+ {
97
+ timer.Dispose();
98
+ }
99
+ }
100
+ }
101
+ ```
102
+ これで、遅延時間を変えたときに全部のボタンクリックイベントを修正しなくてもよくなりました。
103
+ 例外チェックなど細かな部分は省いているので必要に応じて修正してください。
104
+ 実際に書くときは別のファイルに書いた方が良いかと思います。
105
+
106
+ 今回Timerを使ってますが、周期的に動作させるわけではないのでTask.Delayでも良いかもしれませんね。