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

时间:2012-03-22 14:00:15

标签: 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...

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

在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函数,因此在删除制表符之间必须有一些东西。我无法跟踪代码以找出剥离制表符的内容。

希望这有助于其他人。

1 个答案:

答案 0 :(得分:6)

取决于某些内部检查,例如Windows版本(大于或等于vista),UseLatestCommonDialogs变量的值以及当前视觉样式是否为本机Windows主题。 MessageDlg使用TTaskMessageDialog(TCustomTaskDialog)类,内部调用TaskDialogIndirect WinApi函数,此函数由Windows本身处理,据我所知,没有选项可以识别 Tab 以特殊方式表示。

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

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