자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다. 
  • 제품설치/등록 오류 문의: 설치/등록 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 17229
공지 유용한 관련 사이트 관리자2 2014.03.20 56109
공지 본 게시판은 개발자 여러분들의 질문과 답변을 공유하는 공간입니다. 관리자 2012.01.10 99544
913 안드로이드 타이머 화면꺼지면 동작이 잘 안되요 [1] 캔나영 2017.05.29 692
912 db 운영 시 데이터 추가 안되는현상 file 전수정 2017.05.29 147
911 FMX Edit 오류 패치 안되나요??? [2] 로로봉 2017.05.29 137
910 델파이xe win 7 64bit 설치문의 file kwy0702 2017.05.30 342
909 DephiXE4 에디터에서 chinese글자가 깨집니다. RAD Studio 10.2 starter에는 [5] 바람 2017.05.30 274
908 10.2 starter 언인스톨 문제 [3] 바람 2017.05.31 95
907 전화통화 중인지... 확인 [1] 지니 2017.05.31 1578
906 앱스토어 거부건 IPv6 지원안됨 [3] file 사랑남 2017.06.01 5194
905 Datasnap Callback에서 문제 파란하늘 2017.06.01 123
904 Rest web server [6] nickname 2017.06.05 270
903 FireDAC 프로시저로 리모트 서버 연결시 데이타가 프로그램을 종료해야 올라갑니다 아폴로 2017.06.05 194
902 DXE2 에서와 DXE10.2 에서 동작이 다릅니다. [1] file DarkRyu 2017.06.06 121
901 DBExpress 와 MySQL 연결관련 문의 [1] file 대화마을 2017.06.08 499
900 파이어몽키 scrollbox의 수평 스크롤 제어 [2] 화이부동 2017.06.12 506
899 [공유] 모달 창이 간혹 다른 화면 뒤로 숨는 경우가 발생합니다. 무조건 최상위로 띄울 수 있는 방법이 있나요? 험프리 2017.06.12 927
898 [공유] 델파이 프로젝트에서 C로 작성된 소스와 해더 파일을 사용하고 싶어요. [1] 험프리 2017.06.12 190
897 BDE를 사용할 때의 DBTables, MSCommLib_TLB는 업그레이드할 때, 어떻게 해야하나요 [1] 공심이 2017.06.12 269
896 Windows 10 테블릿 모드에서 터치 키보드 관련문의 [2] jaheon 2017.06.14 942
895 모빌리언스 연동시 MSTR값 최종적으로 JSON으로 파싱시 오류입니다 ㅠㅠ! [1] 초보개발자홉 2017.06.15 561
894 fireDac 문의 [1] 영은우 2017.06.19 116