Einzelnen Beitrag anzeigen

bluescreen25

Registriert seit: 27. Nov 2005
Ort: Geldern
229 Beiträge
 
Delphi 7 Enterprise
 
#1

Listboxeintrag merken und wiederherstellen

  Alt 28. Dez 2005, 18:59
Hallo,
ehrlich gesagt weiss ich nicht mehr weiter . Folgende Knobelaufgabe für eine Listbox mit MP3-Files:

Ich möchte den laufenden MP3-Track farbig hinterlegt haben, auch wenn dieser innerhalb der Listbox-Indexe verschoben wird und vor allem muss der richtige Track farbig sein, auch wenn es in der Listbox zwei mal die gleichen Einträge gibt.

1. Im Moment habe ich es nur hinbekommen, das er über den Index immer richtig den laufenden Track farbig anzeigt, aber bei verschieben wieder den falschen, oder
2. das über den PlayList.IndexOf(Playsong) auch bei verschieben der laufende Track immer farbig hinterlegt bleibt, aber bei zwei gleichen Einträgen er immer den ersten gefundenen farbig hinterlegt, obwohl er den zweiten richtigen abspielt.


Hier die Procedure des abspielenden Tracks mit den z.Z. verfügbaren Variablen:
Delphi-Quellcode:
procedure Tmediaplayer_frm.PlayFile(songNumber: integer);
 begin
   if fileexists(Playlist.Strings[songNumber]) then
     begin
      CurrentSong := songNumber;
      playsong := Playlist.Strings[songNumber];
      playsong_name := PlayList_ListBox.Items.Strings[songNumber];
      bassplayer.play(playsong);
      trackbar_position.MaxValue := BassPlayer.length;
      media_scroll_txt_run;
      show_tracktime;
      PlayList_ListBox.Refresh;
     end;
 end;

Hier die procedure für das Halten des Topindex der Listbox im sichtbaren Bereich:
Delphi-Quellcode:
procedure Tmediaplayer_frm.Listbox_track_middle_timerTimer(
  Sender: TObject);
 begin
   if currentsong = 0 then
   PlayList_ListBox.TopIndex := currentsong;//PlayList.IndexOf(Playsong) ;
   if currentsong > 0 then
   PlayList_ListBox.TopIndex := currentsong -5;//PlayList.IndexOf(Playsong)-5 ;
 end;
Hier die procedure für das farbige hinterlegen des laufenden Tracks:
Delphi-Quellcode:
procedure Tmediaplayer_frm.PlayList_ListBoxDrawItem(Control: TWinControl;
  Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
  C:TCanvas;

 begin
   C := TListbox(Control).Canvas;
   C.Font.Assign(TListbox(Control).Font);

    if Index = currentsong then//PlayList.IndexOf(Playsong) then
        C.Brush.Color := clTeal;
      C.Font.Color := clWhite;
    If odSelected in State Then
      C.Brush.Color := clHighlight;
      C.FillRect(Rect);
      C.TextRect(Rect, Rect.Left, Rect.Top, TListbox(Control).Items[Index]);
    If odFocused in State Then
      C.DrawFocusRect(Rect);
 end;
Hier die procedure zum verschieben der Listboxeinträge sowie TStringlist(Playlist):
Delphi-Quellcode:
procedure Tmediaplayer_frm.PlayList_ListBoxDragDrop(Sender,
  Source: TObject; X, Y: Integer);
var
    i,j,k : Integer;
                   //Playlisteneinträge verschieben
 begin
   i := PlayList_ListBox.ItemIndex;
   j := PlayList_ListBox.ItemAtPos(point(x,y),true);

   if j >-1 then //nur drag & drop ,wenn auch item vorhanden
   begin
     PlayList_ListBox.Items.Move(i,j);
     PlayList.Move(i,j);
     PlayList_ListBox.Refresh;
     PlayList_ListBox.Selected[j]:=false;
   end;
 end;

Der komplette Code hier hinterlegt immer den laufenden Track farbig, aber bei verschieben ist es falsch.

Mein Ansatz wäre beim verschieben sich den Track nochmal separat zu merken, aber wie? Der Index ändert sich und es gibt doppelte Einträge in der Listbox, welches PlayList.IndexOf(Playsong) auch ausschliesst.

Bitte nicht über das Konstrukt meckern, mache Delphi erst seit 6 Wochen....
  Mit Zitat antworten Zitat