본문 바로가기
프로그래밍/PC

XE6, 파이어몽키 그리고 TWideMemoField 버그 수정

by 사악신 2014. 6. 30.

델파이 XE6 버전 이후, 처음으로 파이어몽키를 사용해볼 생각을 하게되었습니다. 일단, 과거 2006년경 작업했던 프로그램을 재작성해보고 있는데요. 여기저기 문제점들이 터져나오네요. ^^

 

기존 프로그램 구성은 홈페이지 + 웹서비스 미들웨어(ISAPI) + 클라이언트 입니다. DB 는 MySQL 입니다. 과거 델파이 2005 에서 작업한 프로그램인데요. 일단, 새로이 추가된 DataSnap Server 로 미들웨어를 구성하고 파이어몽키로 다이내믹한 UI 작업을 해보고 있습니다.(추후, 정리해서... 별도 포스팅하겠습니다.)

 

일단, Frame 으로 별도 창을 만들어 사용해보았는데요. 탭키로 컨트롤 간 이동이 되지 않더라구요. 관련 버그는 Update 1 에서 고쳐졌다고하는데 아직 확인해보지 못했습니다.(123635 Tab Key does not work in Frames FireMonkey) 그리고 페이스북에 글을 남긴적이 있는데... 세벌식 한글 입력을 사용할 경우, 콤마나 스페이스 등 한글 자모와 관련없는 키입력에 문제가 있습니다. 두번을 연속해서 입력해야되는 등...

 

그리고 오늘 포스팅 주제인데요. MySQL 의 기본 문자셋이 UTF-8 로 세팅되어있는 반면, 파이어몽키에서의 문자열 기본은 UnicodeString (UTF-16) 입니다. 일단, TSQLConnection 에서 ServerCharSet 을 추가하고 utf8 로 설정합니다.

 

 

 

 

일단 이렇게하면, TEdit 등에서 한글은 깨지지 않고 출력됩니다. 하지만, TMemo 에서는 한글이 깨져 나오더군요. 별 수 없이 추적을 해보았습니다. 그리고 응급처치를 했습니다.(델마당 등 커뮤니티에서는 변태상속이라고 부르죠? 제 개인적으로는 데코레이터 패턴이랑 유사한 부분이 있어 데코레이터로 네임스페이스를 분류해서 사용합니다. 주로, 컴포넌트 등에 버그가 있을 때 패치 방법으로 많이 쓰고 있습죠. ^^)

 

unit Decorator.TWideMemoField;

interface

uses
  System.SysUtils, System.Classes, Data.Db;

type
  TWideMemoField = class(Data.DB.TWideMemoField)
  protected
    function GetAsWideString: string; override;
    procedure SetAsWideString(const Value: string); override;
  end;

implementation

{ TWideMemoField }

function TWideMemoField.GetAsWideString: string;
var
  Len: Integer;
  LStream: TStream;
  Data: AnsiString;
begin
  LStream := DataSet.CreateBlobStream(Self, bmRead);
  try
    Len := LStream.Size;
    SetString(Data, nil, Len div SizeOf(AnsiChar));
    LStream.ReadBuffer(Pointer(Data)^, Len);
  finally
    LStream.Free;
  end;

  Result := UTF8ToString(Data);
end;

procedure TWideMemoField.SetAsWideString(const Value: string);
begin
  SetAsBytes(TEncoding.UTF8.GetBytes(Value));
end;

end.

 

 

상기 유닛을 interface 영역에 추가해주면, 일단 한글 문제는 해결이 됩니다. 제가 처한 급한 불만 끄면되기에... 전체적으로 문제가 없는 방법인지는 모르겠습니다. ^^ 해야할 작업들이 너무 많아서... 이 외에도 자잘한 버그들이 있는데 이래저래 잡아가면서 할 수는 있더군요. 완성도 측면에서 좀 아쉬운 부분이 있지만... 망했다 정도까지는 아닌 것 같습니다. 처음 봤을때 보다는 확실히 나아진 부분이 보이네요. UI 작업에 있어 상상하며 구현할 수 있는 재미가 있다고할까요? ^^

 

 

 

 

현재 테스트 삼아 작업해보고 있는 UI 의 스샷입니다.

 

반응형

댓글