Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Hint / Tooltip selber anzeigen lassen? (https://www.delphipraxis.net/3059-hint-tooltip-selber-anzeigen-lassen.html)

hitzi 20. Feb 2003 14:21


Hint / Tooltip selber anzeigen lassen?
 
Ich habe ein StringGrid. Im MouseMove Ereignis habe ich folgenden Code:

Delphi-Quellcode:
procedure Tfm_Hauptformular.sg1MouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
var c,r:integer;
begin
 //Hint anzeigen
 timer1.enabled:=false;
 sg1.ShowHint:=false; //sg1 = stringgrid
 sg1.MouseToCell(x,y,c,r);
 if (c<sg1.ColCount) and (r<sg1.RowCount)and(c>0)and(r>0) then begin
  sg1.Hint:='Bemerkung: '+trim(sg1.Cells[7,r]);
  sg1.ShowHint:=true;
  timer1.Enabled:=true;
 end;
end;

//Timercode

procedure Tfm_Hauptformular.Timer1Timer(Sender: TObject);
begin
 timer1.Enabled:=false;
 sg1.ShowHint:=false;
end;
Dazu brauche ich aber eine Methode den Hint zu sagen, dass er jetzt erscheinen soll. Sonst muss ich jedesmal erst wieder mit der Maus aus dem Grid gehen.

Sowas in der Art sg1.showhintnow

MfG Hitzi

sakura 20. Feb 2003 21:22

Morgen bitte noch einmal nach oben holen - habe das in meinem Disk-Defrag auch gemacht - Code liegt im Office :D

...:cat:...

_frank_ 21. Feb 2003 00:33

schau dir mal die hint-Methoden von Tapplication an...du kannst z.B. HintPause auf 0 setzen, um den hint sofort anzeigen zu lassen.

Gruß Frank :bounce1:

hitzi 21. Feb 2003 06:12

@frank: Da mus ich aber immer noch den Mouscursor vom Control (hier stringgrid) wegbewegen, damit der Hint wieder erscheint.

@sakura: Nach oben geholt ... :P

MfG Hitzi

sakura 21. Feb 2003 08:09

Delphi startet ja schon... Folgender Code ist fast 1:1 copy&paste, aber es sollte Dir zeigen, wie es geht.

Du must die Eigenschaft ShowHint des Grids auf True setzen (ParentShowHint wird automatisch False).

Die Form-Variable FLastFragmentEntry merkt sich die letzte Zeile des aktuellen Hints, damit der Hint nicht so flackert. Unter Umständen musst Du auch noch die Spalten abfangen, falls Du die separat "hinten" möchtest. - Der Code ist nur zeilenweise.

Delphi-Quellcode:
procedure TfrmMain.grdFragmentsMouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
var
  Col, Row: Integer;
  FileName, FolderName, Fragments, Cluster: string;
begin
  grdFragments.MouseToCell(X, Y, Col, Row);

  if FLastFragmentEntry = Cardinal(Row) then
    Exit;
  FLastFragmentEntry := Row;

  // //kopfzeile zeigt keinen hint
  if Row > 0 then
  begin
    FileName := grdFragments.Cells[0, Row];
    FolderName := grdFragments.Cells[2, Row];
    Cluster := grdFragments.Cells[1, Row];
    Fragments := Fetch(Cluster, '/');
    grdFragments.Hint := Format('Datei: %s'#13#10'Ordner: %s'#13#10 +
        'Fragmente: %s'#13#10'Cluster: %s', [FileName, FolderName, Fragments,
        Cluster]);
  end else begin
    grdFragments.Hint := '';
  end;
  Application.ActivateHint(grdFragments.ClientToScreen(Point(0, (Y div
      grdFragments.DefaultRowHeight) * grdFragments.DefaultRowHeight)));
end;
...:cat:...

HJay 3. Mai 2011 19:21

AW: Hint / Tooltip selber anzeigen lassen?
 
Ich habe fast dasselbe Problem. Ich habe eine eigene graphische Komponente von TCustomControl abgeleitet und möchte je nach berührter Region meiner Komponente UNTERSCHIEDLICHE Hint anzeigen.

Der Trick mit Application.ActivateHint(Mouse.CursorPos) klappt zwar, aber wenn man das im MouseMove-Event erledigt, dann erscheint der Hint immer SOFORT und STÄNDIG, sobald man die entsprechende Region mit der Maus berührt.

Ich möchte aber eigentlich schon normales Hint-Verhalten haben: Also erst nach Application.HintPause erscheinen und dann auch wieder von selbst nach Application.HintHidePause verschwinden. Beides geht so leider nicht.

Wie kann man der Komponente quasi vorgaukeln, dass die Mouse zwischendurch die Komponente verlassen hat, also den offensichtlich vorhandenen "Hint-Merker" zurücksetzen? Wo merkt sich die Komponente, dass sie den Hint schon angezeigt hat? Wie kann man diesen Merker so zurücksetzen, dass beim nächsten Ruhen der Mouse wieder der Hint entsprechend angezeigt wird?

Vielen Dank im voraus!

WladiD 3. Mai 2011 21:11

AW: Hint / Tooltip selber anzeigen lassen?
 
Hatte schonmal dasselbe Problem in Lauge. In der Gallerie sollten je nach anvisierter Fläche unterschiedliche Hints angezeigt werden.

In der VCL wurden die Hints über die Messages CM_HINTSHOW und CM_HINTSHOWPAUSE realisiert.

Hier ein Auszug aus meinem Code:

Delphi-Quellcode:
      
TBaseVirtualTilesView = class(TCustomImage32)
private
   {**
    * Das Rechteck, welches für den letzten Hint als Grenze fungiert
    *
    * Der Hint wird erst geändert/ausgeblendet, wenn der Cursor diesen Bereich verlässt.
    *}
   FLastHintCursorRect:TRect;

   procedure CMHintShow(var Message:TCMHintShow); message CM_HINTSHOW;
   procedure CMHintShowPause(var Message:TCMHintShowPause); message CM_HINTSHOWPAUSE;
end;
   
implementation

procedure TBaseVirtualTilesView.CMHintShow(var Message:TCMHintShow);
var
   HintTile:TVirtualTile; // Ein Hint-Referenzobjekt
   MinHintPosY:Integer;
begin
   Message.Result:=1; // 1 verhindert und 0 erlaubt die Erstellung des Hints
   {**
    * Verhindern, dass der Hint bei jeder Mausbewegung ausgeblendet wird
    *}
   if PtInRect(FLastHintCursorRect, Message.HintInfo.CursorPos) then
      Exit;   
   {**
    * Das Referenzobjekt unter dem Mauszeiger ermitteln
    *}   
   HintTile:=GetTileAt(Message.HintInfo.CursorPos.X, Message.HintInfo.CursorPos.Y);
   if not (Assigned(HintTile) and HintTile.ShowHint) then
      Exit;

   FLastHintCursorRect:=MakeRect(HintTile.GetAdjustedRect(HintTile.Location));
   
   Message.HintInfo.CursorRect:=FLastHintCursorRect;
   Message.HintInfo.HintWindowClass:=GetHintWindowClass; // Beliebige THintWindow-Klasse
   
   
   Message.HintInfo.HintStr:='Der Hint-String';
   
   // Beliebiger Pointer: siehe 3. Parameter von THintWindow.ActivateHintData
   Message.HintInfo.HintData:=Pointer(HintTile);
   
   Message.HintInfo.HideTimeout:=-1; // -1 = kein Timeout
   Message.HintInfo.ReshowTimeout:=0;
   
   Message.HintInfo.HintPos.X:=FLastHintCursorRect.Right;
   Message.HintInfo.HintPos.Y:=FLastHintCursorRect.Top;
   Message.HintInfo.HintPos:=ClientToScreen(Message.HintInfo.HintPos);
   MinHintPosY:=ClientToScreen(Point(0, 0)).Y;
   Message.HintInfo.HintPos.Y:=Max(Message.HintInfo.HintPos.Y, MinHintPosY);

   Message.Result:=0; // Erstellung erlauben
end;

procedure TBaseVirtualTilesView.CMHintShowPause(var Message:TCMHintShowPause);
begin
   Message.Pause^:=500; // Pause in Millisekunden bevor der Hint angezeigt wird
end;
Dieses Listing sollte genügend Informationen enthalten, um sich daraus seine eigene Lösung umzusetzen.

Um an die Messages zu kommen kann man die betreffende Klasse subclassen oder die WndProc hooken.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz