Announcement

Collapse
No announcement yet.

Sucheinträge in TListView sortieren

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

  • Sucheinträge in TListView sortieren

    Hallo,

    ich habe mich etwas mit den Diskussionen in diesem Forum zum Thema "sortieren" befasst und bin im Moment etwas unschlüssig.

    Ich habe mir eine rekursive Funktion "zur Verfügung stellen lassen", deren Ergebnisse ich in einem TListView im Style vsReport in 3 Spalten anzeigen lasse. Spalte 1 sind CheckBoxen, Spalte 2 die Dateinamen und Spalte 3 die Verzeichnisse.

    Leider werden die Dateien Unterverzeichnisübergreifend alphabetisch ausgelesen. Soll heissen (Bsp.):

    <PRE>
    replace.exe c:\Windows\system32
    reset.exe c:\Windows\system32
    rstrui.exe c:\Windows\system32\Restore
    srdiag.exe c:\Windows\system32\Restore
    rexec.exe c:\Windows\system32
    spider.exe c:\Windows\system32
    CNMSD0Y.exe c:\Windows\system32\spool\drivers\w32x86\3
    spools.srv c:\Windows\system32
    </PRE>
    Es wird also kein Unterschied gemacht zwischen Dateien und Verzeichnissen (die ja auch nur Dateien mit Directory-Attribut sind).
    Ich will das aber so sortiert haben, wie die Suchergebnisse der Windows-Suche.

    Was mich jetzt interessiert, ist folgendes:

    Ist es sinnvoller, die TListView zu sortieren oder dafür zu sorgen, dass in einem Verzeichnis die Unterverzeichnisse so lange ignoriert werden, bis das letzte File ausgelesen ist und das Ganze mit den Unterverzeichnissen wieder von vorne ?

    Gruß Markus

  • #2
    <PRE>
    Hi Markus!

    Du hast die function CustomSort.
    Hier kannst Du deine eigenen Vorstellungen
    verwirklichen.

    Gruß Fre

    Comment


    • #3
      Hallo Fred,

      das ist super. Genau, was ich brauche.
      Ich komm leider bloss nicht drauf, wie ich die Funktion dazu bringen kann, die 2. Spalte (oder die 3. Spalte) zu sortieren.
      Ideal wäre, wenn er erst die 3. und dazu die 2. sortieren würde.

      Die Hilfe gibt mir leider nicht sooo viel her.
      Ich probier einfach noch ein bisschen rum.

      Gruß Marku

      Comment


      • #4
        Hi Markus,

        Du brauchst ein OnClumnClick- und ein OnCompare-Ereignis des TListViews zur Realisierung Deines Vorhabens. Wenn Du dann auf die Spaltenüberschriften clickst, wird im OnCompare die Sortierung angestoßen.

        <PRE>
        void __fastcall TfrmGenerator::lvGeneratorCompare(TObject *Sender,
        TListItem *Item1, TListItem *Item2, int Data, int &Compare)
        {
        //Das Ereignis OnCompare tritt ein, wenn zwei Elemente im Rahmen eines
        //Sortiervorgangs verglichen werden müssen.
        //
        //Mit einer Ereignisbehandlungsroutine für OnCompare können Sie eine
        //Sortierreihenfolge für die Liste implementieren. Die Ereignisbehandlungs-
        //routine wird aufgerufen, wenn die Eigenschaft SortType auf stData oder
        //stBoth gesetzt ist und entweder die Methode CustomSort ohne den Parameter
        //SortProc oder die Methode AlphaSort aufgerufen wird.
        //
        //Die Ereignisbehandlungsroutine für OnCompare vergleicht zwei Listenelemente,
        //die in den Parametern Item1 und Item2 übergeben werden. Dem Parameter
        //Compare wird 0 zugewiesen, wenn Item1 und Item2 in der Sortier-
        //reihenfolge gleichrangig sind. Compare wird ein Wert < 0 zugewiesen, wenn
        //Item1 kleiner als Item2 ist, und einen Wert > 0, wenn Item1 größer als
        //Item2 ist.
        //
        //Der Parameter Data hat den Wert 0, wenn die Ereignisbehandlungsroutine die
        //Sortierreihenfolge einer Listenansicht beibehalten soll und SortType auf
        //stData oder stBoth gesetzt ist. Auch wenn OnCompare als Reaktion auf die
        //Methode AlphaSort eintritt, ist der Parameter Data 0. Tritt OnCompare als
        //Reaktion auf die Methode CustomSort ein, wird dem Parameter Data der Wert
        //des Parameters LParam von CustomSort zugewiesen.
        //
        //
        //CompareText:
        //CompareText vergleicht zwei AnsiStrings anhand ihres Ordinalwertes OHNE
        //Berücksichtigung der Groß-/Kleinschreibung.
        //
        //AnsiCompareText:
        //AnsiCompareText vergleicht AnsiStrings auf der Basis des aktuellen Gebiets-
        //schemas und unterscheidet dabei NICHT zwischen Groß- und Kleinschreibung.
        //
        //AnsiCompareStr:
        //AnsiCompareStr vergleicht zwei AnsiStrings unter Berücksichtigung des
        //aktuellen Gebietsschemas UND der Groß-/Kleinschreibung.

        //Caption
        if(iCol == 0)
        {
        if(iSortSpalte[iCol] == 1) //ASC
        {
        Compare = AnsiCompareStr(Item1->Caption,Item2->Caption);
        }
        else //DESC
        {
        Compare = -AnsiCompareStr(Item1->Caption,Item2->Caption);
        }
        }
        //Andere Spalten; SubItems
        else
        {
        if(iSortSpalte[iCol] == 1) //ASC
        {
        Compare = AnsiCompareStr(Item1->SubItems->Strings[iCol-1], Item2->SubItems->Strings[iCol-1]);
        }
        else //DESC
        {
        Compare = -AnsiCompareStr(Item1->SubItems->Strings[iCol-1], Item2->SubItems->Strings[iCol-1]);
        }
        }
        }
        //---------------------------------------------------------------------------
        </PRE>
        &#10

        Comment


        • #5
          Hallo,

          danke nochmal.

          @ Jürgen: Leider hat er die erste Zeile (...TfrmGenerator::lvGeneratorCompare...) angemeckert. Egal, aus der Hilfe hab ich mir mittels Deines Tipps den Rest dann zusammengebaut.
          <PRE>
          void __fastcall TForm1::ListView1ColumnClick(TObject *Sender, TListColumn *Column)

          {
          ColumnToSort = Column->Index;
          ((TCustomListView *)Sender)->AlphaSort();
          }

          //---------------------------------------------------------------------------

          void __fastcall TForm1::ListView1Compare(TObject *Sender, TListItem *Item1, TListItem *Item2, int Data, int &Compare)
          {
          if (ColumnToSort == 0)
          Compare = CompareText(Item1->Caption,Item2->Caption);
          else
          {
          int ix = ColumnToSort-1;
          Compare =
          CompareText(Item1->SubItems->Strings[ix], Item2->SubItems->Strings[ix]);
          }
          }

          //---------------------------------------------------------------------------
          </PRE>
          Allerdings ist in der Hilfe ein Fehler drin (int ix = ColumnToSort - 1, da meckert er "ungültiges Zeichen "|"... .
          Einfach das " - " löschen und "-" draus machen und es geht

          Comment

          Working...
          X