エラーチェックをしよう

ダンナのPCのデスクトップに、電卓プログラムを貼り付けて、自慢げに「やってみて」と言いました。
がちゃがちゃと入力して、「なにこれ?」と言われちゃいました。ふん!
エラーチェックを作っていませんでした。
そこで次のようなエラーチェックを追加しました。ナッキー様のページを見てですけど(^^;

  • クリアしないでテンキーを押したときの処理
  • 入力ボックスに値がないのに計算ボタンを押してしまったときの処理
  • 最初の入力ボックスだけに値が入っていたときの処理
  • 0で割ることができないので、そのときの処理

イベントハンドラの共有

同じ処理をするときには、この機能は便利です。

  • フォームのオブジェクトインスペクタの「イベント」で、「sbtnClick1」の名前を変更します。
  • 他のスピードボタンを、新しい共有ボタン名に変更します。(テンキーのボタン)
  • sbtun1~sbtun9 までの「その他」のTagプロパティの値を、1~9までに設定します。

実行結果(0を入れて割ろうとした)

dentaku5

プログラム

長くてわかりにくいのですが、エラーチェックした場所にコメントを入れておきました。
同じ処理をあちこちに書いているので、関数を作っておいたほうがよいのでしょうね。
だけどまだ関数作りにはチャレンジしていませんので、後日また変更するかも。


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;

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です