我在TDBGrid中编写了一个简单的列排序方法。如果Option.RowSelect设置为False,则一切正常,但如果RowSelect设置为True,则在排序列后水平位置滚动不会恢复。所以我尝试了GetScrollPos和SetScrollPos来恢复水平滚动的位置,ScrollBar转到了正确的位置,但是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)来修复,但这不是一个好主意。谁有更好的解决方案?
发布于 2009-11-29 02:49:26
下面是一种控制最左边列的方法:
type
TGridFriend=class(TDBGrid);
procedure TForm1.Button2Click(Sender: TObject);
begin
// scroll to right by one column
TGridFriend(DBGrid1).leftCol:=TGridFriend(DBGrid1).leftCol + 1;
end;发布于 2009-11-29 02:41:02
你可能会在这里找到答案:
http://www.species.net/Aves/Cassowary/delphi.htm
在正文中查找"SetScrollPos“。
也许ModifyScrollBar(代码、SB_THUMBPOSITION、值)包含了解决方案。
https://stackoverflow.com/questions/1812294
复制相似问题