【发布时间】:2009-11-28 11:23:58
【问题描述】:
我写了一个简单的方法来对 TDBGrid 中的列进行排序。 如果 Option.RowSelect 设置为 False 一切正常,但如果 RowSelect 为 True 则水平位置滚动不会在排序列后恢复。 所以我尝试 GetScrollPos 和 SetScrollPos 来恢复水平滚动位置,滚动条到正确的位置但 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;
这可以在循环中使用 Perform(WM_HSCROLL, SB_LINERIGHT, 0) 修复,但这不是一个好主意。 谁有更好的解决方案?
【问题讨论】:
-
为什么不直接使用 TSMDBGrid?
-
可能是因为它不是免费的?这显然在 TDBGrid 中应该是可能的,所以恕我直言,没有理由放弃并使用另一个(商业)组件......
-
@eKek0 TSMDBGrid 不错的免费组件,但这个组件小巧、简单且速度更快,而且它完全可以胜任。 @Smasher ...可能意见 TSMDBGrid 是免费的,这是 TThemedDBGrid 的修改版本,你可以在这里(免费)获得它:andy.jgknet.de/blog/?page_id=206