| Autor |
Beitrag |
Calculon
      
Beiträge: 676
Win XP Professional
Delphi 7 PE, Delphi 3 PRO
|
Verfasst: Mi 24.01.07 16:36
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
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 24.01.07 17:20
Moin!
Pack einen Autoincrement-Counter in die .Objects[] und such dann mit .IndexOfObject() danach.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Calculon 
      
Beiträge: 676
Win XP Professional
Delphi 7 PE, Delphi 3 PRO
|
Verfasst: 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
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: 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:
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
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Calculon 
      
Beiträge: 676
Win XP Professional
Delphi 7 PE, Delphi 3 PRO
|
Verfasst: Mi 24.01.07 21:57
Vielen Dank!
Werd' mal kucken, ob ich das gebacken kriege!
Gruß
--
|
|
Calculon 
      
Beiträge: 676
Win XP Professional
Delphi 7 PE, Delphi 3 PRO
|
Verfasst: 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
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: 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...
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
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Calculon 
      
Beiträge: 676
Win XP Professional
Delphi 7 PE, Delphi 3 PRO
|
Verfasst: 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
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: 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
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Calculon 
      
Beiträge: 676
Win XP Professional
Delphi 7 PE, Delphi 3 PRO
|
Verfasst: 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
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 25.01.07 01:29
Moin!
Calculon hat folgendes geschrieben: | | Jetzt blick ich's endlich! |
Calculon hat folgendes geschrieben: | | Werde so vorgehen. Danke nochmal für deine Mühen. |
Bitte, gern geschehen.
Markierst du den Thread noch entsprechend, wenn dein Problem gelöst ist? Danke.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|