ダンナの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;
