Pergunta

Tenho problemas para adicionar strings a uma lista de TString. Eu pesquisei outras postagens, mas não consegui encontrar uma resposta para isso.

O que estou tentando fazer é adicionar uma grande quantidade de cordas a uma lista de TString (mais de 14000), mas em algum lugar do processo eu recebo uma eaccessiolation. Aqui está o código que estou usando:

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;

¿O que há de errado com este código? A lista contém strings duplicados, então eu defino o Duplicates propriedade para dupAccept. Eu era capaz de carregar a lista usando LoadFromFile, mas não quero ter um arquivo de texto fora do meu aplicativo.

Espero que você possa me ajudar!!! Por favor, diga -me se você precisar de mais informações.

Muito obrigado. Eu realmente aprecio sua ajuda.

Foi útil?

Solução

As sugestões para o uso de um arquivo externo estão na marca aqui. No entanto, sua postagem indica seu desejo de não ter um arquivo externo. Eu sugiro que você vincule o arquivo ao executável como um recurso. Você pode fazer isso facilmente seguindo estas etapas:

Coloque todas as cordas em um arquivo de texto chamado StringData.txt (ou qualquer nome que você escolher). Em seguida, crie um arquivo .rc de qualquer nome que você escolher e coloque o seguinte (String_data pode ser qualquer identificador que você escolher):

STRING_DATA RCDATA "stringdata.txt"

Crie um arquivo .res a partir do .rc:

BRCC32 <name of rc>.rc

Agora faça referência a este arquivo do código -fonte. Coloque o seguinte em algum lugar na unidade:

{$R <name of res>.res}

Em vez de carregar a partir de um fluxo de arquivos, carregue de um fluxo de recursos:

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

Se você fizer compilações automatizadas na linha de comando, sugiro que você mantenha o arquivo .rc em controle de origem e construa os .res durante o processo de construção. Dessa forma, você também pode manter o arquivo stringdata.txt em controle de origem e quaisquer edições são capturadas automaticamente na próxima compilação sem precisar criar explicitamente o arquivo .res sempre que o arquivo .txt muda.

Outras dicas

Qual versão Delphi você está usando? Algumas versões mais antigas tiveram um bug no gerenciador de memória que pode causar uma violação de acesso ao tentar realocar uma matriz para um tamanho muito grande.

Tente adicionar Fastmm4 ao seu projeto para substituir o antigo gerenciador de memória e ver se isso ajuda.

Além disso, você provavelmente é melhor manter a lista em um arquivo externo. Sim, é outro arquivo, mas também significa que você pode alterar a lista sem precisar recompilar todo o programa. Isso também facilita a criação de atualizações (e distribuições!).

Mason provavelmente é adequado para a causa do AV; Esta é uma variedade bastante grande para crescer.
Em uma nota lateral, ao fazer um processamento tão longo em uma lista de strings, é recomendável cercá -lo por BeginUpdate/EndUpdate para evitar o disparo de qualquer evento de atualização.
Mesmo se você não tiver nenhum agora, eles podem ser adicionados mais tarde e você terá problemas.

Set list.capacidade para o número de itens que você planeja adicionar, imediatamente após criar a lista. Como alternativa, coloque a lista em um arquivo RC (nomeado que não seja com o nome do seu projeto) e adicione -o ao seu projeto. Isso é compilado em seu aplicativo, mas não envolve código executável para criar a lista.

Eu também me preocuparia com a integridade do compilador com um procedimento de 14.000 linhas. As pessoas encontraram outros casos em que ir além de qualquer coisa razoável quebra o compilador de várias maneiras.

Você também pode querer experimentar o THASHEDSTRINGLIST, pode ver um aumento de velocidade (embora não nesta função), embora não tenha certeza se o método Add é muito diferente.

Tente usar o seguinte em vez do seu código para adicionar as strings ao StringList

var
Str: string;
começar
Str: = '125-amost' + #13 #10;
Str: = str + 'tcumson' + #13 #10;
Str: = str + 'atlv 4300' + #13 #10;
Str: = str + '150t-15' + #13 #10;
................

List.Text: = str;

fim;

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top