|
꼴님 안녕하세요..^^
불행중 다행으로 꼴님이 알려주신 방법으로 구현이 됐습니다.
오늘도 하루종일 이것 땜시 몸살을 좀 알았죠........^^
알려주신 방법에는 문제가 없었고 단순 로직상에 문제가 있었습니다.(제 실수죠^^)
아직 많이 모르다 보니 알골구현에 있어서 여러가지 방법을 생각치 못했답니다.
말씀 하신 checkbox나 keydown이벤트 같은 방법은 나중에 차차 공부하기로 하겠습니다.(시간이 없어서리^^)
좋은 하루 되시구요...
나중 질문 하믄 또 자상한 답변 부탁드립니다.아마 조만간에 또 질문을 해야 할듯...^^
꼴 님이 쓰신 글 :
: 저는 아직도 님이 하려고 하시는 기능이 정확히 무엇인지 이해가 되지 않고 있습니다.
: 그래서 지난번에도 가능한 방법만 알려드린거구요.
: 아래 내용 보니 제가 말씀드린 방법은 어느정도 이해 하신거 같은데요.
:
: 일단 아래 소스에서 문제점을 생각해보면
: 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 이벤트의 차이점에 대해서도
: : : : : 설명좀 해주십시요.
: : : : :
: : : : : 그럼 다리겠습니다.^^
: : : : : 즐거운 하루되세요
|