お世話になっております。
Delphi2007,XPです。
StringGridを置き、
StringGrid1.Cells[1,1]:='櫐櫑櫒櫓櫔櫕';
を実行すると、
Cells[1,1]の値が、
?櫑?櫓??
になってしまいます。
Unicodeで、
櫐=6AD0
櫑=6AD1
櫒 =6AD2
櫓=6AD3
櫔=6AD4
櫕=6AD5
です。
※ 櫒 =6AD2は、NotePadでは表示されません。
StringGridに、
櫐櫑櫒櫓櫔櫕が正しく入るようにする方法はあるでしょうか?
よろしくお願いします。
すでに、この掲示板でも文字化けしてしまっていますね。
'櫐櫑櫒櫓櫔櫕';
は、
Unicodeが、6AD0〜6AD5の6つの文字です。
もうなんとなくダメな気がしますが、よろしくお願いします。
Delphi6 Pro XPで。
Unicodeな文字列をUTF-7に変換してStringGridに入れ、StringGridのOnDrawCellイベントででUTF-7に変換した文字列をUnicode文字列に戻して表示させるという方法があります。
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 :=
WideString(WideChar($6AD0))
+ WideString(WideChar($6AD1))
+ WideString(WideChar($6AD2))
+ WideString(WideChar($6AD3))
+ WideString(WideChar($6AD4))
+ WideString(WideChar($6AD5))
;
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);
DrawTextW(Handle, PWideChar(gfnsUtf7ToWide(StringGrid1.Cells[ACol, ARow])), -1, Rect, DT_NOPREFIX or DT_VCENTER or DT_SINGLELINE);
end;
end;
>※ 櫒 =6AD2は、NotePadでは表示されません。
フォントを変えれば表示されると思います。
私の環境では「MS Pゴシック」だと表示されませんが、「MS ゴシック」や「MS P明朝」なんかだと表示されます。
それなら別で保持しておいてOnDrawCellでそっちを参照すればいいだけじゃないの?
なんでUTF-7なんかに変換してわざわざ代入する必要があるのか。
>なんでUTF-7なんかに変換してわざわざ代入する必要があるのか。
データを別に保持する必要がないから。
別に保持する場合ストリンググリッドとの同期が必要になるのでその管理が面倒かなと。
データを増減すればグリッドの行や列も増減させなければならないし、グリッドの列や行を移動させればデータの移動や参照先の変更などが必要になるしで、と。
UTF-7に変換してストリンググリッドに持てばそれらの手間は必要ないので手軽かなと。
別に持つデータとグリッドの同期の手間が負担でなければわざわざ変換して代入するわずらわしさもないし速度的にも優位なのでそっちの方が良いと思います。
まぁ、色々ある解決策のうちの一つということで。
ありがとうございます。
StringGrid1のOptionsプロパティのGoEditingをTrueにして、Cell[0,0]をクリックすると、コードを変換された文字が表示されていて、本当はこの編集部分でも指定した漢字が出ればいいなと思いましたが、表示だけでもできるようになったので、これでいいと思います。
ありがとうございました。
>本当はこの編集部分でも指定した漢字が出ればいいなと思いましたが
それをするにはUnicode対応のEditコントロールをCreateWindowW APIを使って作成する必要があります。
http://cult-drang.com/program/tips/unicode/edit_memo.html
http://cult-drang.com/program/tips/unicode/richedit.html
http://cult-drang.com/program/tips/unicode/richedit/richedit_1.html
手前味噌で恐縮ですがこのあたりが参考になるかと思います。
Dさん
ありがとうございます。
教えてもらった分は、難しそうなので、表示の部分だけできた最初の分だけでいいです。
ありがとうございました。
ツイート | ![]() |