16進数電卓
コンピュータの世界では16進数がよく使われます。そんなわけで16進数電卓はけっこう便利です(Windowsアクセサリの電卓も関数電卓にすれば16進数が使えます)。
ただ、プログラムを作るとなるとけっこう複雑になってしまいました。実際には、単純なのですがキーがたくさんあるので複雑に見えます。
ソース(青色部分が記述したところです)
{ 16進数電卓 ========== } unit HexCalc; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls; const OpPlus = '+'; OpMinus = '-'; OpAnd = '&'; OpOr = '|'; OpXor = '^'; OpNot = '!'; OpNull = '0'; type TForm1 = class(TForm) Bevel1: TBevel; btnC: TSpeedButton; btn8: TSpeedButton; btnD: TSpeedButton; btn0: TSpeedButton; btn4: TSpeedButton; btn9: TSpeedButton; btnB: TSpeedButton; btnF: TSpeedButton; btnE: TSpeedButton; btn2: TSpeedButton; btn1: TSpeedButton; btn6: TSpeedButton; btn5: TSpeedButton; btnA: TSpeedButton; btn7: TSpeedButton; btn3: TSpeedButton; btnAnd: TSpeedButton; btnXor: TSpeedButton; btnSubt: TSpeedButton; btnAdd: TSpeedButton; btnOr: TSpeedButton; btnNot: TSpeedButton; btnExec: TSpeedButton; chkDecimal: TCheckBox; txtDisplay: TEdit; btnAC: TSpeedButton; procedure btn0Click(Sender: TObject); procedure btn1Click(Sender: TObject); procedure btn2Click(Sender: TObject); procedure btn3Click(Sender: TObject); procedure btn4Click(Sender: TObject); procedure btn5Click(Sender: TObject); procedure btn6Click(Sender: TObject); procedure btn7Click(Sender: TObject); procedure btn8Click(Sender: TObject); procedure btn9Click(Sender: TObject); procedure btnAClick(Sender: TObject); procedure btnBClick(Sender: TObject); procedure btnCClick(Sender: TObject); procedure btnDClick(Sender: TObject); procedure btnEClick(Sender: TObject); procedure btnFClick(Sender: TObject); procedure btnACClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure chkDecimalClick(Sender: TObject); procedure btnAddClick(Sender: TObject); procedure btnExecClick(Sender: TObject); procedure btnSubtClick(Sender: TObject); procedure btnAndClick(Sender: TObject); procedure btnOrClick(Sender: TObject); procedure btnXorClick(Sender: TObject); procedure btnNotClick(Sender: TObject); private { Private 宣言 } FOperator: Char; FOperand1: Cardinal; FOperand2: Cardinal; FOK: Boolean; procedure AddCharToDisp(A: Char); procedure Clear; function GetValue: Cardinal; public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.DFM} // 初期化 procedure TForm1.FormCreate(Sender: TObject); begin Clear; end; // クリア procedure TForm1.Clear; begin FOperator := OpNull; FOperand1 := 0; FOperand2 := 0; txtDisplay.Text := '0'; FOK := True; end; // 表示器に数字を追加 procedure TForm1.AddCharToDisp(A: Char); begin if FOK = True then begin txtDisplay.Text := A; FOK := False; end else if Length(txtDisplay.Text) < 8 then txtDisplay.Text := txtDisplay.Text + A; end; // 表示器の値を変換する function TForm1.GetValue: Cardinal; begin // 10進かどうか if chkDecimal.Checked = False then begin // 16進数 Result := StrToInt('$' + txtDisplay.Text); end else begin // 10進数 Result := StrToInt(txtDisplay.Text); end; end; // '0'をクリック procedure TForm1.btn0Click(Sender: TObject); begin AddCharToDisp('0'); end; // '1'をクリック procedure TForm1.btn1Click(Sender: TObject); begin AddCharToDisp('1'); end; // '2'をクリック procedure TForm1.btn2Click(Sender: TObject); begin AddCharToDisp('2'); end; // '3'をクリック procedure TForm1.btn3Click(Sender: TObject); begin AddCharToDisp('3'); end; // '4'をクリック procedure TForm1.btn4Click(Sender: TObject); begin AddCharToDisp('4'); end; // '5'をクリック procedure TForm1.btn5Click(Sender: TObject); begin AddCharToDisp('5'); end; // '6'をクリック procedure TForm1.btn6Click(Sender: TObject); begin AddCharToDisp('6'); end; // '7'をクリック procedure TForm1.btn7Click(Sender: TObject); begin AddCharToDisp('7'); end; // '8'をクリック procedure TForm1.btn8Click(Sender: TObject); begin AddCharToDisp('8'); end; // '9'をクリック procedure TForm1.btn9Click(Sender: TObject); begin AddCharToDisp('9'); end; // 'A'をクリック procedure TForm1.btnAClick(Sender: TObject); begin AddCharToDisp('A'); end; // 'B'をクリック procedure TForm1.btnBClick(Sender: TObject); begin AddCharToDisp('B'); end; // 'C'をクリック procedure TForm1.btnCClick(Sender: TObject); begin AddCharToDisp('C'); end; // 'D'をクリック procedure TForm1.btnDClick(Sender: TObject); begin AddCharToDisp('D'); end; // 'E'をクリック procedure TForm1.btnEClick(Sender: TObject); begin AddCharToDisp('E'); end; // 'F'をクリック procedure TForm1.btnFClick(Sender: TObject); begin AddCharToDisp('F'); end; // ACボタンをクリック procedure TForm1.btnACClick(Sender: TObject); begin Clear; end; // DECボタンをクリック procedure TForm1.chkDecimalClick(Sender: TObject); var N: Cardinal; begin if chkDecimal.Checked = True then begin btnA.Enabled := False; btnB.Enabled := False; btnC.Enabled := False; btnD.Enabled := False; btnE.Enabled := False; btnF.Enabled := False; N := StrToInt('$' + txtDisplay.Text); txtDisplay.Text := IntToStr(N); end else begin btnA.Enabled := True; btnB.Enabled := True; btnC.Enabled := True; btnD.Enabled := True; btnE.Enabled := True; btnF.Enabled := True; N := StrToInt(txtDisplay.Text); txtDisplay.Text := IntToHex(N, 8); end; end; // '+'ボタンが押されたとき procedure TForm1.btnAddClick(Sender: TObject); begin FOperator := OpPlus; FOperand1 := GetValue; txtDisplay.Text := '0'; FOK := True; end; // '-'ボタンが押されたとき procedure TForm1.btnSubtClick(Sender: TObject); begin FOperator := OpMinus; FOperand1 := GetValue; FOK := True; end; // 'AND'ボタンが押されたとき procedure TForm1.btnAndClick(Sender: TObject); begin FOperator := OpAnd; FOperand1 := GetValue; FOK := True; end; // 'OR'ボタンが押されたとき procedure TForm1.btnOrClick(Sender: TObject); begin FOperator := OpOr; FOperand1 := GetValue; FOK := True; end; // 'XOR'ボタンが押されたとき procedure TForm1.btnXorClick(Sender: TObject); begin FOperator := OpXor; FOperand1 := GetValue; FOK := True; end; // 'NOT'ボタンが押されたとき procedure TForm1.btnNotClick(Sender: TObject); begin FOperator := OpNot; FOperand1 := GetValue; FOK := True; end; // '='ボタンが押された procedure TForm1.btnExecClick(Sender: TObject); var Y: Cardinal; begin FOperand2 := GetValue; case FOperator of OpPlus: begin Y := FOperand1 + FOperand2; end; OpMinus: begin Y := FOperand1 - FOperand2; end; OpAnd: begin Y := FOperand1 and FOperand2; end; OpOr: begin Y := FOperand1 or FOperand2; end; OpXor: begin Y := FOperand1 xor FOperand2; end; OpNot: begin Y := not FOperand1; end; else begin Y := 0; end; end; if chkDecimal.Checked = True then begin txtDisplay.Text := IntToStr(Y); end else begin txtDisplay.Text := IntToHex(Y, 8); end; FOK := True; end; end.