2011-09-23 75 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

我有一個水平滾動條的問題 - 滾動條曾經是不可點擊的客戶區 - >不能選擇底行 –

相關問題