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

C++빌더 Q&A
C++Builder Programming Q&A
[12376] Re:Re:Re:콜님 다시 한번 부탁드립니다. Re:UpDown컴포넌트를 눌렀을때 hex값으로 증가시키게 할수 있나요?
[] 808 읽음    2001-11-06 13:48
저는 아직도 님이 하려고 하시는 기능이 정확히 무엇인지 이해가 되지 않고 있습니다.
그래서 지난번에도 가능한 방법만 알려드린거구요.
아래 내용 보니 제가 말씀드린 방법은 어느정도 이해 하신거 같은데요.

일단 아래 소스에서 문제점을 생각해보면
UpDown콤포넌트는 클릭하면 자동으로 Position값을 증가또는 감소시킵니다.
따라서 아래 소스처럼 클릭이벤트에서 Position값을 바꾸는것은 자동으로 바뀌는 루틴과 충돌이 있기때문에
우연히 원하는 결과가 나올 수 는 있지만 잠재적인 버그 요소로 생각할 수 있습니다.
UpDown의 클릭이벤트 말고 다른 콤포넌트의 이벤트를 사용하세요.
예를 들어 10진수,16진수의 선택을 체크박스 콤포넌트에서 한다면 그 체크박스의 Click이벤트를
사용하면 되겠죠.

그리고 한가지
저는 디비 사용할때 Table를 잘 안쓰기 아래 디비문제는 정확히 모르겠구요.
사실은 문제가 없을거 같은데 문제가 있다니 쫌 이상하긴 합니다.
다만..
디비 처리 같은 작업을 OnChange이벤트에서 한다는것에는 조금 구조상 문제가 있다고 봅니다.
Edit콤포넌트의 OnChange이벤트는 글짜 하나만 바뀌어도 계속 호출되는 이벤트인데
완전히 완성되지는 않은 입력도 이 이벤트 처리로 넘어가 버려 문제가 생길 수 있죠.
차라리 Edit의 KeyDown이벤트에서  엔터키 누르면 디비에 저장하는 방식으로 처리하는게
맞다고 봅니다.





heartsim 님이 쓰신 글 :
: 안녕하세요 꼴님. 이제 정말로 마지막입니다.^^
: 답변에 주신 내용 이해를 한 것 같습니다.
:
: 그러니간 Edit5에 있는 28(원래는 10진수임)이란 숫자를 16진수로 생각하고 10진수로 만들어서
: Position에 저장하라는 거죠?(맞는 것 같은데^^)
: 요로케요.......UpDown1->Position=AnsiString("0x"+Edit5->Text).ToInt();
:
: 그리고 UpDown컴포넌트를 눌러서 증가를 시킨다음에 원하는 값이 되면
: 그걸 Edit5에 표시할때는 16진수로 바꾸어서 표시하구요...(이것도 맞는 것 같은데^^)
:   Edit5->Text=IntToHex(UpDown1->Position,4);
:   Table1->FieldByName("50")->AsString="&H"+Edit5->Text;
:
: 근데 실행은 되는데 , 그냥 10진수 모드에서는 증가가 되지 않고
: 또 16진수 모드에서는 데이터베이스(GBgrid의 어느 한 필드 선택 클릭)하면 다음과 같은 에러가 납니다.
:
: Project ss1ver1_p.exe raised exception class EDatabaseError with message 'Table1:
: Dataset not in edit or insert mode'.Process stopped. Use Step or Run to continue.
:
: 컴파일과 실행이 되는것을 봐서는 어느정도 로직은 맞는 것 같은데,
: 마지막에서 에러가 나네요.
: 마지막이라 생각하고 바쁘신와중에 여유가 되시면 도움 부탁드립니다.
: 좋은 하루 되세요..(3일째 이것 때문에 다음과정이 진행이 안됨^^)
:
:
:
:
:
:
: void __fastcall TForm1::Edit5Change(TObject *Sender)
: {
:          Table1->Edit();   //데이터 수정 초기화 설정
:
:          if(strchr(Table1->FieldByName("50")->AsString.c_str(),'&'))
:          {
:                      Edit5->Text=IntToHex(UpDown1->Position,4);
:                      Table1->FieldByName("50")->AsString="&H"+Edit5->Text;
:          }
:          else
:          Table1->FieldByName("50")->AsString=Edit5->Text;
:
:          Table1->Post(); //데이터 수정 초기화 해제
: }
: //---------------------------------------------------------------------------
:
: void __fastcall TForm1::UpDown1Click(TObject *Sender, TUDBtnType Button)
: {
:            UpDown1->Position=AnsiString("0x"+Edit5->Text).ToInt();
: }
: //---------------------------------------------------------------------------
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
: 꼴 님이 쓰신 글 :
: : 이런 문제는 기준을 잘 잡아야 합니다.
: : 왜 이런 기능이 필요한지는 잘 모르겠지만..
: : 지금 님께서 원하시는 기능은 기능 자체에 일관성이 없어보입니다.
: :
: : 28일때 옵션2로 해서 29,2A,2B로 증가하는건 말이 되지만..
: : 거꾸로 2C일때 옵션을 1로 바꾸면 어떻게 되는거죠.?
: : 이 부분이 정의되지 않았으니 구현도 알쏭달쏭할 수 밖에요.
: :
: : 자 그럼.. 위문제부터 풀면..
: : 기준을 UpDown콤포의 Position이라고 하면 됩니다. 물론 십진수면 되죠.
: : Position은 UpDown콤포에서 내부 숫자를 저장하기 위해 사용합니다.
: : Edit와 연결되면 이 Position값이 십진수로 변환되서 보여지는거구요.
: :
: : 그러니까 Edit콤포하고는 연결하지 말고 옵션에 따라서 보여주는 숫자 형태를
: : 10진수 또는 16진수로 하면 되겠죠.
: :
: : 여기서 문제는 28이란 숫자를 16진수로 봤을때 이것을 다시 10진수로 바꿔서
: : Position에 저장해야 보여지는 숫자가 제대로 나오겠죠.?
: :
: : 그래서 옵션이 16진수로 바뀐다면..
: : UpDown1->Position = AnsiString("0x"+Edit1->Text).ToInt();
: : 이렇게 다시 16진수 값으로 바꿔주고
: : Edit콤포에 표시할때도 16진수로 표시하면..
: : 십진수 28이 16진수 28로 표시가 되겠죠.
: :
: : 이해가 되셨나여??
: :
: : 그럼... 좋은 프로그램 만드시길.. ^^
: :
: : PS.
: : 제 아이디는 '콜'이 아니라 '꼴'이라고 불러주세요.
: :
: :
: :
: :
: : heartsim 님이 쓰신 글 :
: : : 답변 주신내용에 대해 정말 감사드립니다.
: : :
: : : 근데 문제가 있는데요.
: : : 처음부터 값을 증가시키는 것은 이해를 했습니다.그런데 ....
: : :
: : : Edit5->Text에는 숫자 값이 이미 들어가 있습니다.
: : : 이 상태에서 UpDown컴포넌트를 누르면 1씩 증가가 되지요.
: : : 근데 어떤 옵션에서는 UpDown 컴포넌트를 누르면 hex값으로 증가를 시켜야 되거든요.
: : : 가령 Edit5->Text에 28이란 숫자가 들어가 있으면 이것을 hex값으로 증가시켜야 됩니다.
: : : 옵션 1의 경우는 그냥 28, 29, 30, 31..........
: : : 옵션 2의 경우는         28, 29, 2A, 2B, 2C,.....
: : : ^^넘 질문이 많아서 죄송하네요.
: : : 아참 한가지 더 있는데, UpDown컴포넌트에서 Position의 의미가 뭔지 알려주시면 감사.
: : : 아직 초보라 많이 모릅니다. 이해해 주십시요.^^
: : : 좋은 하루 되세요.
: : :
: : :
: : :
: : :
: : :
: : :
: : :
: : :
: : :
: : : 생각을 좀 바꿔 봅시다.
: : : 이미 자동으로 증가 잘되는 UpDown콤포넌트는 그냥 나두고
: : : 보여주는 숫자만 16진수로 보여주면 되겠죠
: : :
: : : 자~ 해볼까요.
: : : Edit콤포넌트 두개 떨어뜨리고
: : : Edit1 Change이벤트랑
: : : UpDown1 Click이벤트에 아래 처럼 코딩하세요.
: : : 주의할건 UpDown1의 Associate 프로퍼티는 그냥 비워두셔야 함다.
: : :
: : :
: : : void __fastcall TF_Child1::Edit1Change(TObject *Sender)
: : : {
: : :       Edit1->Text = AnsiString::IntToHex(UpDown1->Position, 4);
: : : }
: : : //---------------------------------------------------------------------------
: : : void __fastcall TF_Child1::UpDown1Click(TObject *Sender, TUDBtnType Button)
: : : {
: : :      Edit1->Text = UpDown1->Position;
: : :      Edit2->Text = UpDown1->Position;
: : :
: : : }
: : :
: : : 박경원 님이 쓰신 글 :
: : : : 안녕하세요.
: : : : 질문이 있답니다.
: : : : 잘 안되서요..^^
: : : :
: : : : UpDown컴포넌트를 TEdit컴포넌트와 결합시키는 것까지는 성공을 했고,
: : : : 또 윗쪽 화살표버튼을 눌렀을 때는 1씩 증가하고 아랫쪽 화살표 버튼을
: : : : 누르면 1씩 자동 감소하더라구요.(하나도 코딩작업없이 컴포넌트가 알아서 다 지원해주더군요)
: : : :
: : : : 근데 문제는 일반숫자증가가 아니라 hex값으로 증가를 시켜야 되거든요.
: : : : 가령 Edit컴포넌트에 24라는 숫자가 있을때 UpDown컴포넌트를 증가하는 방향으로 눌렀을때
: : : : 25, 26, 27, 28, 29, 2A, 2B, 2C, 2D, 2E, 30........
: : : : 이런 식으로 해야하는데 잘 안돼네요.............
: : : : 도움좀 주세요.
: : : : 제 생각에는 UpDown컴포넌트의 이벤트를 이용해서 해야 할 듯 한데요...^^
: : : : UpDown컴포넌트 이벤트 중에 OnChange이벤트와 OnMouseUp, OnMouseDown 이벤트의 차이점에 대해서도
: : : : 설명좀 해주십시요.
: : : :
: : : : 그럼 기다리겠습니다.^^
: : : : 즐거운 하루되세요

+ -

관련 글 리스트
12372 Re:Re:콜님 다시 한번 부탁드립니다. Re:UpDown컴포넌트를 눌렀을때 hex값으로 증가시키게 할수 있나요?(급 heartsim 818 2001/11/06
12376     Re:Re:Re:콜님 다시 한번 부탁드립니다. Re:UpDown컴포넌트를 눌렀을때 hex값으로 증가시키게 할수 있나요? 808 2001/11/06
12381         Re:Re:Re:Re:콜님 다시 한번 부탁드립니다. Re:UpDown컴포넌트를 눌렀을때 hex값으로 증가시키게 할수 있나 heartsim 829 2001/11/06
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.