Announcement

Collapse
No announcement yet.

ListView abspeichern

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • ListView abspeichern

    Hallo zusammen,

    ich habe folgendes Problem, bei dem ich überhaupt nicht weiterkomme:
    Ich habe ein ListView mit 2 Spalten. Dieses ListView bzw. den Inhalt würde ich gerne als Textdatei abspeichern.
    Weiss jemand, wie das geht ?
    Ich habe auch versucht, das über ein Memo zu realisieren mit Tab als Trennzeichen, schaffe aber die Umwandlung von AnsiString nach TStrings nicht und der Debugger mault -sicher zurecht- unzulässige String-Additionen an, z.B., wenn ich es mit "Memo1->Lines=Inhalt_1 + \t + Inhalt_2 + \n;" versuche.

    Ich hab schon die halbe Hilfe durch und komme keinen Schritt weiter !

    Ach ja, die Textdatei soll bei jedem Programmstart wieder eingelesen werden, am besten in ein ListView, weil der Inhalt dieses ListViews dann mit anderen verglichen wird. Ein Filter also quasi.

    Vielleicht kann mir ja jemand helfen. Danke schon mal.

    Gruß Markus

    P.S.: Ich lese auch schon ganz fleissig Richard Kaisers "C++ mit dem Borland C++-Builder"

  • #2
    Hi Markus,

    versuch's mal mit:
    <PRE>
    Memo1->Lines->Add(String1 + "\t" + String2);
    </PRE>
    Ich bin davon ausgegangen das String1 und String2 Variablen des Typs AnsiString sind.
    Das "\n" am Ende brauchst Du nicht.
    Mit jedem Aufruf von ->Add() wird automatisch eine neue Zeile erzeugt.
    Lines ist nicht anderes als eine TStringList.
    Für das Schreiben und Lesen der Memo-Komponente kannst Du Memo1->Lines->SaveToFile(), respektiv LoadFromFile() verwenden.

    Grüße

    Joche

    Comment


    • #3
      Mir ist da noch was eingefallen...

      Unzulässige Zeigeraddition könnte darauf hindeuten, daß Du folgendes versuchst:
      <PRE>
      Irgendeine Stringvariable = "String1" + "\t" + "String2";
      </PRE>
      Das funktioniert nicht, es dürfen keine Konstrukte der Art "xx" + "yy" +"zz" durchgeführt werden.
      Das muß folgendermaßen dargestellt werden "xxyyzz".
      Es funktioniert jedoch reibungslos wenn zwischen den Daten in Anführungszeichen Variablen verwendet werden.
      Beispiel:
      <PRE>
      AnsiString TestString = "yy";
      AnsiString TestString2 = "xx" + TestString + "zz"; // so funktionierts
      </PRE>
      Man könnte sinnvollerweise das "\t" in einer Variable Ablegen:
      <PRE>
      AnsiString tab = "\t";
      AnsiString TestString = "String1" + tab + "String2"; // funktioniert - außerdem ist tab viel einfacher zu tippen als "\t"
      </PRE>

      Joche

      Comment


      • #4
        Markus,

        ich glaube, Du machst Dir mit den Tabs nur das Leben schwer. Warum steckst Du nicht ein ListView-Eintrag in je eine Zeile Deiner String-Liste ?
        (Das hier ist alles ungetestet

        <PRE> for (int i = 0; i < LV->Items->Count; i++)
        {
        Memo1->Lines->Add(LV->Items[i]->Caption);
        }</PRE>

        Dann ist das Laden auch einfacher
        <PRE> Memo1->Lines->LoadFromFile("listview.txt");
        for (int i = 0; i < Memo1->Lines->Count; i++)
        {
        LV->Items->Add()->Caption = Memo1->Lines->Strings[i];
        }

        </PRE>

        Gruß,
        Ja

        Comment


        • #5
          @Jan

          ich glaube Markus möchte in einer Zeile den ListItem und, durch Tabs getrennt, die SubItems speichern und Laden.
          SubItems ist vom Typ TStringList, aber das ist auch schon alles was ich darüber weiß...

          @Markus

          Hast Du denn schon eine Lösung für das Problem gefunden, oder nicht?

          Joche

          Comment


          • #6
            >ich glaube Markus möchte in einer Zeile den ListItem und, durch Tabs getrennt, die SubItems speichern und Laden

            ups, das habe ich überlesen.
            Dann könnte man in das Text-File die Caption und das Sub-Item immer im Wechsel ablegen:
            Caption 1,Sub-Item 1,Caption 2,Sub-Item 2, u.s.w. ...
            Das scheint mir immernoch einfacher zu sein, als mit Tabulatoren zu arbeiten.

            Gruß,
            Ja

            Comment


            • #7
              Hallo dschenski und Jan,

              ich hab folgende Lösung:

              <PRE>
              void __fastcall TfrmDateisuche::speichern()
              {
              TStringList *list = new TStringList();
              for (int i = 0; i < LiVReferenz->Items->Count; i++)
              {
              list->Add(LiVReferenz->Items->Item[i]->Caption + "|" +
              LiVReferenz->Items->Item[i]->SubItems->CommaText);
              }
              list->SaveToFile("c:/listview.txt");
              delete list;
              }
              </PRE&gt

              Comment


              • #8
                Hi Markus,

                das bedeutet, Du hast Deinen Tabulator-Ansatz lediglich durch einen '|'-Ansatz ersetzt. Damit setzt Du stillschweigend voraus, daß niemals das '|'-Zeichen in der Caption verwendet wird. Das würde dann nämlich den betreffenden ListView-Eintrag vermurksen. Ähnliches gilt für das Komma in CommaText (hast Du jetzt doch mehr als 2 Spalten?). Weiterhin mußt Du beim Einlesen das '|' suchen und die Caption davor bzw. die Sub-Items dahinter abschnippeln.
                Hier ein anderer Vorschlag (unter der Voraussetzung, daß die Sub-Items keine Kommas enthalten):
                <pre>
                void __fastcall TForm1::SaveBtnClick(TObject *Sender)
                {
                TStringList *list = new TStringList();
                for (int i = 0; i < LiVReferenz->Items->Count; i++)
                {
                list->Add(LiVReferenz->Items->Item[i]->Caption);
                list->Add(LiVReferenz->Items->Item[i]->SubItems->CommaText);
                }
                list->SaveToFile("C:\\temp\\lv.txt");
                delete list;
                }
                void __fastcall TForm1::LoadBtnClick(TObject *Sender)
                {
                TStringList *list = new TStringList();
                list->LoadFromFile("c:\\temp\\lv.txt");
                LiVReferenz->Items->Clear();
                TListItem* item(NULL);
                int itemCount = list->Count / 2;
                for (int i = 0; (i <= itemCount) && (itemCount > 0); i+=2)
                {
                item = LiVReferenz->Items->Add();
                item->Caption = list->Strings[i];
                item->SubItems->CommaText = list->Strings[i + 1];
                }
                delete list;
                }
                //---------------------------------------------------------------------------

                </pre>

                Gruß,
                Ja

                Comment

                Working...
                X