델파이 계산기 프로그램
Delphi7 툴로 만든 계산기 프로그램입니다.
window 운영체제에 있는 기본 계산기 프로그램과 비슷하게 코딩하였습니다.
기능으로는 사칙연산만 연산 가능하도록 했습니다.
소수점 계산에서 window 계산기는 '=' 버튼을 눌러 결과값이 나온 뒤에 소수점을 누르면
무조건 '0.'에서 시작하지만 제가 만든 계산기는 결과값에 소수점이 포함되면 '0.'로 리셋
아니면 결과값 뒤에 소수점을 붙이게 만들었습니다.
button 19개, edit 2개로 구성됐으며, 마우스 및 키보드로 동작합니다.
다음은 프로그램 내부 코드입니다.
unit cal;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Btn1: TButton;
Btn2: TButton;
Btn3: TButton;
Btn4: TButton;
Btn5: TButton;
Btn6: TButton;
Btn7: TButton;
Btn8: TButton;
Btn9: TButton;
Btn0: TButton;
DotBtn: TButton;
PlusBtn: TButton;
MinusBtn: TButton;
MulBtn: TButton;
DivBtn: TButton;
EqualBtn: TButton;
BackSpaceBtn: TButton;
SubClearBtn: TButton;
ClearBtn: TButton;
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 Btn0Click(Sender: TObject);
procedure DotBtnClick(Sender: TObject);//소수점 버튼
procedure PlusBtnClick(Sender: TObject);//+ 버튼
procedure MinusBtnClick(Sender: TObject);//- 버튼
procedure MulBtnClick(Sender: TObject);//* 버튼
procedure DivBtnClick(Sender: TObject);// / 버튼
procedure EqualBtnClick(Sender: TObject);// = 버튼
procedure BackSpaceBtnClick(Sender: TObject);// <- 버튼
procedure ClearBtnClick(Sender: TObject);// Clear 버튼
procedure SubClearBtnClick(Sender: TObject);// 부분 삭제 버튼
procedure OperatorClick();//연산자 클릭
procedure Calculate();//계산기
procedure Init();//초기화 프로시져
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); //키보드 입력
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
result:real=0;//결과값
val1:real=0;//피연산자1
val2:real=0;//피연산자2
flag:boolean=true;//피연산자2 값이 있는지 없는지 저장하는 플래그
check:integer;//연산자 기호 체크
totalString:string;//연산자와 피연산자를 기억하는 문자열
delNum:string;//숫자값 지우기 전에 저장하는 문자열
RFlag:boolean=true;//결과값 리셋할 때 필요한 플래그
OFlag:boolean=true;// 처음입력값이 숫자인지 연산자인지 저장하는 플래그
dotFlag:boolean=true;//dot값 플래그
saveTotal:string;// 테스트용
implementation
{$R .dfm}
procedure TForm1.Btn1Click(Sender: TObject);//Button Number 1
begin
if(Edit1.Text='0') then
begin
Edit1.Clear;//Edit1 내부 숫자가 0이면 초기화
end;
Edit1.Text:=Edit1.Text+'1';//버튼1을 클릭하면 1이 입력되게 함
OFlag:=false; //숫자가 입력되면 연산자 플래그 불리언 값은 false
//연산자버튼을 연속적으로 누르는 것을 방지함
EqualBtn.SetFocus;// = 버튼에 포커스
if(RFlag=false) and (dotFlag=true) then//리셋 플래그가 false고 닷플래그가 true이면
begin
Edit1.Clear;//Equal버튼을 누르면 Rflag가 false가 되는데 이 때 edit1에 있는
//결과값을 클리어한 후에 입력 값을 받아야함
Edit1.Text:=Edit1.Text+'1';//버튼1을 클릭하면 1이 입력되게 함
RFlag:=true;//다시 RFlag를 true하여 = 버튼을 누르면 false가 되도록 함.
OFlag:=false;//true면 연산자를 먼저 입력한 것이고 false면 숫자를 먼저 입력
end;
end;
procedure TForm1.Btn2Click(Sender: TObject);//Button Number 2
begin
if(Edit1.Text='0') then
begin
Edit1.Clear;
end;
Edit1.Text:=Edit1.Text+'2';
OFlag:=false;
EqualBtn.SetFocus;
if(RFlag=false) and (dotFlag=true) then
begin
Edit1.Clear;
Edit1.Text:=Edit1.Text+'2';
RFlag:=true;
end;
end;
procedure TForm1.Btn3Click(Sender: TObject);//Button Number 3
begin
if(Edit1.Text='0') then
begin
Edit1.Clear;
end;
Edit1.Text:=Edit1.Text+'3';
OFlag:=false;
EqualBtn.SetFocus;
if(RFlag=false) and (dotFlag=true) then
begin
Edit1.Clear;
Edit1.Text:=Edit1.Text+'3';
RFlag:=true;
end;
end;
procedure TForm1.Btn4Click(Sender: TObject);//Button Number 4
begin
if(Edit1.Text='0') then
begin
Edit1.Clear;
end;
Edit1.Text:=Edit1.Text+'4';
OFlag:=false;
EqualBtn.SetFocus;
if(RFlag=false) and (dotFlag=true) then
begin
Edit1.Clear;
Edit1.Text:=Edit1.Text+'4';
RFlag:=true;
end;
end;
procedure TForm1.Btn5Click(Sender: TObject);//Button Number 5
begin
if(Edit1.Text='0') then
begin
Edit1.Clear;
end;
Edit1.Text:=Edit1.Text+'5';
OFlag:=false;
EqualBtn.SetFocus;
if(RFlag=false) and (dotFlag=true) then
begin
Edit1.Clear;
Edit1.Text:=Edit1.Text+'5';
RFlag:=true;
end;
end;
procedure TForm1.Btn6Click(Sender: TObject);//Button Number 6
begin
if(Edit1.Text='0') then
begin
Edit1.Clear;
end;
Edit1.Text:=Edit1.Text+'6';
OFlag:=false;
EqualBtn.SetFocus;
if(RFlag=false) and (dotFlag=true) then
begin
Edit1.Clear;
Edit1.Text:=Edit1.Text+'6';
RFlag:=true;
end;
end;
procedure TForm1.Btn7Click(Sender: TObject);//Button Number 7
begin
if(Edit1.Text='0') then
begin
Edit1.Clear;
end;
Edit1.Text:=Edit1.Text+'7';
OFlag:=false;
EqualBtn.SetFocus;
if(RFlag=false) and (dotFlag=true) then
begin
Edit1.Clear;
Edit1.Text:=Edit1.Text+'7';
RFlag:=true;
end;
end;
procedure TForm1.Btn8Click(Sender: TObject);//Button Number 8
begin
if(Edit1.Text='0') then
begin
Edit1.Clear;
end;
Edit1.Text:=Edit1.Text+'8';
OFlag:=false;
EqualBtn.SetFocus;
if(RFlag=false) and (dotFlag=true) then
begin
Edit1.Clear;
Edit1.Text:=Edit1.Text+'8';
RFlag:=true;
end;
end;
procedure TForm1.Btn9Click(Sender: TObject);//Button Number 9
begin
if(Edit1.Text='0') then
begin
Edit1.Clear;
end;
Edit1.Text:=Edit1.Text+'9';
OFlag:=false;
EqualBtn.SetFocus;
if(RFlag=false) and (dotFlag=true) then
begin
Edit1.Clear;
Edit1.Text:=Edit1.Text+'9';
RFlag:=true;
end;
end;
procedure TForm1.Btn0Click(Sender: TObject);//Button Number 0
begin
if(Edit1.Text='0') then
begin
Edit1.Clear;
end;
Edit1.Text:=Edit1.Text+'0';
OFlag:=false;
EqualBtn.SetFocus;
if(RFlag=false) and (dotFlag=true) then
begin
Edit1.Clear;
Edit1.Text:=Edit1.Text+'0';
RFlag:=true;
end;
end;
procedure TForm1.DotBtnClick(Sender: TObject);//Dot button
begin
if(dotFlag=true) then
begin
if not (Pos('.',edit1.Text)=0) then//숫자에 소수점이 있다면?
begin
Edit1.Clear;
Edit1.Text:=Edit1.Text+'0';
dotFlag:=false;
EqualBtn.SetFocus;
end;
//숫자에 소수점이 없다면?
Edit1.Text:=Edit1.Text+'.';
dotFlag:=false;//소수점이 입력되면 다시 dotFlag를 false하여 소수점이 다시
//찍히지 않도록 함
EqualBtn.SetFocus;
end;
end;
procedure TForm1.Init();//변수 초기화
begin
result:=0;
val1:=0;
val2:=0;
Edit2.Text:='';
totalString:='';
RFlag:=false;
flag:=true;
dotFlag:=true;
end;
procedure TForm1.EqualBtnClick(Sender: TObject);//최종값 출력
begin
case check of
0: Edit1.Text:=FloatToStr(val1+StrToFloat(Edit1.text));//check변수가 0이면 더하기
1: Edit1.Text:=FloatToStr(val1-StrToFloat(Edit1.text));//check변수가 1이면 빼기
2: Edit1.Text:=FloatToStr(val1StrToFloat(Edit1.text));//check변수가 2이면 곱하기
3: if(val1=0) then //0으로 나눌 수 없음
begin
ShowMessage('나눌 수 없습니다');
exit;
end
else
begin
Edit1.Text:=FloatToStr(val1/StrToFloat(Edit1.text));//check변수가 3이면 나누기
end;
end;
Init();
end;
procedure TForm1.OperatorClick();//연산자 버튼 클릭
begin
//숫자를 먼저 클릭하고 연산자 버튼을 눌렀을 때
if(flag=true) then//val1 값이 없다면
begin
val2:=StrToFloat(Edit1.Text);
val1:=val2;//val2값을 val1에 저장함
Edit1.Text:='';
flag:=false;
end
else//val1 값이 있다면
begin
val2:=StrToFloat(Edit1.Text);
Calculate();
val1:=result;
Edit1.Text:='';
end;
end;
procedure TForm1.Calculate();//연산자 체크 후 계산하기
begin
case check of
0: begin
result:=val1+val2;//check가 0이면 더하기
end;
1: begin
result:=val1-val2;//check가 1이면 빼기
end;
2: begin
result:=val1val2;//check가 2이면 곱하기
end;
3: begin
if(val2=0) then//val2이 0이면 못 나눔
begin
exit;
end
else
begin
result:=val1/val2;//check가 3이면 나누기
end;
end;
end;
end;
procedure TForm1.PlusBtnClick(Sender: TObject);//Plus Button클릭
begin
if(OFlag=true) then
begin
Edit1.Text:='+';
EqualBtn.SetFocus;
end
else if(OFlag=false) then
begin
OperatorClick();//연산자 버튼 종류에 따른 계산 프로시져실행
check:=0;//변수값 0은 더하기와 연관되어있음
totalString:=totalString+ConCat(FloatToStr(val2));//오퍼랜드 저장 문자열
saveTotal:=totalString;
if (saveTotal = totalString) then//여기는 테스트 코드입니다.
begin
totalString:=totalString+'+';
Edit2.Text:=totalString;
end
else
begin
Edit2.Text:=totalString;
end;
Edit1.Text:='0';//초기화
dotFlag:=true;
EqualBtn.SetFocus;
end;
end;
procedure TForm1.MinusBtnClick(Sender: TObject);//Minus Button 클릭
begin
if(OFlag=true) then
begin
Edit1.Text:='-';
EqualBtn.SetFocus;
end
else if(OFlag=false) then
begin
OperatorClick();//연산자 버튼 종류에 따른 계산 프로시져실행
check:=1;//변수값 1은 빼기와 연관되어있음
totalString:=totalString+ConCat(FloatToStr(val2)+'-');//오퍼랜드 저장 문자열
Edit2.Text:=totalString;
Edit1.Text:='0';
dotFlag:=true;
EqualBtn.SetFocus;
end;
end;
procedure TForm1.MulBtnClick(Sender: TObject);//Multiply Button 클릭
begin
if(OFlag=true) then
begin
Edit1.Text:='';
EqualBtn.SetFocus;
end
else if(OFlag=false) then
begin
OperatorClick();//연산자 버튼 종류에 따른 계산 프로시져실행
check:=2;//변수값 2은 곱하기와 연관되어있음
totalString:=totalString+ConCat(FloatToStr(val2)+'');//오퍼랜드 저장 문자열
Edit2.Text:=totalString;
Edit1.Text:='0';
dotFlag:=true;
EqualBtn.SetFocus;
end;
end;
procedure TForm1.DivBtnClick(Sender: TObject);//Division Button 클릭
begin
if(OFlag=true) then
begin
Edit1.Text:='';
EqualBtn.SetFocus;
end
else if(OFlag=false) then
begin
OperatorClick();//연산자 버튼 종류에 따른 계산 프로시져실행
check:=3;//변수값 3은 나누기와 연관되어있음
totalString:=totalString+ConCat(FloatToStr(val2)+'/');//오퍼랜드 저장 문자열
Edit2.Text:=totalString;
Edit1.Text:='0';
dotFlag:=true;
EqualBtn.SetFocus;
end;
end;
procedure TForm1.BackSpaceBtnClick(Sender: TObject);//숫자 및 소수점 삭제
begin
delNum:=Edit1.Text;
Delete(delNum,length(delNum),1);
Edit1.Text:=delNum;//delete메소드는 리턴값이 없음
if(length(delnum)=0) then
begin
Edit1.Text:='0';
end
else if (length(delnum)=1) then
begin
dotFlag:=true;
end;
EqualBtn.SetFocus;
end;
procedure TForm1.SubClearBtnClick(Sender: TObject);//부분삭제
begin
Edit1.Text:='0';
dotFlag:=true;
EqualBtn.SetFocus;
end;
procedure TForm1.ClearBtnClick(Sender: TObject);//모두지우기
begin
Edit1.text:='0';
Init();
EqualBtn.SetFocus;
end;
//-------------------키보드 제어----------------------//
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case Key of
VK_NUMPAD0: Btn0Click(Sender); // 숫자 0을 눌렀을 경우
VK_NUMPAD1: Btn1Click(Sender); // 숫자 1을 눌렀을 경우
VK_NUMPAD2: Btn2Click(Sender);
VK_NUMPAD3: Btn3Click(Sender);
VK_NUMPAD4: Btn4Click(Sender);
VK_NUMPAD5: Btn5Click(Sender);
VK_NUMPAD6: Btn6Click(Sender);
VK_NUMPAD7: Btn7Click(Sender);
VK_NUMPAD8: Btn8Click(Sender);
VK_NUMPAD9: Btn9Click(Sender); // 숫자 9를 눌렀을 경우
VK_DECIMAL: DotBtnClick(Sender); //dot
VK_ADD: PlusBtnClick(Sender); //더하기
VK_RETURN: EqualBtnClick(Sender); // 엔터키 (버튼13을 ActiveControl 해야함)
VK_DELETE: ClearBtnClick(Sender); // Delete키 모두 지우기
VK_SUBTRACT: MinusBtnClick(Sender); //빼기
VK_MULTIPLY: MulBtnClick(Sender);//곱하기
VK_DIVIDE: DivBtnClick(Sender);//나누기
VK_BACK: BackSpaceBtnClick(Sender);//문자지우기
else
end;
end;
end.
혹시 고칠점이나 궁금한 점 있으면 댓글 달아주시면 감사하겠습니다.
