选项卡字符在Delphi XE2消息对话框中不再起作用 - 替代方案?

TJ *_*her 2 delphi delphi-xe2

在Win 7 64位上使用Delphi XE2创建一个32位应用程序...

在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...
Run Code Online (Sandbox Code Playgroud)

这创建了一个很好的排列数据列表供用户查看,而不需要自定义表单来询问这个特定问题.右列很好地对齐,可以很容易地清楚地看到数据.

在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;
Run Code Online (Sandbox Code Playgroud)

不知道为什么以这种方式创建消息对话框会在旧方法不会保持制表符字符间距.

我知道当我调用MessageDlg()时会遇到相同的CreateMessageDialog函数,因此在删除制表符之间必须有一些东西.我无法跟踪代码以找出剥离制表符的内容.

希望这有助于其他人.

RRU*_*RUZ 8

取决于某些内部检查,如Windows版本(大于或等于vista),UseLatestCommonDialogs变量的值以及当前视觉样式是否为本机Windows主题.该MessageDlg用途TTaskMessageDialog(TCustomTaskDialog其内部调用)类TaskDialogIndirectWINAPI功能,这个功能是通过Windows本身处理,据我知道有没有选项来识别的Tab 一种特殊的方式字符.

否则,当上述条件之一与MessageDlg使用该CreateMessageDialog函数创建对话框不匹配时.此方法使用VCL和WinApi调用绘制对话框本身,使用包含扩展选项卡字符DrawTextDT_EXPANDTABS标志的函数绘制正文文本.

因此,MessageDlg函数识别 Tab 字符的唯一方法是在CreateMessageDialog内部使用时(您可以强制此行为将UseLatestCommonDialogs的值设置为false).