Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - TListView Hint von Item??
csigg - Fr 10.06.05 15:21
Titel: TListView Hint von Item??
Ich hab ein recht grosses Listview in meinem Programm mit ca 100 Einträgen/Items. Jetzt würd ich mir zu jeden Item gern ein Hint anzeigen lassen, das aus der Datenbank gelesen wird. Das auslesen usw. ist nicht das Problem. Wie, wenn das überhaupt geht, kann ich ein Hint eines Items anszeigenlassen??
Keldorn - Fr 10.06.05 21:09
Hallo
such mal im Forum nach
LISTBOX HINT oder
STRINGGRID HINT.
Die Vorgehensweise ist die gleiche, im mousemove die Zeile/Zelle bestimmmen, Hint ermitteln und mit altem hint vergleichen. Wenn ungleich dann nueen Hint setzen und application.cancelhint aufrufen, damit der Hint auch neu angezeigt wird. Showhint natürlich auch nicht vergessen.
Mfg Frank
csigg - Di 28.06.05 09:18
Ich hab da mal geschaut, aber nicht wirklich brauchbares gefunden. Kann mir jemand sagen wie ich hier:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure Tfrm_Main.lvCube5InfoTip(Sender: TObject; Item: TListItem; var InfoTip: String); var info: String; temp: String; ListItem: TListItem; begin If lvCube5.ShowHinT = false then lvCube5.ShowHint := true;
temp := showMessage(temp);
lvCube5.Hint := info; end; |
weitermachen kann??
Ich muss irgendwie das ITEM auslesen können, weiss jemand wie??
csigg - Di 28.06.05 09:29
obige frage hat sich g rad erledigt, das Ereignis, OnInfoTip wird nie ausgelöst, hat jemand eine andere Idee??
Lannes - Di 28.06.05 10:15
Hallo,
wenn Du die Eigenschaft ListView.Tag noch nicht genutzt wird, hast Du folgende Möglichkeit:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TForm1.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var aItem : TListItem; begin aItem := ListView1.GetItemAt(X, Y); if aItem <> nil then begin Hint := aItem.Caption; if aItem.Index <> ListView1.Tag then begin Application.CancelHint; ListView1.Tag := aItem.Index; end; end else Application.CancelHint; end; |
sahib - Di 28.06.05 10:17
Oder so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39:
| Var Spalte, OldX, OldY: Integer;
procedure TForm1.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var LI : TListItem; i : Byte; SpaltenBreite, VorherigeSpaltenBreite: Integer; begin if (X <> OldX) or (Y <> OldY) then begin LI := ListView1.GetItemAt(X, Y); if LI = nil then Exit; OldX := X; OldY := Y; SpaltenBreite := 0; with ListView1 do begin for i := 0 to Pred(Columns.Count) do begin VorherigeSpaltenBreite := SpaltenBreite; inc(SpaltenBreite, Columns.Items[i].Width); if X <= SpaltenBreite then begin Spalte := i; Break end end end end end;
procedure TForm1.ListView1InfoTip(Sender: TObject; Item: TListItem; var InfoTip: String); begin if Spalte = 0 then InfoTip := Item.Caption else InfoTip := Item.SubItems[Spalte] end; |
*EDIT* Ein 'end' und Kommentare eingefügt
Christian
Lannes - Di 28.06.05 10:38
Hallo,
@sahib, hab das jetzt nicht getestet, aber reagiert das auch richtig, wenn die Spalten der ListView nach links verschoben werden?
Hatte mal etwas ähnliches programmiert, den Versatz der Spalten kann man mit TListItem.Left abfragen. Das nur zur Info.
sahib - Di 28.06.05 11:14
Hallo.
Lannes hat folgendes geschrieben: |
Hatte mal etwas ähnliches programmiert, den Versatz der Spalten kann man mit TListItem.Left abfragen. Das nur zur Info. |
Hmm, das kann schon angehen. Wozu ist die Eigenschaft .Left des Items da? Mit der arbeite ich nicht. Mein Code wird nicht funktionieren, wenn die Spalten untereinander vertauscht werden. Aber darüber hatte ich auch mal etwas gelesen, es gibt einen internen Array, wo die Daten abgelegt sind.
Christian
csigg - Di 28.06.05 11:29
also ich hab die Version von sahib genommen, die funktioniert ohne probleme.
Lannes - Di 28.06.05 11:31
Hallo,
sahib hat folgendes geschrieben: |
... Wozu ist die Eigenschaft .Left des Items da? ... |
Wenn die Spalten der ListView nicht verschoben sind hat .Left den Wert 0. Verschiebt man nun die Spalten mit der horizontalen Scrollbar gibt .Left den positiven Wert des Versatzes an. Muss ich jetzt irgendwas über die Spaltenbreiten berechnen kann ich .Left in die Berechnung einbeziehen.
sahib - Di 28.06.05 13:09
Ok, Lannes. Das habe ich jetzt. Sollte aber kein Problem sein, diese Verschiebung rauszunehmen.
Delphi-Quelltext
1:
| if X <= SpaltenBreite then begin |
wird zu
Delphi-Quelltext
1:
| if X <= SpaltenBreite + LI.Left then begin |
Christian
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!