Frage

Ich habe ein Problem damit, Strings zu einer TStringlist hinzuzufügen. Ich habe andere Beiträge durchsucht, konnte aber keine Antwort darauf finden.

Ich versuche, eine große Anzahl von Saiten zu einer Tstringlist (mehr als 14000) hinzuzufügen, aber irgendwo im Prozess bekomme ich eine Zeit. Hier ist der Code, den ich verwende:

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;

Was ist los mit diesem Code? Die Liste enthält doppelte Saiten, sodass ich die festgelegt habe Duplicates Eigentum an dupAccept. Ich konnte die Liste verwenden LoadFromFile, aber ich möchte keine Textdatei außerhalb meiner Anwendung haben.

Ich hoffe ihr könnt mir helfen!!! Bitte sagen Sie mir, ob Sie weitere Informationen benötigen.

Vielen Dank. Ich schätze deine Hilfe sehr.

War es hilfreich?

Lösung

Die Vorschläge für die Verwendung einer externen Datei sind hier auf der Marke. Ihr Beitrag zeigt jedoch Ihren Wunsch an, keine externe Datei zu haben. Ich würde dann vorschlagen, dass Sie die Datei mit der ausführbaren Datei als Ressource verknüpfen. Sie können dies leicht ausführen: folgenden Schritten:

Platzieren Sie alle Zeichenfolgen in eine Textdatei namens StringData.txt (oder welchen Namen Sie auch immer, den Sie wählen). Erstellen Sie dann eine .rc -Datei mit jedem Namen, den Sie auswählen, und geben Sie Folgendes ein (String_Data kann eine beliebige Bezeichnung sein, die Sie auswählen):

STRING_DATA RCDATA "stringdata.txt"

Erstellen Sie eine .res -Datei aus dem .rc:

BRCC32 <name of rc>.rc

Verweisen Sie nun auf diese Datei aus dem Quellcode. Platzieren Sie den folgenden Ort in das Gerät:

{$R <name of res>.res}

Anstatt aus einem Dateistrom zu laden, laden Sie aus einem Ressourcenstrom:

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

Wenn Sie automatisierte Gebäude für Befehlszeilen durchführen, würde ich empfehlen, die .rc-Datei unter der Quellvertretung zu behalten und die .res während des Build-Prozesses zu erstellen. Auf diese Weise können Sie auch die Datei StringData.txt unter der Quelldatei behalten, und alle Änderungen werden automatisch beim nächsten Build erfasst, ohne dass die .res -Datei bei jedem ändert.

Andere Tipps

Welche Delphi -Version verwenden Sie? Einige ältere Versionen hatten einen Fehler im Speichermanager, der einen Zugriffsverletzungen verursachen kann, wenn er versuchte, ein Array zu einer zu großen Größe neu zuzuordnen.

Versuchen Sie hinzu Fastmm4 In Ihrem Projekt, um den alten Speichermanager zu ersetzen und zu sehen, ob dies hilft.

Sie sind wahrscheinlich besser dran, die Liste in einer externen Datei zu halten. Ja, es ist eine andere Datei, aber es bedeutet auch, dass Sie die Liste ändern können, ohne das gesamte Programm neu kompilieren zu müssen. Dies erleichtert auch das Erstellen (und verteilen!) Updates.

Mason ist wahrscheinlich richtig für die Sache des AV; Dies ist ein ziemlich großes Array, um zu wachsen.
Nebenbei bemerkt, dass bei einer so langen Verarbeitung auf einer StringList empfohlen wird, sie durch beginUpdate/endupdate zu umgeben, um das Abfeuern eines Update -Ereignisses zu vermeiden.
Auch wenn Sie jetzt keine haben, werden sie möglicherweise später hinzugefügt und Sie werden Probleme.

Setzen Sie die Liste auf die Anzahl der Elemente, die Sie hinzufügen möchten, unmittelbar nach dem Erstellen der Liste. Stellen Sie die Liste alternativ in einer RC -Datei (außer dem Namen Ihres Projekts benannt) und fügen Sie sie Ihrem Projekt hinzu. Dies wird in Ihre Anwendung zusammengestellt, beinhaltet jedoch keinen ausführbaren Code, um die Liste zu erstellen.

Ich würde mich auch um Compiler -Integrität mit einem Zeilenverfahren von 14.000 Sorgen machen. Die Menschen haben andere Fälle gefunden, in denen über etwas Vernünftige, die den Compiler auf verschiedene Weise übertroffen haben, auf verschiedene Weise unterbricht.

Möglicherweise möchten Sie auch ThashedStringList versuchen, könnten einen Geschwindigkeitsschub sehen (obwohl nicht in dieser Funktion), obwohl ich nicht sicher bin, ob die Add -Methode viel unterschiedlich ist.

Versuchen Sie, das folgende anstelle Ihres Codes zu verwenden, um die Zeichenfolgen zur StringList hinzuzufügen

var
STR: String;
Start
STR: = '125-Probe' + #13 #10;
STR: = str + 'tcumson' + #13 #10;
STR: = STR + 'ATLV 4300' + #13 #10;
STR: = STR + '150T-15' + #13 #10;
................

List.text: = str;

Ende;

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top