我寫了一個簡單的方法對TDBGrid中的列進行排序。 如果Option.RowSelect設置爲False,則一切正常,但如果RowSelect變爲True,則在排序列後水平位置滾動不會恢復。 所以我嘗試GetScrollPos和SetScrollPos恢復水平滾動位置,滾動條轉到正確的位置,但TDBGrid中沒有滾動,這裏是方法:恢復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;
這可以通過執行(WM_HSCROLL,SB_LINERIGHT也許固定, 0)循環但不是好主意。 有人有更好的解決方案嗎?
你爲什麼不只是使用TSMDBGrid? – eKek0 2009-11-28 17:31:50
也許是因爲它不是免費的?這顯然是TDBGrid應該可以實現的,恕我直言,沒有理由放棄和使用另一個(商業)組件。 – jpfollenius 2009-11-28 18:04:16
@ eKek0 TSMDBGrid很好的免費組件,但這個小巧,簡單,快捷正是這份工作。 @Smasher ...在可能意見TSMDBGrid是免費的,這是TThemedDBGrid的修改版本,你可以得到它(免費)在這裏: http://andy.jgknet.de/blog/?page_id=206 – Kachwahed 2009-12-06 12:11:32