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.