我有字符串添加到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;

¿什么不对的代码?该列表包含重复的字符串,所以我设置Duplicates属性dupAccept。我能够加载使用LoadFromFile的名单,但我不想让我的应用程序之外的文本文件。

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

非常感谢你。我真的很感谢你的帮助。

有帮助吗?

解决方案

使用外部文件中的建议是上的标记在这里。但是,您的文章表明您不具有外部文件的愿望。那么我会建议你将文件作为资源链接到可执行文件。您可以轻松地做到这一点以下步骤:

将所有的字符串到一个文本文件名为stringdata.txt(或任何名称你选择)。然后创建您选择的任何名称的rc文件,并把下列它(STRING_DATA可以是您选择任何标识符):

STRING_DATA RCDATA "stringdata.txt"

从.RC创建res文件:

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文件的源代码控制下,并在构建过程中建立的.res。这种方式,您也可以保持stringdata.txt文件源代码控制之下,任何编辑都对未来建设自动捕获,而不必明确建立.RES每次文件.txt文件的更改。

其他提示

什么版本的Delphi您使用的是?一些旧的版本在内存管理器中的错误可能会导致试图重新分配数组的大小是过大时访问冲突。

尝试添加 FastMM4 您的项目,以取代旧的内存管理器,看看有没有什么帮助。

此外,你可能断保持在一个外部文件列表更好。是的,它的另一个文件,但它也意味着你可以改变列表,而无需重新编译整个程序。这也使得创建(并分发!)更新更容易。

梅森可能是正确的AV的原因;这是一个相当大阵增长。结果 在一个侧面说明,在StringList的做这么长的处理时,它的建议的BeginUpdate / EndUpdate包围,以避免任何射击更新事件。结果 即使你没有任何现在,他们可能会在以后添加,你会得到的问题。

设置list.capacity你打算添加,创建列表后的项目数。或者,将名单在RC文件(不是与你的项目的名称命名的除外),并将其添加到您的项目。这被编译到您的应用程序,但不涉及可执行代码来创建列表。

我也担心有14000线程序编译器的完整性。人们发现其他情况下,超越任何合理的休息以各种方式编译。

您也可以尝试THashedStringList,可以看到一个速度提升(虽然不是在此功能),虽然我不知道,如果add方法是一大堆不同的。

尝试使用以下,而不是你的代码字符串添加到的StringList

变种,点击 STR:字符串;结果 开始结果   STR:= '125-AMPLE' +#13#10;结果,   STR:= STR + 'TCUMSON' +#13#10;结果,   STR:= STR + 'ATLV 4300' +#13#10;结果,   STR:= STR + '150T-15' +#13#10;结果,   ................

List.Text:=海峡;

端;

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top