你怎么能得到TStringGrid中的单元格更加流畅的提示?

时间:2012-02-14 14:46:36

标签: delphi lazarus tstringgrid

我正在跑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 个答案:

答案 0 :(得分:10)

TApplication.OnShowHintTApplicationEvents.OnShowHint事件分配事件处理程序,或者为TStringGrid创建子类以拦截CM_HINTSHOW消息。其中任何一个都将为您提供对THintInfo记录的访问权限,该记录用于控制提示窗口的行为。您可以根据需要自定义THintInfo.CursorRect成员的坐标。只要鼠标移动到该矩形之外,就会使用最新的Hint属性文本(可以在显示之前使用THintInfo.HintStr成员自定义)重新激活提示窗口。矩形越小,重新激活提示窗口的频率越高。此功能允许UI控件在其客户区域内具有多个子部分,当鼠标移动到同一UI控件时,显示不同的提示字符串。

TApplication.HintShortPause属性的值(或拦截CM_HINTSHOWPAUSE消息)控制提示窗口在重新激活之前是否消失。如果将暂停值设置为零,则提示窗口会立即更新其文本而不会消失。如果将暂停值设置为非零值,则只要鼠标停留在同一UI控件上,提示窗口就会消失,然后在指定的毫秒数后再次出现。

例如:

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中处理这个问题。如果它也适用于拉撒路,我不知道。

答案 1 :(得分:0)

我来到以下解决方案...不知道它是否适用于拉撒路但我的delphi没问题...为网格mousemove处理程序编写以下伪代码:

if (current_coords==old_coords) then   
    {showhint=true;hint=use_mousetocell_call_to_create}   
else   
    {showhint=false;hint=''} old_coords=current_coords;