如何解决delphi声明ansi字符串的大小
| 轻松定义大小为3的字符串(在旧的delphi代码中)st:string[3];
现在,我们希望将代码移至ansi
st:ansiString[3];
将无法正常工作!
和高级OEM类型
st:oemString[3];
同样的问题,在哪里
type
OemString = Type AnsiString(CP_OEMCP);
如何声明固定长度的ansi字符串和新的oem类型?
更新:我知道它将创建一个固定长度的字符串。它是软件设计的一部分,可以防止错误,并且对于程序至关重要。
解决方法
您不需要定义AnsiString的大小。
记号
string[3]
用于Pascal(和Delphi 1)使用的短字符串,并且主要保留用于传统目的。
短字符串的长度可以为1到255个字节。第一个(\“ hidden \”)字节包含长度。
AnsiString是指向字符缓冲区的指针(0终止)。它具有一些内部魔术,例如引用计数。而且您可以安全地将字符添加到现有字符串中,因为编译器将为您处理所有令人讨厌的细节。
UnicodeStrings与AnsiStrings类似,但是具有Unicode字符(在这种情况下为2个字节)。现在,默认字符串(Delphi 2009)映射到UnicodeString。
AnsiString类型具有构造以添加代码页(用于定义127以上的字符),从而添加CP_OEMCP:
OemString = Type AnsiString(CP_OEMCP);
, \“ Short Strings \”是\“ Ansi \” String,因为仅可用于向后兼容Delphi之前的代码。
st: string[3];
从Delphi 2009开始,我们将始终使用当前的Ansi代码页/字符集创建固定长度的“短字符串”。
但是,这样的短字符串与所谓的“ 7”并不相同。没有短字符串的代码页。由于没有短字符串的引用计数。
代码页仅适用于AnsiString
类型,它不是固定长度的,而是可变长度的,并且引用计数,因此与than9ѭ定义的短字符串完全不同。
根据设计,您不能只混合Short String
和AnsiString
类型声明。两者都称为“字符串”,但类型多样。
这是ѭ10的映射
st[0] = length(st)
st[1] = 1st char (if any) in st
st[2] = 2nd char (if any) in st
st[3] = 3rd (if any) in st
这是AnsiString
或UnicodeString
类型的内存映射:
st = nil if st=\'\'
st = PAnsiChar if st<>\'\'
这是PSt: PAnsiChar
布局:
PWord(PSt-12)^ = code page
PWord(PSt-10)^ = reference count
PInteger(PSt-8)^ = reference count
PInteger(PSt-4)^ = length(st) in AnsiChar or UnicodeChar count
PAnsiChar(PSt) / PWideChar(PSt) = Ansi or Unicode text stored in st,finished by a #0 char (AnsiChar or UnicodeChar)
因此,如果AnsiString
类型和UnicodeString
类型之间存在某些相似之处,则short string
类型将完全不同,并且不能随意混合。
, 这仅在Delphi的Unicode版本中的String [3]默认为3 WideChars时才有用。这会让我感到惊讶,但如果是这样,请使用:
st: array[1..3] of AnsiChar;
, ansistring和unicodestring的大小将动态增长。编译器和运行时代码将为您处理所有这些工作。
请参阅:http://delphi.about.com/od/beginners/l/aa071800a.htm
有关更深入的说明,请参见:http://www.codexterity.com/delphistrings.htm
长度可以是1字符到2GB。
, 但是在Delphi中,旧的ShortString类型和较新的字符串类型是动态的。它们根据需要生长和收缩。您可以调用SetLength()将字符串预分配为给定的长度,如果必须逐个将数据逐段添加到知道最终长度的字符串中,则有助于避免重新分配内存,但即使在此之后字符串仍然可以增长并在添加或删除数据时缩小。
如果您需要静态字符串,则可以使用char [0..n]数组,其大小不会动态更改。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。