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

왜 그러한 것을 필요로 하는지 모르겠군요. 말씀하신대로, 한영전환을 위해 시프트+

스페이스 키의 처리를 OnKeyDown에서 할 수도 있긴 합니다만. 권장할 만한 방법이

못됩니다. 실제로 리치에디트에 글자가 들어가게 되는 역할은 OnKeyDown 이 아니라

OnKeyPress에서 처리하게 되는 것입니다. 그래서 OnKeyDown 에서 아무리

Key = 0; 이렇게 처리해도 소용이 없습니다.그 이후에 OnKeyPress가 발생해

버리니까요. 그렇다고, OnKeyPress에서는 시프트키의 상태를 직접 알아낼 방법이

애매하고... (GetKeyStatus() 였던가 함수를 쓰면 되긴 합니다만)

그래서, 꼭 그렇게 하고 싶으시다면, 다음과 같은 방법을 쓸 수 있겠네요.

먼저 클래스 내에 bool 형으로 플래그로 써먹을 변수 하나를 만들어봅시다.

bool KeyFlag;

물론 이건 초기화를... false로 합니다. 그건 폼 클래스의 생성자에서 하면 되겠죠.

그런후에, OnKeyDown 이벤트의 핸들러를...

void __fastcall TForm1::RichEdit1KeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
    if(Shift.Contains(ssShift) && Key == VK_SPACE)
    {
        KeyFlag = true;
        TogleHanMode();
    }
}

그리고 OnKeyPress의 핸들러...

void __fastcall TForm1::RichEdit1KeyPress(TObject *Sender, char &Key)
{
    if(KeyFlag == true)
    {
        Key = 0;
        KeyFlag = false;
    }
}

이런 식으로 하면 리치에디트에 스페이스 문자는 넘어가지 않죠. 하지만 역시,

별로 좋은 방법이 못됩니다. (왜 자꾸 OnKeyDown에서 처리하려고 하시는지?)


두번째 질문... 그런 방법은 없겠죠. 억지를 쓰자면, TApplication의 OnMessage

핸들러에서 OnKeyDown 핸들러를 무조건 호출해버리면 되겠지만. 그러면 의미가 없죠?


세번째 질문...

TApplication의 이벤트들은 오브젝트 인스펙터에 나타나지 않습니다.

여기다가 이벤트 핸들러를 연결해주려면, 직접 작성한 코드를 생성자 등에서

연결해주어야 합니다. 헬프에서 OnMessage 를 찾아보면 예제도 잘 나와있습니다.

참고하시기 바랍니다.

그럼 이만...




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

(cbuilder, cbuilder@thrunet.com)


+ -

관련 글 리스트
1397 [질문] 임펠리테리님 빠른 답변을 부탁.../프포 jsk365 3294 1999/06/01
1398     [답변] JSK365/ 임펠리테리님 빠른 답변을 부탁.../프포 박지훈.임프 3319 1999/06/01
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.