Hallo zusammen,
da das Design meiner Applikation einen blauen Selektionsbalken der TListBox nicht "toleriert", möchte ich diese Funktion selbst schreiben.
Da ich den vertikalen Balken nicht möchte, lese ich aus einem Array immer nur sieben Zeilen aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| lbMP3s.Clear; if length(aResultArray) > 7 then iMax := 7 else iMax := length(aResultArray); for i:= 0 to iMax-1 do begin lbMP3s.Add(aResultArray[i].Title) end; |
Die OnDraw-Methode der ListBox sorgt dann für die Zeichnung der Selektion:
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:
| procedure TfJukebox.lbMP3sDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); var myListBox : TRzListBox; sText : string; begin myListBox := (Control as TRzListBox); sText := myListbox.items.strings[index]; if myListBox.Items.Strings[Index] <> '' then begin with (Control as TRzListBox).Canvas do begin if Index = myListBox.Tag then begin Font.Color := clMaroon; Brush.Color := clWhite; end else begin Font.Color := clWhite; Brush.Color := clMaroon; end; FillRect(Rect); TextOut(Rect.Left,Rect.Top,sText); end; end; end; |
Nun habe ich zwei Buttons, mit denen ich die selektierte Zeile wählen kann. Dabei habe ich mir das so gedacht, dass diese lediglich den Wert für den Tag der Listbox verändern und danach OnDraw aufgerufen wird. Jedoch wird OnDraw leider nicht aufgerufen. Wie kann ich das ändern. Manuell möchte ich die Methode nicht aufrufen, weil ich dann alle Indizes mitgeben muss.
Hat einer einen Tip?
Pascal