Delphi молча обрезает строковые литералы - PullRequest
7 голосов
/ 27 марта 2009

Delphi 2009 Win32.

Приведенный ниже код пытается добавить строку 257 к заметке. Он компилируется и работает нормально, но к заметке ничего не добавляется.

Memo1.Lines.Add('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa');

Похоже на ошибку компилятора. Это? Потому что, если бы строка была длиной 256, я бы получил ошибку компилятора и не смог бы скомпилировать приложение.

Есть ли способ заставить приложение сломаться, когда разработчик пытается сделать что-то подобное?

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

Спасибо

Ответы [ 5 ]

14 голосов
/ 27 марта 2009

Это ошибка Delphi 2009 со строковыми литералами, она должна вызывать ту же ошибку, что и D2007.

Попробуйте последнюю версию пакета исправлений IDE Andreas, в котором можно исправить эту ошибку. http://andy.jgknet.de/blog/?page_id=246

2 голосов
/ 30 марта 2009

Я согласен с Gamecat, но если бы вы имели дело с такой большой строкой, я бы ее сломал в несколько строк, чтобы помочь в чтении / редактировании.

если вы ВСЕГДА пытаетесь создать 257 "a", то почему бы не использовать функцию DupeString в модуле StrUtils?

Memo.Lines.Add( DupeString('a',257) );

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

var
  sLotsOfAs : string;
  ix : integer;
begin
  sLotsOfAs := DupeString('a',257);
  for ix := 0 to 1000000 do
    Memo.Lines.Add( sLotsOfAs );
end;
1 голос
/ 27 марта 2009

Строковый литерал может быть длиной всего 255 символов. Не уверен, почему они сохранили это ограничение. Но вы можете решить это, используя несколько литералов:

Memo1.Lines.Add('i have 128 chars' + 'i also have 128 chars').
0 голосов
/ 27 марта 2009

В Delphi 2007 я получаю:

[DCC Error] Unit1.pas(29): E2056 String literals may have at most 255 elements

В Delphi 5 я получаю:

[Error] Unit1.pas(29): String literals may have at most 255 elements

Если поведение D2009 такое, как вы описали, то на ум приходят две вещи:

1 - они расширили ограничение на число символов в строке, но TMemo все еще может только принимать до 255.

или

2 - это старая ошибка

Что касается предотвращения, единственное, о чем я могу думать, - это сделать регулярное выражение для поиска этих строк в ваших файлах .PAS.

0 голосов
/ 27 марта 2009

Я не знаю о D2009, но по крайней мере в Delphi 6 строковые литералы ограничены 255 символами, и компилятор диагностирует ошибку.

...