del7 + zeos 6.6.4 + firebird 2.1로 만들어진 프로그램을 delphi2010 + zeos 7.0.3 + firebird 2.1로
마이그레이션할려고 테스트중입니다.(작업환경은 Win7 32bit이고 데이타베이스의 charset=None으로 되어
있습니다)
richedit의 내용을 디비의 BLOB필드에 저장하고 불러오는 루틴에서 저장은 제대로 되는데
richedit로 저장된 내용을 불러오면 글자가 깨져서 불러와집니다.
<저장하기>
var
memSub: TMemoryStream;
sBuf: Ansistring;
id: integer;
begin
memSub := TMemoryStream.Create;
RichEdit.Lines.SaveToStream(memSub);
memSub.Position := 0;
SetLength(sBuf, memSub.Size);
memSub.Read(sBuf[1], memSub.Size);
// sBuf의 값을 DB의 BLOB필드에 저장
<불러오기>
var
Stream : TStream;
sBuf : AnsiString;
begin
Stream := FQuery.CreateBlobStream(FQuery.FieldByName('S_SUBJECT'), bmRead).Create;
Stream.Position := 0;
SetLength(sBuf, Stream.Size);
Stream.Read(sBuf[1], Stream.Size);
RichEdit.SelStart := RichEdit.GetTextLen;
RichEdit.SelText := sBuf;
볼랜드 포럼에 del2009이후로 UnicodeString이 기본 string으로 되어 있으서 코드를 수정해 줘야
하는 부분에 대한 글이 있어서 참고하고 작업을 해 봐도 여전히 깨집니다.
// ANSI 데이터에서 맞는 코드
var
S : String;
Temp : AnsiString;
begin
Stream.Read(L, SizeOf(Integer));
SetLength(Temp, L); // <<-- 임시 AnsiString 사용
Stream.Read(Pointer(Temp)^, L * SizeOf(AnsiChar)); // <<-- 버퍼 사이즈를 바이트로 지정
S := Temp; // <<-- 스트링을 유니코드로 넓힘
위와 같이 작업하라고 해서
var
Stream : TStream;
sBuf : AnsiString;
L : integer;
temp : string;
begin
Stream := FQuery.CreateBlobStream(FQuery.FieldByName('S_SUBJECT'), bmRead).Create;
Stream.Position := 0;
L := Stream.Size;
SetLength(sBuf, L);
Stream.Read(Pointer(sBuf)^, L * SizeOf(AnsiChar));
temp := sBuf;
RichEdit.SelStart := RichEdit.GetTextLen;
RichEdit.SelText := temp;
이렇게 수정해봐도 여전히 제대로 불러오지를 못하네요. unicodestring과 관련해서 어떤식으로 작업해야
제대로 richedit에 값을 불러 올 수가 있을까요?