Подтвердить что ты не робот

Как delphi "струнные" литералы могут быть больше 255?

im работает над 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?

ИЗМЕНИТЬ я использовал

SetLength(sMyStringOF256characters,300);

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

4b9b3361

Ответ 1

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

У вас есть ответ немного в тексте в разделе Long String (AnsiString).

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

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

sMyString:='ThisStringisofLength255'+'ThisStringisofLength255';

Ответ 2

Разделите его на:

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

Ответ 3

Вернувшись в старые дни DOS/Turbo Pascal, "строки" действительно были ограничены 255 символами. Во многом потому, что первый байт содержал длину строки, а байт может иметь только значение от 0 до 255.

Это уже не проблема в современных версиях Delphi.

"ShortString" - это тип старого типа строки DOS/Pascal.

"LongString" долгое время был стандартным строковым типом (в том числе Borland Delphi 2006, который я сейчас использую для большинства производственных работ). LongStrings (aka "AnsiStrings" ) содержат 8-битные символы и ограничены только доступной памятью.

Последние версии Delphi (Delphi 2009 и выше, в том числе новый Delphi XE2) теперь по умолчанию используют многобайтовые строки Unicode "WideString". WideStrings, как AnsiStrings, также эффективно "неограниченны" в максимальной длине.

В этой статье объясняется более подробно:

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

Ответ 4

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

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

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

Ответ 5

Вы можете попробовать использовать класс 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;

Ответ 6

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

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

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

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

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

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