Delphi: Подсказка заголовка столбца DBGrid - принудительно сбросить подсказку? - PullRequest
2 голосов
/ 14 октября 2011

Я думал, что я реализую подсказку заголовка столбца в моей собственной DBGrid.Кажется, все просто - подумал я.

Я добавил

TitleHints: TStrings

, который содержит информацию в этом формате:

name = value

Где имя (0-99) для столбцов без полей и имя поля для столбцов на основе полей.Значение - это подсказка столбца, crlf - это \ n.

Все в порядке, OnMouseMove - это подсказка, основанная на позиции.

Но: только первый показанный подсказка, ссылки не являются,Я думаю, это потому, что механизм подсказок активируется при поступлении мыши в «Управление» ... Когда я покидаю Управление и возвращаюсь снова, я получаю еще одну подсказку - один раз.Независимо от того, что я отключил ShowHint.

Поскольку я не хочу создавать свой собственный HintWIndow, если это возможно, я ищу способ перенастроить механизм подсказок на приложение. Поверьте: это первый случай в этомконтроль.Могу ли я сделать это каким-либо образом, например, «отправить сообщение» или позвонить «отменить подсказку», если оно существует, и т. Д.

Знаете ли вы об этом способе?

Спасибо за вашу помощь и хорошодень вам!

С уважением: дд

1 Ответ

3 голосов
/ 14 октября 2011

Вы можете повторно активировать подсказку в переопределенном MouseMove, например:

type
  TDBGrid = class(DBGrids.TDBGrid)
  private
    FLastHintColumn: Integer;
  protected
    procedure CMHintShow(var Message: TCMHintShow); message CM_HINTSHOW;
    function GetColumnTitleHint(Col: Integer): string;
    procedure MouseMove(Shift: TShiftState; X: Integer; Y: Integer); override;
  public
    constructor Create(AOwner: TComponent); override;
  end;


procedure TDBGrid.CMHintShow(var Message: TCMHintShow);
var
  Cell: TGridCoord;
begin
  if not Assigned(Message.HintInfo) or not (dgTitles in Options) then
    inherited
  else
  begin
    Cell := MouseCoord(Message.HintInfo^.CursorPos.X, Message.HintInfo^.CursorPos.Y);
    if Cell.Y = 0 then
    begin
      FLastHintColumn := Cell.X - 1;
      Message.HintInfo^.HintStr := GetColumnTitleHint(FLastHintColumn);
    end
    else
      FLastHintColumn := -1;
  end;
end;

function TDBGrid.GetColumnTitleHint(Col: Integer): string;
begin
  Result := Columns[Col].Title.Caption + ' hint';
end;

procedure TDBGrid.MouseMove(Shift: TShiftState; X, Y: Integer);
var
  Cell: TGridCoord;
begin
  inherited MouseMove(Shift, X, Y);
  if dgTitles in Options then
  begin
    Cell := MouseCoord(X, Y);
    if Cell.Y = 0 then
    begin
      if Cell.X - 1 <> FLastHintColumn then
        Application.ActivateHint(Mouse.CursorPos);
    end
    else
      Application.CancelHint;
  end;
end;

constructor TDBGrid.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FLastHintColumn := -1;
end;

GetColumnTitleHint является только примером, вы должны реализовать его для возврата правильного значения из вашего свойства TitleHints.

Надеюсь, это поможет.

...