Autor Beitrag
GuaAck
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 376
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: Sa 17.04.21 19:59 
Hallo,

ich lese aus einer Datei die Pfadnamen einer Sammlung von Dateien und möchte dann alle Dateien in dem durch Pfad angegebenen Verzeichnis untersuchen oder verändern. In meiner Datei können Pfade mehrfach vorkommen, ich darf aber die Dateien in jedem Pfad nicht doppelt bearbeiten. Ich schreibe deshalb jeden bearbeiteten Pfad in eine TStringlist und bevor ich mit der Bearbeitung eines Pfades beginne, prüfe ich mit TStringlist.find, ober ich den Pfad nicht schon einmal hatte.

Ich habe festgestellt, dass das find gelegentlich anscheinend ein Vorkommen nicht findet. Ich kann über TStringlist.strings[index] sehen, dass der nicht gefundenen Pfad eingetragen ist und im Debugger mit Auswerten/Ändern wird für den Ausdruck "TStringlist.strings[index]=Pfad" "true" berechnet, die Strings sind also wirklich gleich. Mit meiner "Ersatzfunktion" geht es zuverlässig.

Hat jemand so etwas schon mal gehabt? (Mit der Suchfunktion hier im Forum habe ich jedenfalls nichts gefunden.) Gibt es eine Tücke, die ich übersehen habe? Oder hat TStringlist.find wirklich eine Macke?

Viele Grüße
GuaAck

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
  VAR
    Pfad: STRING;
    DirIndex: integer;
    gefunden: boolean;
  BEGIN
//  Dirliste:TStringlist  ist vorhanden und enthält schon Einträge.

    Pfad := .....

//  DAS FUNKTIONIERT NICHT ZUVERLÄSSIG!
//  IF NOT Dirliste.Find(Pfad, DirIndex) THEN
//  --> Ersatz-Code
      gefunden:=false;
      DirIndex:=0;
      WHILE NOT gefunden and (DirIndex<=(Dirliste.Count-1)) DO
        BEGIN
        gefunden:=(DIRliste.strings[DirIndex]=Pfad);
        DirIndex:=DirIndex+1;
        END;
      DirIndex:=DirIndex-1;
      if NOT gefunden then
//  --> Ersatz-Code-Ende
        BEGIN
          Dirliste.add(Pfad);
          .... usw.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 17.04.21 22:34 
Hast du dir denn einmal die Dokumentation zu Find angeschaut?
Find funktioniert nur bei sortierten Listen. Ansonsten musst du IndexOf verwenden.
GuaAck Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 376
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: So 18.04.21 00:35 
Bingo, das war es,

ja ich habe die Dokumentation gelesen und bei zwei sortierte Listen das "find" angewendet. Jetzt, nach einiger Zeit, habe ich die Pfadliste ergänzt, die aber nicht auf "sorted" eingestellt, meinen Code aus einer der bei beiden anderen Listenbearbeitungen kopiert, und schon war der Fehler passiert, weil ich IndexOf nicht mehr im Kopf hatte.

Danke vielmals,
schönen Sonntag,
Gruß GuaAck