ダンナのPCのデスクトップに、電卓プログラムを貼り付けて、自慢げに「やってみて」と言いました。
がちゃがちゃと入力して、「なにこれ?」と言われちゃいました。ふん!
エラーチェックを作っていませんでした。
そこで次のようなエラーチェックを追加しました。ナッキー様のページを見てですけど(^^;
- クリアしないでテンキーを押したときの処理
- 入力ボックスに値がないのに計算ボタンを押してしまったときの処理
- 最初の入力ボックスだけに値が入っていたときの処理
- 0で割ることができないので、そのときの処理
イベントハンドラの共有
同じ処理をするときには、この機能は便利です。
- フォームのオブジェクトインスペクタの「イベント」で、「sbtnClick1」の名前を変更します。
- 他のスピードボタンを、新しい共有ボタン名に変更します。(テンキーのボタン)
- sbtun1~sbtun9 までの「その他」のTagプロパティの値を、1~9までに設定します。
実行結果(0を入れて割ろうとした)
プログラム
長くてわかりにくいのですが、エラーチェックした場所にコメントを入れておきました。
同じ処理をあちこちに書いているので、関数を作っておいたほうがよいのでしょうね。
だけどまだ関数作りにはチャレンジしていませんので、後日また変更するかも。
procedure TForm1.btnTasuClick(Sender: TObject); //演算ボタン[+]が押されたとき begin //エラー処理(値がないのに演算ボタンをクリックしたとき if Edit1.Text = '' then raise Exception.Create('値を入力してから演算ボタンをクリックしましょう'); if Edit2.Text <>'' then begin Edit2.Text := ''; ShowMessage('値を入力してください'); end; lblEnzan.Caption := '+'; Edit1.Color := clYellow; Edit2.Color := clWhite; end; //演算ボタン「-」が押されたとき procedure TForm1.btnHikuClick(Sender: TObject); begin if Edit1.Text = '' then raise Exception.Create('値を入力してから演算ボタンをクリックしましょう'); if Edit2.Text <>'' then begin Edit2.Text := ''; ShowMessage('値を入力してください'); end; lblEnzan.Caption := '-'; Edit1.Color := clYellow; Edit2.Color := clWhite; end; //演算ボタン「×」が押されたとき procedure TForm1.btnKakeruClick(Sender: TObject); begin if Edit1.Text = '' then raise Exception.Create('値を入力してから演算ボタンをクリックしましょう'); if Edit2.Text <>'' then begin Edit2.Text := ''; ShowMessage('値を入力してください'); end; lblEnzan.Caption := '×'; Edit1.Color := clYellow; Edit2.Color := clWhite; end; //演算ボタン「÷」が押されたとき procedure TForm1.btnWaruClick(Sender: TObject); begin if Edit1.Text = '' then raise Exception.Create('値を入力してから演算ボタンをクリックしましょう'); if Edit2.Text <>'' then begin Edit2.Text := ''; ShowMessage('値を入力してください'); end; lblEnzan.Caption := '÷'; Edit1.Color := clYellow; Edit2.Color := clWhite; end; //クリアボタンが押されたとき初期化する procedure TForm1.btnClearClick(Sender: TObject); begin Edit1.Text := ''; Edit2.Text := ''; Edit3.Text := ''; Edit1.Color := clWhite; Edit2.Color := clYellow; Edit3.Color := clYellow; lblEnzan.Caption := ''; lblEqual.Visible := False; end; procedure TForm1.btnCloseClick(Sender: TObject); begin Close; end; procedure TForm1.btnCopyClick(Sender: TObject); //コピーボタンを押したとき、計算結果をクリップボードに保存 begin Edit3.SelectAll; Edit3.CopyToClipboard; btnClearClick(Sender);//クリアボタンを呼び出す Edit1.PasteFromClipboard; end; procedure TForm1.btnKeisanClick(Sender: TObject); var Num1 : Integer; Num2 : Integer; Ans : Double; //計算ボタンを押したとき begin // StrToIntDefは文字列型から整数型へ変換する関数 Num1 := StrToIntDef(Edit1.Text,0); Num2 := StrToINtDef(Edit2.Text,0); //ラベルのキャプションで判断して計算する if lblEnzan.Caption = '+' then Ans := Num1 + Num2 else if lblEnzan.Caption = '-' then Ans := Num1 - Num2 else if lblEnzan.Caption = '×' then Ans := Num1 * Num2 else if lblEnzan.Caption = '÷' then try Ans := Num1 / Num2; //例外処理 except Edit2.Text := ''; ShowMessage('0では割れません。正しい数値を入力してください。'); Exit; end else Ans := Num1; Edit2.Color := clYellow; Edit3.Color := clWhite; lblEqual.Visible := True;//=を表示する // FloatToStr は、実数型から文字列型へ変換する関数 Edit3.Text := FloatToStr(Ans); end; procedure TForm1.sbtn10Click(Sender: TObject); //数値0のボタンが押されたとき //演算記号が入ったら右側の入力ボックスに0を入れる //ヌル(空)の場合は、左側のボックスに0を入れる begin if lblEnzan.Caption = '' then Edit1.Text := Edit1.Text + '0' else Edit2.Text := Edit2.Text + '0'; end; procedure TForm1.TenKeyClick(Sender: TObject); var TenKey : TSpeedButton; TenKeyNum : string; //電卓の数値ボタンが押されたとき //ボタンは共有している begin //=表示されているときは入力ボックスをクリアする if lblEqual.Visible then btnClearClick(Sender); TenKey := Sender as TSpeedButton; TenKeyNum := IntToStr(TenKey.Tag); if lblEnzan.Caption = '' then Edit1.Text := Edit1.Text + TenKeyNum else Edit2.Text := Edit2.Text + TenKeyNum; end; procedure TForm1.sbtn2Click(Sender: TObject); begin if lblEnzan.Caption = '' then Edit1.Text := Edit1.Text + '2' else Edit2.Text := Edit2.Text + '2'; end; procedure TForm1.sbtn3Click(Sender: TObject); begin if lblEnzan.Caption = '' then Edit1.Text := Edit1.Text + '3' else Edit2.Text := Edit2.Text + '3'; end; procedure TForm1.sbtn4Click(Sender: TObject); begin if lblEnzan.Caption = '' then Edit1.Text := Edit1.Text + '4' else Edit2.Text := Edit2.Text + '4'; end; procedure TForm1.sbtn5Click(Sender: TObject); begin if lblEnzan.Caption = '' then Edit1.Text := Edit1.Text + '5' else Edit2.Text := Edit2.Text + '5'; end; procedure TForm1.sbtn6Click(Sender: TObject); begin if lblEnzan.Caption = '' then Edit1.Text := Edit1.Text + '6' else Edit2.Text := Edit2.Text + '6'; end; procedure TForm1.sbtn7Click(Sender: TObject); begin if lblEnzan.Caption = '' then Edit1.Text := Edit1.Text + '7' else Edit2.Text := Edit2.Text + '7'; end; procedure TForm1.sbtn8Click(Sender: TObject); begin if lblEnzan.Caption = '' then Edit1.Text := Edit1.Text + '8' else Edit2.Text := Edit2.Text + '8'; end; procedure TForm1.sbtn9Click(Sender: TObject); begin if lblEnzan.Caption = '' then Edit1.Text := Edit1.Text + '9' else Edit2.Text := Edit2.Text + '9'; end;