Delphi 恢复TDBGrid中的水平滚动位置

Delphi 恢复TDBGrid中的水平滚动位置,delphi,tdbgrid,Delphi,Tdbgrid,我编写了一个简单的方法来对TDBGrid中的列进行排序。 如果Option.RowSelect设置为False,则一切正常,但如果RowSelect设置为True,则水平位置滚动在排序列之后不会恢复。 因此,我尝试GetScrollPos和SetScrollPos恢复水平滚动位置,滚动条转到正确位置,但TDBGrid没有滚动,以下是方法: procedure TDBGrid.TitleClick(Column: TColumn); var CurrenctPosition: TBookmar

我编写了一个简单的方法来对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;
过程TDBGrid.TitleClick(列:TColumn);
变量
当前位置:TBookmark;
PosScroll:整数;
开始
继承的标题链接(列);
如果FAllowTitleClick和(已分配(数据源))
和(已分配(DataSource.DataSet))
和(DataSource.DataSet.Active)
和(已分配(列字段))
和(Column.Field.Field)然后
开始
//获取位置滚动
PosScroll:=GetScrollPos(手柄,SB_HORZ);
CurrenctPosition:=DataSource.DataSet.GetBookmark;
FPaintInfo.ColPressed:=False;
FPaintInfo.ColPressedIdx:=-1;
如果是ValidCell(FCell),则
失效单元(FCell.X,FCell.Y);
SortColumn(列);
DataSource.DataSet.GotoBookmark(CurrenctPosition);
//设置位置滚动条

SetScrollPos(手柄,SB_HORZ,PosScroll,True)// 你可以在这里找到答案:

在文本中查找“SetScrollPos”


也许修改滚动条(代码、SB_拇指位置、值)可以解决问题。

这里有一种方法可以控制最左边的列:

type
  TGridFriend=class(TDBGrid);


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

你为什么不直接使用TSMDBGrid?也许是因为它不是免费的?这显然是TDBGrid中应该具备的功能,因此我认为没有理由放弃并使用另一个(商业)组件…@eKek0 TSMDBGrid是一个很好的免费组件,但这个组件很小,很简单,速度也很快,它完全可以完成任务@Smasher…在五月看来,TSMDBGrid是免费的,这是TThemedBgrid的修改版,你可以在这里(免费)获得它:感谢X射线,简单实用的想法。只需保存最后一个LeftCol,并在排序后将其还原即可。