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 Suche in: Delphi-Forum, Delphi-Library LISTBOX HINT oder Suche in: Delphi-Forum, Delphi-Library 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;//hier entsprechend ändern
      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
  // Wurde Mauszeiger bewegt?
  if (X <> OldX) or (Y <> OldY) then begin
    LI := ListView1.GetItemAt(X, Y);  // Item holen
    if LI = nil then Exit;  // Keines da?
    OldX := X; OldY := Y;
    SpaltenBreite := 0;
    // Spalte suchen über Breite der Spalten und MausX
    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.

user profile iconLannes 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,
user profile iconsahib 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