Announcement

Collapse
No announcement yet.

Builder 5 - TStringList Sortieren

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

  • Builder 5 - TStringList Sortieren

    Guten Abend zusammen,
    ich habe folgende Konstellation:
    Eine Textdatei wird eingelesen und in einer ListBox dargestellt. Nun soll über 2 Button das Sortieren (A-Z) bzw. Z-A möglich sein.
    Nun habe ich aber kein Plan, wie ich das anstellen soll!!

    Datensatzbeispiel:

    Nachname, Vorname (00000 / 0000)
    Nachname, Vorname (00000 / 0000)
    Nachname, Vorname (00000 / 0000)

    Jemand ne Idee?!


    Grüße
    Dani
    Viele Grüße
    Dani

  • #2
    Generell ist die Listbox dazu schlecht geeignet nutze ein TStringGrid

    Lese die Daten in die StringList ein, teile sie auf, stze die einzelnen Elemente in das Grid und sortiere da.

    Zum aufteilen:
    http://www.marquardtnet.info/cecke/q...quicky_01.html

    Zum sortieren:
    http://www.bytesandmore.de/rad/cpp/snipp/sc02039.php
    Christian

    Comment


    • #3
      G' Morgen,
      wunderbar....ich habe mir die Funktion pGrid->Rows->Insert() angesehen. Laut Hilfe kann ich damit eine Ganze Zeile füllen. Jedoch ist mal wieder keine Hilfe hinterlegt! Kannst du mir mal n Beispiel machen!?
      Viele Grüße
      Dani

      Comment


      • #4
        Du solltest dir die Eigenschaft Cells ansehen....

        Ansosnsten ist in dem 2. Link ein Beispiel dazu....

        Mit deinem Datenformat kannst du keine Zeile füllen...
        Zuletzt editiert von Christian Marquardt; 01.04.2007, 09:48.
        Christian

        Comment


        • #5
          Thx...so geht natürlich auch!
          Nun bin ich beim Speichern. Ich bin soweit, dass er NUR eine Zeile in die TXT-Datei speichert. Nun möchte ich aber die ganze Tabelle speichern. Muss ich das mit einer for-Schleife lösen pder gibt es da eine Funktion?!

          Wenn ich jetzt eine Zeile speichere (besteht aus 3 Zellen), dann steht das so in der File:
          Code:
          ttt
          fsdfs
          fsfs
          Ich hätte es aber hintereinander mit einem Trennzeichen (z.B. |) gerne. Wie mache kann ich das lösen?
          Viele Grüße
          Dani

          Comment


          • #6
            Das Grid hat keine Speicherfunktionalität

            http://www.tmssoftware.com/advgrid2.htm

            Also Schleife über Zeile und Schleife über Reihen und dann speichern. hier kannst du schauen wie es geht

            http://www.marquardtnet.info/cecke/k...tringgrid.html
            Christian

            Comment


            • #7
              Also das speichern habe ich jetzt los gelöst:
              Code:
              if(SaveDialog1->Execute())
                {
                 // Liste für einzelne Zeilen
                 // Liste für gesamte Tabelle
                 TStringList *list_row = new TStringList();
                 TStringList *list_all = new TStringList();
              
                 // Alle Zeilen auslesen
                 for(int i=1;i < pGrid->RowCount-1;i ++)
                  {
                   // Liste löschen
                   list_row->Clear();
                   // Zeile komplett auslesen
                   list_row->Assign(pGrid->Rows[i]);
                   //Zeile als Kommatext zur Gesamtliste hinzufügen
                   list_all->Add(list_row->CommaText);
                  }
                 // Alle Zeilen in die Datei speichern
                 list_all->SaveToFile(SaveDialog1->FileName);
              
                 //Löscht die beiden Listen wieder
                 delete list_row, list_all;
                }
              Nun habe ich noch das Problem mit dem einlesen. Und zwar habe ich alles in einer "TStringList" stehen. Wie kann ich nun eine Zeile auslesen?! Splitten usw...habe ich schon!

              [UPDATE]
              So das einlesen geht jetzt auch! *gg*

              Code:
              if(OpenDialog1->Execute())
                {
                 //Legt 2 Listen an
                 TStringList* list_all = new TStringList();
                 TStringList *list_parts = new TStringList();
              
                 list_all->LoadFromFile(OpenDialog1->Files->Strings[0]);
                 for(int i=0;i < list_all->Count;i ++)
                  {
                   //Die Liste wird immer geleeert. Danach wird dann jede Zeile bei einem
                   //Komma den Text in ein Array der "list_parts" gespeichert.
                   list_parts->Clear();
                   split(list_parts,list_all->Strings[i],",");
              
                   // Schreibt die Werte der einzelnen Arrays "list_parts" in die Tabelle
                   pGrid->Cells[0][i+1] = list_parts->Strings[0];
                   pGrid->Cells[1][i+1] = list_parts->Strings[1];
                   pGrid->Cells[2][i+1] = list_parts->Strings[2];
              
                   //Fügt den vorhanden Zeilen eine Neue hinzu.
                   pGrid->RowCount+=1;
                  }
              
                 //Entfernt die Listen aus dem Speicher
                 delete list_all,list_parts;
                }
              Zuletzt editiert von Dani; 01.04.2007, 13:04.
              Viele Grüße
              Dani

              Comment


              • #8
                Nun noch das letzte Problem:
                Wie kann ich eine markierte Zeile löschen??
                Viele Grüße
                Dani

                Comment


                • #9
                  Hallo Dani,

                  das musst Du wohl auch selbst implementieren:
                  Code:
                  for (r=row_to_delete; r<StringGrid1->RowCount-1; r++)
                  {
                      // Zeile 'hochschieben'
                      for (c=0; c<StringGrid1->ColCount; c++)
                      {
                          StringGrid1->Cells[c][r] = StringGrid1->Cells[c][r+1];
                      }
                  }
                  // Inhalte in letzter Zeile löschen
                  r = StringGrid1->RowCount - 1;
                  for (c=0; c<StringGrid1->ColCount; c++)
                  {
                      StringGrid1->Cells[c][r] = "";
                  }
                  Gruß vom Knut

                  Comment


                  • #10
                    Hi,
                    ich habe entzwischen anders gelöst.
                    So sieht es bei mir aus:
                    Code:
                    / Zeileninhalt wird mit der darüberliegenden Zeile gefüllt.
                     int Zeile = pGrid->Row-1;
                     while (Zeile++ < pGrid->RowCount)
                      {
                       pGrid->Rows[Zeile] = pGrid->Rows[Zeile + 1];
                      }
                      // Letzte Zeile löschen, wenn mehr als 2 Zeilen noch vorhanden sind,
                      //ansonsten wird eine Fehlermeldung ausgegeben.
                      if(pGrid->RowCount > 2) pGrid->RowCount -= 1;
                      else                    ShowMessage("Die Zeile kann nicht gelöscht werden!");
                    Trotzdem vielen Dank für das Beispiel und die Mühe.
                    Viele Grüße
                    Dani

                    Comment


                    • #11
                      Hallo Dani,

                      Deine Lösung ist eleganter (und wahrscheinlich schneller - obwohl das keine Rolle spielen dürfte).

                      Gruß Knut

                      Comment

                      Working...
                      X