자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다. 
  • 제품설치/등록 오류 문의: 설치/등록 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 15766
공지 유용한 관련 사이트 관리자2 2014.03.20 54580
공지 본 게시판은 개발자 여러분들의 질문과 답변을 공유하는 공간입니다. 관리자 2012.01.10 97985
3199 ems start 버튼 클릭시 [FireDAC][Phys][IB]I/O error for file [1] 느림보 2021.03.15 200
3198 xe10.3.3 에서 단말기 Android 7.1.2 에 넣으면 오류 [1] file 광수생각 2021.03.17 225
3197 UTF-32 변환 문제 입니다. [1] 산별아빠 2021.03.24 233
3196 [문의]프로그램 메모리릭 오류 체크 [1] 공수래 2021.03.25 209
3195 FDBatchMove 질문입니다. [1] 희망나라 2021.03.24 235
3194 맥 어드레스를 못가져오는 경우? [1] 가나다 2021.03.29 180
3193 idhttp로 https주소로 post 방식으로 API insert 문의드립니다... [2] 스마일 2021.03.26 1108
3192 파이어몽키로 안드로이드 시스템상에서 터치 이벤트 발생이 가능한가요? [2] 유성 2021.03.24 203
3191 Optimization 관련 문의 드립니다. [2] BD 2021.03.18 175
3190 IOS 앱 개발 후 배포작업중에 에러를 해결할수없어 질문드립니다.. [2] 밤바야 2021.03.15 566
3189 Datasnap Rest Server dataset결과값을 http 호출 json타입으로 받으려면 [1] 델마당쇠 2021.03.16 210
3188 Access violation 'vcl270.bpl"에러가 발생 합니다. file 하루 2021.03.22 241
3187 ctrl + space 기능 활성화문제 [2] file 즐거운하늘 2021.02.04 425
3186 C++ Builder 10.3 / 10.3.1 Clang에서 Code Insight 동작하지 않는 현상 질의? [3] 포비 2019.02.21 656
3185 로그출력 기능 문의 [2] 공수래 2021.03.17 148
3184 TNetEncoding.URI.Encode함수 [1] 똘귀아빠 2021.03.17 179
3183 XE8 JSON통신 오류 [2] file 똘귀아빠 2021.03.10 285
3182 시드니 10.4.1에서 Code Insight가 동작 되지 않아요. [3] file 오늘도좋은하루 2020.10.24 536
3181 [10.4.2] 프로젝트를 새로 열어 빌드 할 때마다 프로젝트 파일이 변경되는 문제 아루스 2021.03.15 188
3180 안드로이드 플레이스토어 aab 등록시 "서명" 문제 [1] 불나방 2021.03.12 206