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