delphi – 当RowCount> VisibleRowCount没有选择网格的第一行时,DBGrid的最顶行中会出现什么数据集行?

当底层数据集中的记录数大于时,是否可以从DBGrid的最顶行中获取从基础数据集显示的行号,而不是最顶行是当前选定的行. DBGrid中显示的行数,并且已滚动DBGrid.

这是我的问题.从附加到DBGrid的拖放事件处理程序,我可以使用MyGrid.MouseCoord(X,Y).Y确定drop事件与DBGrid的哪个可见行相关联.当基础数据集包含的记录数小于或等于DBGrid中显示的行数时,此值也是基础数据集中关联记录的行号.

当基础数据集包含的记录多于DBGrid中可见行数时,MyGrid.MouseCoord(X,Y).Y和TDataSet(MyGrid.DataSource.DataSet).RecNo仅在数据集的第一行出现时相同在网格的第一行.

有没有办法在没有选择DBGrid行的情况下识别DBGrid中最顶层显示记录的基础数据集(或偏移量)中的记录号?我知道如果我实际上选择了DBGrid的最顶行,那么我可以使用TDataSet(MyGrid.DataSource.DataSet).RecNo来获取底层数据集的当前记录号.但是,从DBGrid.OnDragOver或DBGrid.OnDragDrop事件我只有DBGrid和鼠标坐标的引用(我可以从中确定网格的哪一行是放置的目标).

例如,如果我可以确定DBGrid在网格的最顶行中的基础数据集中显示第三条记录,我的问题就解决了.同样,如果我可以读取特定行的底层TField(例如,最顶行)而没有选择该行,我就拥有了我需要的东西.但是,我看不到这样做的方法.

任何建议将不胜感激.

编辑:我之前发布了一篇关于拖放到DBGrid的博客.有了这个新信息,我可以解决以前已知的问题.我将在本周的某个时候更新该博客,并且一旦我这样做,就会在这里添加一个指向该博客链接.

还有一个问题.当可见行的数量小于基础记录的数量时,我们还需要计算在最后一个可见行之后发生的下降.在最后一个可见行之后删除时,MouseCoord(x,y).Y返回-1.

以下是对Uwe代码修改,以实现这一目的:

function TDBGridHelper.RecNoFromVisibleRow(Value: Integer): Integer;
begin
  if Value = -1 then
  begin
    Result := DataSource.DataSet.RecNo - Row + TopRow + VisibleRowCount
  end
  else
  begin
    Result := DataSource.DataSet.RecNo - Row + TopRow + Value;
    if dgTitles in Options then
      Dec(Result);
  end;
end;

编辑:正如我在原始问题中提到的,我对这个答案很感兴趣,以便修复我的代码中实现拖放到DBGRid中的行为.有了这个答案,我已经更新了我的拖放行为,我在博客中写过这个更新.您可以在以下URL找到此讨论,包括原始博客文章链接Dragging and Dropping into a DBGrid Revisited

解决方法

只要DataSet.RecNo与网格中的可见rownumber之间只有一个偏移量,您就可以从受保护的成员Row和TopRow获取所需的信息,这些信息可以由类助手访问.像这样的东西:
function TDbGridHelper.RecNoFromVisibleRow(Value: Integer): Integer;
begin
  Result := DataSource.DataSet.RecNo - Row + TopRow + Value;
  if dgTitles in Options then
    Dec(Result);
end;

相关文章

ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c++ 调用, 抽空研究了一下该库的最新版 ,把...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的功能是:将源操作数送到目的操作数中,即:...
有三个API函数可以运行可执行文件WinExec、ShellExecute和CreateProcess。 1.CreateProcess因为使用复杂...
API原型: Declare Function MoveFileEx& Lib "kernel32" Alias "MoveFileExA" (By...