Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Listview NICHT sortieren (https://www.delphipraxis.net/139488-listview-nicht-sortieren.html)

martinf16 29. Aug 2009 21:58


Listview NICHT sortieren
 
Hallo,

ich habe schon versucht danach auf zu suchen, aber ich bekomme immer nur den Code zum sortieren einer ListView. Dabei suche ich genau das Gegenteil: Die ListView soll nicht sortiert werden!

Das Problem: In einer Schleife durchlaufe ich die Einträge einer Listview um sie zu ändern. Jetzt werden die Einträge aber so schnell aktualisiert, dass sich die Positionen der Einträge verändern und dadurch alles durcheinander gerät.

Gibt es daher eine Möglichkeit die Sortierung abzuschalten (dann ändere ich die Einträge) und danach schalte ich die Sortierung wieder ein?

Vielen Dank!

sx2008 29. Aug 2009 22:04

Re: Listview NICHT sortieren
 
Zitat:

Zitat von martinf16
In einer Schleife durchlaufe ich die Einträge einer Listview um sie zu ändern.

Läuft die Schleife rückwärts (for i := listview.Items.count-1 downto 0 do)?
Das ist nötig, um beim Einfügen oder Löschen von Items die Numerierung nicht durcheinander zu bringen.

Luckie 29. Aug 2009 22:49

Re: Listview NICHT sortieren
 
Dann sorge dafür, dass während des Änderns keine keien Einträge hinzukommen. Oder trenne Datenhaltung und Darstellung und führe die Änderungen in deiner Datenhaltung durch.

martinf16 29. Aug 2009 22:57

Re: Listview NICHT sortieren
 
Es kommen keine neuen Einträge hinzu und das mit dem Rückwärts-Laufen-Lassen geht auch nicht.

Mal ein kleines Beispiel:

In der Liste steht:
A1
A2
A3

Bei den Einträgen wird "A" durch "B" ersetzt:

Für den Fall dass, die Schleife von oben nach unten läuft:

A1 wird zu B1, B1 rutscht nach unten
A2
A3

Neue Sortierung:

A2
A3
B1

Als nächstes wird A2 in B2 geändert, das geht auch noch gut. Wenn die Schleife aber B1 erreicht bleibt A3 übrig und wird nicht geändert und B1 sollte ja schon geändert werden.

Beim Rückwärts-Durchlaufen würde die Sortierung bei diesem Beispiel gehen, nicht aber wenn man beispielsweise die Einträge B1, B2, B3 in A1, A2 und A3 umbenennen will.

Das mit der gesonderten Liste erscheint mir zu umständlich für den besagten Fall. Es sollen ja nur einige Einträge umbenannt werden, deren alphabetische Reihenfolge sich leider ändern kann. Es wäre schön die Sortierung solange umbenannt wird einfach abzuschalten. So ähnlich wie in einer Stringlist mit sorted = false, wenn das auch in der Listview geht.

Luckie 30. Aug 2009 01:37

Re: Listview NICHT sortieren
 
Also der Listview hat keine automatische Sortierung. Man muss explizit Sorted auf True setzen, damit die Einträge sortiert werden. Und eine Datenhaltung nicht im Listview ist eigentlich die übliche Vorgehensweise. Steuerelemente sind eigentlich nur dazu da die Daten darzustellen. Stichwort; Trennung von Daten und Sicht. willst du jetzt den Listview gegen ein anderes Steuerelement austauschen, bekommst du ziemliche Probleme. Desweiteren leidet auch die Wiederverwendbarkeit von Code.

martinf16 30. Aug 2009 03:05

Re: Listview NICHT sortieren
 
Naja, wenn es wirklich nicht anders geht, trenne ich die Daten von der Sicht.

Allerdings geht es in meinem Fall wirklich nur um die Anzeige von einigen Dateien, diese sollen wenn sie umbenannt wurden aktualisiert in der ListView dargestellt werden. Ich arbeite ja nicht mit den Daten in der ListView, sie sollen lediglich aktualisiert werden.

Aber wie stellt man denn das sorted auf true bzw false? Die Eigenschaft sorted gibts offenbar bei der ListView gar nicht. Also ListView.Sorted := true. Wo stellt man sie denn ein?

Luckie 30. Aug 2009 03:55

Re: Listview NICHT sortieren
 
Die Dateien sind ja auch Daten oder nicht?

Kann jetzt auch sein, dass ich das mit einer Listbox verwechsele.

alzaimar 30. Aug 2009 08:57

Re: Listview NICHT sortieren
 
Die Sortierreihenfolge einer ListView wird durch die Eigenschaft 'SortType' definiert. Der von Dir beobachtete Effekt tritt dann ein, wenn SortType einen anderen Wert als 'stNone' hat. Ohne weiteres Zutun ist das ListView bestrebt, jede Änderung an den Items sofort sortiert darzustellen. Als Abhilfe umklammere deine Umbenennungsoperationen mit einem ListView.Items.BeginUpdate / EndUpdate, so etwa:
Delphi-Quellcode:
  ...
  ListView.Items.BeginUpdate;
  Try
    For i:=0 to ListView.Items.Count - 1 do
      RenameItem (ListView.Items[i]);
  Finally
    ListView.Items.EndUpdate;
  End;
  ...
Durch das 'BeginUpdate' wird nun sowohl die Darstellung als auch die instantane Sortierung blockiert, bis 'EndUpdate' aufgerufen wird.

martinf16 31. Aug 2009 04:17

Re: Listview NICHT sortieren
 
Ohja, vielen Dank. Jetzt funktionierts.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz