speichern von ListView ?



  • Gibt es da eine fertige Lösung zum Speichern vom Inhalt eines ListView(wie bei ComboBox,oder eigene fertige VCL), falls nicht werd ichs mit .ini machen, oder fällt jemandem eine bessere Idee ein.

    MFG pera
    ps.: es ist ein ViewStyle=vsReport

    [ Dieser Beitrag wurde am 29.05.2002 um 16:54 Uhr von pera editiert. ]



  • naja so fertig gibts da noch nix, nur so halb...

    einfach über alle zeilen gehen und die subitems einfach mit SaveToFile (da die ja von TStrings kommen) speichern.



  • Hallo ihrs,

    ich habe ein kleines Programm geschrieben, in welches ich daten (caption und 2 Subitems einlese).

    Nun würde ich gerne diese speiocher, im Forum ahbe ichs chon gelesen, dass das so einfahc mit ListViw1->...->SaveToFile("Test.txt"); nicht geht.

    Nun suche ich ne möglichkeit, wie ich die Liste von Anfang bis end emit ner For Schleife durchlaufe und die einzelnen Zeilen in einen String einlese und den mit ofstream in ne Datei schreibe.

    Aber wie laufe ich die liste von oben nach unten durch.

    MitListBox geht das ja leicht aber wie bei ListView.

    Habe absolut keine idee.

    Kann mir einer helfen?????????

    Dank.

    ciao zani





  • Hallo,

    cih habe jedtzt doch mit der Hilfe eines Users was gefunden.

    Aber nun habe ich doch nocht ne frage.

    Ich weiß zwar jetzt, wie ich mit der For-Schleife auf die einzlenen Elemente zugreife.

    Aber wie kann ich afu die SubItems zugreifen???

    String test;
    string cap;
    string subit;
    
    for(int i = 0; i < 2; i++)
    {
        subit=ListView1->Items->Item[i]->SubItems; //das geht nicht
        cab=ListView1->Items->Item[i]->Caption; //das geht aber
    }
    


  • Das hat sich ja zu einer häufig gefragten Frage entwickelt, deshalb hier mal ein konkreter Lösungsvorschlag:

    //---------------------------------------------------------------------------
    void __fastcall TForm1::SaveBtnClick(TObject *Sender)
    {
      TStringList *list = new TStringList();
      for (int i = 0; i < ListView1->Items->Count; i++)
      {
        list->Add(ListView1->Items->Item[i]->Caption + "," +
                  ListView1->Items->Item[i]->SubItems->CommaText);
      }
      list->SaveToFile("c:/listview.txt");
      delete list;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::LoadBtnClick(TObject *Sender)
    {
      TStringList *list = new TStringList();
      list->LoadFromFile("c:/listview.txt");
    
      for (int i = 0; i < list->Count; i++)
      {
        String str_tmp = list->Strings[i];
        int pos = str_tmp.Pos(",");
    
        TListItem *pItem = ListView1->Items->Add();
        pItem->Caption = str_tmp.SubString(1, pos - 1);
        str_tmp.Delete(1, pos + 1);
        pItem->SubItems->CommaText = str_tmp;
      }
      delete list;
    }
    //---------------------------------------------------------------------------
    

    Bei Bedarf könnten natürlich auch noch die Anzahl der Columns, Spaltenbreite usw. mitgespeichert werden.



  • hi

    Wer auf inis steht 😃

    void __fastcall TForm1::SaveButtonClick(TObject *Sender)
    {
    int old;
    TIniFile *SearchListini = new TIniFile(ExtractFilePath(Application->ExeName)+"save.INI" );
    
    SearchListini->WriteInteger("save","rows",ListView6->Items->Count);
    for (int i=0;i<SearchListini->ReadInteger("saveold","rows",0);i++)
        SearchListini->EraseSection(IntToStr(i));
    
    for (int i=0;i<ListView6->Items->Count;i++)
    {
        SearchListini->WriteString ( i, "name", ListView6->Items->Item[i]->Caption );
        SearchListini->WriteString ( i, "name2", ListView6->Items->Item[i]->SubItems->Strings[0]);
    }                    
    delete SearchListini;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::LoadButtonClick(TObject *Sender)
    {
    TIniFile *SearchListini = new TIniFile(ExtractFilePath(Application->ExeName)+"save.INI" );
    
    int itc = SearchListini->ReadInteger("save","rows",0);
    
    for (int i=0;i<itc;i++)
    {
            TListItem *pLI = ListView6->Items->Add();
            pLI->Caption = SearchListini->ReadString (i, "name","");
            pLI->SubItems->Add( SearchListini->ReadString (i, "name2",""));
    }
    SearchListini->WriteInteger("saveold","rows",ListView6->Items->Count);  
    delete SearchListini;
    }
    

    ps.:email Benachrichtigung klapt spitze, siehe Datum



  • Hallo Jansen,

    Dein Code funzt prima. Danke.
    Du hast aber, wenn ich mir das als Anfänger gestatten darf, 2 Fehler drin:

    1. Beim einlesen wird das 1. Zeichen vom SubItem abgeschnitten. Bei mir schauen die Pfade anstatt "C:\..." so aus: ":\...".
    Ich hab halt in Zeile 6 das + "," + durch ein Leerzeichen nach dem Komma erweitert.

    2. Nimm als Trennzeichen kein Komma, da ein Komma ein zulässiges Zeichen in Dateinamen ist. Ich hab ein | (ALT + <) verwendet. Das geht problemlos.

    Gruß Markus



  • Danke, wenigstens einer, der mitliest. 🙂

    Markus Pelloth schrieb:

    Ich hab halt in Zeile 6 das + "," + durch ein Leerzeichen nach dem Komma erweitert.

    Warum nicht einfach das offensichtlich fehlerhafte '+ 1' in der Delete-Funktion entfernen?

    Ich hab ein | (ALT + <) verwendet. Das geht problemlos.

    Wer sagt, dass im ListView (nur) Dateinamen stehen? Das können genausogut Strings ala '12|34' sein, und schon ist nix mehr mit "geht problemlos". 😉
    Für eine universelle Lösung müsste man wohl auf ein nicht darstellbares Zeichen ausweichen (ASCII < 32).



  • Zu dem Thema nochwas:

    Schaut euch mal "WriteComponentResFile()" an. Die Funktion schreibt die komplette
    Listview in eine File.

    Gruß 4you



  • Danke, wenigstens einer, der mitliest.

    Mitlesen hat einen erheblichen Lerneffekt 🙂

    Warum nicht einfach das offensichtlich fehlerhafte '+ 1' in der Delete-Funktion entfernen?

    Ich habs vermutet, war mir aber nicht ganz sicher. Also tat ich das, was funktioniert.

    Das können genausogut Strings ala '12|34' sein

    Da hast Du allerdings recht.
    Und schon wieder was gelernt 🙂

    Gruß Markus


Anmelden zum Antworten