「C# 入門講座 第4回 イベントを逃すな」の5-2のコードについて。

タグの編集
投稿者 辺見!真琴  (社会人) 投稿日時 2022/11/6 10:24:39
 初めまして。
 当方はC+DXライブラリの経験はありますがWINDOWSプログラミングの経験がなく、初めてC#を入門しています。
 ここのC#入門でざっと流して全体像を掴もうとしているのですが動かないコードがあり自分がどこを見落としているのか分からず泥沼と化してきたので、質問させて下さい。 環境はVS2022comunityです。

Visual Basic 中学校 C# 入門講座 第4回 イベントを逃すな
https://www.umayadia.com/CSNyumon/BEGIN4.htm

 この第4回の最後の5-2のタイマーのカウントアップのコードですが、実際に入力して実行すると

> ユーザーが処理していない例外
> System.FormatException: 'Input string was not in a correct format.'

と出て処理は中断します。
 文字列を変換できない、みたいな内容だと思うのですがFormのTextプロパティを半角数字で0を書き込んでもエラー停止します。 処理が完了しません。 抽象的な質問ですが、どこに見落としがあるのでしょう?
 それとTextプロパティは(DataBindings)にも同名プロパティがありますが、そちらは関係ないですよね?
投稿者 るきお  (社会人) 投稿日時 2022/11/6 12:32:23
こんにちは。

> > ユーザーが処理していない例外
> > System.FormatException: 'Input string was not in a correct format.'
> と出て処理は中断します。

このサンプルでこの例外が出るありそう理由は、FormのTextプロパティを 0 に設定していない場合です。

> FormのTextプロパティを半角数字で0を書き込んでもエラー停止します。
その記事のところに実際に設定とプログラムを行う動画を付けてありますが、同じように設定してもエラーになるでしょうか?

「半角数字で」ということですが、念のため全角になっていないか、前後に余計なものがついていないかなどご確認ください。

> それとTextプロパティは(DataBindings)にも同名プロパティがありますが、そちらは関係ないですよね?
はい。関係ありません。

this.Text = (int.Parse(this.Text) + 1).ToString();


このプログラムでは、 this.Text を数値にして +1 するという処理を実行しています。
this.Text は Form の Text プロパティを表しています。
this.Text が 数値にできない場合、System.FormatException: 'Input string was not in a correct format.' の例外が発生します。

エラーが解決できない場合、エラーが発生して、プログラムが中断しているときに this.Text の Text の部分にマウスカーソルをホバーさせてみてください。Textプロパティの値がどのように認識されているか確認してみてください。

※スクリーンショットのサイズが思ったより大きかったです…


投稿者 辺見!真琴  (社会人) 投稿日時 2022/11/6 18:42:34
 迅速な返答ありがとうございます。
 そしてそれに追い付けていなくてごめんなさい。

> エラーが解決できない場合、エラーが発生して、プログラムが中断しているときに this.Text の Text の部分にマウスカーソルをホバーさせてみてください。Textプロパティの値がどのように認識されているか確認してみてください。



 IMEを確実に切って入力し直してみましたが、結果は変わらず。
 コードではなくTextプロパティでもないとしたら、もしかして先の講座で同じことの繰り返しなので暗黙の了解として何か省略されているのかと思えばそうでもなく、改めて新規プロジェクトで同じ手順を繰り返しても再現しました。
投稿者 るきお  (社会人) 投稿日時 2022/11/6 19:27:32
うーん、どうなっているんでしょう…。みたところ良さそうです。

ちょっと確認ですが、int.Parse は環境で設定されている言語や地域(.NETではこれを「カルチャー」と呼びます)の影響を受けます。使用されているWindowsなど何か日本・日本語以外の設定になっているようなものに心当たりはありますか?

とはいえ、"0" がエラーというのはちょっと考えにくいので念のための確認です。

プログラムを次のように書き換えると、カルチャーの影響が無視されます。このように書き換えるとうまくいったりしますか?
this.Text = (int.Parse(this.Text, CultureInfo.InvariantCulture) + 1).ToString();


これで、うまくいかないなら、お手数ですが、次のようにプログラムを2行に書き換えて、どの行でエラーになるのか、確認してみてください。

int x = int.Parse(this.Text, CultureInfo.InvariantCulture);
this.Text = (x + 1).ToString();


多分、1行目でエラーになると思うのですが…。
投稿者 辺見!真琴  (社会人) 投稿日時 2022/11/6 21:36:43
 私はWindows10pro22H2を使っていますが、日本語以外への用事はないので変更していません。
 そして書き換えですが、お察しの通り2行に分割した1行目で同じ例外を出しました。

 なんか、こうなってくるとインストールミスを疑いたくなってきますね。
 とは言え、C++は正常に動いていますからね・・・。
投稿者 るきお  (社会人) 投稿日時 2022/11/6 22:03:04
私はWindowsの設定を疑っています。
CultureInfo.InvariantCulture をつけても改善されなかったということですね?
投稿者 辺見!真琴  (社会人) 投稿日時 2022/11/6 22:49:11
はい、int x = int.Parse(this.Text, CultureInfo.InvariantCulture)で例外が出ました。
私の環境ですと、設定→時刻と言語→地域/言語はすべて日本か日本語です。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2022/11/6 23:02:47
> お察しの通り2行に分割した1行目で同じ例外を出しました。
int.Parse が失敗するとのことですが、TryParse も失敗する状況でしょうか。
たとえば、Timer で下記を実行した場合、常に this.Text == "1" の状態になってしまいますか?
this.Text = $"{(int.TryParse(this.Text, out int num) ? num + 1 : 1)}";



> こうなってくるとインストールミスを疑いたくなってきますね。
WindowsFormsApp1 - "Windows フォーム アプリケーション (.NET Framework)" と
WinFormsApp1 - "Windows フォーム アプリ" のいずれの場合でも、
int.Parse が失敗するのでしょうか。
// int x = int.Parse(this.Text);
int x = int.Parse("0");
this.Text = (x + 1).ToString();
投稿者 辺見!真琴  (社会人) 投稿日時 2022/11/7 01:22:23
 反応ありがとうございます。

> たとえば、Timer で下記を実行した場合、常に this.Text == "1" の状態になってしまいますか?
> this.Text = $"{(int.TryParse(this.Text, out int num) ? num + 1 : 1)}";

 はい、0から1になって、後は常に1の状態でした。

> WindowsFormsApp1 - "Windows フォーム アプリケーション (.NET Framework)" と
> WinFormsApp1 - "Windows フォーム アプリ" のいずれの場合でも、
> int.Parse が失敗するのでしょうか。
> // int x = int.Parse(this.Text);
> int x = int.Parse("0");
> this.Text = (x + 1).ToString();

 ここの入門はWinFormsApp1でこなして来ました。
 改めてWindowsFormsApp1でもやってみましたが、どちらもこのサンプルは0から1に変わって、後は常に1でした。
 エラーは出ませんでした。

 思い付きで、コメントアウトしていたコードを復帰させてもう少し分解してみました。
var x = this.Text;
int y = int.Parse(x);
this.Text = (y + 1).ToString();

 2行目のParse()で例外が出ました。
 "0"が変換出来てthis.Textが変換出来ないと言うのは・・・うむむむむ。
投稿者 辺見!真琴  (社会人) 投稿日時 2022/11/7 02:14:11
 大事な事実に気が付きました。
 るきお様と魔界の仮面弁士様には謝罪しないといけません。

 まず端的に、原因は私が常用していた常駐ソフトのせいでした。
 アクティブウインドウのタイトルバーに時計を表示するもので、元の表示物に現在時刻を追記するものでした。
 その追記に数字以外の文字列も色々と入ってくるので、当然・・・。
 可能性に気が付いて、WindowsUPDATEでの再起動のついでにオフにしてVS2022で試した所、全てすんなりカウントアップしました。

 お時間を無駄に浪費させてしまい、本当に本当に申し訳ありませんでした。
 一方的ではありますが、解決チェックを付けさせてもらいます。
 本当に申し訳ありませんでした。