TStringGridにUnicodeを表示するにはOnDrawCellイベント中にTextOutWやDrawTextWなどのUnicode版APIを使うことでできます。
TListBoxやメニューなどの場合とは違いイベント起こすためのプロパティはありません。
OnDrawCellイベントに記述するだけでOKです。
DefaultDrawingプロパティはデフォルトの描画を行うかどうかを決めるプロパティです。
デフォルトの描画を行うことで選択状態の背景やフォント、ラインの処理や描画を自前でやらずに済みます。
その分描画処理が二度行われることになるので速度は遅くなります。
とはいえそのような状況であってもTListBoxよりは速いです。
function gfnsWideToUtf7(sSrc:
WideString): AnsiString;
//WideStringをUTF-7にエンコードして返す
var
li_Len: Integer;
lp_Buff: PAnsiChar;
begin
li_Len := WideCharToMultiByte(CP_UTF7, 0, PWideChar(sSrc),
-1,
nil, 0,
nil,
nil);
lp_Buff := AllocMem(li_Len + 1);
try
WideCharToMultiByte(CP_UTF7, 0, PWideChar(sSrc), -1, lp_Buff,
li_Len,
nil,
nil);
Result := AnsiString(lp_Buff);
finally
FreeMem(lp_Buff);
end;
end;
function gfnsUtf7ToWide(sSrc: AnsiString):
WideString;
//UTF-7でエンコードされている文字列をWideStringにして返す
var
li_Len: Integer;
lp_Buff: PWideChar;
begin
li_Len := MultiByteToWideChar(CP_UTF7, 0, PAnsiChar(sSrc),
-1,
nil, 0);
lp_Buff := AllocMem((li_Len + 1) * 2);
try
MultiByteToWideChar(CP_UTF7, 0, PAnsiChar(sSrc), -1, lp_Buff,
li_Len);
Result :=
WideString(lp_Buff);
finally
FreeMem(lp_Buff);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ls_Wide:
WideString;
begin
ls_Wide := 'Queensr' +
WideString(WideChar($00FF)) + 'che';
//Queensrÿche
//WideStringをUTF-7に変換してセルに代入
StringGrid1.Cells[0, 0] :=
gfnsWideToUtf7(ls_Wide);
end;
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect:
TRect; State: TGridDrawState);
begin
with StringGrid1.Canvas
do begin
FillRect(Rect);
//UTF-7に変換したものをWideStringに戻して描画
DrawTextW(Handle, PWideChar(
gfnsUtf7ToWide(StringGrid1.Cells[ACol, ARow])), -1, Rect, DT_NOPREFIX
or DT_VCENTER
or DT_SINGLELINE);
end;
end;