Canvas に右から左への Unicode 文字列を印刷したいと考えています。BidiMode プロパティなどを見つけることができません。
現在、文字列の末尾にある記号は、キャンバスに印刷されるテキストの最初の文字の前に表示されます。
現時点では、FireMonkey には BiDi 機能はありません。
このVcl.TControlクラスにはパブリックメソッドDrawTextBiDiModeFlags()とメソッドがあり、Win32 API関数DrawTextBiDiModeFlagsReadingOnly()を呼び出すときに指定する適切な BiDi フラグをコントロールが決定するのに役立ちます。DrawText()
ではVcl.Graphics.TCanvas、そのTextOut()およびTextRect()メソッドは Win32 API 関数を使用せず、代わりにDrawText()Win32 API関数を使用します。プロパティの値は のパラメータに渡されます。このプロパティはプロパティの値にも影響し、内部で図面の X 座標を調整するために使用されます。ExtTextOut()TCanvas.TextFlagsfuOptionsExtTextOut()TextFlagsTCanvas.CanvasOrientationTextOut()TextRect()
で右から左に描画するには、プロパティにフラグをTCanvas含めます。ETO_RTLREADINGTextFlags
フォームの双方向モードが「bdLeftToRight」に設定されている場合、RTL テキストを「TextOut」で表示することに成功しなかったため、通常は XXX.Canvas.TextRect(Rect,Text,[tfRtlReading,tfRight]); を使用しました。私にとっては非常にうまく機能しました..ヘブライ語を検出する必要があったので、次のようにしました:
function CheckHebrew(s: string): boolean;
var
i: Integer;
begin
Result := false;
for i := 1 to Length(s) do
if (ord(s[i])>=1424) and (ord(s[i])<1535) then
begin
Result := true;
exit;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
tf : TTextFormat;
r : TRect;
s : string;
begin
r.Left := 0;
r.Top := 0;
r.Width := Image1.Width;
r.Height := Image1.Height;
s := Edit1.Text;
if CheckHebrew(s) then
tf := [tfRtlReading,tfRight,tfWordBreak]
else
tf := [tfWordBreak];
Image1.Canvas.FillRect(r);
Image1.Canvas.TextRect(r,s,tf)
end;