자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다. 
  • 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)

Q,

TEdit, TComboBox 등의 MaxLength 속성을 이용해 DB 필드의 길이와 매핑해 데이터 입력을 제한했습니다.

 

하지만 최신 버전 델파이에서는 한글도 1글자로 인식되어 DB 필드 길이를 초과해 오류가 발생합니다.

예를 들어

"홍길동전123" 입력 시 아래와 같이 입력됩니다.

예전 버전에서는 "홍길동전12"(10 bytes)

최신 버전에서는 "홍길동전123"(11 bytes)

 

해결방법이 있을까요?

 

A, 

유니코드가 적용된 2009 이후 버전 부터 MaxLength는 글자의 길이를 기준으로 동작합니다.

(2007 이전 버전, 즉 안시스트링 기반에서는 바이트 수 기준으로 동작했습니다.)

 

이슈를 해결하는 가장 좋은 방법은 DBMS의 캐릭터 셋을 UTF8로 변경하는 것입니다.(하지만 현실적으로 어렵죠^^)

 

또다른 방법 중 하나로, MaxLength를 Byte 단위로 처리하도록 기능을 수정하는 것입니다.

아래 코드는 TEdit를 상속받아 위 내용을 구현한 내용의 일부입니다.

 

Vcl.Extension.Edit 유닛에 TEdit를 상속받아 다시 구현했습니다.

TEdit를 사용하는 폼의 유닛의 유즈절에 Vcl.Extension.Edit 유닛을 추가해야 합니다.

이 경우 주의할 점은 Vcl.StdCtrls 유닛보다 뒤에 Vcl.Extension.Edit 유닛을 추가해야 합니다.

유즈절은 뒤에서 읽기 때문에 Vcl.Extension.Edit에 있는 TEdit를 폼에서 읽어야 합니다.

 

다른 컴포넌트 들도 아래 내용을 참고해 구현할 수 있습니다.

혹시 더 좋은 방법을 알고 계신 분들은 댓글 부탁드립니다.

 

샘플 프로젝트는 첨부파일에서 받아 볼 수 있습니다.

-----------

unit Vcl.Extension.Edit;

 

interface

 

uses

  Vcl.StdCtrls, System.Classes, System.SysUtils;

 

type

  TEdit = class(Vcl.StdCtrls.TEdit)

  protected

    procedure Change; override;

  end;

 

implementation

 

uses

  WinAPI.Windows;

 

{ TEdit }

 

function CutString(Value : AnsiString; Len: Integer ) : string;

var

  I: Integer;

  Ch : AnsiChar;

  InChar: Boolean;

  Ansi: AnsiString;

begin

  InChar := False;

 

  for i := 1 to Len do begin

    Ch := Value[i];

    Ansi := Ansi + Ch;

 

    if (Ch > #127 ) and (not InChar) then

      InChar := True

    else if ( ch > #127 ) and ( InChar ) then

      InChar := False

  end;

 

  if InChar then

    Ansi := Copy(Ansi, 1, Length(Ansi) - 1);

 

  Result := string(Ansi);

 

  OutputDebugString(PChar(Result));

end;

 

procedure TEdit.Change;

begin

  inherited;

 

  if Length(AnsiString(Text)) > MaxLength then

  begin

    Text := CutString(AnsiString(Text), MaxLength);

    SelStart := MaxLength;

    keybd_event(VK_RIGHT, 0,0,0);

  end;

end;

 

end.

-----------

번호 제목 글쓴이 날짜 조회 수
공지 [프로그래밍 강의] 2021.6~2021.12 관리자 2015.01.22 15947
공지 유용한 관련 사이트 관리자2 2014.03.20 54752
공지 본 게시판은 개발자 여러분들의 질문과 답변을 공유하는 공간입니다. 관리자 2012.01.10 98219
3199 [10.3.3 브리핑] RAD서버의 부하 분산 등은 어떻게 되나요? 험프리 2019.12.10 78
3198 [RAD서버-201703 세미나] 리눅스 및 ARM 계열 크로스컴파일 업그레이드 일정 험프리 2017.03.17 78
3197 실행되지만 레퍼런스에 없는 system.default 2 임병기 2017.04.01 80
3196 [시애틀 출시세미나] 제품소개의 권장사항에 XP가 빠져있는데 XP에서도 사용할 수 있나요? Humphery 2015.09.11 81
3195 [시작하는 사람들을 위한 델파이 프로그래밍] 모듈 18 - Exercise 3 [1] 관리자 2016.05.27 81
3194 디버깅을 하면서 메모리에 어떻게 할당됐는지 확인할 수 있나요? 손보라 2016.08.31 81
3193 [10.2.2 세미나] 이전 버전과의 차별점 알려주시면 감사하겠습니다. 험프리 2018.01.18 81
3192 ActiveX 호환이 안되는 것인지 궁금합니다. KJ 2020.02.17 81
3191 델파이 xe seattle 10 사용중 이미지 인쇄 버그 네이트 2020.11.17 81
3190 설치및 구버젼 라인센스 [2] 희망나라 2020.07.02 82
3189 [개발생산성향상 세미나] 리눅스 지원은 언제쯤 하나요? 험프리 2017.02.22 83
3188 rio update 질문입니다. [1] file 희망나라 2020.02.17 84
3187 간혹 . 를 찍어도 아무런 반응이 없는 경우.. 가나당 2016.12.22 85
3186 Berlin, Nougat 환경에서 TMemo 관련. [1] 까치발가락 2017.07.28 86
3185 10.2 starter 언인스톨 문제 [3] 바람 2017.05.31 87
3184 [100%활용 세미나] 리눅스 지원 계획을 알고 싶습니다. 험프리 2017.11.10 87
3183 아파치 RAD Server 연동 날개 2021.03.11 87
3182 시애틀에서 비콘사용문의 [1] tonetel 2016.08.16 88
3181 RIO 10.3 폼 Transparency 활성시 검정색 문제 돌팅 2018.12.07 88
3180 문자열 관련 [1] 구뚜루 2018.12.25 88