Autor |
Beitrag |
csigg
      
Beiträge: 706
WIn XP, Win NT, Win2000, Suse8.0
Delphi 5, Delphi 6
|
Verfasst: Fr 10.06.05 15:21
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
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: 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
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
csigg 
      
Beiträge: 706
WIn XP, Win NT, Win2000, Suse8.0
Delphi 5, Delphi 6
|
Verfasst: 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 
      
Beiträge: 706
WIn XP, Win NT, Win2000, Suse8.0
Delphi 5, Delphi 6
|
Verfasst: 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
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: 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; |
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
sahib
      
Beiträge: 117
Win 2000 SP4+
Delphi 5 Prof.
|
Verfasst: Di 28.06.05 10:17
Oder so:
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
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: 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.
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
sahib
      
Beiträge: 117
Win 2000 SP4+
Delphi 5 Prof.
|
Verfasst: 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 
      
Beiträge: 706
WIn XP, Win NT, Win2000, Suse8.0
Delphi 5, Delphi 6
|
Verfasst: Di 28.06.05 11:29
also ich hab die Version von sahib genommen, die funktioniert ohne probleme.
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: 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.
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
sahib
      
Beiträge: 117
Win 2000 SP4+
Delphi 5 Prof.
|
Verfasst: 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
|
|
|