基になるデータセットのレコード数が現在選択されている行ではない場合、DBGrid の一番上の行にある基になるデータセットから表示される行番号を取得することは可能ですか? DBGrid に表示される行数、および DBGrid がスクロールされました。
これが私の問題です。DBGrid に接続されたドラッグ/ドロップ イベント ハンドラから、MyGrid.MouseCoord(X,Y).Y を使用して、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 が基になるデータセットの 3 番目のレコードをグリッドの一番上の行に表示していると判断できれば、問題は解決します。同様に、特定の行 (一番上の行など) の基になる 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にあります。