Dateien suchen und einlesen



  • Hallo Gemeinde,

    ich habe Probleme mit FindFirst, FindNext mit dem folgenden Code(ein wenig gekürzt):

    ListView1->Clear();
    
       AnsiString workpath1 = ExtractFilePath(Application->ExeName)+"\\dateien\\*"+Edit3->Text+"*.txt";
       AnsiString workpath  = ExtractFilePath(Application->ExeName)+"\\dateien\\";
    
       TSearchRec sr;
       TListItem *ListIt;
    
      if (FindFirst(workpath1, faAnyFile, sr) == 0)
    
      {
        do
        {
            TIniFile* IniFile = new TIniFile(workpath+sr.Name);
            AnsiString gruppe = IniFile->ReadString("1","GRUPPE","");
            AnsiString gattung = IniFile->ReadString("1","GATTUNG","");
    
            ListIt = ListView1->Items->Add();
            ListIt->Caption = gruppe;
            ListIt->SubItems->Add(gattung);
    
            delete IniFile;
         }
         while (FindNext(sr) == 0);
    
        FindClose(sr);
      }
      delete ListIt;
    

    In dem Ordner befinden sich jetzt immer Textdateien mit versch. Inhalten im TIni-Format z.B. Fisch.txt Fischer.txt Filet.txt.
    Ich würde jetzt gerne die Dateien bzw. deren Inhalte in einem ListView anzeigen. Teilweise klappt das auch, jedoch fehlen bei eingeschränkter Suche immer versch. Dateien oder es werden welche doppelt angezeigt, in jedem Fall ist das Ergebnis nie ganz in Ordnung.

    Vielen Dank
    Gruß myerscola



  • Das delete ListIt am Ende der Methode sieht mir sehr suspekt aus... wofür brauchst du das? Wenn FindFirst false zurückgibt führt das übrigens zu undefiniertem Verhalten, weil ListIt einen zufälligen Wert hat und dann irgendwo in den Adressraum zeigt.



  • Danke an DocShoe, das war der Fehler.
    Nur, wie gebe ich den Speicher von dem mit

    TListItem *ListIt;
    

    erzeugtem TListItem wieder frei , wenn nicht mit

    delete ListIt;
    

    oder muss ich das gar nicht?



  • Hallo,

    ich glaube das musst du gar nicht weil das übergeordnete ListView nach dem Löschen alles aufräumt was zu ihm gehört.

    LG, Micha



  • Das TListItem brauchst du nicht selbst abzuräumen, weil das TListView Objekt sich beim Erzeugen des Items den Besitz des Objektes übernimmt (Stichwort: TObject* Owner).
    Mit dem Originalcode hast du übrigens nur das letzte (oder gar keins) Item zerstört, weil du erst alle Dateien durchläufst und für jede Datei ein neues TListItem erzeugst, aber erst nach dem Verlassen der Schleife das Item zerstörst.



  • Ok, danke Euch Beiden für die Antworten, war mir wichtig zu wissen warum das so ist.

    Liebe Grüße myerscola



  • myerscola schrieb:

    Nur, wie gebe ich den Speicher von dem mit

    TListItem *ListIt;
    

    erzeugtem TListItem wieder frei (...) ?

    Hiermit wird kein Speicher reserviert, der wieder frei gegeben werden muss. Es wird einfach nur eine lokale Zeigervariable erzeugt, die am Ende der Funktion auch wieder automatisch gelöscht wird.

    Erst mit dem ->Add wird hier eine neue Instanz erzeugt, allerdings wird das TListItem von der TListView erzeugt und ist dessen Eigentümer. Die Funktion liefert nur einen Zeiger darauf zurück.

    Grundsätzlich kann man sagen: Nur wenn man ein new verwendet, muss man auch ein delete verwenden.

    Kam, meiner Meinung nach, nicht ganz klar rüber...

    Gruß KK


Log in to reply