質問編集履歴

6

解決方法追記

2020/07/21 04:34

投稿

Mr.sijimi
Mr.sijimi

スコア21

test CHANGED
File without changes
test CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
  ```C#
18
18
 
19
- namespace CalculatorNeo
19
+ namespace Calculator
20
20
 
21
21
  {
22
22
 
@@ -355,3 +355,149 @@
355
355
 
356
356
 
357
357
  他必要な情報がありましたらご教示ください。
358
+
359
+
360
+
361
+
362
+
363
+ ### 解決方法(済)
364
+
365
+
366
+
367
+ ```C#
368
+
369
+ namespace Calculator
370
+
371
+ {
372
+
373
+ public partial class Initialize
374
+
375
+ {
376
+
377
+ /// <summary>
378
+
379
+ /// イベント初期化
380
+
381
+ /// </summary>
382
+
383
+ public void InitializeEvent(MainWindow w)
384
+
385
+ {
386
+
387
+ //rootGridは以下のコントロールを探す
388
+
389
+ foreach (var ctrl in LogicalTreeHelper.GetChildren(w.rootGrid))
390
+
391
+ {
392
+
393
+ //ボタン以外は無視
394
+
395
+ if (!(ctrl is Button))
396
+
397
+ {
398
+
399
+ continue;
400
+
401
+ }
402
+
403
+
404
+
405
+ //ボタンがクリックされたときの処理登録
406
+
407
+ (ctrl as Button).Click += (sender, e) =>
408
+
409
+ {
410
+
411
+ string inKey = (sender as Button).Content.ToString();
412
+
413
+ switch (inKey)
414
+
415
+ {
416
+
417
+ //クリア
418
+
419
+ case "AC":
420
+
421
+ w.formula.Text = "0";
422
+
423
+ break;
424
+
425
+ case "=":
426
+
427
+ if (w.formula.Text == MessageList.CFNM0001)
428
+
429
+ {
430
+
431
+ w.formula.Text = "0";
432
+
433
+ }
434
+
435
+ else
436
+
437
+ {
438
+
439
+ //計算結果表示
440
+
441
+ var Calc = new CalculateProcess();
442
+
443
+ w.formula.Text = Calc.Calculator(w.formula.Text);
444
+
445
+ }
446
+
447
+ break;
448
+
449
+ default:
450
+
451
+ if (w.formula.Text.Length >= ItemProperty.FormulaMax)
452
+
453
+ {
454
+
455
+ break;
456
+
457
+ }
458
+
459
+ else if (w.formula.Text == "0" && (inKey != "/" && inKey != "*" && inKey != "-" && inKey != "+"))
460
+
461
+ {
462
+
463
+ w.formula.Text = inKey;
464
+
465
+ }
466
+
467
+ else if (w.formula.Text == MessageList.CFNM0001)
468
+
469
+ {
470
+
471
+ //0が表示されていて数字が入力されたらその値を設定
472
+
473
+ w.formula.Text = inKey;
474
+
475
+ }
476
+
477
+ else
478
+
479
+ {
480
+
481
+ //入力された値を式に追加
482
+
483
+ w.formula.Text += inKey;
484
+
485
+ }
486
+
487
+ break;
488
+
489
+ }
490
+
491
+ };
492
+
493
+ }
494
+
495
+ }
496
+
497
+ }
498
+
499
+ }
500
+
501
+
502
+
503
+ ```

5

文脈の修正

2020/07/21 04:34

投稿

Mr.sijimi
Mr.sijimi

スコア21

test CHANGED
File without changes
test CHANGED
@@ -2,12 +2,14 @@
2
2
 
3
3
  C#でクリック操作でできる電卓を作成してますが
4
4
 
5
- Mainwindow処理のインスタンスしている箇所
5
+ Mainwindow処理の「var IniEvent = new Initialize()」
6
6
 
7
7
  無限ループになってしまい処理が進みません。
8
8
 
9
9
 
10
10
 
11
+
12
+
11
13
  ### 該当のソースコード
12
14
 
13
15
 

4

コードの修正と追記

2020/07/21 02:58

投稿

Mr.sijimi
Mr.sijimi

スコア21

test CHANGED
File without changes
test CHANGED
@@ -14,19 +14,37 @@
14
14
 
15
15
  ```C#
16
16
 
17
- public MainWindow()
17
+ namespace CalculatorNeo
18
18
 
19
19
  {
20
20
 
21
+ public partial class MainWindow : Window
22
+
23
+ {
24
+
25
+ /// <summary>
26
+
27
+ /// コンストラクタ
28
+
29
+ /// </summary>
30
+
31
+ public MainWindow()
32
+
33
+ {
34
+
21
- InitializeComponent();
35
+ InitializeComponent();
22
-
23
-
24
-
36
+
37
+
38
+
25
- //イベント初期化
39
+ //イベント初期化
26
-
40
+
27
- var IniEvent = new Initialize();
41
+ var IniEvent = new Initialize();
28
-
42
+
29
- IniEvent.InitializeEvent();
43
+ IniEvent.InitializeEvent();
44
+
45
+ }
46
+
47
+ }
30
48
 
31
49
  }
32
50
 
@@ -36,124 +54,276 @@
36
54
 
37
55
  ```C#
38
56
 
39
- //初期化イベント
40
-
41
- public void InitializeEvent()
57
+ namespace Calculator
42
58
 
43
59
  {
44
60
 
45
- //rootGridは以下のコントロールを探す
46
-
47
- foreach (var ctrl in LogicalTreeHelper.GetChildren(rootGrid))
61
+ public partial class Initialize : MainWindow
48
62
 
49
63
  {
50
64
 
65
+ /// <summary>
66
+
67
+ /// イベント初期化
68
+
69
+ /// </summary>
70
+
71
+ public void InitializeEvent()
72
+
73
+ {
74
+
75
+ //rootGridは以下のコントロールを探す
76
+
77
+ foreach (var ctrl in LogicalTreeHelper.GetChildren(rootGrid))
78
+
79
+ {
80
+
51
- //ボタン以外は無視
81
+ //ボタン以外は無視
52
-
82
+
53
- if (!(ctrl is Button))
83
+ if (!(ctrl is Button))
84
+
85
+ {
86
+
87
+ continue;
88
+
89
+ }
90
+
91
+
92
+
93
+ //ボタンがクリックされたときの処理登録
94
+
95
+ (ctrl as Button).Click += (sender, e) =>
96
+
97
+ {
98
+
99
+ string inKey = (sender as Button).Content.ToString();
100
+
101
+ switch (inKey)
102
+
103
+ {
104
+
105
+ //クリア
106
+
107
+ case "AC":
108
+
109
+ formula.Text = "0";
110
+
111
+ break;
112
+
113
+ case "=":
114
+
115
+ if (formula.Text == MessageList.CFNM0001)
116
+
117
+ {
118
+
119
+ formula.Text = "0";
120
+
121
+ }
122
+
123
+ else
124
+
125
+ {
126
+
127
+ //計算結果表示
128
+
129
+ var Calc = new CalculateProcess();
130
+
131
+ formula.Text = Calc.Calculator(formula.Text);
132
+
133
+ }
134
+
135
+ break;
136
+
137
+ default:
138
+
139
+ if (formula.Text.Length >= ItemProperty.FormulaMax)
140
+
141
+ {
142
+
143
+ break;
144
+
145
+ }
146
+
147
+ else if (formula.Text == "0" && (inKey != "/" && inKey != "*" && inKey != "-" && inKey != "+"))
148
+
149
+ {
150
+
151
+ formula.Text = inKey;
152
+
153
+ }
154
+
155
+ else if (formula.Text == MessageList.CFNM0001)
156
+
157
+ {
158
+
159
+ //0が表示されていて数字が入力されたらその値を設定
160
+
161
+ formula.Text = inKey;
162
+
163
+ }
164
+
165
+ else
166
+
167
+ {
168
+
169
+ //入力された値を式に追加
170
+
171
+ formula.Text += inKey;
172
+
173
+ }
174
+
175
+ break;
176
+
177
+ }
178
+
179
+ };
180
+
181
+ }
182
+
183
+ }
184
+
185
+ }
186
+
187
+ }
188
+
189
+ ```
190
+
191
+
192
+
193
+ ### 追記
194
+
195
+ ```C#
196
+
197
+ namespace Calculator
198
+
199
+ {
200
+
201
+ public partial class CalculateProcess : MainWindow
54
202
 
55
203
  {
56
204
 
205
+ /// <summary>
206
+
207
+ /// 計算実行
208
+
209
+ /// </summary>
210
+
211
+ /// <param name="formula">計算式</param>
212
+
213
+ /// <returns>計算結果</returns>
214
+
215
+ public string Calculator(string formula)
216
+
217
+ {
218
+
219
+ try
220
+
221
+ {
222
+
223
+ var p = new Process();
224
+
225
+
226
+
227
+ // システムフォルダの取得
228
+
229
+ string systemFolder = Environment.GetFolderPath(Environment.SpecialFolder.System);
230
+
231
+ // PowerShellのフルパスを組立
232
+
233
+ string powerShellFullPath = System.IO.Path.Combine(systemFolder, @"WindowsPowerShell\v1.0\powershell.exe");
234
+
235
+
236
+
237
+ // 実行ファイル
238
+
239
+ p.StartInfo.FileName = powerShellFullPath;
240
+
241
+ // パラメータ(計算式)
242
+
243
+ p.StartInfo.Arguments = "-Command " + formula;
244
+
245
+
246
+
247
+ // 標準入力リダイレクトしない
248
+
249
+ p.StartInfo.RedirectStandardInput = false;
250
+
251
+ // 標準入力リダイレクトする
252
+
253
+ p.StartInfo.RedirectStandardOutput = true;
254
+
255
+
256
+
257
+
258
+
259
+ // シェル機能使用しない
260
+
261
+ p.StartInfo.UseShellExecute = false;
262
+
263
+ // ウィンドウ開かない
264
+
265
+ p.StartInfo.CreateNoWindow = true;
266
+
267
+
268
+
269
+ // 実行
270
+
57
- continue;
271
+ p.Start();
272
+
273
+ // 結果を一行読む
274
+
275
+ string calcResult = p.StandardOutput.ReadLine();
276
+
277
+ p.WaitForExit();
278
+
279
+ p.Close();
280
+
281
+
282
+
283
+ if (string.IsNullOrEmpty(calcResult))
284
+
285
+ {
286
+
287
+ // 計算結果無し(計算失敗)
288
+
289
+ return MessageList.CFNM0001;
290
+
291
+ }
292
+
293
+ else
294
+
295
+ {
296
+
297
+ // 計算結果を返す
298
+
299
+ return calcResult;
300
+
301
+ }
302
+
303
+ }
304
+
305
+ catch
306
+
307
+ {
308
+
309
+ return MessageList.CFNM0001;
310
+
311
+ }
312
+
313
+ }
314
+
315
+
58
316
 
59
317
  }
60
318
 
61
- //ボタンがクリックされたときの処理登録
62
-
63
- (ctrl as Button).Click += (sender, e) =>
64
-
65
- {
66
-
67
- string inKey = (sender as Button).Content.ToString();
68
-
69
- switch (inKey)
70
-
71
- {
72
-
73
- //クリア
74
-
75
- case "AC":
76
-
77
- formula.Text = "0";
78
-
79
- break;
80
-
81
- case "=":
82
-
83
- if (formula.Text == MessageList.CFNM0001)
84
-
85
- {
86
-
87
- formula.Text = "0";
88
-
89
- }
90
-
91
- else
92
-
93
- {
94
-
95
- //計算結果表示
96
-
97
- var Calc = new CalculateProcess();
98
-
99
- formula.Text = Calc.Calculator(formula.Text);
100
-
101
- }
102
-
103
- break;
104
-
105
- default:
106
-
107
- if (formula.Text.Length >= ItemProperty.FormulaMax)
108
-
109
- {
110
-
111
- break;
112
-
113
- }
114
-
115
- else if (formula.Text == "0" && (inKey != "/" && inKey != "*" && inKey != "-" && inKey != "+"))
116
-
117
- {
118
-
119
- formula.Text = inKey;
120
-
121
- }
122
-
123
- else if (formula.Text == MessageList.CFNM0001)
124
-
125
- {
126
-
127
- //0が表示されていて数字が入力されたらその値を設定
128
-
129
- formula.Text = inKey;
130
-
131
- }
132
-
133
- else
134
-
135
- {
136
-
137
- //入力された値を式に追加
138
-
139
- formula.Text += inKey;
140
-
141
- }
142
-
143
- break;
144
-
145
- }
146
-
147
- };
148
-
149
- }
150
-
151
319
  }
152
320
 
153
321
  ```
154
322
 
155
323
 
156
324
 
325
+
326
+
157
327
  ### 試したこと
158
328
 
159
329
  「インスタンス化 無限ループ」や、「Main 無限ループ」などで調べてみましたが出てこず、原因がわかりません。

3

文面の修正

2020/07/21 02:54

投稿

Mr.sijimi
Mr.sijimi

スコア21

test CHANGED
File without changes
test CHANGED
@@ -2,7 +2,9 @@
2
2
 
3
3
  C#でクリック操作でできる電卓を作成してますが
4
4
 
5
+ Mainwindow処理のインスタンスしている箇所で
6
+
5
- Main処理でインスタンス化すると無限ループになってしまい処理が進みません。
7
+ 無限ループになってしまい処理が進みません。
6
8
 
7
9
 
8
10
 

2

文面の修正

2020/07/21 02:42

投稿

Mr.sijimi
Mr.sijimi

スコア21

test CHANGED
File without changes
test CHANGED
@@ -1,8 +1,8 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
- C#でクリック操作でできる電卓を作成してます
3
+ C#でクリック操作でできる電卓を作成してます
4
4
 
5
- しかし、Main処理でインスタンス化すると無限ループになってしまい処理が進みません。
5
+ Main処理でインスタンス化すると無限ループになってしまい処理が進みません。
6
6
 
7
7
 
8
8
 

1

Main処理内のコード内容の修正

2020/07/21 02:38

投稿

Mr.sijimi
Mr.sijimi

スコア21

test CHANGED
File without changes
test CHANGED
@@ -15,6 +15,10 @@
15
15
  public MainWindow()
16
16
 
17
17
  {
18
+
19
+ InitializeComponent();
20
+
21
+
18
22
 
19
23
  //イベント初期化
20
24