Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TStringList.Find gibt nie True zurück (https://www.delphipraxis.net/130952-tstringlist-find-gibt-nie-true-zurueck.html)

Forlan 16. Mär 2009 15:33


TStringList.Find gibt nie True zurück
 
Hallo zusammen..
Folgendes Problem:
Ich habe mir folgenden Quellcode überlegt, um zu prüfen ob eine Eingabe schon in meiner *.txt Datei vorhanden ist...

Delphi-Quellcode:
 List := TStringList.Create;
  if FileExists(ExtractFilePath(ParamStr(0))+'Words.txt') then
    begin
      List.LoadFromFile(ExtractFilePath(ParamStr(0))+'Words.txt');
      for j := 1 to List.Count-1 do
        begin
          k := j;
          if List.Find(Uppercase(tx),k) then
            begin
              ShowMessage('Wort bereits in Liste vorhanden!');
              break;
              List.Free;
              exit;
            end;
        end;
      try
        List.Free;
      finally

      end;
    end;
Jedoch wird nie ein Wort gefunden wenn es in der Datei vorhanden ist :?

Vielen Dank für euer Bemühen im vorraus ;)

DeddyH 16. Mär 2009 15:36

Re: TStringList.Find gibt nie True zurück
 
Ich kann gerade nicht nachschauen, was macht denn TStringlist.Find? Ansonsten finde ich die Reihenfolge etwas suboptimal gewählt.

Tyrael Y. 16. Mär 2009 15:37

Re: TStringList.Find gibt nie True zurück
 
...und was liefert IndexOf ?

...wenn IndexOf einen wert größer -1 leifert, ist der String in der Liste.

Bbommel 16. Mär 2009 15:38

Re: TStringList.Find gibt nie True zurück
 
Du musst dafür sorgen, dass die StringList sortiert ist, sonst funktioniert Find nicht (such also mal nach der Eigenschaft "sorted" in der Hilfe).

Außerdem brauchst du dann Find auch nicht in einer Schleife mehrfach aufrufen, sondern das durchsucht automatisch die ganze Liste.

Bis denn
Bommel

Forlan 16. Mär 2009 15:38

Re: TStringList.Find gibt nie True zurück
 
List.Find gibt eigentlich True zurück, wenn ein String, an meiner Stelle halt tx, an der stelle k vorhanden ist..
Und der Code wird auch noch überarbeitet, Stichwort: Subobtimale Reihenfolge ;)
Ich hab mir das ganze eben nur schnell überlegt :)

Forlan 16. Mär 2009 15:39

Re: TStringList.Find gibt nie True zurück
 
Zitat:

Zitat von Bbommel
Du musst dafür sorgen, dass die StringList sortiert ist, sonst funktioniert Find nicht (such also mal nach der Eigenschaft "sorted" in der Hilfe).

Außerdem brauchst du dann Find auch nicht in einer Schleife mehrfach aufrufen, sondern das durchsucht automatisch die ganze Liste.

Bis denn
Bommel

Danke, dass werde ich gleich mal versuchen :)

Tyrael Y. 16. Mär 2009 15:41

Re: TStringList.Find gibt nie True zurück
 
Für unsortierte Listen eignet sich IndexOf, wie oben beschrieben.
Auch das muss man nicht in einer Schleife abfragen.

DeddyH 16. Mär 2009 15:42

Re: TStringList.Find gibt nie True zurück
 
Richtig, IndexOf benutzt intern bereits eine Schleife.

Bbommel 16. Mär 2009 15:42

Re: TStringList.Find gibt nie True zurück
 
Zitat:

Zitat von Forlan
List.Find gibt eigentlich True zurück, wenn ein String, an meiner Stelle halt tx, an der stelle k vorhanden ist..

Das ist falsch. :) Find gibt dir true zurück, wenn tx in einer sortierten Liste vorhanden ist. Zusätzlich gibt dir Find noch die Stelle k zurück, an der der String gefunden wurde.

Du solltest indexOf benutzen, das funktioniert mit sortierten und unsortierten Listen (und nutzt auch die Vorteile von sortierten Listen). Oder die Liste sortieren... :)

Forlan 16. Mär 2009 15:45

Re: TStringList.Find gibt nie True zurück
 
Zitat:

Zitat von Tyrael Y.
Für unsortierte Listen eignet sich IndexOf, wie oben beschrieben.
Auch das muss man nicht in einer Schleife abfragen.

Super, mit IndexOf funktioniert es perfekt...
Vielen Dank :thumb:

Dipl Phys Ernst Winter 29. Mai 2009 16:00

Re: TStringList.Find gibt nie True zurück
 
Delphi-Quellcode:
List.LoadFromFile(ExtractFilePath(ParamStr(0))+'Words.txt');
Das geht sicher nicht! Eine Liste lässt sich nur aus einer Datei laden, in die mit List.SaveToFile eine Liste gespeichert wurde. Ich tippe mal, dass deine Liste leer bleibt.

Willst Du Testen, ob ein Wort in einer Textdatei vorhanden ist, musst do eine Wortliste der Datei erstellen.

Was soll das Uppercase in
Delphi-Quellcode:
if List.Find(Uppercase(tx),k) then

Muetze1 29. Mai 2009 16:22

Re: TStringList.Find gibt nie True zurück
 
1. Wenn die Datei nicht existiert, gibst du die angelegte StringList niemals frei.
2. Der Try/finally Block ist völlig falsch angewendet
3. List.Free bringt nach einem Break; überhaupt nix, da das Break die (innere) Schleife sofort verlässt
4. Das Exit dementsprechend ist genauso sinnlos.
5. Break verlässt nur die innere Schleife, d.h. in der äusseren macht er mit dem nächsten Durchlauf weiter...

Bbommel 31. Mai 2009 14:22

Re: TStringList.Find gibt nie True zurück
 
Zitat:

Zitat von Dipl Phys Ernst Winter
Delphi-Quellcode:
List.LoadFromFile(ExtractFilePath(ParamStr(0))+'Words.txt');
Das geht sicher nicht! Eine Liste lässt sich nur aus einer Datei laden, in die mit List.SaveToFile eine Liste gespeichert wurde. Ich tippe mal, dass deine Liste leer bleibt.

Das stimmt nicht - mit TStringList.LoadFromFile lässt sich jede Textdatei in eine StringList lesen, egal, wie diese Textdatei erstellt wurde. Wie kommst du darauf, dass das anders sein sollte?

Bis denn
Bommel

Dipl Phys Ernst Winter 7. Jun 2009 22:47

Re: TStringList.Find gibt nie True zurück
 
Zitat:

Das stimmt nicht - mit TStringList.LoadFromFile lässt sich jede Textdatei in eine StringList lesen, egal, wie diese Textdatei erstellt wurde. Wie kommst du darauf, dass das anders sein sollte
Ok! Dann stehen die Zeilen der Textdatei in den Items.
Nach denen hat er wohl nicht gesucht. Wenn ich ihn richtig verstanden habe, sucht er nach einzelnen Worten.

mkinzler 7. Jun 2009 22:57

Re: TStringList.Find gibt nie True zurück
 
Dies wiet aber eher auf eine Nichinstantiierung des StringList-Objektes hin.
Es sollte so aber jede beliebige Textdatei eingelesen werden können.

Luckie 7. Jun 2009 22:58

Re: TStringList.Find gibt nie True zurück
 
Zitat:

Zitat von Dipl Phys Ernst Winter
Was sollte auch in den Items der StringListe stehen??

... die Zeilen der Textdatei und zwar jeder beliebigen Textdatei.

quendolineDD 7. Jun 2009 23:04

Re: TStringList.Find gibt nie True zurück
 
Zitat:

Eine Liste lässt sich nur aus einer Datei laden, in die mit List.SaveToFile eine Liste gespeichert wurde
Vollkommen falsch.
Aus der Delphi-Hilfe (TDE 2006)
Zitat:

Beschreibung
Mit Methode LoadFromFile wird der Inhalt einer Textdatei in die Liste eines TStrings-Objekts geladen. Der Name der Datei wird im Parameter FileName übergeben. LoadFromFile löscht zunächst alle bereits in der Liste vorhandenen Strings. Danach wird jede Zeile der Textdatei, die mit einem Zeichen für Zeilenvorschub oder Wagenrücklauf endet, als String an die Liste angefügt.
Hinweis:
LoadFromFile verwendet die Methode Add, um die Liste aus einer Textdatei zu füllen.

Amateurprofi 7. Jun 2009 23:04

Re: TStringList.Find gibt nie True zurück
 
Zitat:

Zitat von Dipl Phys Ernst Winter
Zitat:

Das stimmt nicht - mit TStringList.LoadFromFile lässt sich jede Textdatei in eine StringList lesen, egal, wie diese Textdatei erstellt wurde. Wie kommst du darauf, dass das anders sein sollte
Weil ich da eine Exception Lesen von Adresse 00000 erhalte!
Was sollte auch in den Items der StringListe stehen??

Ein Item der StringListe enthält eine Zeile der Datei.

Zitat:

Zitat von Delphi Hilfe
Mit Methode LoadFromFile wird der Inhalt einer Textdatei in die Liste eines TStrings-Objekts geladen. Der Name der Datei wird im Parameter FileName übergeben. LoadFromFile löscht zunächst alle bereits in der Liste vorhandenen Strings. Danach wird jede Zeile der Textdatei, die mit einem Zeichen für Zeilenvorschub oder Wagenrücklauf endet, als String an die Liste angefügt.

Hinweis: LoadFromFile verwendet die Methode Add, um die Liste aus einer Textdatei zu füllen.


Luckie 7. Jun 2009 23:09

Re: TStringList.Find gibt nie True zurück
 
OK, ich glaube, das hätten wir jetzt geklärt, kommen wir zum eigentlichen Problem zurück. ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:50 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz