我正在使用 Delphi 7 和 Strings,并且 我遇到了这个:
对于默认长度的字符串,即简单地声明为字符串,最大大小始终为 255。 ShortString 永远不允许增长到超过 255 个字符。
有一次我必须在我的 Delphi 代码中做这样的事情(那是一个非常大的查询):
var
sMyStringOF256characters : String;
ilength : Integer;
begin
sMyStringOF256characters := 'ThisStringisofLength256,ThisStringisofLength256,.....'
// length of sMyStringOF256characters is 256
end;
...我收到此错误:
[错误] u_home.pas(38):字符串文字最多可以有 255 个元素。
但是当我尝试这个时:
var
iCounter : Integer;
myExtremlyLongString : String;
begin
myExtremlyLongString := '';
for iCounter := 0 to 2500 do
begin
myExtremlyLongString := myExtremlyLongString + IntToStr(iCounter);
end;
Label1.Caption := myExtremlyLongString;
Label2.Caption := IntToStr(Length(myExtremlyLongString));
end;
...结果是:
如您所见,
myExtremlyLongString
的长度是8894个字符。为什么 Delphi 没有给出任何错误提示 myExtremlyLongString
的长度超过 255?我也用过这个,但是没用:
SetLength(sMyStringOF256characters, 300);
为什么delphi没有给出任何错误说长度超过255 我的极长字符串?
您的答案在长字符串(AnsiString)部分的文本中。
在当前版本的 Delphi 中,字符串类型只是 Ansi 字符串,
因此字符串不限于 255 个字符,但字符串文字可以。这意味着您可以构建长度超过 255 个字符的字符串,但代码中的字符串值不能超过 255 个字符。如果你想要的话,你需要将它们分开。
sMyString:='ThisStringisofLength255'+'ThisStringisofLength255';
将其分为:
sMyStringOF256characters :=
'ThisStringis' +
'ofLength256' +
'And ManyManyManyManyManyManyManyManyManyManyManyManyMany' +
'ManyManyManyManyManyManyManyManyManyManyManyManyMany' +
'ManyManyManyManyManyManyManyManyManyManyManyManyMany' +
'ManyManyManyManyManyManyManyManyManyManyManyManyMany' +
'ManyManyManyManyManyManyManyManyManyManyManyManyMany' +
'ManyManyManyManyManyManyManyManyManyManyManyManyMany' +
'ManyManyManyManyManyManyManyManyManyManyManyManyMany' +
'ManyManyManyManyManyManyManyManyManyManyManyManyMany' +
'CharactersCharactersCharactersCharactersCharactersCharactersCharactersCharacters';
回到旧的 DOS/Turbo Pascal 时代,“字符串”确实被限制为 255 个字符。很大程度上是因为第一个字节包含字符串长度,而一个字节只能具有 0 到 255 之间的值。
这在当代版本的 Delphi 中不再是问题。
“ShortString”是旧 DOS/Pascal 字符串类型的类型。
“LongString”长期以来一直是默认的字符串类型(包括我目前用于大多数生产工作的 Borland Delphi 2006)。 LongStrings(又名“AnsiStrings”)可容纳 8 位字符,并且仅受可用内存的限制。
Delphi 的最新版本(Delphi 2009 及更高版本,包括新的 Delphi XE2)现在都默认为多字节 Unicode“WideString”字符串。 WideStrings 与 AnsiStrings 一样,实际上在最大长度上也是“无限”的。
这篇文章更详细地解释了:
区别在于,在第一个代码示例中,您将字符串作为代码的一部分 - 文字字符串。这对允许的字符数有限制。
在第二个代码示例中,您动态生成它,而不是将其作为一个大的文字字符串。
Delphi 中的字符串类型(与只能达到 255 的短字符串不同)可以与您的内存一样大。
您可以尝试使用 StringBuilder 类:
procedure TestStringBuilder;
var
I: Integer;
StringBuilder: TStringBuilder;
begin
StringBuilder := TStringBuilder.Create;
try
for I := 1 to 10 do
begin
StringBuilder.Append('a string ');
StringBuilder.Append(66); //add an integer
StringBuilder.Append(sLineBreak); //add new line
end;
OutputWriteLine('Final string builder length: ' + IntToStr(StringBuilder.Length));
finally
StringBuilder.Free;
end;
end;
如果您在 Delphi 中需要很长的字符串,您可以从其他资源(例如 txt 文件)或带有任何扩展名的纯文本加载它。我正在使用它并且它有效。您可以使用纯文本行号创建“类似”数组表。在delphi代码中,您可以按照@arjen van der Spek和其他人所说的进行操作。
对我来说,文本格式为 var 的文件 -
sometext:string=
'txt...'+
'txt...'+
'txt...';
不利于以后的编辑。
优点:您可以使用任何长文本。
缺点:文本代码是开放的,任何人都可以在记事本等中打开文件来读取它。