새로운 글
새로운 덧글

Q&A 게시판은 누구나 자유롭게 질의 및 응답을 할 수 있는 게시판이며 
어느 누구도 답변을 달아야만 하는 의무는 없습니다. 
만약 제품 구매 고객께서 제품설치, 등록, 제품 오류 등의 문의사항이 있으신 경우,  
좌측 메뉴에서 설치/등록/버그 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.

-----------

번호 제목 글쓴이 날짜 조회 수
공지 데브기어 강의 - 2018년 1월~2018년 4월 관리자 2015.01.22 5268
공지 유용한 관련 사이트 관리자2 2014.03.20 42904
공지 본 게시판은 개발자 여러분들의 질문과 답변을 공유하는 공간입니다. 관리자 2012.01.10 84824
2152 웹소켓 사용 질문 [3] 나즈나 2018.01.07 53
2151 컴포넌트 설치관련 [4] file 개미 2018.01.03 50
2150 idhttp 에서 https 호출시 Could not load SSL library 오류 발생 [2] 신현아빠 2018.01.03 22
2149 델파이 xe7 로딩시 오류 [1] file chchchchchch 2018.01.04 18
2148 응용프로그램 화면크기가 해상도에 따라 반영하고 싶습니다. 험프리 2018.01.04 29
2147 특정문자 먹통 및 에디트박스 한글 문자중복현상 [2] file 아크나톤 2018.01.02 33
2146 android show 에러 [1] bursil 2017.12.31 20
2145 XE 10.2 안드로이드 스크롤박스 테스트 버그 문의 [2] file 캔나영 2017.12.26 42
2144 [오픈소스] Python for Delphi(P4D) 설치 및 watson conversation api 연동 [3] 신현아빠 2017.12.19 77
2143 refind 명령으로 컴포넌트, 속성이 아닌 값(value)도 수정 가능한가요? [1] file roki81 2017.12.20 49
2142 Multithread 한시민 2017.12.19 46
2141 Class안의 function를 어떻게 global function에서 활용할 수 있는지... 한시민 2017.12.19 48
2140 Delphi 10.2.1 Update후 MSSQL 2000 연결시 오류가 납니다. 불나방 2017.12.18 32
2139 Tokyo 10.2.1에서 동적생성된 TFrame 해제시 오류... [6] file 푸른솔 2017.10.14 133
2138 XE10.2 Showmodal 폼에서 TEdit/TButton등 안 먹습니다. [1] 소란코더 2017.12.15 50
2137 sendMultimediaMessage 사용방법은?? [1] kerry 2017.12.14 40
2136 디스플레이 설정에서 항목 크기 변경(HighDPI 적용) 후 컨트롤 크기 및 위치를 수동 지정 시 올바르게 표시되지 않습니다. file 험프리 2017.12.14 37
» [마이그레이션] MaxLength 속성이 이전버전(2007 이전)에서는 한글이 2였는데... file 험프리 2017.12.14 19
2134 cport 질문드려요! 신종훈 2017.12.13 25
2133 모바일에서 메일전송시 ssl negotiation failed 메세지?? [1] kerry 2017.12.08 34


광고 모듈이 설치되어 있지 않아 실행을 중단합니다..