2012-01-07 38 views
20

IM工作的德尔福7和我工作的一个字符串,我碰到这个delphi'string'文字怎么能超过255?

对于默认长度的字符串,也就是宣布简称为字符串,最大大小始终是255。ShortString短决不允许增长到超过255个字符。

delphi strings

有一次,我不得不做这样的事情在我的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:=''; 
     Label1.Caption:=''; 
     for iCounter:=0 to 2500 do 
     begin 
      myExtremlyLongString:=myExtremlyLongString+inttostr(iCounter); 
      Label1.Caption:=myExtremlyLongString; 
     end; 
     Label2.Caption:=inttostr(length(myExtremlyLongString)); 
    end; 

,其结果是

enter image description here

正如你可以看到myExtremlyLongString的长度为字符。

为什么delphi没有给出任何错误,说长度超过255为myExtremlyLongString

编辑 我用

SetLength(sMyStringOF256characters,300); 

,但它不工作。

+0

也许你只是读错文档。顺便说一句,它真的不清楚你的意思是“动态分配”,而不是......什么? – OnTheFly 2012-01-07 12:51:18

+0

@ user539484:在循环过程中运行时的含义可能是strVal:= mystring,就像是一个循环值,你赋值给字符串变量 – PresleyDias 2012-01-07 12:57:30

+1

啊,从头开始“动态”的,然后,关于赋值与**声明**。上面引用的内容是关于声明,更具体地说是关于字符**文字**的编译器限制。它已经通过历史手段连接到Turbo Pascal字符串。 – OnTheFly 2012-01-07 13:19:33

回答

31

为什么没有delphi给出任何错误,说长度超过255为 myExtremlyLongString?

您在长字符串(AnsiString)中的文本中有一些错误。

在Delphi的当前版本,该字符串类型只是对 AnsiString类型的别名,

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

sMyString:='ThisStringisofLength255'+'ThisStringisofLength255'; 
+0

它的工作原理,感谢您的解释和例子 – PresleyDias 2012-01-07 07:39:10

2

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

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

Delphi中的字符串类型(不像短字符串最多只能达到255)可以和您的记忆一样大。

+0

+1“可以大如你的记忆。”那是一个非常大的字符串,然后 – PresleyDias 2012-01-07 07:40:08

+1

它不能被大如你的记忆。最大的Delphi字符串类型仍然限制为2GB字符。 http://docwiki.embarcadero.com/RADStudio/XE3/en/String_Types – alcalde 2013-09-24 21:47:41

7

其分解成:

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

+1,我曾试图相似(THA少255是肯定的),用于查询一次,那个时候我就想,极限是255,所以没有无法超越255..nice例子感谢名单 – PresleyDias 2012-01-07 07:42:35

4

早在老的DOS/Turbo Pascal的天, “串” 确实被限制在255个字符。在很大程度上是因为第一个字节包含字符串长度,而一个字节只能有一个介于0和255之间的值。

这在Delphi的当代版本中不再是问题。

“ShortString”是旧DOS/Pascal字符串类型的类型。

“LongString”是很长一段时间的默认字符串类型(包括目前用于大多数生产工作的Borland Delphi 2006)。 LongStrings(又名“AnsiStrings”)保存8位字符,并且仅受可用内存的限制。

最新版本的Delphi(Delphi 2009及更高版本,包括新的Delphi XE2)现在都默认为多字节Unicode“WideString”字符串。像AnsiStrings一样,WideStrings在最大长度上也是有效的“无限”。

本文详细介绍了:

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

+0

+1好的解释 – PresleyDias 2012-01-07 07:39:37

+2

这不再是在Delphi中的当代版本的问题,除了在两个地方; (!明明)字符串常量,并在琴弦下标串一样[50],其中限制为250或更少,在我提到的情况下,限制为50 – 2012-01-07 14:14:55

+0

@Warren P - 你是绝对正确的。字符串文字的解决方法是使用其他线程中讨论的“'mystring'+”语法。 – paulsm4 2012-01-09 01:52:36

0

如果您需要在Delphi真的长字符串,你可以像一个txt文件,或与任何扩展仅仅是纯文本从其他资源加载它。我使用它,它的工作原理。您可以使用纯文本行数创建“像一个”数组表。在delphi代码中,你可以像@arjen van der Spek和其他人说的那样。

对于我来说,用文本文件作为VAR的格式化 -

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

是坏对未来的编辑。

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

缺点:文本代码是开放的,任何人都可以阅读它在记事本等

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; 
相关问题