お世話になります。
C#で次のようなプログラムを書いているのですが、もっと簡単なもの(というか少ない行数に)直せないでしょうか?
//----------------------------
switch (e.KeyCode)
{
case Keys.F1:
ret = 1;
break;
case Keys.F2:
ret = 2;
break;
case Keys.F3:
ret = 3;
break;
case Keys.F4:
ret = 4;
break;
case Keys.F5:
ret = 5;
break;
case Keys.F6:
ret = 6;
break;
case Keys.F7:
ret = 7;
break;
case Keys.F8:
ret = 8;
break;
case Keys.F9:
ret = 9;
break;
default:
}
No.1ベストアンサー
- 回答日時:
Keys.F1からKeys.F9が連続した数値であるという性質を利用しています。
if (e.KeyCode >= Keys.F1 && e.KeyCode <= Keys.F9)
{
ret = e.KeyCode - Keys.F1 + 1;
}
else
{
ret = -1;
}
厳密に言えば、今後、永久にKeys.F1からKeys.F9が連続であることが保障されているとは限らないので、
あなたが提示したコードのほうが、信頼性は高いと思います。
回答ありがとうございます。
tatsu99さんの教えてくれた方法で行くことにしました。
>今後、永久にKeys.F1からKeys.F9が連続であることが保障されているとは限らないので、
だめになったら(変更されたら)、その時に別の方法も考えたいと思います。
No.3
- 回答日時:
「テーブルを引く」 が定石ですね。
ここでいう「テーブル」とは配列や辞書のことです。
switchが大きくなってきたら置き換えを検討しましょう。
No.2
- 回答日時:
if 文で使用している変数名およびそのプロパティ名から KeyDown イベント内での処理と思われます。
# 今回は上記が特徴的だったからわかりましたが、本来ならば質問者様がプログラム中に出てくる変数(今回の場合は e)の型を明記すべきです。次回からはご注意ください。
したがいまして、上記イベント内での処理をイメージして以下の通り簡略化しました。
なお、教えて!goo の投稿の仕様上インデントを全角空白で行っています。
// (多分)押されたキーとそれに対する ret の値の対応
// イベント発生するたびにこの対応を用意するのは時間の無駄なので
// インスタンス変数化して適切な場所で初期化したほうがいいかも
Dictionary<Keys, int> retvals = new Dictionary<Keys, int> {
{Keys.F1, 1},
{Keys.F2, 2},
{Keys.F3, 3},
{Keys.F4, 4},
{Keys.F5, 5},
{Keys.F6, 6},
{Keys.F7, 7},
{Keys.F8, 8},
{Keys.F9, 9},
};
int ret = 0;
if (retvals.TryGetValue(e.KeyCode, out ret))
{
// (多分)ファンクションキーが押された時の処理
}
else
{
// (多分)ファンクションキーが押されなかった時の処理
}
回答ありがとうございます。
>if 文で使用している変数名およびそのプロパティ名から KeyDown イベント内での処理と思われます。
># 今回は上記が特徴的だったからわかりましたが、本来ならば質問者様がプログラム中に出てくる変数(今回の場合は e)の型を明記すべきです。次回からはご注意ください。
おっしゃる通りです。KeyDownイベント内の処理です。
今後気を付けます。
ご提案していただいた方法は、今後のプログラムで使えそうです。
ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript jsで、switch文で書かれた分をif文にできませんか。 1 2022/07/28 15:10
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- JavaScript セレクトボックスを2つ設けて選択して初めてメッセを表示 1 2022/07/27 12:15
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- JavaScript セレクトボックスを2つ選択してメッセージなどを表示するには。~運賃検索プログラムを完成させたい~ 1 2022/07/22 11:10
- JavaScript 以前の質問だと、どの条件でも配列が表示されてしまいます。 1 2022/07/09 11:40
- C言語・C++・C# C++のcase文の書き方 4 2023/02/24 20:50
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- その他(プログラミング・Web制作) powershell で書いたプログラムでcd が動かない 5 2023/04/08 14:47
- その他(プログラミング・Web制作) test([)コマンドによる条件判定 2 2022/08/10 12:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エディットボックスの背景の色...
-
この列挙体でsysjanの関数はあ...
-
画像を表示したいのですが……
-
不明なエラー
-
エラー Run-Time Check Failur...
-
COMPORTマルチスレッドで例外発生
-
子ウインドウの作成と破棄について
-
エディットコントロール入力時...
-
音量調節
-
WM_CREATE について
-
プログラミングでエラーが出ま...
-
Enterキーを押されたら次の処理...
-
fgetsなどのときのstdinのバッ...
-
マイナスからプラスへ転じた時...
-
複数桁10進数の*桁目だけを抽出...
-
「指定されたキャストは有効で...
-
「an=(n-1)/(n+1)のときlim[n→∞...
-
c言語で、繰り返し文の中で、0....
-
C言語での引数の省略方法
-
正負を反転させて出力するプロ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Win32APIでウィンドウを中央に...
-
オーバーレイみたいな処理がしたい
-
ダイアログプログラムでEnterキ...
-
キャレットの現在位置の表示 (W...
-
PeekMessageについて
-
ウィンドウ非表示に時に表示し...
-
C#のswitch文を簡略化したいの...
-
C言語win32api、エディットボッ...
-
音量調節
-
LoadImageを使用し、タイトルバ...
-
プログラミングでエラーが出ま...
-
エディットコントロール入力時...
-
ウィンドウハンドルがメッセー...
-
ボタンの色(WINAPI)
-
画像を表示したいのですが……
-
WINAPIでキーから文字列を入力...
-
エラー Run-Time Check Failur...
-
エディットボックスの背景の色...
-
Win32APIでアイコンファイルを...
-
WM_KEYDOWNでPrtScを捕まえる方...
おすすめ情報