3

我写了一个简单的方法来对 TD​​BGrid 中的列进行排序。如果 Option.RowSelect 设置为 False 一切正常,但如果 R​​owSelect 为 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) 修复,但这不是一个好主意。有人有更好的解决方案吗?

4

2 回答 2

3

这是一种控制最左边一列的方法:

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-28T18:49:26.040 回答
0

你可能会在这里找到答案:

http://www.species.net/Aves/Cassowary/delphi.htm

在文本中查找“SetScrollPos”。

也许 ModifyScrollBar(Code, SB_THUMBPOSITION, Value) 拥有解决方案。

于 2009-11-28T18:41:01.987 回答