Hola marcial.
Entonces creo que el primer código que adjunté se hacercaba más a lo que buscabas.
El problema que veo es que comparando la coordenada X del mouse por la igualdad, te desplazará una columna cuando ingresa a la zona de desplazamiento pero también cuando sale. Esto se soluciona comparando por mayor y menor, pero cualquier movimiento que haga con el mouse una vez en el area de desplazamiento, por pequeño que sea, provocará el scroll. En resumidas cuentas: Es imposible de manejar para el usuario.
Así que la solución es detectar si el puntero del mouse está dentro de las zonas de desplazamiento o nó. Si ya se encuentra dentro no debe realizar el scroll.
Creo que el código que buscas sería:
Código Delphi
[-]
procedure TForm1.MMouseEvent(var Msg: TMsg; var Handled: Boolean);
{$J+}
const InZD: Boolean = False;
{$J-}
var
P: TPoint;
WControl: TWinControl;
G: TDBGrid;
ZD: Integer;
begin
WControl:= FindVCLWindow(Mouse.CursorPos); if Assigned(WControl) and (WControl is TDBGrid) then begin
P:= ScreenToClient(Mouse.CursorPos); G:= TDBGRid(WControl);
ZD:= GetSystemMetrics(SM_CXVSCROLL); if (P.X < G.Left + ZD) and not InZD then SendMessage(G.Handle, WM_HSCROLL, SB_LINELEFT, 0);
if (P.X > G.Left + G.Width - ZD) and not InZD then SendMessage(G.Handle, WM_HSCROLL, SB_LINERIGHT, 0);
InZD:= (P.X < G.Left + ZD) or (P.X > G.Left + G.Width - ZD); end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage := MMouseEvent;
end;
De este modo el usuario tiene que volver a la zona de no desplazamiento y reingresar a la de desplazamiento para que se produzca el scroll (izquierdo o derecho).
Saludos.