2016-09-28 44 views
1

由于整容原因,我所维护的应用程序使用DevExpress中的一个古老组件,它预先记录了他们当前的网格控件(如果您感兴趣,请使用TdxMasterView)。我想要做的是有一个显示当前单元格文本的工具提示,但是此组件没有公开OnHint事件。将类似OnHint的功能添加到第三方组件

我已经能够使用MouseMove事件获得我需要的功能,但是由于代码要求它将鼠标光标转换为单元格,然后检索内容,我认为这对于事件来说代码太多被频繁地击中(尽管它在操作中感觉不太严重)。

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

有没有人有任何示例代码,他们已经取得了类似的东西?我可以访问底层的源代码,所以如果需要的话可以修改一下(DevExpress绝不会发布这个代码的更新,所以这样做的正常风险并不适用),但我更喜欢使用帮助函数,Windows消息或某种修饰器如果可能的话。

我想另一种选择是有一个定时器来启用/禁用事件,但这看起来有点糟糕(如果很简单)的解决方案。

+0

Devex对此有何评论 - 他们是明显要问的人? – MartynA

+0

通常我会同意,但是这个组件太旧了,以至于它会超出它们最早支持的版本。我只知道他们的cxGrid组件,但是这是在这之前的。 –

回答

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; 
+0

谢谢 - 明天我会明白这一点。 –

+0

或者如果您不能编辑组件本身,请使用“TApplication.OnShowHint”或“TApplicationEvents.OnShowHint”事件。 –