C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[965] [퀴즈] 계산기 만들기..
장성호 [nasilso] 10424 읽음    2010-03-12 15:08
종종 Q&A 게시판에 계산기 만드는 질문이 올라오네요

다음과 같은 계산기 화면이 있습니다.



Edit에 숫자입력을 코드를 다음과 같이 작성했습니다.

void __fastcall TForm2::BNum1Click(TObject *Sender)
{
   Edit1->Text+="1";
}
//---------------------------------------------------------------------------
void __fastcall TForm2::BNum2Click(TObject *Sender)
{
   Edit1->Text+="2";
}
//---------------------------------------------------------------------------
...
...
...
void __fastcall TForm2::BNum9Click(TObject *Sender)
{
   Edit1->Text+="9";
}
//---------------------------------------------------------------------------
void __fastcall TForm2::BNum0Click(TObject *Sender)
{
   Edit1->Text+="0";
}
//---------------------------------------------------------------------------
void __fastcall TForm2::BNum00Click(TObject *Sender)
{
    Edit1->Text+="00";
}
//---------------------------------------------------------------------------
void __fastcall TForm2::BClearClick(TObject *Sender)
{
   Edit1->Text="";
}
//---------------------------------------------------------------------------



버튼마다 숫자 입력코드가 있어서 코드가 길어졌는데..

[문제]
어떻게 하면 좀더 심플하게 짤수 없을까요?

많은 성원 부탁드립니다.

[추신]
코드와 화면을 약간 수정했습니다.
"00" 두개짜리 버튼을 추가했어요

..
김시환 [godson2]   2010-03-12 15:37 X
비주얼 베이직의 컴포넌트 배열 이라는 기능이 있는데 빌더에서도 컴포넌트의 Tag 속성을 이용하여 동일한 기능을 구현할 수 있습니다.

일단 여기서는 정수 표현만 하겠습니다.

1. 각각의 숫자 버튼마다 Tag 속성값을 숫자버튼에 해당하는 값으로 설정을 합니다.
2. Edit1 박스에 표현할 숫자값을 표현할 전역변수를 하나 만듭니다. int g_Number = 0 ;
3. 그리고 이벤트 함수를 하나 만듭니다.

void __fastcall TForm2::NumberButtonClick(TObject *Sender)
{
    TButton* pButton = dynamic_cast<TButton *>(Sender) ;

    g_Number = (Number * 10) + pButton->Tag ;

    Edit1->Text = g_Number ;
}

4. 만들어진 이벤트 함수를 각각의 버튼의 Click 이벤트에 등록을 시킵니다.
김시환 [godson2]   2010-03-12 15:39 X
Float 형식은 위의 이벤트 함수를 조금 수정하면 되겠지요...
김시환 [godson2]   2010-03-12 15:45 X
퀴즈만 내시지 마시고 상품도 주심 안될까요?
장성호 [nasilso]   2010-03-12 15:45 X
Tag값을 이용했네요
Design타임에 실수로 라도 절대 Tag값이 변경되는 일이 없어야 겠네요

저는 가끔 버튼의 이벤트를 만들었다가 이벤트를 빼뒀는데 .. 어쩌다가 디자인실수로 이벤트가 연결되어버린경우도 있구..
Tag값이나 Control의 위치 등도 옮겨지는 경우 등이 왕왕있더라구요

g_Number가  int 인가요? int64 인가요? 
int64 범위를 벗어나게 되면 어떻게 되죠?  그건 뭐 나중에 또 생각해 봐야할 문제이구..

여튼 상당히 simple해졌네요
장성호 [nasilso]   2010-03-12 15:48 X
ㅋㅋ
안그래도 누가 상품 달라는 사람이 있네요~!

상품에 뭐가 좋을까 고민입니다.
우리사무실 오시면 언제든지 맛있는것 사드릴수 있지만 .. 그건 발품 팔아야 하니 .. 좋아하시 않으실테구..

-------------------------------------

여기에 지금까지 올린 퀴즈들은
거의 대부분 퀴즈라기 보다는 퀴즈형식을 이용한 팁/강좌입니다.

퀴즈 형식을 빌려서 vcl 원리/팁을 알려주는데 목적이 있었습니다.

장성호 [nasilso]   2010-03-12 16:14 X
"00" 버튼이 있는 화면으로 화면을 수정해습니다.
김시환 [godson2]   2010-03-12 16:32 X
void __fastcall TForm2::NumberButtonClick(TObject *Sender)
{
    TButton* pButton = dynamic_cast<TButton *>(Sender) ;

    Edit1->Text = Edit1->Text + pButton->Caption ;
}

이렇게 하면 Tag 속성을 이용할 필요가 없을듯 하네요...
장성호 [nasilso]   2010-03-12 16:40 X
이문제는
저도  정답 없이 낸 문제입니다.

그런데 godson님  "0" 이나 "00" 버튼을 맨먼저 클릭하고
그후에 "1" 이상되는 버튼을 클릭하는 경우는 어떻게 해야하죠?
김시환 [godson2]   2010-03-12 16:47 X
그런 문제 때문에 처음에 Tag 와 전역변수를 이용하여 수학적인 연산을 사용한 것이었는데요...
결국 00 버튼의 경우에 대한 조건을 포함 시킬 수 밖에 없을 것입니다.
아울러 소숫점 표현에 대한 문제도 조건을 만들어 넣어야 겠지요..

이 문제는 다른 문제점 보다는 컴포넌트 배열에 대한 이해와 사용방법을 익히는 문제로 국한시키는 편이 좋을듯 한데요..ㅋㅋ
장성호 [nasilso]   2010-03-12 16:51 X
네...

제가 작성한 코드처럼
"저렇게 삽질코드는 하지마라" 하는 의미에서 올린 문제입니다.

Godson님 답변정도면 충분할듯...

그럼..

+ -

관련 글 리스트
965 [퀴즈] 계산기 만들기.. 장성호 10424 2010/03/12
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.