ListBox HINT

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
hbr
Beiträge: 321
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

ListBox HINT

Beitrag von hbr »

Hallo,
ich benutze folgende Hint Anweisung in MousMove.

Code: Alles auswählen

 
  p.x := X;  p.y := Y;
  with TListBox(Sender) do     
  begin
    ItemIndex := ItemAtPos(p, True);
    if ItemIndex = -1 then
     ListBox1.ShowHint:=false
    else
    begin
      s := ListBox1.Items[ItemIndex];
      if ListBox1.Canvas.TextWidth(s)>ListBox1.Width-10 then
     begin
       ListBox1.ShowHint := true;
       ListBox1.Hint := ListBox1.Items[ItemIndex];
     end else
      ListBox1.ShowHint:=false;
    end;
  end; 
 
Problem, die Hint-Anzeige funktioniert, nicht solange ich mich mit dem Mauszeiger in der Box befinde.
Es wird also kein Wechsel des Hint's angezeigt, solange man nicht den Mauszeiger aus der Box entfernt und dann wider erneut hinein geht.
Gibt es eventuell eine Lösung?

Gruß

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: ListBox HINT

Beitrag von theo »

Ich glaube der System Hint funktioniert einfach so (Will aber nicht ausschließen, dass es eine Lösung gibt).
Vielleicht hast du mit einer anderen Komponente mehr Glück: Z.B. http://wiki.freepascal.org/TPopupNotifier

P.S. Schlimmer Coding Style.
"With" ist mMn sowieso ganz schlecht (with TListBox(Sender) do ), aber "with" und ListBox1 gemischt ist ganz übel, da sind die Probleme vorprogrammiert.

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: ListBox HINT

Beitrag von wp_xyz »

Das folgende ist dem Hint-System der Grid-Komponenten nachempfunden und funktioniert bei mir:

Code: Alles auswählen

type
  TForm1 = class(TForm)
    proceudre Listbox1MouseMove(Sender: TObject; Shift: TShiftState);
  private
    FHintItemIndex: Integer; 
  ...
  end;
 
procedure TForm1.ListBox1MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
var
  lb: TListbox;
  p: TPoint;
  idx: Integer;
  s: String;
  R: TRect;
begin
  lb := Sender as TListbox;
  p := Point(X, Y);
  idx := lb.ItemAtPos(p, true);
  if idx = -1 then
  begin
    FHintItemIndex := -1;
    lb.Hint := '';
    Application.CancelHint;
  end else
  if idx <> FHintItemIndex then
  begin
    Application.CancelHint;
    s := lb.Items[idx];
    R := lb.ItemRect(idx);
    if lb.Canvas.TextWidth(s) > R.Right - R.Left then
    begin
      lb.Hint := s;
      Application.Hint := s;
      Application.ActivateHint(p, true);
      FHintItemIndex := idx;
    end else
    begin
      lbHint := '';
      FHintItemIndex := -1;
    end;
  end;
end;
Evtl. musst du noch FHintItemIndex im OnCreate auf -1 setzen, außerdem im OnMouseLeave, falls mehrere solcher Listboxen auf dem Formular sind.

hbr
Beiträge: 321
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: ListBox HINT

Beitrag von hbr »

Vielen Dank an alle.

Antworten