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
[1498] [답변] JSK365/ 빠른 답변 좀 부탁드립니다./프포
박지훈.임프 [cbuilder] 3834 읽음    1999-06-26 02:52
안녕하세요. 천리안 프로그래머포럼 C++Builder 담당 임펠리테리입니다.

이틀동안 회사에서 밤샘을 하고 돌아온 직후라.. 답변은 다음에.. 출장 다녀와서

올리려고 했었는데요.. 더욱이 설명을 드려야 할 만한 부분도 적지 않고.. 쩝..


오래전에, JSK365님이 처음으로 이 문제를 질문하셨을때 언급한 적이 있습니다.

vcl의 TComboBox(더 엄밀히 말해 TCustomComboBox)에서는, CBN_DROPDOWN 메시지는

처리하면서 그 반대의 경우인 CBN_CLOSEUP, 즉 콤보박스의 리스트박스가 사라지는

순간의 메시지는 처리하지 않았기 때문이라고 언급했었습니다. (기억나시는지? ^^)

사실 이 두개의 메시지는 그 패어런트 컨트롤로 전달되는 것이므로.. 항상 적용되지

는 않겠지만, 만약 콤보박스의 직접적인 패어런트가 폼이라면 생각보다는 간단히

구현할 수 있습니다. 하지만, 기본적인 메시지맵은 작성해야만 합니다.

(메시지맵에 대해서 궁금하시면 기존의 답변들을 참고하시기 바랍니다. 여러번

설명했으니까요.)

방법은 알려드리겠습니다만, 코드를 잘 이해하지 못하시더라도, 지금 제가 무쟈게

피곤한 관계로 자세한 설명은 다음 기회로 미루도록 하겠습니다.


우선.. 다음과 같은 메시지처리 함수를 폼 유닛에 추가합니다.

void __fastcall TForm1::WMCommand(TWMCommand &Message)
{
    if(Message.NotifyCode == CBN_CLOSEUP)
        RichEdit1->SetFocus();
    else
        TForm::Dispatch(&Message);
}

그리고, 폼 유닛의 헤더를 열어서 폼 클래스내에 위 함수의 선언을 추가합니다.

위치는 어떤 섹션이든 별 관계없습니다. 퍼블릭이든 프라이빗이든 프로텍티드든..

public:  // User declarations
    void __fastcall WMCommand(TWMCommand &Message);

마지막으로 메시지가 들어왔을때 위 함수가 호출되도록 메시지맵을 작성합니다.

이것도 사실 어디에 하든 별 관계가 없습니다만, 폼클래스의 맨 마지막, 그러니까

} 괄호를 닫기 직전에 추가하는게 무난합니다.

BEGIN_MESSAGE_MAP
    VCL_MESSAGE_HANDLER(WM_COMMAND, TWMCommand, WMCommand);
END_MESSAGE_MAP(TForm);

여기까집니다.

실행해보시면 잘 될겁니다. 이렇게 하면, 콤보박스의 리스트박스가 어떤 방법으로

닫히든지에 관계없이(아이템을 선택해서 닫히든 아래쪽 삼각형 버튼을 눌러서

닫든 ESC키를 눌러서 닫든) 닫히기만 하면 무조건 리치에디트로 포커스가 갑니다.


그런데.. 죄송하지만 이것은 완벽한 코드가 아닙니다. 몇가지 문제점이 있는데요.

첫번째는, 아까도 말했듯이, 콤보박스의 직접적인 패어런트가 반드시 폼이어야만

합니다. 반드시 아니어야만 하는 경우라면.. 코딩은 위처럼 단순한 형태로는

되지 않을겁니다.

두번째 문제. 만약 같은 폼을 직접적인 패어런트로 하는 콤보박스가 두개 이상이라면

위와 같은 코드는 절대로 그 몇개의 콤보박스를 구별하지 못합니다. 뭐, 굳이 구별할

필요가 없다면 괜찮겠지만요. 콤보박스들을 구별하는 루틴은 직접 추가해보세요.

WMCommand() 함수내에서 검사할 수 있습니다. 그리 어렵지 않을겁니다.

예제 코딩을 하면서.. 한가지 문제가 더 있을거란걸 예상했었는데, 너무 피곤해서인지

잊어버렸습니다. ^^;;;;


그럼 도움되시길...





임펠리테리 박지훈이었습니다.

(cbuilder, cbuilder@thrunet.com)





+ -

관련 글 리스트
1491 [질문] 빠른 답변 좀 부탁드립니다./프포 jsk365 3502 1999/06/25
1502     [답변] JSK365/ 빠른 답변 좀 부탁드립니다./프포 박지훈.임프 3718 1999/06/28
1498     [답변] JSK365/ 빠른 답변 좀 부탁드립니다./프포 박지훈.임프 3834 1999/06/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.