2

在 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;

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

4

2 回答 2

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事件,以允许以较少耦合的方式指定此类自定义。

于 2013-06-10T08:12:36.167 回答
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;
于 2013-06-10T08:04:56.103 回答