6

我刚刚遇到了一个关于 SO 的答案,语法很奇怪:

如何在 Delphi 中的字符串中包含换行符?

MyString := 'Hello,' + ^M + ^J + 'world!';

我已经使用 Delphi 好几年了,但我不知道您可以将抑扬符用于控制字符。

这只是早期 Delphi 或 Turbo Pascal 时代的遗留物吗?

现在应该使用它吗?

PS:我不是在询问有关换行符的建议,原始问题中讨论了 sLineBreak 和其他方法。

4

3 回答 3

9

不,它不是从 Turbo Pascal 时代开始的。它是在 TP 之前的几十年,在 MS-DOS 之前,甚至可能在 UNIX 之前。像第一个每秒 300 位的拨号调制解调器和 DEC VT-52 终端、PDP-8 机器上的 RT-8 操作系统和早期版本的 C 之类的旧东西。或者甚至更老——尽管对我来说更老的一切都只是传说 :-) .

“^”符号是“Ctrl”键的快捷键。所以^C在传统表示法中代表Ctrl+C微软表示法。该符号在 MS-DOS 时代被广泛用于文本模式菜单,如前面提到的 Turbo Pascal、Norton Utilities、DOS Navigator 等。

根据我的记忆,您可以考虑用“^”表示“减 64”。就
这样。_ _ 并且将是:-) 在 MS-DOS 中按 Ctrl+Shift+"2/@" 的 AFAIR 实际上会生成BIOS 键盘缓冲区 :-) Chr(65)'A'Chr(1)^A
^@#0#0

^[ 将 AFAIR#27又名 Esc(ape) char - 如果您运行telnet.exe,您会看到它被提示为转义字符。

因此,Turbo Pascal 很久以前就选择遵循时间祝福的约定,然后从那时起就开始采用向后兼容的规则。就个人而言,我比你想要它在一行上'bla-bla'^M^J'foo-baz'更像字符串。'bla-bla'#13#10'foo-baz'当您的文字需要多个源代码行时,使用 plus 构造值更合适。

遗憾的是,Delphi IDE 中的语法高亮在这种常量上是无可救药的。

于 2012-10-25T08:32:16.473 回答
3

是的,这是昔日的遗产。

不,您不应该养成使用此功能的习惯。请记住,阅读代码的频率高于编写代码的频率。始终考虑您的读者,他们很可能不知道该语法的含义。

于 2012-10-25T06:40:40.520 回答
0

是的,这是 TP 日遗留下来的。你也可以这样写你的陈述

mystring:= 'Hello'#13#10'world!';

这可能比使用 ^M 和 ^J 不那么晦涩难懂,也更容易理解。当然,你真的应该定义常量

const
 crlf = #13#10

begin
 mystring:= 'Hello' + crlf + 'world!';
end;
于 2012-10-25T06:37:10.287 回答