2011-12-22 20 views
4

以下のコードでは、一部の選択された行でいくつかの操作(削除ではない)を行います。前の場所に戻るときにTDbgridスクロールを回避する方法

しかし、終了すると、選択された行の上端がスクロールし、グリッドの1/2の方向に表示されることがあります。このスクロールを避ける方法はありますか? (私のコードは、以下の選択された行を横断する場合、私は訂正を歓迎し、いくつかの無関係な理由で不適当である。)

Function TForm.DoSomethingToSelectedRows; 
    var 
    KeyAtStart: Integer; 
    begin 
    Result := TRUE; 
    KeyAtStart := DataSet.FieldByName('Key').AsInteger; 
    DataSet.DisableControls; 
    DataSet.First; 
    try 
     while Result AND (NOT DataSet.EOF) do DataSet 
     begin 
      if DBGrid1.SelectedRows.CurrentRowSelected then 
      Result := ... do something ... 
      fMPODataTls.GetDS.Next; 
     end; 
    finally 
     DataSet.Locate('Key', KeyAtStart, []); // re-position where we started 
     DataSet.EnableControls; 
    end; 
    end; 
+2

[デルファイ - DBGridの実際の行を復元]の可能な複製(http://stackoverflow.com/questions/2995662/delph-restore-actual-row-in-dbgrid) –

+0

ありがとう!この質問は、何が尋ねられているかについてはっきりしています。これは、他の質問の無関係の回答から明らかです。だから私はこの質問を残しておくといいと思う。 –

答えて

1

データセットをループする前に、グリッドが表示している一番上の行と表示されている合計レコードの数を記録することができます。この情報を使用して、レコードを再配置した後、上または下のいずれかに移動してから元の位置に戻すことで、レコードを正確な行に配置できます。

MoveByで移動できます。残念なことにとRowCountのプロパティーはTDBGridで保護されています。そのためには、広く「保護されたハック」として知られているものを使用する必要があります。

thisにコード例があります。ブックマークをチェックすると、間違ったレコードにならないようになります。

+0

私はちょうどあなたのソリューションを実装し、私のグリッドがもはや飛び跳ねるのを見て非常にうれしいです!もう一度感謝します、Sertac。 – RobertFrank

1

グリッド内の現在のレコードが正確に表示される行の中央部に位置しているという保証はありません視野からスクロールしたときにLocateを実行すると、グリッドの中央の行(新しい現在のレコード)になります。そのため、明らかにスクロールします。
グリッドを元の位置に戻したい場合は、一番上の行にあるレコードを覚えておく必要があります。

0

TClientDatasetを使用している場合は、ユーザーのカーソルを混乱させる必要はありません。そのカーソルをクローンして編集することができます。

DBGrid1がClientDataSet1にリンクされていて、DBGrid(およびClientDataSet)の行5と最初の行のビュー内にカーソルがあり、次のようなクローンカーソルを使用して最初の行を削除すると、最初の行が消えて、選択された行が1行の高さだけ上がることがわかります。私はすべての方法をスクロールした場合

Function TForm.DeleteFirstRow; 
var 
    myCDS: TClientDataSet; 
begin 
    myCDS := myCDS.Create(nil); 
    try 
    myCDS.CloneCursor(ClientDataSet1, False); 
    myCDS.First; 
    myCDS.Delete; 
    finally 
    myCDS.Free; 
    end; 

ダウン500行ほど、最初の行のビューのうち、それは再び、選択された行がグリッドに全く動かない実行します。

関連する問題