Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Listbox.hint


D. Annies - Fr 29.01.10 10:57
Titel: Listbox.hint
Hi, Delpher,

ich "schwebe" mit der Maus über einer Listbox und fahre die einzelnen Einträge ab, das sind die Namen von Schulklassen.
Dann will ich jeweils die zugehörigen Klassenlehrer aus einer anderen Tabelle als Hint sehen.
Ich habe folgenden Code, der aber den Klassenlehrer nicht wechselt:


Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  QAusleihsatz.Locate('Klasse', listbox1.Items[listbox1.ItemIndex], []);
  listbox1.Hint := QAusleihsatz.fieldbyname('KLK').asstring;
end;


Wie muss ich das ändern?
Gruß, Detlef


guinnes - Fr 29.01.10 11:14

Erst ShowHint auf False, den Hint wechseln und dann ShowHint wieder auf True


D. Annies - Fr 29.01.10 11:20

Danke, reicht aber noch nicht, ich bekomme immer den markierten Eintrag angezeigt.

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

So, jetzt habe ich folgende Lösung:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var item: integer;
begin
  with Sender as TListbox do
  begin
    item := itemAtpos(Point(x, y), true);
    if item >= 0 then
    begin
      QAusleihsatz.Locate('Klasse', listbox1.Items[Item], []);
      listbox1.Hint := QAusleihsatz.fieldbyname('KLK').asstring;
    end;
  end;    
end;


Aber ich muss jedesmal wieder neu von außen in die Listbox, kann also nicht einfach die Einträge "abfahren".


guinnes - Fr 29.01.10 12:06

user profile iconD. Annies hat folgendes geschrieben Zum zitierten Posting springen:
Aber ich muss jedesmal wieder neu von außen in die Listbox, kann also nicht einfach die Einträge "abfahren".
Deswegen sollst du Showhint auch ausschalten und wieder einschalten. Bei mir klappt das z.B. bei einem TChart problemlos :

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:
procedure TPlanung.Chart1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
Var
  Index : Integer;

procedure GetHint ( aList : TStringList);
begin
  with aList do
  begin
    fChargenName    := Names[Index];
    Chart1.Hint     := Names[Index] + #$0d + Trim(Copy(Strings[Index],16,255));
  end;
end;

begin
  if fEnableMouseMove Then
  begin
    Chart1.ShowHint := False;
    Chart1.Hint     := #$0D;
    fChargenName    := '';
    Index := Series1.GetCursorValueIndex;
    if (Index >= 0and (Index < fChargen.Count) Then
    begin
      GetHint(fChargen);
      fMouseKessel := Trunc(Series1.YValues.Value[Index]);
    end
    else
    begin
      Index := Series2.GetCursorValueIndex;
      if (Index >= 0and (Index < fLaufende.Count) Then
      GetHint(fLaufende);
    end;
    if Chart1.Hint <> #$0d Then Chart1.ShowHint := True;
  end;
end;


D. Annies - Fr 29.01.10 13:10

Tut mir leid, ich krieg's für die Listbox nicht hin :roll: :(


guinnes - Fr 29.01.10 13:52

user profile iconD. Annies hat folgendes geschrieben Zum zitierten Posting springen:
Tut mir leid, ich krieg's für die Listbox nicht hin :roll: :(

Ich kann dich beruhigen, mit ner Listbox krieg ichs auch nicht hin :bawling:
Wahrscheinlich wirken die einzelnen ChartSeries so, als würde die Maus den Chart verlassen und dann wieder betreten


D. Annies - Fr 29.01.10 14:45

Hi, Guinnes,

na, ja, beruhigt bin ich nicht, :wink: wir beide sind wohl eher kaltgestellt!
Trotzdem danke für deine Mühe,

Detlef :motz:


ALF - Fr 29.01.10 15:15

Hi, ich versuch mal zu Helfen kenn mich aber in Tabellen und so nicht aus :?
Aber was machst Du hier:

Delphi-Quelltext
1:
listbox1.Hint := QAusleihsatz.fieldbyname('KLK').asstring;                    


Wo erhöchst Du hier die tabellenzeile oder so.
Du übergibst , wenn ich es richtig sehe, immer den gleichen Wert oder!?

Gruss ALf


Nersgatt - Fr 29.01.10 15:33

user profile iconALF hat folgendes geschrieben Zum zitierten Posting springen:
Hi, ich versuch mal zu Helfen kenn mich aber in Tabellen und so nicht aus :?
Aber was machst Du hier:

Delphi-Quelltext
1:
listbox1.Hint := QAusleihsatz.fieldbyname('KLK').asstring;                    


Wo erhöchst Du hier die tabellenzeile oder so.
Du übergibst , wenn ich es richtig sehe, immer den gleichen Wert oder!?

Ne, macht er nicht. Mit dem Locate eine Zeile vorher sucht er den passenden Datensatz raus und zeigt das die Daten aus dem entsprechenden Feld an.


guinnes - Fr 29.01.10 16:00

Ich Habs :

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TForm1.ListBoxMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  item : integer;
  HS   : string;
  LB   : TListBox;
begin
  LB := Sender as TListbox;
  item := LB.itemAtpos(Point(x, y), true);
  if item >= 0 then
  begin
    HS := LB.Items.Strings[Item];
    if HS <> LB.Hint then
    begin
      LB.Hint := HS;
      Application.ActivateHint(Point(X,Y));
    end;
  end;
end;


D. Annies - Fr 29.01.10 17:56

Allteer!! (Tschuldigung!)
PERFEKT! Wie bist du denn darauf gekommen?
Ja, so wollte ich es haben. Dann noch wieder den Locate gesetzt - es funzt!

Vielen, vielen Dank! Hatte ich gar nicht mehr mit gerechnet.
Gruß aus Lübeck,
Detlef


guinnes - Fr 29.01.10 19:40

user profile iconD. Annies hat folgendes geschrieben Zum zitierten Posting springen:
Allteer!! (Tschuldigung!)

Na, ja, mit 56 stört mich das nicht mehr, es passt ja :wink:
Zitat:
Wie bist du denn darauf gekommen?

Einfach ( hust ) im Quelltext der Forms.Pas ( da liegt ja das Application-Objekt ) nach Hint gesucht
Zitat:
Dann noch wieder den Locate gesetzt - es funzt!

Du solltest dir den gefundenen Zeileninhalt aber in der Form merken, sonst wird deine Datenbank bei jedem noch so kleinen Ruckler an der Maus abgefragt, was ja nicht nötig ist


D. Annies - Fr 29.01.10 22:05

Hi, guinnes,

off-topic:
nun, und ich: detlef := guinnes - 1; (ich auch allteer ..) - Nein, ich war nur so begeistert, hatte nicht gedacht, dass es doch geht - und so (hust) einfach!!

bis denne,
Detlef


kmma - Mo 23.08.10 15:06

Hallo

Ich habe eine Frage zu dieser Lösung. So wie sie dasteht funktioniert das, sobald ich aber eine Variable HS2 einfüge, klappt das nicht mehr, hat jemand eine Ahnung warum? (Wichtig: Ich mache garnichts mit hs2, ich bin da nur draufgestoßen weil ich eigentlich den hint-Text ändern wollte.

user profile iconguinnes hat folgendes geschrieben Zum zitierten Posting springen:
Ich Habs :

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TForm1.ListBoxMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  item : integer;
  HS, hs2   : string;
  LB   : TListBox;
begin
  LB := Sender as TListbox;
  item := LB.itemAtpos(Point(x, y), true);
  if item >= 0 then
  begin
    HS := LB.Items.Strings[Item];
    HS2 := lowercase(hs);
    if HS <> LB.Hint then
    begin
      LB.Hint := HS;
      Application.ActivateHint(Point(X,Y));
    end;
  end;
end;