【问题标题】:How to get the text under the cursor in a TDbGrid如何在 TDbGrid 中获取光标下的文本
【发布时间】:2012-10-15 11:28:28
【问题描述】:

屏幕宽度不足以显示某些文本字段。我不知道如何自动包装它们,我怀疑它是否可以轻松完成。

所以,我想我会做类似的事情

procedure TForm1.FormMouseMove(Sender: TObject;
    Shift: TShiftState; X,Y: Integer);

   var column, row : Integer;
begin
  myDbGrid.MouseToCell(X, Y, column, row);
  myDbGrid.Hinst := myDbGrid.Cells(column, row); // <==== ooops
end;

或者,也许在OnShowHint 中执行并获取鼠标坐标并将它们转换为列和行(更有效)

当然,TDbGrid 没有Cells。知道如何在用户将鼠标移动到网格的“单元格”上时为控件设置提示吗?

【问题讨论】:

    标签: delphi mouseover tdbgrid


    【解决方案1】:

    这是直接从我的一个程序中获取的代码(尽管是简化的),它显示连接到网格的数据集的值之一作为提示。

    procedure TMainForm.DBGrid1MouseMove(Sender: TObject; Shift: TShiftState;
      X, Y: Integer);
    var
     MousePos: TGridCoord; // X = Column, Y = Row
    
    begin
     MousePos:= DBGrid1.MouseCoord (X, Y);
     if mousepos.X = 6  // we are over the 'tops' field
      then mainform.hint:= qPeopleTops.asstring;  // show for current person
    end;
    

    【讨论】:

    • 什么是“qPeopleTops”?我怀疑它是一个领域,但你如何引用它? myDbGrid.qPeopleTops?还是我错过了什么?
    • 如果列被调整大小、移动或任何列不可见,此代码将不起作用..
    • @Mawg:qPeople 是在网格中显示的数据集的名称; qPeopleTops 是该数据集的持久字段的名称,大概显示在第 6 列中。
    • 这不是只对 active 记录有效吗?这就是 OP 想要的吗?
    • 我认为,当我编辑原始代码以呈现这里的本质时,我是'用洗澡水把婴儿扔了出去'。实际的生产代码会显示一个提示,该提示显示数据集中的一个未显示的字段,该字段会随着鼠标在网格上移动而变化。
    【解决方案2】:

    使用此代码:

    type
     THackGrid = class(TDBGrid);
    
    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;
        finally
          THackGrid(DBGrid1).DataLink.ActiveRecord := ActRec;
        end;
      end;
    end;
    

    【讨论】:

    • +1 和答案,但由于某种原因,我发现我可以将光标向下拖动到网格中并且它不会拾取每一行。也许移动鼠标太快?也许我会使用OnMouseDown
    • 它工作得很好。这是我处理错误提示的代码。
    猜你喜欢
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 2011-04-20
    相关资源
    最近更新 更多