【问题标题】:Application.ActivateHint shows hint on incorrect position on Delphi XE2Application.ActivateHint 在 Delphi XE2 上显示不正确位置的提示
【发布时间】:2013-07-03 22:18:48
【问题描述】:

我使用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 上显示所需坐标的提示?

非常感谢您的帮助!

【问题讨论】:

  • 有机会获得 SSCCE 吗?
  • 嗯,因为TApplication.ActivateHint 的行为是that way(后来是HintInfo 变量传递给OnShowHint 事件方法而不改变HintPos)?
  • 但是 ActivateHint 上有一个参数,其中包含显示提示的坐标。文档同意这一点。此代码也适用于 Delphi 7。不要在 Delphi XE2 上工作。
  • ...以及如何在所需坐标上显示提示?
  • 大卫,它可以在使用 StringGrid 而不是 RxGrid 的简单项目上正常工作...:(

标签: delphi delphi-xe2 hint


【解决方案1】:

我确信有一种方法可以使用默认的提示控件来实现这一点,但您可能需要查看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;
    

【讨论】:

  • 谢谢!但它会与系统提示具有相同的外观吗?我可以在上面使用自定义字体吗?
  • @Altaveron,TBalloonHint 严重依赖于 Windows 主题。要使其看起来与常规提示完全相同,您必须修改绘制过程或以某种方式禁用用于提示的 TCustomHintWindow 的主题化。
  • @Altaveron,我不知道你在实现时哪里出错了,我添加了简单的示例供你测试。
【解决方案2】:

问题来自以下方法:

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

以及组件的新属性:

type
  TJvDBGridCellHintPosition = (gchpDefault, gchpMouse);

property CellHintPosition: TJvDBGridCellHintPosition; default gchpDefault;

为了解决这个问题,我在调用提示之前使用了以下代码:

ShowCellHint := True;
CellHintPosition := gchpDefault;

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

【讨论】:

    猜你喜欢
    • 2013-02-08
    • 1970-01-01
    • 2012-04-01
    • 2016-09-08
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多