33 Stimmen

Delphi/Lazarus: Text langer Items als Hint in ListBox anzeigen

Tutorial von Stefan Trost | Letztes Update am 07.01.2023 | Erstellt am 25.10.2013

In diesem Tutorial möchte ich euch zeigen, wie ihr in Delphi oder Lazarus hinbekommt, dass der Text langer Einträge einer TListBox als Hint (eine kleine Box bei einem MouseOver) angezeigt wird, wenn man mit der Maus über das jeweilige Item fährt.

Diese Funktion beherrscht die ListBox im Gegensatz zur TListView nämlich nicht von alleine und da die ListBox von sich aus auch keine Zeilenumbrüche unterstützt, bietet es sich an, dieses Feature programmatisch zu implementieren.

Hint immer anzeigen

Schauen wir uns zunächst diesen Code an, den wir dem Ereignis OnMouseMove unserer Listbox hinzugefügt haben. In diesem Beispiel zeigen wir das Hint immer an, unabhängig davon, wie lang der Text eines Items auch sein mag.

procedure TForm1.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  k: integer;
begin
  k := ListBox1.ItemAtPos(Point(X,Y),true)

  if k = -1 then begin
    ListBox1.ShowHint := false;
  end else begin
    ListBox1.ShowHint := true;
    ListBox1.Hint := ListBox1.Items[k];
  end;
end; 

Wenn wir mit der Maus über unsere ListBox fahren, wird automatisch das OnMouseMove-Ereignis ausgeführt und die Koordinaten der Maus in den Variablen X und Y übergeben. Mit der Funktion ItemAtPos() können wir den Eintrag einer ListBox bestimmen, der an einer bestimmten Stelle liegt. Die Funktion liefert uns den Index des betreffenden Items zurück oder -1 falls sich an dieser Stelle kein Eintrag befindet.

Abhängig vom Rückgabewert müssen wir nun also nur noch das ShowHint der ListBox aktivieren oder deaktivieren und im ersteren Fall das Hint auf den Text des entsprechenden Items setzen.

Text nur bei langen Items anzeigen

Möchten wir den Text nur bei Items einer bestimmten Länge anzeigen (zum Beispiel bei denen, die über die Größe der ListBox hinausragen, können wir eine weitere Bedingung in unseren Code von eben einfügen:

procedure TForm1.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  k: integer;
  s: string;
begin
  k := ListBox1.ItemAtPos(Point(X,Y),true)

  if k = -1 then begin
    ListBox1.ShowHint:=false;
  end else begin
    s := ListBox1.Items[k];
    if ListBox1.Canvas.TextWidth(s)>ListBox1.Width-10 then begin
      ListBox1.ShowHint := true;
      ListBox1.Hint := ListBox1.Items[k];
    end else begin
      ListBox1.ShowHint := false;
    end;
  end;
end; 

Falls wir also einen Eintrag unter unserem Cursor vorfinden, prüfen wir zunächst mit der Hilfe von Canvas.TextWidth(), ob die Länge des Textes dieses Items über die Breite der ListBox hinausragt. Nur in diesem Fall aktivieren wir unser Hint, ansonsten setzen wir ShowHint wieder auf false, wodurch der Hint nicht angezeigt wird.

AntwortenPositivNegativ

Über den Autor

AvatarSoftware von Stefan Trost finden Sie auf sttmedia.de. Benötigen Sie eine individuelle Software nach Ihren eigenen Wünschen? Schreiben Sie uns: sttmedia.de/kontakt
Profil anzeigen

 

Ähnliche Themen

Wichtiger Hinweis

Bitte beachten Sie: Die Beiträge auf askingbox.de sind Beiträge von Nutzern und sollen keine professionelle Beratung ersetzen. Sie werden nicht von Unabhängigen geprüft und spiegeln nicht zwingend die Meinung von askingbox.de wieder. Mehr erfahren.

Jetzt mitmachen

Stellen Sie Ihre eigene Frage oder schreiben Sie Ihren eigenen Artikel auf askingbox.de. So gehts.