9

对于我们的 dbgrid,我们希望滚动条一直被隐藏。由于 TDBGrid 没有“滚动条”属性,我们使用:

ShowScrollBar(DBGrid1.Handle, SB_VERT, False);
ShowScrollBar(DBGrid1.Handle, SB_HORZ, False);

然而,当我们调整窗口(和包含 dbgrid 的面板)的大小时,滚动条会出现一秒钟,并且只有在调用上述两种方法后才会再次隐藏。

一个解决方案是在 DrawColumnCell 中调用这些方法,但这会导致 dbgrid 闪烁,即使 DoubleBuffered 设置为 true。

有没有办法永久隐藏滚动条?

提前致谢!

4

3 回答 3

7

隐藏TDBGridin的滚动条CreateParams有很短的时间效果。有UpdateScrollBar导致滚动条可见的过程。发生这种情况是因为滚动条的可见性是根据显示的数据来控制的,因此每当数据更改时都会调用此过程。

由于这个过程在滚动条需要更新的时候被调用并且因为它是虚拟的,所以是时候覆盖它了。
以下代码示例使用了插入类,因此TDBGrid属于该单元的表单上的所有组件的行为都相同:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TDBGrid = class(DBGrids.TDBGrid)
  private
    procedure UpdateScrollBar; override;
  end;

type
  TForm1 = class(TForm)
    DBGrid1: TDBGrid;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TDBGrid.UpdateScrollBar;
begin
  // in this procedure the scroll bar is being shown or hidden
  // depending on data fetched; and since we never want to see 
  // it, do just nothing at all here
end;

end.
于 2012-03-29T11:23:07.070 回答
1

滚动条在 中更新TDBGrid.UpdateScrollBar。不幸的是,这个例程不是虚拟的(至少在 D7 中)。在该例程中,SetScrollInfo调用了一个不发送任何可能被拦截的消息的 Windows 函数。那里没有运气。

剩下的唯一可能性是覆盖每当控件更改大小时发送的消息的消息处理程序:

type
  TDBGrid = class(DBGrids.TDBGrid)
  private
    procedure WMWindowPosChanged(var Message: TWMWindowPosChanged);
      message WM_WINDOWPOSCHANGED;
  end;

procedure TDBGrid.WMWindowPosChanged(var Message: TWMWindowPosChanged);
begin
  inherited;
  Windows.ShowScrollBar(Handle, SB_VERT, False);
end;

尽管UpdateScrollBar在数据更改或数据集的属性更改时也会调用Active,但这似乎在这里可以正常工作而不会闪烁。

于 2012-03-29T11:31:14.193 回答
0

也许覆盖CreateParams()方法和删除WS_HSCROLLWS_VSCROLL位形式Params.Style会有所不同。如果您不想编写自定义后代,可以尝试使用类助手来完成。

您还可以使用 SetWindowLongPtr APIGWL_STYLE来更改窗口的样式,但是由于某种原因重新创建网格的窗口时更改会丢失(因此它不如覆盖可靠CreateParams)。

于 2011-09-23T13:38:59.760 回答