Einzelnen Beitrag anzeigen

BigAl

Registriert seit: 6. Sep 2008
Ort: Kehl
495 Beiträge
 
Delphi 12 Athens
 
#1

TBallonHint gezielt anzeigen / ausblenden

  Alt 5. Mär 2016, 11:20
Hallo zusammen,

ich bin dabei eine Komponente zu erstellen (Delphi 10 Seattle, Windows 10). Meine Komponente ist von TCustomControl abgeleitet. Hier mal ein Ausschnitt der Zeichenfläche:

snip.png

Ich möchte nun beim Überfahren bestimmter Bereiche (im Beispiel die Felder mit den unterstrichenen Zahlen) einen Hinweis anzeigen. Der Hinweis soll erscheinen, sobald sich die Maus innerhalb des Felds befindet und auch solange angezeigt werden, bis die Maus das Feld wieder verlässt. Es soll also ein Hint gezielt ein- und ausgeblendet werden.

Im ersten Schritt habe ich das mal mit "Hint := HintText" und beim Verlassen mit "Application.CancelHint" versucht. Das hat grundsätzlich funktioniert. Leider war die Formatierung nicht wie gewünscht und Hinweis wurde natürlich nach einer bestimmten Zeit wieder ausgeblendet. Die globale Einstellung hierzu möchte ich aber nicht verändern.

Nun habe ich einen "TBalloonHint" erstellt und diesem dem "CustomHint" der Komponente zugewiesen. Dieser wird aber beim ersten Mal gar nicht angezeigt. Die Anzeige erfolgt erst, nachdem ich die Komponente mit der Maus komplett verlassen habe und diese dann wieder auf die Fläche der Komponente bewege. Angezeigt wird der Hint dann aber immer nur am Rand der Komponente bzw. an dem Punkt, an dem die Maus beim Eintritt in die Komponentenfläche zum ersten mal erfasst wurde.

Die Anzeige des Hints erfolgt in "MouseMove" und wird etwa wie folgt durchgeführt:

Delphi-Quellcode:
procedure Txxx.MouseMove(Shift: TShiftState; X, Y: Integer);
var
  I: Integer;
  HintText: string;
begin
  HintText := '';

  if AreaAt(X, Y) = rgaDay then
  begin
    I := GetHolidayIndex(DateAt(X));
    if I >= 0 then
      HintText := DateToStr(GetDateAt(X)) + '|' + FHolidays[I].Description;
  end;

  // show hint
  if HintText <> 'then
  begin
    Hint := HintText;
    if Assigned(CustomHint) then
      CustomHint.ShowHint(Mouse.CursorPos);
  end
  else
    if Assigned(CustomHint) then
      CustomHint.HideHint
    else
      Application.CancelHint;
end;
Das Ganze wurde auf das Wesentliche eingekürzt und sollte eigentlich selbsterklärend sein. Im Bereich ab "//show hint" habe ich schon alles Mögliche getestet. Leider hat bisher nichts zum Erfolg geführt. Ich möchte lediglich, dass der BalloonHint bei dem Feld angezeigt wird, sobald der Mauszeiger dieses berührt. Beim Verlassen des Bereichs soll der Hint dann wieder verschwinden.

Hat jemand vielleicht ein "Rezept" für das gezielte ein- und ausblenden von Hints? Im Internet (und auch hier im Forum) habe ich da nichts wirklich hilfreiches gefunden.

Danke schon mal für Eure Antworten.

Alex
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)
  Mit Zitat antworten Zitat