J'ai écrit une méthode simple pour trier une colonne dans TDBGrid. Si Option.RowSelect est défini sur False, tout fonctionne correctement, mais si RowSelect est défini sur True, le défilement horizontal n'est pas restauré après la colonne de tri. donc j'essaie GetScrollPos et SetScrollPos pour restaurer la position de défilement horizontale, ScrollBar va à la bonne position, mais TDBGrid n'a pas défiler, voici la méthode:Restaurer la position de défilement horizontale dans TDBGrid
procedure TDBGrid.TitleClick(Column: TColumn);
var
CurrenctPosition: TBookmark;
PosScroll: Integer;
begin
inherited TitleClick(Column);
if FAllowTitleClick and (Assigned(DataSource))
and (Assigned(DataSource.DataSet))
and (DataSource.DataSet.Active)
and (Assigned(Column.Field))
and (Column.Field.FieldKind <> fkLookup) then
begin
//Get position scroll
PosScroll := GetScrollPos(Handle, SB_HORZ);
CurrenctPosition := DataSource.DataSet.GetBookmark;
FPaintInfo.ColPressed := False;
FPaintInfo.ColPressedIdx := -1;
if ValidCell(FCell) then
InvalidateCell(FCell.X, FCell.Y);
SortColumn(Column);
DataSource.DataSet.GotoBookmark(CurrenctPosition);
//Set position scroll
SetScrollPos(Handle, SB_HORZ, PosScroll, True);//<- need to be refreshed
end;
end;
Cela peut peut-être fixé à l'aide Perform (WM_HSCROLL, SB_LINERIGHT, 0) en boucle mais ce n'est pas une bonne idée. Quelqu'un at-il une meilleure solution?
pourquoi ne pas simplement utiliser TSMDBGrid? – eKek0
Peut-être parce que ce n'est pas gratuit? Ceci est clairement quelque chose qui devrait être possible dans TDBGrid, donc à mon humble avis, il n'y a aucune raison d'abandonner et d'utiliser un autre composant (commercial) ... – jpfollenius
@ eKek0 TSMDBGrid sympa composant gratuit, mais celui-ci est petit, facile et rapide et il fait exactement le travail. @Smasher ... En mai Opinion TSMDBGrid est gratuit, et c'est la version modifiée de TThemedDBGrid, vous pouvez l'obtenir (gratuit) ici: http://andy.jgknet.de/blog/?page_id=206 – Kachwahed