我想确定在 TDBGrid 事件 TitleClick(Column: TColumn) 上单击的标题单元格的屏幕坐标。
我可以使用 ColWidths 属性(通过 TDBGrid = class(DBGrids.TDBGrid) 类型声明公开),但我很难确定列是否已被用户重新排序,并结合 TDBGrid 的水平滚动。我还想在随后的移动和调整大小期间跟踪此列的位置,同时注意此列可能会从网格中滚动出来。
我在这个问题上花了很长时间,而且我很擅长 Delphi,所以这不是一个无聊的问题。
我想确定在 TDBGrid 事件 TitleClick(Column: TColumn) 上单击的标题单元格的屏幕坐标。
我可以使用 ColWidths 属性(通过 TDBGrid = class(DBGrids.TDBGrid) 类型声明公开),但我很难确定列是否已被用户重新排序,并结合 TDBGrid 的水平滚动。我还想在随后的移动和调整大小期间跟踪此列的位置,同时注意此列可能会从网格中滚动出来。
我在这个问题上花了很长时间,而且我很擅长 Delphi,所以这不是一个无聊的问题。
使用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 中的坐标是相对于网格的。
我昨天在工作中开始研究一个非常相似的网格。正如你提到的,我在网格固定行上覆盖了一个控件,右键单击激活它。这就是我到目前为止所做的,然后在我的数据集上设置过滤器。但是,在组合上使用多选时我遇到了问题。我很想看看你自上一篇文章以来所取得的成就。
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;