как delphi 'строковые' литералы могут быть больше 255? - PullRequest
23 голосов
/ 07 января 2012

я работаю над delphi 7 , и я работал над строками, я наткнулся на это

Для строки длины по умолчанию, то есть объявляемой просто как строка, максимальный размер всегда равен 255. Строка ShortString никогда не может увеличиваться до более чем 255 символов.

на строки Delphi

однажды мне пришлось сделать что-то подобное в моем коде 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 составляет 8894 символов.

почему delphi не выдала ошибку, указав, что длина превышает 255 для myExtremlyLongString ?

EDIT я использовал

SetLength(sMyStringOF256characters,300);

но это не работает.

Ответы [ 6 ]

33 голосов
/ 07 января 2012

почему Delphi не выдал ошибку, сказав, что длина myExtremlyLongString превышает 255?

Ваш ответ немного ниже в тексте в разделе Длинная строка (AnsiString) .

В текущих версиях Delphi тип строки является просто псевдонимом для AnsiString,

Таким образом, строка не ограничена 255 символами, но является строкойбуквальный есть.Это означает, что вы можете создать строку длиной более 255 символов, но вы не можете иметь строковое значение в коде длиной более 255 символов.Вы должны разделить их, если хотите.

sMyString:='ThisStringisofLength255'+'ThisStringisofLength255';
7 голосов
/ 07 января 2012

Разделить на:

sMyStringOF256characters := 
  'ThisStringis' +
  'ofLength256' +
  'And ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'CharactersCharactersCharactersCharactersCharactersCharactersCharactersCharacters';
4 голосов
/ 07 января 2012

В старые времена DOS / Turbo Pascal «строки» действительно были ограничены 255 символами.Во многом потому, что 1-й байт содержал длину строки, а байт может иметь значение только от 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 голосов
/ 07 января 2012

Разница в том, что в вашем первом примере кода вы помещаете строку как часть вашего кода - буквальную строку.Это ограничивает количество символов, которое он допускает.

Во втором примере кода вы генерируете его динамически, а не помещаете его как одну большую литеральную строку.

Строковый тип в Delphi (в отличие откороткая строка, которая может быть только до 255), может быть такой же большой, как ваша память.

1 голос
/ 26 марта 2013

Вы можете попробовать использовать класс 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 голосов
/ 19 января 2013

Если вам нужна действительно длинная строка в Delphi, вы можете загрузить ее из других ресурсов, таких как текстовые файлы или просто текст с любым расширением.Я использую это, и это работает.Вы можете создавать таблицы массивов "like a", используя номера строк в виде простого текста.В коде delphi вы можете делать так, как говорит @arjen van der Spek и другие.

Для меня файлы с текстом в формате var -

sometext:string=<br/> 'txt...'+<br/> 'txt...'+<br/> 'txt...';

плохо для будущего редактирования.

плюсы: вы можете использовать любой длинный текст.

минусы: текстовый код открыт, любой может прочитать его, открыв файл в блокноте и т. д.

...