Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   TListbox und TBalloonHint (https://www.delphipraxis.net/167256-tlistbox-und-tballoonhint.html)

Maya 20. Mär 2012 12:01


TListbox und TBalloonHint
 
Hallo ihr Lieben,

ich habe eine TListbox in der Namen von Leuten aufgezählt sind. Wenn man nun mit den Mauscursor dadrüber fährt, möchte ich, dass die Adresse der Personen angezeigt wird.
Habe ich auch fast soweit geschafft, wie ich es möchte, aber es tun sich zwei Probleme auf.

1: Dieses "dadrüberfahren", durch die Liste funktioniert nicht. Ich muss jedes Mal aus der Listbox heraus und wieder herein mit den Mauszeiger.
2: Wenn ich dann wieder auf einen Eintrag gehe, zeigt er mir die Adresse vom vorherigen Eintrag ein, auf den ich war. -.-

Ich habe schon folgende Thread gelesen: Listbox.hint oder auch hier ListBox: Hint = Item @ Mouse, klappt beides bei mir nicht. -.- Ich hab jetzt auch die Struktur von dem Beispiel hier ausprobiert und auch keinen Erfolg gehabt. Hint ähnlich wie ICQ Benutzer-Informationen

Hier ist mein Quellcode:
Delphi-Quellcode:
procedure TForm.lst1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var ID: Integer;
    Text, neuerHint: string;
begin
  Application.CancelHint;
  ID:=lst1.ItemAtPos(Point(x,y), True);
  if (ID>=0) then
    begin
      Text:=lst1.Items.Strings[ID];
      //[...]Datenbankabfrage nach der Adresse[...]
      neuerHint:=dtm.sdqrySuche.FieldByName('strasse').AsString+ #13+#10+
                 dtm.sdqrySuche.FieldByName('plz').AsString+' ' +
                 dtm.sdqrySuche.FieldByName('ort').AsString;

      if neuerHint<>lst1.Hint then
        begin
          lst1.Hint:=neuerHint;
          Application.ActivateHint(Point(x,y));
        end;
    end;
end;
Über Tipps wäre ich sehr erfreut.
Ich mach mir jetzt erstmal 'n Kakao. :)

stahli 20. Mär 2012 16:47

AW: TListbox und TBalloonHint
 
Falls Dir niemand konkreter helfen kann...

Ich habe mal Hints für eine ComboBox realisiert wie hier: http://delphi.about.com/library/weekly/aa102604a.htm
Vielleicht findest Du in der Gegend etwas...

Keldorn 20. Mär 2012 18:03

AW: TListbox und TBalloonHint
 
Hallo,

mich macht dein
Delphi-Quellcode:
Application.CancelHint;
stutzig. das gehört dort am Anfang nicht hin und kann so auch nicht funktionieren.
setzt das mal direkt vor
Delphi-Quellcode:
Application.ActivateHint(Point(x,y));
Wenn das noch nicht geht, würde ich das activatehint auch mal ausklammern.

Gruß Frank

Bummi 20. Mär 2012 22:44

AW: TListbox und TBalloonHint
 
ohne Daten, aber im Prinzip ...
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.HintPause :=0;
  Application.HintHidePause :=2000;
end;

procedure TForm1.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
 ANewHint:String;
 i:Integer;
begin

  i := ListBox1.ItemAtPos(Point(x,y), True);
  if i>-1 then
      begin
      ANewHint := ListBox1.Items[i];
      if ANewHint<>Listbox1.Hint then
        begin
          Listbox1.Hint:=ANewHint;
          Application.ActivateHint(Point(x,y));
        end;

    end;

end;

Maya 21. Mär 2012 05:42

AW: TListbox und TBalloonHint
 
Zitat:

Zitat von Bummi (Beitrag 1157622)
ohne Daten, aber im Prinzip ...
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.HintPause :=0;
  Application.HintHidePause :=2000;
end;

procedure TForm1.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
 ANewHint:String;
 i:Integer;
begin

  i := ListBox1.ItemAtPos(Point(x,y), True);
  if i>-1 then
      begin
      ANewHint := ListBox1.Items[i];
      if ANewHint<>Listbox1.Hint then
        begin
          Listbox1.Hint:=ANewHint;
          Application.ActivateHint(Point(x,y));
        end;

    end;

end;

Guten Morgen ihr Lieben,

danke erstmal für die Denkanstöße.

Bummi, deine Version ist ja fast die gleiche wie meine und leider brachte sie auch nicht den erwünschten Erfolg. Die Daten sind immer noch die vom vorherigen Datensatz, auf dem die Maus war. Auch muss ich immer noch 'raus aus der Listbox, um einen neuen Hint zu bekommen.
Ich würde ja am liebsten verbissen daran weiterarbeiten, bis das funktioniert, aber ich weiß nicht so recht, wo da der Fehler liegen könnte, da ich den Quelltext schon mehrere Male durch den Debugger jagte und eigentlich auch an der Stelle
Delphi-Quellcode:
lst1.Hint:=neuerHint;
die richtige Adresse in der Variable angezeigt wird.
Ein Kollege vermutete, dass das MouseMove-Ereignis auch vielleicht noch so ganz das richtige dafür ist, was ich da basteln möchte. Aber sowas wie MouseOver gibt es ja leider nicht bei der Listbox. -.- Mir jetzt selber so ein Ereignis zu schreiben, ist mir für diese Sache eigentlich auch zu aufwendig, da würde ich mir lieber eine andere Art überlegen, die Adresse anzeigen zu lassen.

EDIT!
So, Maya Sherlock Holmes hat zugeschlagen und geht der Sache jetzt auf 'n Grund. Ich hab jetzte infach mir 'n Label noch mit hingeklatscht und wenn ich jetzt über die Liste fahre, funktioniert das mit dem Label so wie ich das will, dass immer aktuell die Adresse des anvisierten Namen angezeigt wird. Ein weiterer Test bestätigte mir, dass das Problem bei dem TBalloonHint liegt. Als ich den aus dem CustomHint von der Listbox 'rausnahm, funktionierte das einwandfrei mit dem Standardhint! Die Schrift ist mir von dem aber zu klein, weswegen ich den BalloonHint nehmen möchte.

Jemand einen Tipp, was ich bei den Eigenschaften ändern muss? Den Delay habe ich schon 'runtergesetzt, kann aber z.B. nicht so recht was mit der Eigenschaft "HideAfter" anfangen und die OH empfinde ich da jetzt auch nicht als hilfreich.

Bummi 21. Mär 2012 06:03

AW: TListbox und TBalloonHint
 
Mhhhh, was ich hier eingestellt habe wurde mit 2010 getestet und funktioniert, geht es bei Dir auch nicht in der abgespeckten Version, oder tritt das Problem erst im Zusammenhang mit den Daten auf?

Maya 21. Mär 2012 06:10

AW: TListbox und TBalloonHint
 
Ich hab meinen Beitrag oben mal aktualisiert. ;)

Bummi 21. Mär 2012 06:44

AW: TListbox und TBalloonHint
 
ist zwar etwas unsauber, aber funktioniert
Delphi-Quellcode:
          Listbox1.Hint:=ANewHint;
          Sendmessage(Listbox1.Handle,CM_MOUSELeave,0,0);
          Sendmessage(Listbox1.Handle,CM_MOUSEENTER,0,0);
          Application.ActivateHint(Point(x,y))

Maya 21. Mär 2012 06:59

AW: TListbox und TBalloonHint
 
Or, du bist super, danke!!

Für alle, die auch mal das Problem haben sollten, hier der Quelltext:

Delphi-Quellcode:
procedure TForm1.lst1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var ID: Integer;
    Text, neuerHint: string;
begin
  ID:=lst1.ItemAtPos(Point(x,y), True);

  if (ID > -1 ) AND (ID < lst1.Items.Count) then
    begin
      Text:=lst1.Items.Strings[ID];
      //[..]Datenbankabfrage für die Adressen[...]    
      neuerHint:=dtm.sdqrySuche.FieldByName('strasse').AsString+ #13+#10+
                 dtm.sdqrySuche.FieldByName('plz').AsString+' ' +
                 dtm.sdqrySuche.FieldByName('ort').AsString;

      if neuerHint<>lst1.Hint then
        begin
          lst1.Hint:=neuerHint;
          SendMessage(lst1.Handle,CM_MOUSELEAVE,0,0);
          SendMessage(lst1.Handle,CM_MOUSEENTER,0,0);
          Application.ActivateHint(Point(x,y));
        end;
    end;
end;
Ich habe sicherheitshalber noch eingebaut, dass die ID kleiner als die Liste sein muss, da ich die Befürchtung hatte, dass mir das sonst knallt, wenn man außerhalb der Daten gelangt.

Bummi, dir ein absolut dickes "DANKE".

Bummi 21. Mär 2012 07:58

AW: TListbox und TBalloonHint
 
never mind ...:oops:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz