새로운 글
새로운 덧글

자유롭게 질의 및 응답을 할 수 있는 게시판이며 어느 누구도 답변을 달아야만 하는 의무는 없습니다. 
  • 제품설치/등록/제품 오류 문의: 설치/등록 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.8~2018.11 관리자 2015.01.22 6058
공지 유용한 관련 사이트 관리자2 2014.03.20 43311
공지 본 게시판은 개발자 여러분들의 질문과 답변을 공유하는 공간입니다. 관리자 2012.01.10 84893
2138 refind 명령으로 컴포넌트, 속성이 아닌 값(value)도 수정 가능한가요? [1] file roki81 2017.12.20 56
2137 Multithread 한시민 2017.12.19 65
2136 Class안의 function를 어떻게 global function에서 활용할 수 있는지... 한시민 2017.12.19 67
2135 Delphi 10.2.1 Update후 MSSQL 2000 연결시 오류가 납니다. 불나방 2017.12.18 49
2134 Tokyo 10.2.1에서 동적생성된 TFrame 해제시 오류... [6] file 푸른솔 2017.10.14 171
2133 XE10.2 Showmodal 폼에서 TEdit/TButton등 안 먹습니다. [1] 소란코더 2017.12.15 72
2132 sendMultimediaMessage 사용방법은?? [1] kerry 2017.12.14 118
2131 디스플레이 설정에서 항목 크기 변경(HighDPI 적용) 후 컨트롤 크기 및 위치를 수동 지정 시 올바르게 표시되지 않습니다. file 험프리 2017.12.14 207
» [마이그레이션] MaxLength 속성이 이전버전(2007 이전)에서는 한글이 2였는데... file 험프리 2017.12.14 67
2129 cport 질문드려요! 신종훈 2017.12.13 52
2128 모바일에서 메일전송시 ssl negotiation failed 메세지?? [1] kerry 2017.12.08 53
2127 intent 이용 sms,mms 보낼때 이미지 파일및 동영상파일 첨부는?? 고견을 부탁드립니다. 답변 0 [1] kerry 2017.12.12 185
2126 델파이 도쿄10.2.1 에서 개발한 앱을 ios Enterprise program형태로 배포 [1] 밤바야 2017.12.11 53
2125 XE10 시애틀에서는 문제가 없는 소스가 10.2에서 컴파일 후 segment falut 11이 발생해요~ [1] file 소란코더 2017.12.12 57
2124 파이어몽키 mms 장문문자+이미지파일및 첨부파일 전송?? [1] kerry 2017.12.07 90
2123 Datasnap 오류 문의 [1] 파란하늘 2017.12.07 56
2122 적외선 리모컨 앱을 만들고 싶습니다 [1] 박군80 2017.09.21 152
2121 [안드로이드]LocationSensor의 Accuracy / Distance 에 대한 문의 [1] 소란코더 2017.12.04 51
2120 CPort baudrate 질문드려요 [1] 신종훈 2017.12.04 72
2119 안드로이드 Runtime.getRuntime().exec 커멘드처럼 할려면 어떻게 해야하나요? [1] 소란코더 2017.12.04 159



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