hint in listbox

derGugi

Erfahrenes Mitglied
Hallo!
Ich habe eine Listbox, bei der die Einträge teilweise länger sind als die Listbox selbst, also sie ragen über die rechte Seite raus, so dass ich nicht mehr den ganzen Eintrag sehen kann. Ich versuchte mit showhint und hint den eintrag anzeigen zu lassen, was auch funktionierte, nur halt nicht so gut... Kann ich abfragen, ob die Maus über einem jeweiligen Eintrag ist? Oder geht es nur mit der gesamten Listbox? Wie wird das normalerweise gelöst? Hat jemand einen guten Vorschlag?

Danke im Voraus!
 
schreib mal im onmousemove-ereignis der listbox folgenden code:
Code:
if (ListBox1.ItemAtPos(Point(X, Y), True)) > -1 then
begin
  ListBox1.Hint := ListBox1.Items[ListBox1.ItemAtPos(Point(X, Y), True)];
end;

das ist aber nur ein denkanstoss, da müsste man evtl. noch ein paar kleinigkeiten verbessern.
 
danke!
ich habs jetzt etwas weiter entwickelt und es läuft, wenn ich es im MouseOver habe, da dort die x und y-Koordinaten automatisch ausgelesen werden. Wie kann ich diese Koordinaten, also die aktuelle Maus position manuell auslesen? Hier noch der Code;

PHP:
procedure TfrmEditPaths.ListHint(list:TListBox);
var x, y:Integer;
begin
if list.itemindex <> -1 then
begin
 list.ShowHint := True;
 try
  if list.Items[list.ItemIndex] = list.Items[list.ItemAtPos(Point(X, Y), True)] then
   list.Hint := list.items[list.ItemIndex]
  else
  list.showhint := False;
 except
  list.showhint := False;
 end;
end
else
 list.ShowHint := False;
end;

btw: Wie kann ich normaler nicht php code hier reinfügen so dass er formatiert ist??
 
die mausposition besteht aus einer x- und einer y-koordinate (angaben in pixeln). diese koordinaten werden der behandlungsroutine vom mousemove-ereignis als parameter übergeben.
wenn du also eine andere prozedur verwendest, musst du die koordinaten innerhalb der prozedur bekannt machen. dazu kannst du die variablen entweder als parameter übergeben oder in der prozedur selbst nochmal neu deklarieren.

anderen code kannst du übrigens mit dem Codetag einfügen. aber da gibt es dann kein syntax-highlighting mehr. den fettdruck der schlüsselwörter müsstest du dir dann mit den B-tags selber bauen. ;)
 
Jo das ist mir schon klar. Meine Frage ist aber, wie lautet die Funktion um die Koordinaten auszulesen? Ich möchte sie in der Prozedur definieren, da die Prozedur auch durch das Onclick ereignis der Liste ausgeführt werden muss. Und diese hat ja keine Koordinaten als Parameter, darum kann ich sie auch nicht übergeben.
Also
Code:
procedure TfrmEditPaths.ListHint(list:TListBox);
var x, y:Integer;
begin
//x := ?? getX() oder so..
//y := ??
if list.itemindex <> -1 then
begin

Wird wahrscheinlich einfach sein, aber finds nicht in der Hilfe...
 
die mauskoordinaten sind eine eigenschaft von dem mouse-objekt:
Code:
x := Mouse.CursorPos.X;
y := Mouse.CursorPos.Y;

allerdings beziehen sich diese angaben immer auf den gesamten bildschirm. also musst du das auf den bereich deines formulars eingrenzen:
Code:
var
  p: TPoint;
begin
  p.X := Mouse.CursorPos.X - Form1.Left - (Form1.Width - Form1.ClientWidth);
  p.Y := Mouse.CursorPos.Y - Form1.Top - (Form1.Height - Form1.ClientHeight);
 
Danke es klappt! Musste es nur noch auf die liste anpassen. hier der vollständige code, falls es jemanden interessiert..
Code:
procedure TfrmEditPaths.ListHint(list:TListBox);
var
  x, y          :       Integer;
begin
  X := Mouse.CursorPos.X - self.Left - (self.Width - self.ClientWidth) - list.Left;
  Y := Mouse.CursorPos.Y - self.Top - (self.Height - self.ClientHeight) - list.Top;
if list.itemindex <> -1 then
begin
 list.ShowHint := True;
 try
  if list.Items[list.ItemIndex] = list.Items[list.ItemAtPos(Point(x, y), True)] then
   list.Hint := list.items[list.ItemIndex]
  else
  list.showhint := False;
 except
  list.showhint := False;
 end;
end
else
 list.ShowHint := False;
end;

Zum schluss noch was: Ist es möglich, den Hint länger anzeigen zu lassen? Jetzt verschwindet er doch noch recht schnell..
 
Zuletzt bearbeitet:
ja, das geht - mit der variable Application.HintHidePause. die variable enthält die anzeigedauer für alle hints in der anwendung (gemessen in sekunden).
voreinstellung ist soweit ich weiss 2500 (=2,5 sekunden).
 

Neue Beiträge

Zurück