Actualiser une table sans que la dbgrid modifie son visuel et l' enregistrement actuel.

Contenu du snippet

Pour ceux qui utilisent les SGBD client/serveur, l' un des problèmes rencontrés est que lorsque l' on veut actualiser les données d' une table, on doit forcément réexecuter le query (select * from ...) ce qui implique la fermeture de la table.
Cela a pour conséquence que la DBGrid oú l' on visualise les données, n' est plus positionnée sur le bon enregistrement. Quand bien même on utiliserait GetBookmark/GotoBookmark/FreeBookmark, l' enregistrement peut ne plus se trouver sur la même ligne de la DBGrid, ce qui estétiquement n' est pas terrible ...

Pour résoudre ce problème, je vous propose le source à appliquer à votre compo DBGrid, ou bien vous pouvez aussi bien téléchargé mes compos et utiliser mes DBGrids:
https://sourceforge.net/projects/tcycomponents/
http://www.delphifr.com/codes/CINDY-PACK-V3-00_51810.aspx

Démo:
http://sourceforge.net/projects/tcycomponents/files/Demo/demo3.40.zip/download

A+

Source / Exemple :


Déclarez ce type qui vous permettra d' utiliser les fonctions: 
type
  TRecordPosition = Record
    ActiveRecord: Integer;
    Bookmark: TBookmark;
  end;

Sauvegardez la position :
function TcyBaseDBGrid.GetRecordPosition: TRecordPosition;
begin
  if not DataLink.Active then Exit;
  Result.ActiveRecord := DataLink.ActiveRecord;
  Result.Bookmark := DataLink.DataSet.GetBookmark;
end;

// Restaurer la position : 
function TcyBaseDBGrid.GotoRecordPosition(RecordPosition: TRecordPosition): Boolean;
var m, LastRow: Integer;
begin
  Result := false;
  if not DataLink.Active then Exit;

  if DataLink.DataSet.BookmarkValid(RecordPosition.Bookmark) then
  begin
    BeginUpdate;    // Avoid flickering
    DataLink.DataSet.GotoBookmark(RecordPosition.Bookmark);

    if DataLink.ActiveRecord <> RecordPosition.ActiveRecord
    then begin
      // *** We are not placed on the same row *** //
      if DataLink.ActiveRecord < RecordPosition.ActiveRecord
      then begin
        // Goto to first row and scroll DBGrid to put the bookmarked record on the correct row:
        m := DataLink.ActiveRecord + (RecordPosition.ActiveRecord - DataLink.ActiveRecord);
        DataLink.DataSet.MoveBy((-1) * m);

        // Goto to the correct record:
        DataLink.DataSet.MoveBy(RecordPosition.ActiveRecord);
      end
      else begin
        LastRow := RowCount-1;
        if dgTitles in Options
        then Dec(LastRow, 1);
        // Goto last row and scroll DBGrid ti put the bookmarked record on the correct row:
        m := (LastRow - DataLink.ActiveRecord) + (DataLink.ActiveRecord - RecordPosition.ActiveRecord);
        DataLink.DataSet.MoveBy(m);

        // Goto to the correct record:
        DataLink.DataSet.MoveBy(RecordPosition.ActiveRecord - DataLink.ActiveRecord);
      end;

      // Can fail if a record was added/removed:
      if DataLink.DataSet.CompareBookmarks(RecordPosition.Bookmark, DataLink.DataSet.GetBookmark) <> 0
      then DataLink.DataSet.GotoBookmark(RecordPosition.Bookmark);
    end;

    Result := DataLink.DataSet.CompareBookmarks(RecordPosition.Bookmark, DataLink.DataSet.GetBookmark) = 0;
    EndUpdate;
  end;
end;

// Libérer le bookmark : 
procedure TcyBaseDBGrid.FreeRecordPosition(RecordPosition: TRecordPosition);
begin
  if not DataLink.Active then Exit;
  DataLink.DataSet.FreeBookmark(RecordPosition.Bookmark);
end;

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.