Выборочно показать подсказку с помощью StringGrid

В потомке компонента StringGrid я хочу изменить всплывающее сообщение подсказки в зависимости от значения ячейки. Моя кодировка:

procedure TForm.GridMouseEnterCell(Sender: TObject; ACol, ARow: Integer);
var  k: integer;
begin
  k := strtointdef(Grid.Cells[13, ARow],-1);
  Grid.ShowHint := (ACol = 12) and (k >= 0);
  if Grid.ShowHint then
    Grid.Hint := MyLIst.Items[k];
 end;

Это отлично работает, когда я навожу указатель мыши на столбец 12 из другого столбца, но если остаться в столбце 12 и перейти к другой строке (с другим значением k), всплывающая подсказка не изменится. Он покажет правильную/новую подсказку только тогда, когда я сначала наведу указатель мыши на другой столбец, а затем вернусь к столбцу 12. У кого-нибудь есть решение?


person bobonwhidbey    schedule 10.06.2013    source источник
comment
Вы можете попробовать Grid.ShowHint := (ACol = 12) and (k >= 0) and (Grid.Hint <> MyLIst.Items[k]); повторно запустить показ подсказки.   -  person bummi    schedule 10.06.2013


Ответы (2)


Самый простой способ изменить подсказку во время выполнения — перехватить сообщение CM_HINTSHOW. Это означает, что вам не нужно отслеживать все различные события, которые могут привести к изменению вашей подсказки. Вместо этого вы просто ждете, пока не будет показана подсказка, и используете текущее состояние элемента управления, чтобы определить, что показывать.

Вот пример использования класса интерпозера:

type
  TStringGrid = class(Grids.TStringGrid)
  protected
    procedure CMHintShow(var Message: TCMHintShow); message CM_HINTSHOW;
  end;

procedure TStringGrid.CMHintShow(var Message: TCMHintShow);
var
  HintStr: string;
begin
  inherited;
  // customise Message.HintInfo to influence how the hint is processed
  k := StrToIntDef(Cells[13, Row], -1);
  if (Col=12) and (k>=0) then
    HintStr := MyList.Items[k]
  else
    HintStr := '';
  Message.HintInfo.HintStr := HintStr;
end;

Если вы хотите сделать это более полезным, вы должны создать подкласс TStringGrid и добавить событие OnShowHint, которое позволяет указывать такую ​​настройку менее связанным образом.

person David Heffernan    schedule 10.06.2013
comment
Более чистый подход, который не включает перехватчик (и может быть настроен во время разработки), заключается в использовании вместо этого события TApplication(Events).OnShowHint. Но концепция та же, поскольку это событие обеспечивает доступ к той же записи THintInfo. - person Remy Lebeau; 10.06.2013

Вы уверены, что событие OnMouseEnterCell() работает правильно? Вызывается ли он, когда вы остаетесь в столбце и переходите в другую строку? Поскольку это событие потомка, а не TStringGrid, у нас нет информации о нем.

Кроме того, попробуйте поставить Application.ActivateHint(Mouse.CursorPos); в конце вашей функции. Это заставит подсказку повторно показать:

procedure TForm.GridMouseEnterCell(Sender: TObject; ACol, ARow: Integer);
var
  k: integer;
begin
  k := StrToIntDef(Grid.Cells[13, ARow], -1);
  Grid.ShowHint := (ACol = 12) and (k >= 0);
  if Grid.ShowHint then
  begin
    Grid.Hint := MyList.Items[k];
    Application.ActivateHint(Mouse.CursorPos);
  end;
end;
person Marko Paunovic    schedule 10.06.2013