한글 조합중일 때 OnExit에서 Text가 잘리는 문제

먼저 이 문제의 증상에 대해 간략히 설명하자면…
델파이 2009 및 2010 버전에서, 빈 폼에 에디트 하나를 놓고, OnExit 이벤트 핸들러를 만들어 그 에디트의 Text를 ShowMessage()로 뿌리게 만들었을 때, 한글이 조합중인 상태에서 다른 윈도우 컨트롤(예를 들면 버튼 등)을 클릭하여 포커스를 옮기면, ShowMessage() 다이얼로그에 에디트의 Text에서 조합중이던 마지막 글자가 나타나지 않는 문제입니다.

한마디로 조합중이던 마지막 한글 한글자가 잘려버리는 거죠. (TEdit 뿐만 아니라 TComboBox에서도 유사한 문제가 발생하는데, TComboBox에서는 증상이 완전히 동일하지는 않고 약간 다르게 나타납니다)
사용자 삽입 이미지
이 버그를 잡기 위해서 VCL을 샅샅이 뒤졌는데…
결론부터 말하자면, 델파이의 버그가 아니라 윈도우 IME의 버그입니다.

이 버그가 나타나는 이유를 간략히 설명하면, 조합중인 마지막 글자가 입력되는 WM_CHAR 메시지(OnKeyPress 이벤트)보다, WM_KILLFOCUS(OnExit 이벤트)가 먼저 발생했기 때문입니다. 조합중인 마지막 글자의 입력 이벤트보다 엑시트 이벤트가 먼저 발생했으니 OnExit 시점에는 당연히 마지막 글자가 나타나지 않습니다.

그리고 이 메시지들은 델파이에서 자체적으로 발생시킨 메시지가 아니라, Win32의 Edit 컨트롤과 IME의 기본 동작으로 날아오는 메시지입니다. 다시 말해 델파이와는 아무 관계도 없이 윈도우의 기본 동작으로서 날아오는 메시지들인데, 이 메시지들이 날아오는 순서가 뒤집어져 있습니다. 두말할 필요도 없이 윈도우의 자체 버그입니다.

글자가 조합되지 않는 영숫자 입력의 경우, 키를 타이핑하는 즉시 해당 글자에 대한 WM_CHAR 메시지가 발생하는데, 여러 자소가 조합되어 글자를 이루는 한글의 경우 여러번의 타이핑 결과 최종적으로 글자에 대한 WM_CHAR 메시지가 발생합니다.

어쨌든.. 이 문제가 발생하는 컴포넌트는 TEdit와 TComboBox 두가지입니다. 여러가지로 연구해본 결과, 이 두 컴포넌트에 대해 한글 입력에서 이와 같은 문제가 발생하지 않도록 하는 유닛을 만들었습니다.

ImpImePatch.pas

위의 ImpImePatch.pas 파일을 다운받아 적당한 위치에 놓고, 문제가 되는 유닛의 상단의 uses 절에 추가해주면 됩니다. 그러면 한글 입력시에 문제가 발생하지 않습니다. 원래 삼성창원병원에서 델파이 2009에서 발생한 문제로 도움을 요청해서 만들었던 것인데, 추가로 유사한 문제와 부작용 효과가 발생하여 여러번 다시 수정하여 지금은 잘 사용하고 있는 버전입니다.

물론 이들 컴포넌트로부터 상속받는 컴포넌트에서도 발생할 것이지만 일일이 상속받은 컴포넌트들에 대해서는 처리할 수 없고, 사용하시는 분이 소스를 참고해서 직접 클래스를 추가해주시면 됩니다.

그런데.. 재미있게도 XE 버전에서는 이 에러가 발생하지 않습니다. 시간이 없어서 XE의 VCL에서 어떤 식으로 패치했는지 확인해보지 못했습니다. 아마도 제가 했던 삽질에 가까운 방식보다는 좀 세련되게 처리했을 것 같은데… 어쨌든 2009, 2010 두 버전에서만 발생하는 문제입니다.

15 comments for “한글 조합중일 때 OnExit에서 Text가 잘리는 문제

  1. 같은 문제로 고생하고있는 중생입니다.
    인터넷에서 검색하다가 단비를 만난것 같아 급히
    말씀하신대로 Unit 을 다운받아 프로젝트에 Add 하고 uses 절에 ImpImePatch 를 추가한 후 빌드하고 테스트 해보았습니다만 변함이 없네요. ㅠㅠ
    무엇을 잘못하고 있는 걸까요?

    정말 중생을 구하는셈 치고 도와주세요. 부탁드립니다.
    답글 미리 감사드립니다.

    • 안녕하세요 나그네님,
      문제가 생기는 코드를 간단한 샘플 수준으로 프로젝트를 만들어서 제게 메일로 보내주시면 시간 나는 대로 검토해보겠습니다. 메일 주소 Jeehoon.Imp.Park골뱅gmail.com 입니다.

  2. 참고로 Win7 에서 Delphi 2010으로 개발하고 있습니다.
    TEdit에서는 잘리는 현상 TComboBox에서는 맨 뒤글자가 맨앞으로 이동하는 현상입니다.

  3. 위와 같은 문제가 발생하여 볼랜드포럼에서 글을 보고 찾아왔습니다.

    그런데 패치파일 다운로드가 안보이네요 ㅠㅠ

    edit72 골뱅 naver.com으로 부탁드려도 될까요?

  4. 안녕하십니까 한글잘림 현상이

    delphi7에서 발생하여 찾던중 선생님의 내용을 보았습니다.

    다운로드 파일이 보이지않아 바쁘시겠지만 메일로 파일좀 주시면 안될까요 !?

    부탁드리겠습니다. 꾸벅

  5. 안녕하세요 ,

    위와 같은 문제가 발생하여 볼랜드포럼에서 글을 보고 찾아왔습니다.

    다운로드 파일이 보이지 않아 글을 남깁니다.

    ekthf0528@nate.com 로 보내주시면 감사하겠습니다. 부탁드립니다^^

  6. 안녕하세요

    위와 같은 상황이 발생되어서 검색하여 찾아왔습니다

    다운로드 버튼이 보이지 않아 ju840709@naver.com으로 보내주시면 감사하겠습니다.

  7. 첨부파일로 ImpImePatch.pas이 있는데 파일 요청 메일이 계속 와서 무슨 일인가 했는데.. 이제 보니 첨부파일이 없어져 버렸었네요. 지난해던가 블로그 이전하는 과정에서 컨버팅 오류로 날아갔던 모양입니다. 최근에 제가 너무 바빠져서 확인을 미처 못했습니다.

    방금 ImpImePatch.pas 파일을 본문에 첨부해두었습니다. 애태우셨을 분들께 죄송합니다.

    참고로, 이 파일은 특정 버전의 특정 증상에서만 문제가 해결될 수도 있습니다. 위 본문을 쓴 직후에 일부 케이스에서는 해결이 안되더라는 말도 들었거든요. 혹시 문제 해결이 안되었을 경우, 버전과 증상, 상황 등을 메일로 가급적 구체적으로 써서 제게 알려주시면 다시 살펴보도록 하겠습니다. 제 메일주소는 Jeehoon.Imp.Park 골 gmail.com 입니다.

    • 정말 감사합니다 !! 덕분에 일주일 머리 싸매던 문제를 해결했습니다 !!

  8. 너무 너무 감사~

    참고삼아 제 경우는 윈도우7은 괜찮았고, 윈도우8 콤보박스에서만(TEdit는 괜찮았음) 한글조합중 포커스를 이동하면 “가나” -> “나가” 로 변경되어 황당했었습니다.
    포커스 이동을 마우스로 할 경우만 변경되었고 탭키로 이동하면 괜찮았습니다.

    개발환경은 Win7 32비트 Delphi 2007 입니다.

    MS의 ime는 여러가지로 실패한 기술같네요.
    윈도우7까지는 MS-오피스 설치시 설치되는 한글 IME입력기로 때문에 한/영 모드가 자동으로 영문으로 바뀌는 버그로 고생했었습니다. 결국 사용자의 PC설정에서 오피스 입력기를 제거하고 기본 “Microsoft 입력기” 를 사용하여 해결했는데…
    윈도우8에서는 다행히 OS차원에서 IME를 관리하여 그나마 다행이라고 여기고 있었는데…

    이런 문제가 또 있으니 어서 빨리 XE5, XE6 최신 버전으로 가야겠네요…
    문제는 2007까지는 Ainsi 코드라 유니코드 소스로 바꾸기가 엄두가 나질 않네요…
    언젠가는 바꾸어야 할텐데…

    임프님 감사합니다.

    너무 감사합니다.
    여러번 도움을 받습니다.

  9. 안녕하세요 임프님 들어올때마다 너무 많은걸 배우고 있습니다!!!!

    다름이 아니라, 델파이 7으로 컴파일한 프로그램에서 해당 에러가 발생되서

    올려주신 pas를 add하고 컴파일 하게 되면, Cannot override a static method 란 에러가 자꾸 뜹니다…ㅜㅜ

    해결방법을 알려주신다면 정말 감사드리겠습니다!!!!

    ddochi0406@naver.com

답글 남기기

이메일 주소는 공개되지 않습니다.