2009-11-28 3 views
2

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?

+0

pourquoi ne pas simplement utiliser TSMDBGrid? – eKek0

+0

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

+0

@ 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

Répondre

2

est ici un moyen de contrôler ce qui est la colonne de gauche:

type 
    TGridFriend=class(TDBGrid); 


procedure TForm1.Button2Click(Sender: TObject); 
begin 
    // scroll to right by one column 
    TGridFriend(DBGrid1).leftCol:=TGridFriend(DBGrid1).leftCol + 1; 
end; 
+0

Merci Rayon X, idée simple et fonctionnelle. Sauvegardez simplement LeftCol et restaurez-le après avoir fait un tri. – Kachwahed

Questions connexes