こんにちは。まるです。
電卓作りを一週間弱やって気がついたこと書いてます。
前回は1+2=12になる問題でした。
今回はじつは順番的にはそれより前にあたる壁で、
1+2=3の、+が押された時の処理です。
まず手順を日本語で書きますと、
ボタン1の数字とボタン2の数字を足してテキストボックスに表示する
となりますね。
ではこれを細分化します。
ボタン1と押した時、当然テキストディスプレイには1と表示されます。
では+を押した時どうなるか。
テキストディスプレイには1が表示されたままですよね。
そしてものによってはディスプレイの右上に+が表示されたりしますよね。(大半そうか)
この+が表示されるというのが非常に大事になってきます。
次にボタン2を押した時ディスプレイはどうなるでょうか。
1+2ときてるわけですからとりあえず”2だけ”表示されますよね。
お察しの方もいらっしゃいますよね。
そうです。最初に押した1どこいくん問題です。
とりあえず話を進めます。
1+2ときましたので次は=です。
なので=が押された時に、”どっかにいった1”と”ディスプレイに表示されてる2”を足す。という指示を出さないといけません。
なので、1が押された時か、+が押された時に、"ディスプレイの文字(あえて文字とします)" を "どこかにやる"必要があります。
まずどこかにやるにはですが、これは簡単です。
電卓のフォームには表示させませんが、裏にfirstNum(名前はなんでもよくて、最初のナンバーという意味です)というものを用意して、そこに最初の数字を入れておけばいいのです。
なので、firstNum = txtDisplay.Textという指示を、1が押された時か、+が押された時に与えなければいけません。※firstNum.Textとはならないの注意
結論から言うとまず1を押した時に格納すると問題が生じます。
1+2の2の時です。1の時に格納したものが2の時に更新されてしまいます。
なので+の時に格納してあげればいいのです。(察しが良すぎる人にはここで新たな問題が見えてしまうかもしれませんがそれは別の記事で)
そうすると、また日本語で先に書くと、
・ボタン1を押す。
・プラスを押す(この時表示されている文字をfirstNumに格納し、かつ+を別の場所(lblを用意してそこ)に表示))。そしてプラスが押されましたよというフラグを立てる必要があります。これをやることによって、打ち込まれた数字が確定する意味があります。(フラグを立てないとずっと111111のようになってしまう)
・ボタン2を押す(ディスプレイに表示される)
・=(ファーストナム+テキストディスプレイの文字)
となります。
コードを加えると、
・btn1を押したとき・・・txtDisplay.Text=txtDisplay.Text + btn1.Text; //このスラッシュ
2本はコメント
の意味。ボタン1
のテキストは、も
ともとプロパティ
画面で登録した
1をひっぱりだし
てくるという意味
です。
・+を押したとき・・・firstNum=txtDisplay.Text; // 1をfirstNumに格納
lblOperation.Text=btnPlus.Text; // lblはラベルを指します。
="+"としても可ですが、
格納されてる文字のほうが
打ち間違えることがないので
おすすめ。
opeFlg=true; //これが非常に大事。
・2を押したとき・・・txtDisplay.Text=btn2.Text; //テキストディスプレイにボタン2
のテキストを表示
opeFlg=false; //フラグをオフに
if(opeFlg==false) //フラグがオフの時限定イベント
{
txtDisplay.Text=txtDisplay.Text + btn2.Text; //ディスプレイ
} の文字にボタン2
のテキストを足す
・=押したとき・・・txtDisplay.Text =
(decimal.Parse(firstNum)+decimal.Parse(txtDiplay.Text)).ToString();
//ごめんなさいなぜか改行されちゃう。テキストディスプレイの
文字=数字変換したfirstNumの文字+数字変換したtxtDisplayの文字
を足して、テキストに戻したものを代入する。となります。
ほんとはもっといろいろ条件分岐していたりして、こんなに簡単にかけるものではないのですが、とりあえずこんな感じの繰り返しで電卓が作られます。
0~9のボタンに対しての命令と、+ - * / = に対しての命令、
写真の右側の各ボタンの命令と、"."の処理、計算式を随時表示するディスプレイの実装、さらに”-1 - -1=” といったマイナス計算までC#を始めてから3日で済ませました。
もちろん楽しくて仕方なくて家でもずっとやっていましたので、触っていた時間は長いです。
それとこの後ぶち当たる壁なのですが、1+1+1= といった、連続計算の処理と、1+1+=とコマンドしたときに起きる不具合に対する処理に困ったのですが、これを解決した時のすっきり感といったらなかったです。
なぜならネットでもほとんど明確な回答(しかも初心者にもわかりやすいもの)がなかったですし、できてない人が多かったので、してやったりという気分でした。
ここについては次回書いていこうと思います。