【问题标题】:What is the rect of a clicked Title on a TDBGrid in Delphi?Delphi中TDBGrid上单击标题的矩形是什么?
【发布时间】:2012-08-19 21:36:06
【问题描述】:

我想确定在 TDBGrid 事件 TitleClick(Column: TColumn) 上单击的标题单元格的屏幕坐标。

我可以使用 ColWidths 属性(通过 TDBGrid = class(DBGrids.TDBGrid) 类型声明公开),但我很难确定用户是否重新排序了列,并结合了 TDBGrid 的水平滚动.我还想在后续移动和调整大小期间跟踪此列的位置,同时注意此列可能会从网格中滚动出来。

我在这个问题上花了很长时间,而且我很擅长 Delphi,所以这不是一个无聊的问题。

【问题讨论】:

  • 如果列偏离网格,您为什么要担心?显然,如果用户可以单击标题,则该列是可见的,对吧?
  • 我正在使用标题单击来更改索引,并且我在该列旁边显示了一个小位图以指示当前的排序顺序。如果网格按当前不可见的字段上的顺序排序,那么我不想看到图像。
  • 有免费的组件可以做到这一点,比如来自(scalabium.com)的smdbgrid组件,来自(jvcl.delphi-jedi.org)的JvDbgrid。
  • 我正在实现一个复杂的 TDBGrid,它会让 TEdit 浮动在用户可以输入过滤器的每个列标题下方。稍后将扩展到自定义的 TComboBox,其中可以针对每列输入多个过滤器和范围,因此我正在构建自己的组件,但它全部在运行中,因为它进入了 TFrame,这在技术上使 TFrame 本身成为我的完整零件。通过这种级别的自定义,可以更轻松地完成更简单的基础,此外我不会使用自定义组件来解决您在 1 行代码中为我解决的问题(我正在查看标题时,行 = 0!)
  • 啊,我明白了。我上面提到的自定义组件,当然不仅有排序功能,还有更多。我提到它们的目的是您可能想探索它们的功能,并且只实现尚未实现的其他功能,因此您不必从头开始。

标签: delphi coordinates tdbgrid


【解决方案1】:

使用How do I get screen coordinates of the DBGrid cell 中的技巧,我写道:

type
...
  THackedGrid = class(TDBGrid);
...
implementation
...
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
var
  currRow : Integer;
  rect : TRect;
begin
  currRow := THackedGrid(DBGrid1).Row;
  rect := THackedGrid(DBGrid1).CellRect(Column.Index+1,currRow);
end;

这是你想要的吗? rect 中的坐标是相对于网格的。

【讨论】:

  • 是的,非常感谢。我非常专注于劫持 Cells 或 Cols(就像我们在过去 TDBGrid 从 TDrawGrid 继承时一样),以至于我错过了这个明显的,谢谢!问题中提到的一个小改进是如果您声明“type TDBGrid = class(DBGrids.TDBGrid);”在表单对象之前,它会将 DBGrid 转换为本地定义,另外还可以在该单元内访问本地声明的类的私有属性。例如,即使在初始化部分,您也可以从表单之外的过程访问表单的私有声明参数。
【解决方案2】:

我昨天在工作中开始研究一个非常相似的网格。正如你提到的,我在网格固定行上覆盖了一个控件,右键单击激活它。这是我到目前为止所做的,然后在我的数据集上设置过滤器。但是,在组合上使用多选时我遇到了问题。我很想看看你自上一篇文章以来所取得的成就。

procedure Tf_well.dbWellGridMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
var cell  : TGridCoord;
begin
    if Button = mbRight then
    begin
        Cell := dbWellGrid.MouseCoord(X, Y);
        //  showmessage(dbWellGrid.Columns[Cell.X-1].DisplayName);

        case Cell.X-1 of
            0:  begin
                    fieldComboWellName.Visible:=True;
                    fieldComboWellName.DroppedDown:=True;
                    fieldComboWellName.SetFocus;
                end;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 2014-01-12
    相关资源
    最近更新 更多