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;
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.