Recently I needed a plain TDBGrid without a horizontal scrollbar. I based it on the below solutions, but using an interposer class (type TDBGrid = class(TDBGrid) ... end;
).
Another solution is to redirect the WinProc for a single grid component to a different method (you can apply it to the similar TDBCtrlGrid
class as well):
unit DBGridFormUnit;
uses
Winapi.Messages,
Vcl.DBGrids,
Vcl.Forms;
type
TDBGridForm = class(TForm)
DBGrid: TDBGrid;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
strict private
OriginalDBGridWindowProc : TWndMethod;
procedure DBGridWindowProc(var Message: TMessage);
end;
implementation
uses
Winapi.Windows;
procedure TDBGridForm.FormCreate(Sender: TObject);
begin
OriginalDBGridWindowProc := DBGrid.WindowProc;
DBGrid.WindowProc := DBGridWindowProc;
end;
procedure TDBGridForm.FormDestroy(Sender: TObject);
begin
DBGrid.WindowProc := OriginalDBGridWindowProc;
end;
procedure TDBGridForm.DBGridWindowProc(var Message: TMessage);
const
ScrollStylesToExclude = WS_VSCROLL or WS_HSCROLL;
var
Style: Integer;
begin
if Message.Msg = WM_NCCALCSIZE then
begin
Style := GetWindowLong(Handle, GWL_STYLE);
if (Style and ScrollStylesToExclude) <> 0 then // any scroll style to exclude present?
SetWindowLong(Handle, GWL_STYLE, Style and not ScrollStylesToExclude);
end
else
OrigWndProc(Message);
end;
end.
I think the SwissDelphiCenter solution in [WayBack] …hide the scrollbars of a DBGrid? originally has been copied from the 2003 post by Peter Below at [WayBack] how to hide DBCtrlGrid scrollbars – delphi.
(*
Q:
I want to hide the vertical scrollbar on a dbgrid when the record count
exceed a number. How can I do that?
A:
Make a descendent of the TDBGrid class. Add a handler for the
WM_NCCALCSIZE message.
Title: ...hide the scrollbars of a DBGrid?
Author: P. Below
Category: VCL
*)
type
TNoScrollDBGrid = class(TDBGrid)
private
procedure WMNCCalcSize(var Msg: TMessage);
message WM_NCCALCSIZE;
end;
procedure TNoScrollDBGrid.WMNCCalcSize(var Msg: TMessage);
const
Scrollstyles = WS_VSCROLL or WS_HSCROLL;
var
Style: Integer;
begin
Style := GetWindowLong(Handle, GWL_STYLE);
if (Style and Scrollstyles) <> 0 then
SetWindowLong(Handle, GWL_STYLE, Style and not Scrollstyles);
inherited;
end;
//This removes both scrollbars. If you want to remove only the vertical one
//change the scrollstyles constant accordingly.
I like this derived class from [WayBack] Delphi VCL Component • View topic • Hiding Scrollbars in DBGRID by Chris Luck based on the code from Peter Below more (I slightly condensed it from non-relevant code):
unit NoScrollDBGrid;
interface
uses
Windows, Messages, DBGrids;
type
TNoScrollDBGrid = class(TDBGrid)
private
FVertScroll: Boolean;
FHorzScroll: Boolean;
procedure WMNCCalcSize(var msg: TMessage); message WM_NCCALCSIZE;
procedure SetVertScroll(Value: Boolean);
procedure SetHorzScroll(Value: Boolean);
published
property VertScroll: Boolean read FVertScroll write SetVertScroll;
property HorzScroll: Boolean read FHorzScroll write SetHorzScroll;
end;
procedure Register;
implementation
uses
Classes;
procedure TNoScrollDBGrid.SetVertScroll(Value: Boolean);
begin
if FVertScroll <> Value then
begin
FVertScroll := Value;
RecreateWnd;
end;
end;
procedure TNoScrollDBGrid.SetHorzScroll(Value: Boolean);
begin
if FHorzScroll <> Value then
begin
FHorzScroll := Value;
RecreateWnd;
end;
end;
procedure TNoScrollDBGrid.WMNCCalcSize(var msg: TMessage);
var
style: Integer;
begin
style := getWindowLong( handle, GWL_STYLE );
if (NOT(FHorzScroll)) AND ((style and WS_HSCROLL) <> 0) then
SetWindowLong( handle, GWL_STYLE, style and not WS_HSCROLL );
if (NOT(FVertScroll)) AND ((style and WS_VSCROLL) <> 0) then
SetWindowLong( handle, GWL_STYLE, style and not WS_VSCROLL );
inherited;
end;
procedure Register;
begin
RegisterComponents('Samples', [TNoScrollDBGrid]);
end;
end.
–jeroen