Announcement

Collapse
No announcement yet.

Hint bei Mausbewegung über selbem Control mehrfach anzeigen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Hint bei Mausbewegung über selbem Control mehrfach anzeigen

    Hallo,

    ich habe ein TImage mit einem Bitmap als Graphik. Wenn ich mit dem Mauszeiger über
    das Image gehe bestimme ich mit dem Event Application.OnShowHint aus HintInfo.CursorPos
    die Cursorposition und zeige je nach Position unterschiedliche Hints an. Das funktioniert beim ersten
    Mal sehr gut, aber wenn ich den Mauszeiger innerhalb des Images bewege wird der Hint kein
    weiteres Mal ausgelöst. Wie kann ich erreichen, dass der Hint nach jeder Mausbewegung
    innerhalb des Controls so ausgelöst wird als wäre der Mauszeiger von ausserhalb
    über das Control geführt worden ? Ist das HintInfo Objekt vom Typ THintInfo auch ausserhalb
    des Application.OnShowHint Events verfügbar ?

    Vielen Dank für jeden Hinweis

  • #2
    Versuch doch im OnMouseMove das Anzeigen des Hints zu erzwingen. Vielleicht eignet sich ja Application.ActivateHint (nicht getestet).
    Gruß, Mario Noac
    Schöne Grüße, Mario

    Comment


    • #3
      Versuch doch im OnMouseMove das Anzeigen des Hints zu erzwingen. Vielleicht eignet sich ja Application.ActivateHint (nicht getestet).<P>
      Gruß, Mario Noac
      Schöne Grüße, Mario

      Comment


      • #4
        Hallo Mario,

        danke für Deine mail. Leider habe ich unter Delphi3 Application.ActivateHint
        scheinbar nicht zur Verfügung. Benutzt Du vielleicht eine höhere Version?

        mfG

        Marti

        Comment


        • #5
          Hallo Martin,

          mit der folgenden Procedure sollte es funktionieren. Du mußt lediglich noch in Deinem Form fHintWindow: THintWindow; deklarieren.

          Ciao Torsten

          Procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer)

          Var
          sText: String;
          wnHintKoord: TRect;

          Begin
          // ab bestimmter Pos soll Hilfe angezeigt werden
          IF X > 100 then
          begin
          If Not Assigned ( fHintWindow ) then
          fHintWindow := HintWindowClass.Create ( Self ) ;
          sText := 'Hello World';
          with wnHintKoord do
          begin
          Left := x + 5;
          Top := y + 25;
          Bottom := Top + fHintWindow.Canvas.TextHeight ( sText ) + 2;
          Right := Left + fHintWindow.Canvas.TextWidth ( sText ) + 7;
          end;
          fHintWindow.ActivateHint ( wnHintKoord, sText );
          end
          else
          If Assigned ( fHIntWindow )then
          FreeAndNil ( fHintWindow );
          end

          Comment


          • #6
            Jo, Delphi 5<P>
            Gruß, Mario Noac
            Schöne Grüße, Mario

            Comment


            • #7
              Hallo Torsten,

              vielen Dank für Deine Hilfe.
              Anbei eine abgewandelte Version.

              mfg

              Martin

              <PRE>
              unit Unit1;

              interface

              uses
              Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
              ExtCtrls;

              type
              TForm1 = class(TForm)
              Panel1: TPanel;
              procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
              Y: Integer);
              procedure FormCreate(Sender: TObject);
              private
              { Private declarations }
              public
              { Public declarations }

              HintShowMove: boolean;
              HintHideMove: boolean;

              HintShowTimer: TTimer;
              HintHideTimer: TTimer;

              MyHintWindow: THintWindow;

              procedure HintShowTimerEvent(Sender: TObject);
              procedure HintHideTimerEvent(Sender: TObject);

              end;

              var
              Form1: TForm1;

              implementation

              {$R *.DFM}
              //------------------------------------------------------------------------
              procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
              Y: Integer);
              begin

              if HintShowMove then //weil ActivateHint einen MouseMove auslöst
              HintShowMove := false
              else
              begin
              MyHintWindow.ReleaseHandle;

              if(HintHideMove) then //weil ReleaseHandle einen MouseMove auslöst
              HintHideMove := false
              else
              begin
              if(HintShowTimer <> nil) then
              begin
              HintShowTimer.Free;
              HintShowTimer := Nil;
              end;

              HintShowTimer := TTimer.Create(self);
              HintShowTimer.Interval := 500;

              HintShowTimer.OnTimer := HintShowTimerEvent;
              end;
              end;

              end;
              //------------------------------------------------------------------------
              procedure TForm1.HintShowTimerEvent(Sender: TObject);

              var
              pt: TPoint;

              ClientPoint: TPoint;
              PanelRect: TRect;

              S: String;

              HintCoord: TRect;

              begin

              HintShowTimer.Enabled := false;
              HintShowMove := true;

              GetCursorPos(pt);
              ClientPoint := Panel1.ScreenToClient(pt);
              PanelRect := Panel1.ClientRect;

              if (PtInRect(PanelRect,ClientPoint)) then
              begin
              S := IntToStr(integer(ClientPoint.x))+'/'+IntToStr(integer(ClientPoint.y));

              HintCoord.left := pt.x + 5;
              HintCoord.top := pt.y + 25;
              HintCoord.bottom := HintCoord.top + MyHintWindow.Canvas.TextHeight(S) + 2;
              HintCoord.right := HintCoord.left + MyHintWindow.Canvas.TextWidth(S) + 7;

              MyHintWindow.ActivateHint(HintCoord,S);

              if(HintHideTimer <> nil) then
              begin
              HintHideTimer.Free;
              HintHideTimer := nil;
              end;

              HintHideTimer := TTimer.Create(self);
              HintHideTimer.Interval := 3000;

              HintHideTimer.OnTimer := HintHideTimerEvent;
              end
              else
              begin
              if(HintHideTimer <> nil) then
              begin
              HintHideTimer.Free;
              HintHideTimer := nil;
              end;
              end;

              if(HintShowTimer <> nil) then
              begin
              HintShowTimer.Free;
              HintShowTimer := Nil;
              end;

              end;
              //------------------------------------------------------------------------
              procedure TForm1.HintHideTimerEvent(Sender: TObject);

              begin

              HintHideTimer.Enabled := false;
              HintHideMove := true;

              MyHintWindow.ReleaseHandle;

              if(HintHideTimer <> nil) then
              begin
              HintHideTimer.Free;
              HintHideTimer := nil;
              end;

              end;
              //------------------------------------------------------------------------
              procedure TForm1.FormCreate(Sender: TObject);
              begin

              MyHintWindow := HintWindowClass.Create(Self ) ;

              end;
              //------------------------------------------------------------------------
              end.
              </PRE&gt

              Comment

              Working...
              X