将类似OnHint的功能添加到第三方组件

时间:2016-09-28 15:36:14

标签: delphi delphi-xe2

由于外观的原因,我正在维护的应用程序使用DevExpress的一个古老组件,它预先设置了当前的网格控件(如果您感兴趣,可以使用TdxMasterView)。我想要做的是有一个显示当前单元格文本的工具提示,但是这个组件没有暴露OnHint事件。

我已经能够使用MouseMove事件获得我需要的功能,但是因为代码要求它将鼠标光标转换为单元格然后检索内容我认为这对于一个事件是太多的代码经常被解雇(尽管在操作中感觉不太))。

组件本身派生自TCustomControl,基本的HintShowHint属性也是如此,但我认为我想要的是能够公开或添加一个事件只有在显示提示气泡时才会触发(即OnHint事件或等效事件)。我需要获得正确的文本是鼠标的X和Y坐标。这似乎与TControlAction有关,但是我不完全确定它是如何工作的,因为从第一眼看代码就不能立即清楚它并没有被组件公开。

有没有人有任何示例代码,他们已经取得了类似的成就?我可以访问底层源代码,因此可以根据需要对其进行一些修改(DevExpress永远不会发布对此代码的更新,因此执行此操作的正常风险并不真正适用),但我更喜欢使用辅助函数,Windows消息或某种装饰器,如果可能的话。

我认为另一种选择是使用计时器来启用/禁用事件,但这看起来有点像一个简单的(如果简单的)解决方案。

1 个答案:

答案 0 :(得分:2)

在代码中实施procedure CMHintShow(var Message: TCMHintShow); message CM_HINTSHOW;

procedure TMyComponent.CMHintShow(var Message: TCMHintShow);
var
  CellIdx: Integer;
  Handled: Boolean;
  HintStr: string;
  LHintInfo: PHintInfo;
begin
  Message.Result := 1; // Don't show the hint
  if Message.HintInfo.HintControl = Self then
  begin
    with Message.HintInfo.CursorPos do
    begin
      CellIdx := ImageAtPos(X, Y);
    end;

    Handled := False;
    HintStr := '';
    if Assigned(FOnGetHint) then
      FOnGetHint(Self, CellIdx, HintStr, Handled);
    LHintInfo := Message.HintInfo;
    if (CellIdx <> -1) then
    begin
      if not Handled then
        HintStr := Hint;
      LHintInfo.CursorRect := GetCellRect(CellIdx);
      Handled := True;
    end;
    if Handled then
    begin
      LHintInfo.HintStr := HintStr;
      Message.Result := 0; // Show the hint
    end;
  end;
end;