向TStringList添加大量字符串时出现问题

2 delphi tstringlist

我在向TStringList添加字符串时遇到问题.我搜索过其他帖子但找不到答案.

我要做的是将大量字符串添加到TStringList(超过14000),但在此过程中我获得了EAccessViolation.这是我正在使用的代码:

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;
Run Code Online (Sandbox Code Playgroud)

¿这段代码出了什么问题?该列表包含重复的字符串,因此我将Duplicates属性设置为dupAccept.我能够使用加载列表LoadFromFile,但我不希望在我的应用程序之外有一个文本文件.

我希望你能帮帮我!!!如果您需要任何进一步的信息,请告诉我.

非常感谢你.我非常感谢你的帮助.

All*_*uer 18

有关使用外部文件的建议在此处标记.但是,您的帖子表明您不想拥有外部文件.然后,我建议您将文件链接到可执行文件作为资源.您可以按照以下步骤轻松完成此操作:

将所有字符串放入名为stringdata.txt(或您选择的任何名称)的文本文件中.然后创建一个.rc文件,其中包含您选择的任何名称,并将以下内容放入其中(STRING_DATA可以是您选择的任何标识符):

STRING_DATA RCDATA "stringdata.txt"
Run Code Online (Sandbox Code Playgroud)

从.rc创建一个.res文件:

BRCC32 <name of rc>.rc
Run Code Online (Sandbox Code Playgroud)

现在从源代码中引用此文件.将以下位置放在单元中:

{$R <name of res>.res}
Run Code Online (Sandbox Code Playgroud)

从资源流加载,而不是从文件流加载:

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

如果您执行命令行自动构建,我建议您将.rc文件保留在源代码管理下,并在构建过程中构建.res文件.这样,您还可以将stringdata.txt文件保留在源代码管理下,并且任何编辑都会自动捕获到下一个版本,而不必在每次.txt文件更改时显式构建.res文件.