2012-03-22 6 views
1

32ビットアプリケーションを作成するWin 7 64ビット版Delphi XE2を使用しています...タブ文字は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; 

この方法でメッセージダイアログを作成すると、古い方法ではタブ文字の間隔が維持されないのはなぜか分かりません。

MessageDlg()を呼び出すと、同じCreateMessageDialog関数がヒットしているので、タブ文字を取り除く間に何かが存在するはずです。私はコードにタブ文字を取り除いていたものを見つけることができませんでした。

これは他の人に役立つことを望みます。

答えて

6

Windows版(Vista以上)などの内部チェックには、UseLatestCommonDialogs変数の値と現在のビジュアルスタイルがネイティブWindowsテーマであるかどうかによって異なります。 MessageDlgは、TaskDialogIndirect WinApi関数を内部的に呼び出すTTaskMessageDialog(TCustomTaskDialog)クラスを使用します。この関数はWindows自体によって処理され、特別な方法でタブの文字を認識するオプションはありません。

上記以外の条件のいずれかが一致しない場合MessageDlgCreateMessageDialog関数を使用してダイアログを作成します。このメソッドは、VCLとWinApiの呼び出しを使用してダイアログ自体を描画し、DrawText関数にDT_EXPANDTABSフラグを含むタブ文字を展開して本文を描画します。

(あなたがfalseにUseLatestCommonDialogsの値を設定し、この動作を強制することができます)、内部CreateMessageDialogを使用する場合、だから、MessageDlg機能がタブ文字を認識する唯一の方法です。

+0

私は単純に 'Applicationを使うことを提案していました。MessageBox'であるが、その悪い点は 'str'の代わりに' PChar(str) 'が必要なことです。 –

関連する問題