2012-01-07 67 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; 
相關問題