Home » Tipps & Tricks » Komponenten » TListBox/TComboBox » Listbox mit horizontaler Scrollbar

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;