델파이 계산기 프로그램

in #delphi8 years ago

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(val1
StrToFloat(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.
혹시 고칠점이나 궁금한 점 있으면 댓글 달아주시면 감사하겠습니다.