Application.ActivateHint显示了Delphi XE2上错误位置的提示

时间:2013-07-05 18:49:27

标签: delphi delphi-xe2 hint

我正在使用Application.ActivateHint(p),其中p: TPoint来显示指定位置的提示。但它始终显示在Delphi XE2上的实际鼠标坐标上。

请查看堆栈:

Main.ApplicationEventsShowHint('Hint String Here...',True,$18FB14)
:5049c644 TCustomApplicationEvents.DoShowHint + $20
:5049d043 TMultiCaster.DoShowHint + $4B
:50454a6b TApplication.ActivateHint + $213
RxDBCtrl.TRxDBGrid.MouseMove([],934,45)

RxDBCtrl.TRxDBGrid.MouseMove上,我使用正确的屏幕坐标作为参数调用TApplication.ActivateHint。但在Main.ApplicationEventsShowHint(var HintStr: string; var CanShow: Boolean; var HintInfo: THintInfo)上,HintInfo.HintPos的值与实际鼠标坐标相同。作为参数传递给TApplication.ActivateHint的值将丢失。

为什么会这样?如何在Delphi XE2上显示所需坐标的提示?

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

我确定可以使用默认的Hint控件实现此目的,但您可能需要查看TBalloonHint组件,该组件允许您在给定位置显示提示。

以下是如何实现这一目标的一个非常简单的示例:

var B : TBalloonHint;

procedure TForm1.FormCreate(Sender: TObject);
begin
  B := TBalloonHint.Create(Self);
  B.Style := bhsStandard;
  CustomHint := B;
end;

创建表单时,我们将BalloonHint组件分配给主表单,任何parentCustomHint属性设置为True的组件都将继承CustomHint。

之后,您只需在给定的屏幕位置调用提示,如下所示:

B.ShowHint(Point(X,Y)); {Where X & Y are Screen Coordinates}

简单演示:

  1. 创建一个新的空白VCL项目

  2. 整合以下内容:

    type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
        procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    var B : TBalloonHint;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Hint := 'Test';
      ShowHint := True;
      B := TBalloonHint.Create(Self);
      B.Style := bhsStandard;
      CustomHint := B;
    end;
    
    procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var P : TPoint;
    begin
      P := Point(X,Y);
      P := ClientToScreen(P);
      B.ShowHint(P);
    end;
    

答案 1 :(得分:0)

问题来自以下方法:

procedure TJvDBGrid.CMHintShow(var Msg: TCMHintShow); message CM_HINTSHOW;

组件的新属性:

type
  TJvDBGridCellHintPosition = (gchpDefault, gchpMouse);

property CellHintPosition: TJvDBGridCellHintPosition; default gchpDefault;

要解决此问题,请在调用提示之前使用以下代码:

ShowCellHint := True;
CellHintPosition := gchpDefault;

第二行是可选的。但是我在调​​试器上看到了gchpMouse属性的非常奇怪的CellHintPosition值。