ホーム >プログラム >Delphi 6 ローテクTips

TStringGridにUnicodeを表示

ウムラウトのようなUnicode文字をTStringGridに表示させましょうというページ。


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;

ウムラウトのようなUnicode文字「ÿ」がちゃんと表示されています。

上記の例では変換にUTF-7を利用していますがURLもどきの独自変換の方がグリッドのセルに入力するときには楽です。

TStringGridはTListBoxなどと違いUTF-8を利用したりWideStringを直接持つ方法も使えます。