Delphi“字符串”文字如何超过 255 个字符?

问题描述 投票:0回答:6

我正在使用 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; 

...结果是:

Delphi Form show both Label's values

如您所见,

myExtremlyLongString
的长度是8894个字符。为什么 Delphi 没有给出任何错误提示
myExtremlyLongString
的长度超过 255?我也用过这个,但是没用:

SetLength(sMyStringOF256characters, 300);
string delphi size delphi-7 string-literals
6个回答
46
投票

为什么delphi没有给出任何错误说长度超过255 我的极长字符串?

您的答案在长字符串(AnsiString)部分的文本中。

在当前版本的 Delphi 中,字符串类型只是 Ansi 字符串,

因此字符串不限于 255 个字符,但字符串文字可以。这意味着您可以构建长度超过 255 个字符的字符串,但代码中的字符串值不能超过 255 个字符。如果你想要的话,你需要将它们分开。

sMyString:='ThisStringisofLength255'+'ThisStringisofLength255';

11
投票

将其分为:

sMyStringOF256characters := 
  'ThisStringis' +
  'ofLength256' +
  'And ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'CharactersCharactersCharactersCharactersCharactersCharactersCharactersCharacters';

5
投票

回到旧的 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 一样,实际上在最大长度上也是“无限”的。

这篇文章更详细地解释了:

http://delphi.about.com/od/beginners/l/aa071800a.htm


2
投票

区别在于,在第一个代码示例中,您将字符串作为代码的一部分 - 文字字符串。这对允许的字符数有限制。

在第二个代码示例中,您动态生成它,而不是将其作为一个大的文字字符串。

Delphi 中的字符串类型(与只能达到 255 的短字符串不同)可以与您的内存一样大。


1
投票

您可以尝试使用 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;

0
投票

如果您在 Delphi 中需要很长的字符串,您可以从其他资源(例如 txt 文件)或带有任何扩展名的纯文本加载它。我正在使用它并且它有效。您可以使用纯文本行号创建“类似”数组表。在delphi代码中,您可以按照@arjen van der Spek和其他人所说的进行操作。

对我来说,文本格式为 var 的文件 -

sometext:string=
'txt...'+
'txt...'+
'txt...';

不利于以后的编辑。

优点:您可以使用任何长文本。

缺点:文本代码是开放的,任何人都可以在记事本等中打开文件来读取它。

© www.soinside.com 2019 - 2024. All rights reserved.