Das Gegenteil dessen, was Du in Beitrag 2 vorgestellt hast, sähe wie folgt aus:
Delphi-Quellcode:
TVScrollDBGrid =
class(TDBGrid)
private
procedure WMNCCalcSize(
var Msg: TMessage);
message WM_NCCALCSIZE;
end;
procedure TVScrollDBGrid.WMNCCalcSize(
var Msg: TMessage);
// Grundsätzlich den vertikalen Scrollbalken anzeigen
var Style : Integer;
begin
Style := GetWindowLong(
Handle, GWL_STYLE);
if (Style
and WS_VSCROLL) = 0
then
SetWindowLong(
Handle, GWL_STYLE, Style
or WS_VScroll);
inherited;
end;
// WMNCCalcSize
Oder du bindest selber eine neue Komponente in die Komponentenpalette ein, bei der Du über die neuen Eigenschaften "AlwaysShowVScroll" und "AlwaysShowHScroll" im Objektinspektor festlegen kannst, welche der beiden Scrollbalken permanent eingeblendet werden sollen:
Delphi-Quellcode:
TFlexibleScrollDBGrid =
class(TDBGrid)
private
FAlwaysShowVScroll: Boolean;
FAlwaysShowHScroll: Boolean;
procedure WMNCCalcSize(
var Msg: TMessage);
message WM_NCCALCSIZE;
published
property AlwaysShowVScroll: Boolean
read FAlwaysShowVScroll
write FAlwaysShowVScroll;
property AlwaysShowHScroll: Boolean
read FAlwaysShowHScroll
write FAlwaysShowHScroll;
end;
procedure TFlexibleScrollGrid.WMNCCalcSize(
var Msg: TMessage);
var Style, ScrollStyles : Integer;
begin
// An ScrollStyles übergeben, welche Scrollbars permanent zu sehen sein sollen
ScrollStyles := 0;
if FAlwaysShowVScroll
then ScrollStyles := WS_VSCROLL;
if FAlwaysShowHScroll
then ScrollStyles := ScrollStyles
or WS_HSCROLL;
// Prüfen, ob sie bereits angezeigt werden
Style := GetWindowLong(
Handle, GWL_STYLE);
// Wenn nicht, dann die Anzeige aktivieren
if (FAlwaysShowVScroll
and ((Style
and WS_VSCROLL) = 0))
or (FAlwaysShowHScroll
and ((Style
and WS_HSCROLL) = 0))
then SetWindowLong(
Handle, GWL_STYLE, Style
or ScrollStyles);
inherited;
end;
// WMNCCalcSize
MfG