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/)
-   -   Drag & Drop in TListView mit TStringList (https://www.delphipraxis.net/204385-drag-drop-tlistview-mit-tstringlist.html)

linus_wildcat 25. Mai 2020 21:09

Drag & Drop in TListView mit TStringList
 
Hallo zusammen,

ich habe echt gesucht und gelesen und war sogar "in der Schweiz", aber meine Problemstellung, bzw. die Lösung habe ich noch nicht gefunden.

Ich habe eine TListview, welche Elemente anzeigt (MP3s-Namen).
Dahinter verbirgt sich aber eine Stringlist, in der diese Namen und einige Metadaten dazu mit ; getrennt abgelegt sind.
Wenn ich also visuell mit der Maus oder über Buttons an der Reihenfolge etwas mache, habe ich ja immer den Index des Elementes und kann über StringList.Move auch die Elemente in der Stringlist tauschen.
Auch bei Drag & Drop für EIN Element habe ich eine Methode gefunden.

Aber wenn ich mehrere markierte Elemente per DnD verschieben möchte scheitere ich.

Das Beispiel aus dem SwissDelphiCenter würde ich ja gerne verwenden, kapier es aber irgendwie nicht.
Wie bekomme ich hier für jedes Element den Quellindex und den Zielindex?

Vielleicht sehe ich ja den Wald vor lauter Bäumen nicht.....

Danke schon mal...

Kai

Strict 25. Mai 2020 21:12

AW: Drag & Drop in TListView mit TStringList
 
Zitat:

Dahinter verbirgt sich aber eine Stringlist, in der diese Namen und einige Metadaten dazu mit ; getrennt abgelegt sind.
Schonmal an eine virtuelle ListView gedacht?

Redeemer 25. Mai 2020 21:36

AW: Drag & Drop in TListView mit TStringList
 
Also du hast eine einzige StringList mit einem Eintrag pro TListItem? Das ist extrem unklug, da der einzige Bezug über TListItem.Index erfolgt, was aber variabel ist. Viel einfacher wäre es, wenn sich die Daten gezwungenermaßen mit dem TListItem bewegen. Dazu gibt es verschiedene Ideen:
  • Den String in TListItem.SubItems.Text ablegen, sofern das sonst nicht genutzt wird
  • Statt der TStringList ein TDictionary<TListItem, string> verwenden
  • In der TStringList nichts tun, was die Indizes der Einträge verändert, und diese Indizes über einen Cast von/nach NativeInt in TListItem.Data speichern
  • TListItem vererben und den String in einem neuen Feld speichern
Danach kann man nochmal über DnD sprechen, wenn es da nicht schon was Fertiges gibt, da man dann so ziemlich jeden Algorithmus nutzen kann, der die TListItems verschiebt.

linus_wildcat 26. Mai 2020 11:14

AW: Drag & Drop in TListView mit TStringList
 
Asche auf mein Haupt.....das passiert wenn man zwischen Delphi 7 und 10.3 mit dem Programmieren pausiert :roll:

Aber danke, ihr habt mich auf die richtige Fährte geschickt.

Die Stringliste mit zig Einträgen im Format NAME;Meta1;Meta2;Meta3 habe ich nun komplett verworfen und arbeite nur noch mit der Listview und Items (= NAME) und SubItems (= Metas).
Durch den Spalteneditor kann ich ja dafür sorgen, dass ich nur die Namen sehe.

Und da ich nur noch mit einem "Objekt" arbeite, ist das speichern und eben auch Dnd deutlich einfacher.

:thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:34 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