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.