2012-03-22 35 views
1

在Win用Delphi XE2 7 64位創建一個32位應用...Tab字符不再適用於Delphi XE2消息對話框 - 可選項?

在Delphi 6中,我們使用的消息內的製表符以創建好看的,多線雙柱對話框。

str := 'Left item:' + #9#9 + 'Right Item' + #13#10 + 
     'Next left item: + #9 + 'Next Right Item' + ... 

if MessageDlg(str, mtConfirmation,[mbYes,mbNo],0) = mrYES then... 

這將創建數據的用戶看到,而不需要自定義表單只是爲了問這個特定問題一個很好的排隊名單。右邊的列很好地對齊,並且很容易清楚地看到數據。

在Delphi XE2中,字符串中嵌入的製表符(#9)完全被忽略,根本沒有空白。使用#32確實會創建一個空間,但不會像製表符(#9)那樣很好地排列。我遇到一些Unicode問題?

除了使用自定義表單之外,還有什麼建議可以讓這個格式化回來?

乾杯!

編輯:

當然,我張貼問題後,我想出了幾個不同的解決方法。

首先,使用Application.MessageBox()確實保持製表符間距。

其次,奇怪的是,下面的代碼工作並使用製表符保持適當的空白區域。

procedure TForm1.Button1Click(Sender: TObject); 
var AMsgDialog : TForm; 
var str : string; 
begin 
    str := 'Left item:' + #9#9 + 'Right Item' + #13#10 + 
     'Next left item:' + #9#9 + 'Next Right Item'; 
    AMsgDialog := CreateMessageDialog(str, mtConfirmation,[mbYes,mbNo],0); 
    try 
    if AMsgDialog.ShowModal = mrYES then begin 
     //do something 
    end; 
    finally 
    AMsgDialog.Release; 
    end; 
end; 

不確定爲什麼以這種方式創建消息對話框時,會保持標籤字符間距,而舊方法不會。

我知道同樣的CreateMessageDialog函數在我調用MessageDlg()時被打中,因此必須在刪除製表符之間有一些東西。我無法追蹤代碼以找出剝離製表符的內容。

希望這可以幫助別人。

回答

6

取決於一些內部檢查,如Windows版本(大於或等於vista),UseLatestCommonDialogs變量的值以及當前視覺樣式是否是本地Windows主題。 MessageDlg使用TTaskMessageDialog(TCustomTaskDialog)類,該類內部調用WinApi函數TaskDialogIndirect。該函數由Windows自己處理,據我所知,沒有選項可以用特殊方式識別選項卡字符。

否則當上述其中一個條件不匹配時MessageDlg使用CreateMessageDialog函數創建對話框。此方法使用VCL和WinApi調用繪製對話框本身的文本是使用DrawText函數繪製的,DT_EXPANDTABS標誌包含「擴展」選項卡字符。

所以該MessageDlg功能識別標籤字符的唯一方法是使用CreateMessageDialog內部時(你可以強制這種行爲UseLatestCommonDialogs的值設置爲false)。

+0

我會建議簡單地使用'應用程序。MessageBox「,但是不好的部分是你需要'PChar(str)'而不是'str'。 – 2012-03-22 17:03:23