2011-09-23 143 views
8

对于我们的dbgrid,我们希望滚动条经常隐藏。 由于TDBGrid中没有一个“滚动条”属性,我们使用:保持滚动条隐藏在Delphi dbgrid中(甚至在调整大小时)

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

然而,当我们调整窗口的大小(和包含的DBGrid面板),用于 第二滚动条出现,becom只有再次隐藏上述两种方法调用 后。

解决方法是在DrawColumnCell中调用这些方法,但这会导致dbgrid的闪烁 ,即使将DoubleBuffered设置为true也是如此。

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

在此先感谢!

+0

请注意,在Delphi VCL中的'DoubleBuffered',在某些部分,在Windows本身并不是真正的DoubleBuffered技术。 –

+0

如果你想要一个C++ Builder示例,请不要在标题中说Delphi。 –

+0

愚蠢的黑客主意:将DBGrid放入Panel中,并调整面板的大小以使其足够大,从而不显示滚动条。相反,你会得到截断的内容。 –

回答

6

隐藏TDBGrid的滚动条在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. 
+0

不是很熟悉德尔福的语法。可以这样不派生新类,并在开发环境中工具箱安装新组件做了什么? – truthseeker

+2

这就是所谓的insterposed类,如果你是足够的把它放到你的单位(见更新),它将*控*原班在你把它(所以属于单位将被*子类*这样的形式对所有的TDBGrid组件)的命名空间。 – TLama

+0

这一切都很好,但我需要用C++重写这个例子。我能找到的所有网络资源都使用Delphi语言的示例。您的示例可以保持原样并添加到C++示例中,或者至少链接到一些权威性源代码机制。 – truthseeker

0

也许重写CreateParams()方法和删除WS_HSCROLLWS_VSCROLL位形式Params.Style作出的区别。如果您不想编写自定义后代,则可以尝试使用class helper

你也可以使用SetWindowLongPtr API与GWL_STYLE改变窗口的风格,但随后当重新网格的窗口,由于某种原因(所以它不是不是覆盖CreateParams可靠)的更改将丢失。

+0

谢谢!我没有设法实施您的某个建议的工作版本。 我现在只是禁用与我提到的相同的调用滚动条,当面板dbgrid是调整大小的一部分。 – user729103

+0

SetWindowLongPtr不起作用,我:-(。 – truthseeker

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属性更改,这似乎在没有闪烁的情况下工作。

+5

在2007年德尔福UpdateScrollbar * *是虚拟的,所以需要这个技巧取决于你的Delphi的版本。 – GolezTrol

+0

我有一个水平滚动条的问题 - 滚动条曾经是不可点击的客户区 - >不能选择底行 –