Как вы можете получить подсказки для ячеек в TStringGrid, которые выглядят более плавно? - PullRequest
7 голосов
/ 14 февраля 2012

Я использую Lazarus 0.9.30.

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

procedure TTmMainForm.SgScoutLinkMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
  R, C: Integer;
begin
  R := 0;
  C := 0;

  SgScoutLink.MouseToCell(X, Y, C, R);

  with SgScoutLink do
  begin
    if (R = 0) then
      if ((C >= 3) and (C <= 20)) then
      begin
        SgScoutLink.Hint := FManager.ScoutLinkColumnTitles.stGetColumnTitleHint(C-3);
        SgScoutLink.ShowHint:= True;
      end; {if}
  end; {with}
end;

Ответы [ 2 ]

10 голосов
/ 15 февраля 2012

Назначьте обработчик события TApplication.OnShowHint или TApplicationEvents.OnShowHint или создайте подкласс TStringGrid для перехвата сообщения CM_HINTSHOW.Любой из них предоставит вам доступ к записи THintInfo, которая используется для управления поведением окна подсказки.Вы можете настроить координаты члена THintInfo.CursorRect по мере необходимости.Окно подсказок повторно активируется последним текстом свойства Hint (который можно настроить с помощью элемента THintInfo.HintStr до его отображения) всякий раз, когда мышь выходит за пределы этого прямоугольника.Чем меньше прямоугольник, тем чаще окно подсказки активируется.Эта функция позволяет элементу управления пользовательского интерфейса иметь несколько подразделов в своей клиентской области, которые отображают различные строки подсказок, когда мышь перемещается вокруг того же элемента управления пользовательского интерфейса.

Значение свойства TApplication.HintShortPause (или от перехвата CM_HINTSHOWPAUSE сообщение) определяет, исчезает ли окно подсказки перед повторной активацией.Если вы установите нулевое значение паузы, окно подсказки обновит свой текст немедленно, не исчезая.Если установить значение паузы в ненулевое значение, окно подсказки исчезнет, ​​а затем снова появится после истечения указанного количества миллисекунд, пока мышь остается над тем же элементом управления пользовательского интерфейса.

Например:

procedure TTmMainForm.FormCreate(Sender: TObject);
begin
  Application.OnShowHint := AppShowHint;
end;

procedure TTmMainForm.FormDestroy(Sender: TObject);
begin
  Application.OnShowHint := nil;
end;

procedure TTmMainForm.AppShowHint(var HintStr: String; var CanShow: Boolean; var HintInfo: THintInfo);
var 
  R, C: Integer; 
begin
  if HintInfo.HintControl = SgScoutLink then
  begin
    R := 0; 
    C := 0; 
    SgScoutLink.MouseToCell(HintInfo.CursorPos.X, HintInfo.CursorPos.Y, C, R); 
    if (R = 0) and (C >= 3) and (C <= 20) then 
    begin 
      HintInfo.CursorRect := SgScoutLink.CellRect(C, R);
      HintInfo.HintStr := FManager.ScoutLinkColumnTitles.stGetColumnTitleHint(C-3); 
    end;
  end;
end;

Редактировать: Я только что заметил, что вы используете Lazarus.Я описал, как решить эту проблему в Delphi.Я понятия не имею, применимо ли это к Лазарю или нет.

0 голосов
/ 11 ноября 2015

Я пришел к следующему решению ... понятия не имею, работает ли оно в Lazarus, но мой delphi в порядке с ним ... Напишите следующий псевдокод для обработчика grid mousemove:

if (current_coords==old_coords) then   
    {showhint=true;hint=use_mousetocell_call_to_create}   
else   
    {showhint=false;hint=''} old_coords=current_coords;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...