如何在鼠标悬停在单元格上时显示DBGrid.Hint?

时间:2013-07-17 12:48:17

标签: delphi

虽然以下代码使用鼠标所在的单元格文本正确设置了Form1.Caption,但它不会显示任何DBGrid.Hint ,除非我单击该单元格。

这张照片出了什么问题?

type
 THackGrid = class(TDBGrid); // to expose protected DataLink property

procedure TForm1.DBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  Cell: TGridCoord;
  ActRec: Integer;
begin
  Cell := DBGrid1.MouseCoord(X, Y);
  if dgIndicator in DBGrid1.Options then
    Dec(Cell.X);
  if dgTitles in DBGrid1.Options then
    Dec(Cell.Y);
  if THackGrid(DBGrid1).DataLink.Active and (Cell.X >= 0) and
    (Cell.Y >= 0) then
  begin
    ActRec := THackGrid(DBGrid1).DataLink.ActiveRecord;
    try
      THackGrid(DBGrid1).DataLink.ActiveRecord := Cell.Y;
      Caption := DBGrid1.Columns[Cell.X].Field.AsString;     // Form1.Caption shows fine!
      DBGrid.Hint := DBGrid1.Columns[Cell.X].Field.AsString; // <== Hint only shows when I click into the cell!
    finally
      THackGrid(DBGrid1).DataLink.ActiveRecord := ActRec;
    end;
  end;
end;

1 个答案:

答案 0 :(得分:5)

使用所需的提示坐标调用Application.ActivateHint,例如

Procedure ChangeHint(C: TControl; Const Hint: String; p: TPoint);
var
  OldHint: String;
begin
  OldHint := C.Hint;
  if Hint <> OldHint then
  begin
    C.Hint := Hint;
    Application.ActivateHint(p);
  end;
end;

procedure TForm3.DBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  ...
  ChangeHint(TDBGrid(Sender), YourIntendedHintText, TDBGrid(Sender).ClientToScreen(Point(X, Y)));
  ....
end;