1

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

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

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

4

2 回答 2

4

使用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 中的坐标是相对于网格的。

于 2012-07-22T04:29:54.130 回答
0

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

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;
于 2012-08-19T03:07:27.830 回答