Delphi中^H这类语法的作用是什么?旧组件迁移技术问询
Delphi中
^X字符常量语法解析 问题场景
迁移老旧组件到Delphi 12时遇到陌生语法:
someBoolean := key in [^H, #32..#255];
已知这是判断key是否属于指定ANSI字符集合,但对^H的含义存疑。测试发现将H替换为A、B、C或数字1时,Delphi 12和Delphi 7均可正常编译。
测试验证
在Delphi 7中编写测试代码:
procedure TForm1.Button1Click(Sender: TObject); var c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15: AnsiChar; begin c1 := ^A; c2 := ^B; c3 := ^C; c4 := ^D; c5 := ^E; c6 := ^F; c7 := ^G; c8 := ^H; c9 := ^Z; c10 := ^a; c11 := ^b; c12 := ^0; c13 := ^1; c14 := ^2; c15 := ^3; ShowMessage( IntToStr(Byte(c1)) + #13#10 + IntToStr(Byte(c2)) + #13#10 + IntToStr(Byte(c3)) + #13#10 + IntToStr(Byte(c4)) + #13#10 + IntToStr(Byte(c5)) + #13#10 + IntToStr(Byte(c6)) + #13#10 + IntToStr(Byte(c7)) + #13#10 + IntToStr(Byte(c8)) + #13#10 + IntToStr(Byte(c9)) + #13#10 + IntToStr(Byte(c10)) + #13#10 + IntToStr(Byte(c11)) + #13#10 + IntToStr(Byte(c12)) + #13#10 + IntToStr(Byte(c13)) + #13#10 + IntToStr(Byte(c14)) + #13#10 + IntToStr(Byte(c15))); end;
输出结果:
1
2
3
4
5
6
7
8
26
1
2
112
113
114
115
观察到:大写字母对应字母表位置,小写字母、数字的取值不符合常规ASCII表逻辑。
语法本质解析
^X是Object Pascal从Turbo Pascal继承的控制字符快捷表示法,对应键盘Ctrl+X组合键生成的ASCII字符,具体规则:
- 大写字母A-Z:
^X的ASCII码 =Ord(X) - 64。例如^A对应65-64=1(SOH控制符),^H对应72-64=8(退格键BS),^Z对应90-64=26(SUB控制符),与测试结果完全匹配。 - 小写字母a-z:编译器会自动转换为对应大写字母处理,因此
^a等价于^A,^b等价于^B,取值与大写版本一致。 - 数字0-9:
^X的ASCII码 =Ord(X) + 64。例如^0对应48+64=112(小写字母p),^1对应49+64=113(小写字母q),这是早期Pascal为兼容键盘输入逻辑设计的规则。
回到原始代码,[^H, #32..#255]的含义是:判断key是否为退格键(ASCII 8),或者属于ASCII 32到255的可打印字符/扩展ANSI字符。
内容的提问来源于stack exchange,提问作者TByte
相关产品推荐
相关产品推荐

