You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 04:50:23