2

TListview彼のプロパティを持つアイテムの左側に負の数のマイナス記号を表示しようとしていますBiDiMode = bdRightToLeft.

そこでコードを試しました:

DBGrid の千区切り記号

Function TfrmProjets.IfSign(floatValue: double; howMuchDecimalAfterComa: 

integer):string;
var
  strResult: string;
  strZero: string;
  i: integer;
begin
  strResult := '';
  strZero := '';

  for i := 0 to howMuchDecimalAfterComa -1 do
  begin
    strZero := strZero + '0';
  end;

  if(Sign(floatValue) = NegativeValue)then
  begin
      strResult := '-' + FormatFloat('0.' + strZero,Abs(floatValue));
    //strResult := '(' + FormatFloat('0.' + strZero,Abs(floatValue)) + ')';
  end
  else
  begin
    strResult := FormatFloat('0.' + strZero,floatValue);
  end;

  result := strResult;
end;

実際、ブレークポイントを使用して評価すると機能しますstrResult

しかしTListView、私のアイテムに表示されると:

lvItem := lvPeriodic[0];
lvItem.SubItems.Add(IfSign(-14.2),1) + '%') ;

次のように表示されます。14.2%-

表示している文字列などを変更しないように指示する方法はありTListviewますか?

4

1 に答える 1

4

Delphi の Unicode バージョンを使用していると仮定すると、明示的な RTL および LTR マークを指定して、言語に依存しない文字または弱い文字 (ダッシュ-、感嘆符!など) の位置を強制できます。

さまざまなコンテキストで LTR および RTL テキストを解析するための規則は広範で複雑です。参考までに、双方向アルゴリズムの仕様については、こちらを参照してください。弱い文字の 1 つのパスは、ヨーロッパの数字を LTR として解析します (これが14.2%正しい方向に終わる理由ですが、-マイナスを示すためにダッシュを使用するとあいまいさが生じます。適切なマイナス記号を代用するとうまくいくと思うかもU+2212しれませんが、これもおそらく、アラビア数字も負になる可能性があるためです(反対方向にレンダリングする必要があります...よくわかりません)。

いずれにせよ - 次に進むと、次のような関数を構築して、文字列を厳密な LTR 順序に強制することができます。

function StrictLTR(const s : string) : string;
const
  LTR_EMBED = Char($202A);
  POP_DIRECTIONAL = Char($202C);
begin
  result := LTR_EMBED + s + POP_DIRECTIONAL;
end;

これにより、埋め込まれた左から右への文字 ( U+202A) が文字列の前に配置され、その後に Pop-Directional-Formatting ( U+202C) 文字が続きます。後者は、埋め込まれた方向の書式設定の手がかりを削除し、テキストの方向を前のコンテキストにあったものに戻します。したがって、返された文字列は、RTL または LTR コンテキストで安全に使用できます。

これを呼び出すと、次のようになります。

 ListView1.AddItem(StrictLTR(IfSign(-14.2,1) + '%'), nil);

望ましい結果が得られます。


余談ですが、 function を使用すると、関数IfSignを大幅に簡略化できます。Format

Function IfSign(floatValue: double; numberOfDecimalPlaces:integer):string;
begin
  result := Format('%.'+IntTostr(numberOfDecimalPlaces)+'f', [floatValue]);
end;
于 2015-11-03T19:50:55.087 に答える