delphi.gif (306 バイト) 16進数電卓


コンピュータの世界では16進数がよく使われます。そんなわけで16進数電卓はけっこう便利です(Windowsアクセサリの電卓も関数電卓にすれば16進数が使えます)。
ただ、プログラムを作るとなるとけっこう複雑になってしまいました。実際には、単純なのですがキーがたくさんあるので複雑に見えます。

 

wpe1.jpg (12197 バイト)

 

ソース(青色部分が記述したところです)
{
    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.