AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Hint / Tooltip selber anzeigen lassen?

Ein Thema von hitzi · begonnen am 20. Feb 2003 · letzter Beitrag vom 3. Mai 2011
Antwort Antwort
Benutzerbild von hitzi
hitzi

Registriert seit: 2. Jan 2003
Ort: Eibau
768 Beiträge
 
Delphi 2010 Professional
 
#1

Hint / Tooltip selber anzeigen lassen?

  Alt 20. Feb 2003, 15:21
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
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#2
  Alt 20. Feb 2003, 22:22
Morgen bitte noch einmal nach oben holen - habe das in meinem Disk-Defrag auch gemacht - Code liegt im Office

......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#3
  Alt 21. Feb 2003, 01: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
Frank Wunderlich
  Mit Zitat antworten Zitat
Benutzerbild von hitzi
hitzi

Registriert seit: 2. Jan 2003
Ort: Eibau
768 Beiträge
 
Delphi 2010 Professional
 
#4
  Alt 21. Feb 2003, 07:12
@frank: Da mus ich aber immer noch den Mouscursor vom Control (hier stringgrid) wegbewegen, damit der Hint wieder erscheint.

@sakura: Nach oben geholt ...

MfG Hitzi
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#5
  Alt 21. Feb 2003, 09: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;
......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
HJay

Registriert seit: 7. Dez 2009
172 Beiträge
 
Delphi XE7 Enterprise
 
#6

AW: Hint / Tooltip selber anzeigen lassen?

  Alt 3. Mai 2011, 20:21
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!
  Mit Zitat antworten Zitat
WladiD

Registriert seit: 27. Jan 2006
Ort: Celle
135 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Hint / Tooltip selber anzeigen lassen?

  Alt 3. Mai 2011, 22:11
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.
Waldemar Derr

Geändert von WladiD ( 3. Mai 2011 um 22:14 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:13 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