Проблема добавление много струн в TStringList

StackOverflow https://stackoverflow.com/questions/1903723

  •  19-09-2019
  •  | 
  •  

Вопрос

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

То, что я пытаюсь сделать, - это добавить большое количество строк в TStringList (более 14000), но где -то в процессе я получаю экзамену. Вот код, который я использую:

procedure TForm1.FormCreate(Sender: TObject);
begin
    List := TStringList.Create;
    List.Duplicates := dupAccept;
end;

procedure TForm1.ButtonStartClick(Sender: TObject);
begin
    List.Clear;
    List.Add('125-AMPLE');
    List.Add('TCUMSON');
    List.Add('ATLV 4300');
    List.Add('150T-15');
    List.Add('TDL-08ZE');
    List.Add('RT20L');
    List.Add('SIN LINEA');
    List.Add('TIARA');
    List.Add('FL200ZK1');
    List.Add('FL250ZK1');
    List.Add('SIN LINEA');
    List.Add('CENTAURO-70 S.P.');
    List.Add('CORSADO');

{ This list continues to about 14000 strings...}

    List.Add('VOSJOD 2');
    List.Add('Z 125');
    List.Add('ZUMY');
    List.Add('NEW AGE 125');
    List.Add('SIN LINEA');
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    FreeAndNil(List);
end;

¿Что не так с этим кодом? Список содержит дублирующие строки, поэтому я установил Duplicates собственность dupAccept. Анкет Я смог загрузить список, используя LoadFromFile, но я не хочу иметь текстовый файл вне моего приложения.

Я надеюсь, что вы можете помочь мне!!! Пожалуйста, скажите мне, если вам нужна дополнительная информация.

Большое спасибо. Я действительно ценю твою помощь.

Это было полезно?

Решение

Предложения по использованию внешнего файла находятся здесь на отметке. Тем не менее, ваш пост указывает на ваше желание отсутствия внешнего файла. Затем я бы посоветовал вам связать файл с исполняемым файлом в качестве ресурса. Вы можете легко сделать это следующим образом:

Поместите все строки в текстовый файл с именем stringdata.txt (или любое имя, которое вы выберете). Затем создайте файл .rc из любого имени, который вы выберете, и вставьте в него следующее (string_data может быть любым выбранным вами идентификатором):

STRING_DATA RCDATA "stringdata.txt"

Создайте файл .res из .rc:

BRCC32 <name of rc>.rc

Теперь ссылайтесь на этот файл из исходного кода. Поместите следующее место в подразделении:

{$R <name of res>.res}

Вместо загрузки из потока файла загрузите из потока ресурсов:

StringData := TResourceStream.Create(HInstance, 'STRING_DATA', RT_RCDATA);
try
  List.LoadFromStream(StringData);
finally
  StringData.Free;
end;

Если вы выполняете автоматические сборки командной строки, я бы посоветовал вам сохранить файл .rc под управлением источника и создать .RE в процессе сборки. Таким образом, вы также можете сохранить файл stringdata.txt под управлением источника, и любые изменения автоматически поймают на следующей сборке без необходимости явно строить файл .res каждый раз, когда файл .txt меняется.

Другие советы

Какая версия Delphi вы используете? У некоторых более старых версий была ошибка в менеджере памяти, которая может вызвать нарушение доступа при попытке перераспределить массив на слишком большой размер.

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

Кроме того, вам, вероятно, лучше сохранить список во внешнем файле. Да, это еще один файл, но это также означает, что вы можете изменить список без необходимости перекомпилировать всю программу. Это также облегчает создание (и распределение!) Обновления.

Мейсон, вероятно, подходит для причины AV; Это довольно большой массив, чтобы расти.
С другой стороны, при выполнении такой длительной обработки в StringList рекомендуется окружить его путем BegnupDate/EndupDate, чтобы не запустить какое -либо событие обновления.
Даже если у вас нет сейчас, они могут быть добавлены позже, и вы получите проблемы.

Установите List.capicity к количеству элементов, которые вы планируете добавить, сразу после создания списка. В качестве альтернативы, поместите список в файл RC (названный, кроме имени вашего проекта) и добавьте его в свой проект. Это собирается в ваше приложение, но не включает исполняемый код для создания списка.

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

Вы также можете попробовать ThashedStringList, можете увидеть повышение скорости (хотя и не в этой функции), хотя я не уверен, что метод добавления сильно отличается.

Попробуйте использовать следующее вместо кода, чтобы добавить строки в StringList

вар
Str: String;
начинать
Str: = '125-выбор' + #13 #10;
Str: = str + 'tcumson' + #13 #10;
Str: = str + 'atlv 4300' + #13 #10;
Str: = str + '150t-15' + #13 #10;
................

List.text: = str;

конец;

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top