[Gelöst] ListView, Ordner Oben, Dateien unten?

Rund um die LCL und andere Komponenten
Antworten
pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

[Gelöst] ListView, Ordner Oben, Dateien unten?

Beitrag von pluto »

Hallo

Für meine neue Oberfläche, für den Notizen Manager, such ich eine Möglichkeit in der ListView die "Ordner" Oben anzuzeigen und die Notizen unten.
Jeweils Natürlich Sortiert.

Mir sind bisher nur zwei Lösungen eingefallen:
1. Eine eigene ListView, die auf eine "Ebene" mehrer Listen verwalten kann.
Die habe ich sogar schon angefangen... dauert aber wohl noch etwas. Bei Interesse kann ich dazu ein extra Thread aufmachen, wo ich mehr ins Detail gehe.
Hier kann ich mehrer Listen hinzufügen z.b. eine Liste für Ordner und eine Liste für Notizen.

2. Eine Sortier Funktion mit der Standard ListView:
Hier muss die ListView erst Komplett geleert werden und dann aus der Basis Datenstruktur neu erstellt werden.
Die ListView hält nicht die Daten. Es gibt eine Basis Datenstruktur.

Kennt ihr noch andere Wege um dieses Problem zu lösen?
Zuletzt geändert von pluto am Do 30. Mai 2019, 22:47, insgesamt 1-mal geändert.
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: ListView, Ordner Oben, Dateien unten?

Beitrag von pluto »

Mir ist möglicherweise noch eine dritte Möglichkeit eingefallen:
Beim Einfügen von Einträgen, brauche ich ja "nur" eine Position.
D.H. ich muss in der Liste schauen, an welcher Position ich einfügen.
MFG
Michael Springwald

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: ListView, Ordner Oben, Dateien unten?

Beitrag von wp_xyz »

Ich verstehe das alles nicht. Warum sortierst du nicht einfach die vorhandene ListView? Das geht entweder mit Sort und einer im Ereignis OnCompare definierten Sortierreihenfolge, oder CustomSort, dem die Vergleichsfunction als Parameter übergeben wird. Die Vergleichsfunktion hat zwei ListItems als Parameter und muss festlegen, welcher von den beiden "kleiner" ist, also in der Sortierung obensteht. Wenn der erste Parameter "kleiner" ist, ist der Funktionswert -1; bzw +1, wenn der zweite "kleiner" ist; bzw. 0, wenn beide gleich sind. Deine Vergleichsfunktion muss so aufgebaut sein, dass, wenn ein Ordner und eine Notiz verglichen werden, den Ordner immer als "kleiner" eingestuft wird (-1 wenn der Ordner der 1.Parameter ist, bzw +1 wenn es der zweite Parameter ist).

Das beigefügte Beispielprojekt sortiert die Dateien und Ordner in dem Projektordner genauso, wobei noch zwischen "Ordner oben" und "Ordner unten" unterschieden werden kann
Dateianhänge
listview_sort.zip
(64.19 KiB) 93-mal heruntergeladen

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: ListView, Ordner Oben, Dateien unten?

Beitrag von pluto »

Vielen Dank für dein Beispiel.

Ich habe es gleich ausprobiert und es Funktioniert. Ich habe wohl den Wald voller Bäume nicht gesehen...

Ich werde es noch mal testen, aber es scheint das zu sein, was ich gesucht habe.
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: [Gelöst] ListView, Ordner Oben, Dateien unten?

Beitrag von pluto »

Ich habe es auch schon in die neue Oberfläche eingebaut, damit ist mir aufgefallen,
die Sortierung scheint nicht Natürlich zu sein:
1
10
2
9
MFG
Michael Springwald

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: [Gelöst] ListView, Ordner Oben, Dateien unten?

Beitrag von wp_xyz »

Das passiert, wenn die Vergleichsfunktion die Items als Strings vergleicht (CompareText). Da "1" vor "9" kommt, wird auch "10" vor "9" einsortiert. Um als Zahlen zu vergleichen, musst du die Strings in Integer oder Floats umwandeln und dann per CompareValue aus der Unit Math vergleichen

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: [Gelöst] ListView, Ordner Oben, Dateien unten?

Beitrag von pluto »

Werde ich mal versuchen, es ist aber schon ein String:
Item1
Item10
Item2
Item9
hätte ich vielleicht dazu schreiben sollen.... Aber ich könnte versuchen, den "Zahlen" Teil getrennt vom "String" teil zu vergleichen....
MFG
Michael Springwald

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: [Gelöst] ListView, Ordner Oben, Dateien unten?

Beitrag von wp_xyz »

Würde ich auch so machen. Es gibt allerdings auch ein "NaturalCompareText" in der Unit StrUtils:

Code: Alles auswählen

function NaturalCompareText (const S1 , S2 : string ): Integer ;
function NaturalCompareText(const Str1, Str2: string; const ADecSeparator, AThousandSeparator: Char): Integer;

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: [Gelöst] ListView, Ordner Oben, Dateien unten?

Beitrag von pluto »

NaturalCompareText Funktioniert Prima. Ich werde, die Sortier Funktion weiter Testen, aber es sieht schon sehr gut aus.

Manchmal denke ich einfach viel zu Kompliziert.
MFG
Michael Springwald

Antworten