使用StringGrid有选择地ShowHint

时间:2013-06-10 05:48:52

标签: delphi tstringgrid

在StringGrid组件后代中,我想根据单元格的值更改弹出的Hint消息。我的编码:

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;

当我从另一列鼠标移到Col 12时,这可以正常工作,但是如果留在第12列并移动到另一行(具有不同的k值),则弹出提示不会改变。当我第一次将鼠标移到另一列时,它将仅显示正确/新提示,然后返回到第12列。任何人都有解决方案吗?

2 个答案:

答案 0 :(得分:3)

在运行时修改提示的最简洁方法是拦截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事件,允许以较少耦合的方式指定这样的自定义。

答案 1 :(得分:0)

您确定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;