Listbox mit horizontaler Scrollbar
Enthält eine Listbox mehr Einträge als sie anzeigen kann, wird auf der rechten Seite automatisch eine vertikale Scrollbar angezeigt, um auch die anderen Items in den sichtbaren Bereich scrollen zu können.Sind allerdings einige Items breiter als die Listbox, wird keine horizontale Scrollbar zur Verfügung gestellt. Man muss manuell die LB_SetHorizontalExtent-Message an die Listbox senden. Im Folgenden Beispiel wird der Listbox eine Horizontale Scrollbar mit einer pauschalen Breite von 1000 Pixel hinzugefügt:
procedure TForm1.FormCreate(Sender: TObject); begin Listbox1.Perform(LB_SetHorizontalExtent, 1000, Longint(0)); end;
Möchte man den Scrollbereich der Scrollbar abhängig vom Inhalt festlegen, ist das OnDrawItem-Ereignis der richtige Ansatzpunkt dafür. Setzen Sie zunächst das Style-Property der Listbox auf lbOwnerDrawVariable oder lbOwnerDrawFixed und deklarieren Sie ein globales Feld in der Formular-Klasse:
type TForm1 = class(TForm) //... private flbHorzScrollWidth: Integer; //...
Die Scrollbar ist nun immer so groß, dass der breiteste Item angezeigt werden kann:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); var Len: Integer; NewText: String; begin NewText:=Listbox1.Items[Index]; with Listbox1.Canvas do begin FillRect(Rect); TextOut(Rect.Left + 1, Rect.Top, NewText); Len:=TextWidth(NewText) + Rect.Left + 10; if Len>flbHorzScrollWidth then begin flbHorzScrollWidth:=Len; Listbox1.Perform(LB_SETHORIZONTALEXTENT, flbHorzScrollWidth, 0 ); end; end; end;
So entfernen Sie die Scrollbar wieder:
procedure TForm1.Button2Click(Sender: TObject); begin flbHorzScrollWidth:=0; Listbox1.Perform(LB_SETHORIZONTALEXTENT, 0, 0 ); end;