2016-09-28 2 views
1

В связи с косметическими соображениями приложение, которое я поддерживаю, использует древний компонент DevExpress, который предварительно давал свои текущие элементы управления сеткой (TdxMasterView, если вам интересно). То, что я хочу сделать, - это иметь всплывающую подсказку, отображающую текст текущей ячейки, однако этот компонент не имеет открытого события OnHint.Добавление функции OnHint к стороннему компоненту

Мне удалось получить функциональность, которая мне нужна, используя событие MouseMove, однако, поскольку код требует, чтобы он переводил курсор мыши в ячейку, а затем извлекал содержимое, я думаю, что это слишком много кода для события, которое (хотя он не чувствует себя слишком слабым в работе).

компонент сам по себе является производным от TCustomControl, поэтому имеет основные Hint и ShowHint свойства, однако, что я думаю, что я хочу, чтобы иметь возможность либо выставить или добавить событие, которое будет срабатывать только тогда, когда подсказка пузырь будет показано (т.е. событие OnHint или эквивалент). Все, что мне нужно, чтобы получить правильный текст, это координаты X и Y мыши. Это, похоже, связано с TControlAction, однако я не совсем уверен, как это работает, поскольку это не сразу видно с первого взгляда на код, и он не отображается компонентом.

Есть ли у кого-нибудь пример кода, где они достигли чего-то подобного? У меня есть доступ к базовому источнику, поэтому при необходимости его можно немного модифицировать (DevExpress никогда не выпустит обновление для этого кода, поэтому обычные риски для этого не применяются), но я бы предпочел работать с помощью вспомогательной функции , оконное сообщение или какой-либо декоратор, если это возможно.

Я полагаю, что другой вариант состоит в том, чтобы включить или отключить таймер, но это кажется немного сложным (если просто) решением.

+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», если вы не можете отредактировать сам компонент. –

Смежные вопросы