Announcement

Collapse
No announcement yet.

Tooltips

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

  • Tooltips

    Hallo,

    ich suche nach einer Möglichkeit, ein Tooltip-Fenster eines Steuerelements anzuzeigen und zwar nicht nur, wenn der Anwender mit der Maus drübergeht. In meinem konkreten Fall bedeutet dies das ich ein TEdit dynamisch erstellt habe und den Hint einblenden möchte, sobald TEdit.Visible auf "true" gesetzt wird. Ich habe dieses mit der Methode TApplication.ActiveHint() versucht, aber ohne Erfolg!
    Weiss jemand Rat?

    MfG

    Reiner Ziegler

  • #2
    Hallo Reiner,<br>
    ich vor einiger Zeit mal mit den HintWindows herumgespielt. Vielleicht ist der folgende Source<br>
    ja eine kleine Hilfe.<br>
    THintWindowEx ist ein Nachfahre von THintWindow. Wo ich THintWindowEx gefunden habe weiß<br>
    ich leider nicht mehr.<br>
    <pre>
    unit HintWindowEx;

    interface

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

    type
    THintWindowEx = class(THintWindow)
    private
    FHintFont: TFont;
    FBorderColor: TColor;
    { Private-Deklarationen }
    procedure WMNCPaint(var Message: TMessage); message WM_NCPAINT;
    procedure SetHintFont(const Value: TFont);
    procedure SetBorderColor(const Value: TColor);
    protected
    { Protected-Deklarationen }
    procedure Paint; override;
    public
    { Public-Deklarationen }
    constructor Create(AOwner : TComponent); override;
    destructor Destroy; override;
    function CalcHintRect(MaxWidth: Integer; const AHint: string;
    AData: Pointer): TRect; override;
    published
    { Published-Deklarationen }
    property HintFont : TFont read FHintFont write SetHintFont;
    property BorderColor : TColor read FBorderColor write SetBorderColor;
    end;

    implementation

    { THintWindowEx }

    function THintWindowEx.CalcHintRect(MaxWidth: Integer; const AHint: string;
    AData: Pointer): TRect;
    begin
    Canvas.Font.Assign(FHintFont);
    Result:=inherited CalcHintRect(MaxWidth,AHint,AData);
    end;

    constructor THintWindowEx.Create(AOwner: TComponent);
    begin
    inherited Create(AOwner);
    FHintFont:=TFont.Create;
    FBorderColor:=clBlack;
    end;

    destructor THintWindowEx.Destroy;
    begin
    FHintFont.Free;
    inherited Destroy;
    end;

    procedure THintWindowEx.Paint;
    var
    R: TRect;
    begin
    R := ClientRect;
    Canvas.Brush.Style:=bsClear;
    Canvas.Pen.Color:=FBorderColor;
    Canvas.Rectangle(R);
    Inc(R.Left, 2);
    Inc(R.Top, 2);
    Canvas.Font.Assign(FHintFont);
    DrawText(Canvas.Handle, PChar(Caption), -1, R, DT_LEFT or DT_NOPREFIX or
    DT_WORDBREAK or DrawTextBiDiModeFlagsReadingOnly);
    end;

    procedure THintWindowEx.SetBorderColor(const Value: TColor);
    begin
    FBorderColor := Value;
    end;

    procedure THintWindowEx.SetHintFont(const Value: TFont);
    begin
    FHintFont.Assign(Value);
    end;

    procedure THintWindowEx.WMNCPaint(var Message: TMessage);
    begin
    Message.Result:=0;
    end;

    end.

    </pre>
    &#10

    Comment


    • #3
      Hier das Testprogramm,<br>
      <pre>
      <font face="Verdana" size="1" color="#000000">unit Unit1;

      interface

      uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, AppEvnts, ExtCtrls, CanvasPanel, HintWindowEx;

      type
      TForm1 = class(TForm)
      Edit1: TEdit;
      Edit2: TEdit;
      ApplicationEvents1: TApplicationEvents;
      CanvasPanel1: TCanvasPanel;
      procedure Edit1Enter(Sender: TObject);
      procedure Edit1Exit(Sender: TObject);
      procedure FormCreate(Sender: TObject);
      procedure FormClick(Sender: TObject);
      private
      { Private-Deklarationen }
      FHintWnd : THintWindowEx;
      FControl : TControl;
      procedure WMWINDOWPOSCHANGED(var Msg : TWMWindowPosChanged); message WM_WINDOWPOSCHANGED;
      public
      { Public-Deklarationen }
      end;

      var
      Form1: TForm1;

      implementation

      {$R *.DFM}

      procedure TForm1.Edit1Enter(Sender: TObject);
      var
      aRect : TRect;
      aPoint : TPoint;
      begin
      If Not Assigned(FHintwnd) then
      FHintWnd:=THintWindowEx.Create(Self);
      FHintWnd.Color:=$00DFFFFF;
      FHintWnd.HintFont.Style:=[];
      FHintWnd.HintFont.Name:='Verdana';
      FHintWnd.HintFont.Size:=7;
      FHintWnd.BorderColor:=clNavy;
      FControl:=TControl(Sender);
      aRect:=FHintWnd.CalcHintRect(Screen.Width,
      FControl.Hint,Nil);
      aPoint:=ClientToScreen(Point(FControl.Left,
      FControl.Top+FControl.Height+2));
      OffsetRect(aRect,aPoint.X,aPoint.Y);
      FHintWnd.ActivateHint(aRect,FControl.Hint);
      end;

      procedure TForm1.Edit1Exit(Sender: TObject);
      begin
      FControl:=Nil;
      FHintWnd.ReleaseHandle;
      end;

      procedure TForm1.WMWINDOWPOSCHANGED(var Msg: TWMWindowPosChanged);
      begin
      FControl:=Nil;
      If Assigned(FHintWnd) then
      FHintWnd.ReleaseHandle;
      end;

      procedure TForm1.FormCreate(Sender: TObject);
      begin
      CanvasPanel1.Hint:='Dies ist der Hint'+#13#10+'für TCanvasPanel';
      end;

      procedure TForm1.FormClick(Sender: TObject);
      begin
      FControl:=Nil;
      FHintWnd.ReleaseHandle;
      end;

      end.</font>
      </pre>
      Jens Schumann<br&gt

      Comment

      Working...
      X