恢复TDBGrid中的水平滚动位置
问题描述:
我写了一个简单的方法对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)循环但不是好主意。 有人有更好的解决方案吗?
答
这里有一个方法来控制什么是最左边的列:
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
谢谢X射线,简单和工作的想法。 只需保存最后一个LeftCol并在进行排序后恢复。 – Kachwahed 2009-12-06 12:28:23
答
你可能会在这里找到答案:
http://www.species.net/Aves/Cassowary/delphi.htm
查找文本 “SetScrollPos”。
也许ModifyScrollBar(代码,SB_THUMBPOSITION,Value)包含解决方案。
你为什么不只是使用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