2015-11-03 53 views
2

我想在TListview有他的財產BiDiMode = bdRightToLeft.如何在左邊(德爾福的TListView)顯示減去

我試過,以顯示對一個項目的左側負數的減號代碼中有:

Thousand Separator in 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不改變我顯示字符串或什麼?

+0

德爾福的版本:


順便說一句,你IfSign功能可以大大利用Format功能簡化? Unicode提供了一些在D2009之前不可用的解決方案。 –

+0

這是D2009 unicode – pikarie

回答

4

假設你正在使用德爾福的Unicode版本,你可以提供明確的RTL和LTR標記強制的語言中性或弱酸字符(如破折號-,感嘆號!等)的位置。

在各種上下文中解析LTR和RTL文本的規則是廣泛和複雜的。作爲參考,你可以找到bidirectional algorithm specification here。弱字符的一次傳遞將歐洲數字解析爲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(floatValue: double; numberOfDecimalPlaces:integer):string; 
begin 
    result := Format('%.'+IntTostr(numberOfDecimalPlaces)+'f', [floatValue]); 
end; 
+0

我用你的功能,它的作品就像一個魅力!我不確定我是否理解彈出式格式化思想。在編程時需要解決這個問題嗎?非常感謝您的高級答案! – pikarie

+0

@pikarie第一個「LTR_EMBED」字符告訴解析器開始將以下文本視爲從左到右的文本。 'pop-directional-formatting'字符告訴解析器停止將文本強制爲LTR,然後繼續處理文本,無論是在LTR_EMBED字符之前的雙向模式。是的,當混合雙向文本時,這是一種強制渲染文本的正常方式,應該將文本解釋爲一個給定的方向。 –

+0

很好的解釋!再次感謝! – pikarie