Soyez le premier à donner votre avis sur cette source.
Snippet vu 8 279 fois - Téléchargée 17 fois
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;
Merçi.
@+
je me cite :
"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 ..."
La ligne importante est celle-ci:
"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 ..."
A+
ABookmark := ADataset.GetBookmark;
ADataset.DisableControls;
try
ADataset.Close;
ADataset.Open;
if ADataset.BookmarkValid(ABookmark) then ADataset.GotoBookmark(ABookmark);
finally
ADataset.EnableControls;
end;
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.