Mit Bezug auf das Tutorial vielleicht ein paar Anmerkungen, damit auch TH69s Frage deutlicher wird:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TfrmMain.UpdateListBox; var Contact : TContact; i : Integer; s : string; begin ListBox1.Items.Clear; for i := 0 to AddressBook.Contacts.Count - 1 do begin Contact := AddressBook.Contacts.Items[i]; s := Contact.LastName + ', ' + Contact.FirstName; ListBox1.Items.Add(s); end; end; |
In diesem Beispiel aus dem Tutorial sind die Daten in der Liste "AddressBook.Contacts" gespeichert. In die Listbox werden dann über die for-Schleife Strings angezeigt, die aus einigen Datenpunkten der Liste generiert werden (LastName + FirstName). Die Listbox "weiß" aber sonst nichts über die Objekte. Ihr werden quasi nur ein paar Strings zum Anzeigen vor die Füße geworfen. Wenn du dann die Strings verschiebst, dann bekommen die Objekte dahinter nichts davon mit.
Daher gibt es bei der ListBox noch die Methode AddObject, der man nicht nur den String zum Anzeigen, sondern auch ein Datenobjekt übergeben kann. Der Code zum Füllen der Listbox dürfte dann in etwa so aussehen (basierend auf dem Tutorial-Code)
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| for i := 0 to AddressBook.Contacts.Count - 1 do begin Contact := AddressBook.Contacts.Items[i]; s := Contact.LastName + ', ' + Contact.FirstName; ListBox1.AddObject(s, Contact); end; |
Damit behältst du beim Verschieben die Referenz auf die Objekte, und kannst diese dann in der neuen Reihenfolge wieder abspeichern.
Allerdings muss man da dann auch aufpassen, dass man die Grenzen zwischen Datenspeicherung im Hintergrund und der Anzeige nicht verwischt. Denn durch das Verschieben der Listbox-Items wird die Reihenfolge der Objekte in der "ursprünglichen Liste" AddressBook.Contacts erstmal nicht verändert. D.h. du müsstest den Code ggf. so erweitern, dass die Move-Operationen auch auf dieser Liste durchgeführt werden.
Zum Staub: Die Motivation hinter der Klasse TContactList in dem Tutorial ist eine Typ-sichere Liste von "Kontakten". Man kann auch (wenn man auf die Typsicherheit verzichten mag) eine normale TObjectList verwenden. Wenn man aber heutzutage (da kommt dann der Staub rein) in dem Kontext Typsicherheit haben will, dann nimmt man Generics. Das Prinzip dahinter (Datenklasse + Containerklasse) kann man aber imho immer noch so anwenden. Daran ändert sich auch wenig, wenn man statt der ListBox andere Komponenten zum Anzeigen nimmt, wie z.B. den VirtualStringTree.
We are, we were and will not be.