2007 이하 버전에서 TEdit의 MaxLength 한글 문제

아시다시피 Delphi/C++Builder 2009 버전은 유니코드가 전면 적용된 버전이죠. 따라서 2009 버전에서 TEdit의 MaxLength 값을 10이라고 지정한다면 영숫자 뿐만 아니라 한글도 10자까지 들어갈 수 있다는 것을 의미합니다.

반면, Delphi/C++Builder의 2007 버전은 유니코드가 적용되지 않은, 즉 Ansi 코드 버전입니다. 따라서 MaxLength에서 설정한 값이 10이라면, 한글만 입력했을 경우 5자만 들어가는 것이 정상입니다.

그런데, 최근 델파이를 사용하는 주요 업체들 중 한군데에서 기술지원을 요청한 케이스에서, Delphi 2007에서 TEdit의 MaxLength가 마치 유니코드 버전인 것처럼 동작한다는 레포트가 있었습니다. 다시 말해, MaxLength를 10으로 설정했는데 한글도 10글자까지 들어가더라는 것입니다.

아시다시피 이것은 데이터베이스의 파라미터로 사용할 필드라든지 한 경우 꽤 심각한 문제가 됩니다. 물론 키 이벤트 핸들러 등에서 일일이 체크해서 입력을 제한하면 되지만, 업무 개발 프로젝트인 경우 화면 갯수만 수천개씩 되는 경우도 흔한데 그 안의 모든 Edit마다 다 이벤트 핸들러를 달아준다는 것도 거의 불가능한 일이고, 그 기능을 담아서 새 컴포넌트를 만든다고 해도 기존 프로젝트에서 폼을 불러온 경우 일일이 수정하는 것도 어렵습니다. 그 외에도 일을 더 쉽게 해줄만한 약간의 트릭이 있기는 하지만 그 모두가 완벽한 솔루션은 아닙니다.

여러가지로 비교 테스트를 해본 결과, 델파이/C++빌더 2006까지 버전에서는 이런 현상이 발견되지 않았고, 또 델파이/C++빌더 2009 버전은 유니코드화로 인해 당연한 현상이니까 문제가 안되구요.

왜 이런 일이 발생했을까요. 짬짬이 1주일 이상이나 뒤져봤는데 답을 찾기가 어려웠습니다. 이런 종류의 문제, 즉 델파이의 버전을 타는 문제를 추적할 때 저는 주로 둘 이상의 델파이 버전의 해당 VCL 소스를 비교해서 찾아냅니다. 그래서 실제로 VCL의 버그를 여러번 찾아내기도 했습니다.

그런데, 이번 케이스에서는, TEdit의 클래스가 선언 및 정의되어 있는 StdCtrls.pas를 델파이/C++빌더 2006과 2007에서 비교를 했는데, MaxLength와 관련하여 문제가 생길 어떤 차이도 찾아내지 못했습니다. 그럼 혹시라도 그 상위의 TWinControl이나 TControl에서 변경된 것이 아닐까 싶어 Controls.pas도 몽땅 비교해봤습니다만, 결과는 마찬가지였습니다.

일주일 이상이라는 오랜 기간을 들여서 이런 단편적인 문제를 해결하지 못했던 경험이 거의 없어서 꽤 많이 당황했었답니다. 그러다가 아주 우연히, 일본의 델파이 매니아 블로그에서 단서를 발견했습니다. “TEdit의 MaxLength가 테마의 영향을 받는다”라는 거였습니다.
http://hiderin.air-nifty.com/delphi/2007/10/index.html#entry-21411387

생각해보니 가능성이 있을 수 있는 것이, 아시다시피 델파이 2007은 비스타 지원이 처음 이루어진 버전입니다. 따라서 XP까지의 테마 지원 루틴들을 비스타를 지원하기 위해 테마 지원이 업그레이드되었거나 수정되었을 가능성이 있지 않겠습니까. 그래서 구글신께 “delphi 2007 theme”라고 주문을 외쳤습니다!

그랬더니.. 추측한 대로 델파이 2007에서 테마 방식이 바뀌었다는 글을 찾을 수 있었고요.
http://www.stevetrefethen.com/blog/Delphi2007VCLDesignerThemeSupport.aspx
요약하자면, 델파이 2006까지는 테마 지원을 위해 각 유닛마다 XPMan 유닛을 uses 했었는데, 2007에서도 그 방식은 여전히 지원하면서도 테마를 지원하는 더 간편한 방법이 추가되었습니다.

델파이 2007에서 새로 추가된 테마 방식은, 간단히 프로젝트 옵션에서 설정하는 방법입니다. 프로젝트 옵션에서 Application 페이지를 보시면 “Enable runtime themes” 체크박스가 있는데, 이 체크박스를 체크하면 테마가 지원됩니다.

이 체크 옵션은, 이전 프로젝트를 델파이 2007로 마이그레이션했을 때는 체크가 안되어 있고, 델파이 2007에서 새로 만든 프로젝트에서는 기본적으로 체크가 되어 있으므로 테마가 지원되는 상태입니다.

이 방식은 당연히 이전의 방식, 즉 프로젝트의 모든 폼 유닛에 uses XPMan 을 하지 않아도 테마 지원을 위해 프로젝트 옵션에서 켜거나 끌 수 있기 때문에 훨씬 발전한 것이라고 할 수 있습니다. 다만, uses XPMan과 위의 옵션을 둘다 쓸 경우엔 링커 에러가 발생합니다. “duplicated resource…”

어쨌든, 처음의 논제로 돌아가서.. 그런데 그게 왜 TEdit의 MaxLength에서의 한글 문제와 관련이 있느냐… 윈도우 XP 이상에서 도입된 테마는, 사용자와 관련된 입출력의 상당 부분을 마음대로 제어해버립니다. 기본 설정된 테마에 따라 화면 디스플레이(모양이나 컬러 등) 뿐만 아니라, 입력 부분에까지 영향을 미치는데요.

Edit 컴포넌트에서의 MaxLength가 바로 테마에 영향을 받습니다. 결과적으로 테마가 처음 적용되기 시작한 델파이 7 이후로 주욱~ 테마만 enable시키면 이 MaxLength 문제가 발생합니다. 다만 그것이 이전에는 uses XPMan을 하지 않으면 유닛에서 테마가 제대로 적용되지 않다가 델파이 2007에서 기본으로 테마 지원이 되면서 꼬인 거죠. 그런 이유로 델파이 2007에서 갑자기 발생한 문제처럼 보이게 된 것입니다.

결국 이 MaxLength는, 단지 프로젝트 옵션의 Application 페이지에서 “Enable runtime themes” 체크 박스의 체크를 빼기만 하면 사라집니다. 테마 지원을 뺀다고 해서 윈도우 타이틀이 테마가 적용안된 디자인으로 ‘윈도우 고전’ 스타일로 나타날 것도 아니기 때문에 큰 문제가 될 일도 아니죠.

답글 남기기

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