Delphi7字符串转字符数组报错:Record, object or class type required求解
问题原因与解决方法
你遇到的错误很典型——你把C#里的字符串方法用到Delphi上了!Delphi的String类型(不管是Ansi还是Unicode版本)根本没有ToCharArray这个成员方法,编译器看到s.ToCharArray的时候,以为你要访问某个类/对象的属性或方法,但String在Delphi里是原生值类型,不是类实例,所以才会抛出「Record, object or class type required」的错误。
下面给你两种可靠的实现方式,把Delphi字符串转成动态字符数组:
方法一:手动遍历复制(直观易理解)
这种方式适合新手,逻辑清晰,逐个把字符串里的字符复制到数组中:
procedure TForm1.Button1Click(Sender: TObject); var a: array of Char; s: String; i: Integer; begin s := Edit1.Text; // 先给动态数组分配和字符串长度一致的空间 SetLength(a, Length(s)); // Delphi字符串的索引从1开始,动态数组从0开始,注意偏移 for i := 1 to Length(s) do a[i-1] := s[i]; end;
方法二:用Move函数高效复制(性能更优)
如果处理的字符串很长,用Move内存拷贝会比循环遍历快很多:
procedure TForm1.Button1Click(Sender: TObject); var a: array of Char; s: String; begin s := Edit1.Text; SetLength(a, Length(s)); // 只有字符串非空时才需要拷贝,避免空指针问题 if Length(s) > 0 then Move(PChar(s)^, a[0], Length(s) * SizeOf(Char)); end;
额外说明
- Delphi 2009及以后版本的
String默认是UnicodeString,对应的Char是双字节的;2009以前是AnsiString,Char是单字节。上面的代码兼容所有版本,因为用了SizeOf(Char)来适配字节数。 - 如果只是临时需要字符指针,不需要真正的动态数组,直接用
PChar(s)就能获取字符串的字符指针,不需要额外复制。
内容的提问来源于stack exchange,提问作者hmahdavi




