Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Indizes in Listbox nach Löschen
Calculon - Mi 24.01.07 16:36
Titel: Indizes in Listbox nach Löschen
Hi allerseits,
diese Problem hab' ich jetzt schon öfters und bisher nur durch Work-Arounds lösen können. Ich greife auf Listbox-Einträge mit "Listbox.Items.Strings[index]" zu. Wenn ich nun aber Einträge lösche (vor und nach meinem aktuellen index), dann gelingt es mir nicht mehr meine Indizes den Listbox-Einträgen zuzuordnen, weil die Anzahl der Einträge ja immer neu definiert wird.
Ich hatte mir mal überlegt gezielt nach einem String zu suchen um wieder Orientierung zu schaffen, aber das ist unsinnig, wenn mehrmals derselbe Eintrag in der Listbox steht.
Weiß jemand wie ich das hinbekommen kann?
Gruß
Calculon
--
Narses - Mi 24.01.07 17:20
Moin!
Pack einen Autoincrement-Counter in die .Objects[] und such dann mit .IndexOfObject() danach. ;)
cu
Narses
Calculon - Mi 24.01.07 17:39
Hi Narses!
Erstmal danke für deine Antwort.
| Narses hat folgendes geschrieben: |
| Pack einen Autoincrement-Counter in die .Objects[] und such dann mit .IndexOfObject() danach. |
Ich habe das noch nie benutzt. Kannst du mir kurz erklären, was es macht und wie man es benutzt?
Gruß
--
Narses - Mi 24.01.07 20:12
Moin!
Calculon hat folgendes geschrieben: |
| Ich habe das noch nie benutzt. Kannst du mir kurz erklären, was es macht und wie man es benutzt? |
Ungefähr so: ;)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| var SL: TStringList; NextID: Integer;
function GetNextID: TObject; begin Result := TObject(NextID); Inc(NextID); end;
procedure ShowID(const ID: Integer); var i: Integer; begin i := SL.IndexOfObject(TObject(ID)); if (i > -1) then ShowMessage(SL.Strings[i]) else ShowMessage(IntToStr(ID)+' ist nicht in der Liste!?'); end;
begin NextID := 0; SL := TStringList.Create; try SL.AddObject('Das',GetNextID); SL.AddObject('ist',GetNextID); SL.AddObject('ein',GetNextID); SL.AddObject('Test!',GetNextID); ShowID(1); ShowID(2); SL.Delete(1); ShowID(2); ShowID(1); finally SL.Free; end; |
Runtergetippt und ohne Kontext, sollte aber das Prinzip verdeutlichen. ;)
cu
Narses
Calculon - Mi 24.01.07 21:57
Vielen Dank!
Werd' mal kucken, ob ich das gebacken kriege!
Gruß
--
Calculon - Do 25.01.07 00:43
Also, ich hab' das jetzt mal probiert und hab' festgestellt, dass mir .IndexOfObject() ja keine Information über die ursprüngliche Platzierung gibt, sondern nur sagt, ob es sich bei dem im aktuellen Index eingetragenen string um einen vorhandenen Eintrag handelt, ansonsten liefert der Befehl mir eine -1 und die Anzahl der Einträge wird neu definiert? (die nach dem gelöschten string angezeigten Einträge waren ja wieder verschoben)
Ich glaub ich werd in Zukunft, wenn ich eine Listbox benutze immer einen array of array of string mitdeklarieren müssen. So à la Sparse-Matrix mit Koordinaten und String-Eintrag, damit ich immer weiß, wo sich was befindet. :(
Gruß
--
Narses - Do 25.01.07 00:49
Moin!
Calculon hat folgendes geschrieben: |
| Also, ich hab' das jetzt mal probiert und hab' festgestellt, dass mir .IndexOfObject() ja keine Information über die ursprüngliche Platzierung gibt, |
Die "ursprüngliche Position" ist doch der Wert von .Objects[] selbst. ;) Oder hab ich da jetzt was nicht verstanden... :gruebel:
Calculon hat folgendes geschrieben: |
| sondern nur sagt, ob es sich bei dem im aktuellen Index eingetragenen string um einen vorhandenen Eintrag handelt, ansonsten liefert der Befehl mir eine -1 und die Anzahl der Einträge wird neu definiert? (die nach dem gelöschten string angezeigten Einträge waren ja wieder verschoben) |
Kannst du mal erklären, was du damit meinst? :? Irgendwie ist das alles sehr nebulös beschrieben... :| Am besten mit einem Beispiel. ;)
cu
Narses
Calculon - Do 25.01.07 01:03
Naja die Sache ist die. Ich hab' eine Playlist für eine Jukebox in einer Listbox erstellt. Damit das ganze schön anzuschauen ist, stehen in der Listbox Tags und nicht der Pfad zum Song. Wenn ich einen Eintrag doppelkliche soll der Pfad, der parallel in einer TStringlist gespeichert ist geöffnet werden.
Die Stringlist reagiert auf alles was in der Listbox passiert. Löschen, verschieben und hinzufügen. Das Problem zeigt sich, wenn ich die Songs nacheinander abspielen lassen will. In einem Timer wird geprüft ob, das Lied zu Ende ist, wenn ja index := index + 1; und das nächste Lied soll abgespielt werden. Nur wenn ich während der Laufzeit Titel lösche, schaffe ich es nicht diesen Index in einem Algorithmus korrekt beizubehalten.
Ich hoffe mein Problem ist jetzt klarer geworden.
Gruß
--
Narses - Do 25.01.07 01:10
Moin!
Also, wenn ich dich richtig verstanden habe, dann brauchst du doch nur statt dem Index (in die Listbox) des aktuell laufenden Titels die ID (der Wert in dem .Objects[]) zu speichern. Soll dann der nächste Titel starten, bestimmst du mit .IndexOfObject[CurrentSong] den Index in die Liste und addierst dann darauf eins und merkst dir wieder den ID-Wert des neuen aktuellen Titels. ;)
cu
Narses
Calculon - Do 25.01.07 01:27
Jetzt blick ich's endlich!
| Narses hat folgendes geschrieben: |
| Soll dann der nächste Titel starten, bestimmst du mit .IndexOfObject[CurrentSong] den Index in die Liste und addierst dann darauf eins und merkst dir wieder den ID-Wert des neuen aktuellen Titels. |
Werde so vorgehen. Danke nochmal für deine Mühen.
Gruß
--
Narses - Do 25.01.07 01:29
Moin!
Calculon hat folgendes geschrieben: |
| Jetzt blick ich's endlich! |
:idea: ;)
Calculon hat folgendes geschrieben: |
| Werde so vorgehen. Danke nochmal für deine Mühen. |
Bitte, gern geschehen. :D
Markierst du den Thread noch entsprechend, wenn dein Problem gelöst ist? Danke. ;)
cu
Narses
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!