3

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) を使用して修正できる可能性がありますが、お勧めできません。誰もがより良い解決策を持っていますか?

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 に答える