Ver Mensaje Individual
  #7  
Antiguo 27-03-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Reputación: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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);  // ¿ Esta sobre un TWinControl ?
  if Assigned(WControl) and (WControl is TDBGrid) then // ¿ Es tambien un TDBGrid ? 
  begin
    P:= ScreenToClient(Mouse.CursorPos);  // Obtener posición del mouse
    G:= TDBGRid(WControl);                     
    ZD:=  GetSystemMetrics(SM_CXVSCROLL);  // Ancho zona desplazamiento 
    if (P.X < G.Left + ZD) and not InZD then  // Ingresa zona desplazamiento izquierda    
      SendMessage(G.Handle, WM_HSCROLL, SB_LINELEFT, 0);
    if (P.X > G.Left + G.Width - ZD) and not InZD then  // Ingresa zona desplazamiento derecha
      SendMessage(G.Handle, WM_HSCROLL, SB_LINERIGHT, 0);
    InZD:= (P.X < G.Left + ZD) or (P.X > G.Left + G.Width - ZD); // ¿ En zona desplazamiento ?
  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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita