Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Problema con scrollbars en VB6

Estas en el tema de Problema con scrollbars en VB6 en el foro de Visual Basic clásico en Foros del Web. Hola, espero me puedan ayudar, ando buscando la manera de controlar las barras de desplazamiento de mis sistema, el problema esque tengo Grids muy grandes ...
  #1 (permalink)  
Antiguo 10/06/2008, 15:14
 
Fecha de Ingreso: febrero-2006
Mensajes: 56
Antigüedad: 18 años, 2 meses
Puntos: 0
Problema con scrollbars en VB6

Hola, espero me puedan ayudar, ando buscando la manera de controlar las barras de desplazamiento de mis sistema, el problema esque tengo Grids muy grandes (Horizontalmente) y para eso ocupo la barra horizontal, pero cuando estoy hacia la derecha del grid, al dar click sobre una linea, el scrollbar se me regresa todo a la izquerda y esto saca de onda al usuario.

Habra alguna forma de que al dar click en cualquier lado no me regrese la barra hasta el inicio del lado izquierdo??

Espero me puedan ayudar tengo rato con esto y no le he encontrado.

Saludos
  #2 (permalink)  
Antiguo 10/06/2008, 15:17
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Pregunta Respuesta: Problema con scrollbars en VB6

Cita:
Iniciado por juxodais Ver Mensaje
Hola, espero me puedan ayudar, ando buscando la manera de controlar las barras de desplazamiento de mis sistema, el problema esque tengo Grids muy grandes (Horizontalmente) y para eso ocupo la barra horizontal, pero cuando estoy hacia la derecha del grid, al dar click sobre una linea, el scrollbar se me regresa todo a la izquerda y esto saca de onda al usuario.

Habra alguna forma de que al dar click en cualquier lado no me regrese la barra hasta el inicio del lado izquierdo??

Espero me puedan ayudar tengo rato con esto y no le he encontrado.

Saludos
¿Qué Grid estás usando? ¿MSFlexGrid? ¿MSHFlexGrid? ¿DBGrid?
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #3 (permalink)  
Antiguo 10/06/2008, 15:26
 
Fecha de Ingreso: febrero-2006
Mensajes: 56
Antigüedad: 18 años, 2 meses
Puntos: 0
Respuesta: Problema con scrollbars en VB6

Cita:
Iniciado por David el Grande Ver Mensaje
¿Qué Grid estás usando? ¿MSFlexGrid? ¿MSHFlexGrid? ¿DBGrid?
Estoy usando MSHFlexGrid
  #4 (permalink)  
Antiguo 10/06/2008, 15:28
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Exclamación Respuesta: Problema con scrollbars en VB6

Cita:
Iniciado por juxodais Ver Mensaje
Estoy usando MSHFlexGrid
Ahora mismo no puedo ayudarte. Pero investigaré algo al respecto y luego te contestaré.
Saludos
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #5 (permalink)  
Antiguo 10/06/2008, 15:55
 
Fecha de Ingreso: febrero-2006
Mensajes: 56
Antigüedad: 18 años, 2 meses
Puntos: 0
Respuesta: Problema con scrollbars en VB6

Cita:
Iniciado por David el Grande Ver Mensaje
Ahora mismo no puedo ayudarte. Pero investigaré algo al respecto y luego te contestaré.
Saludos
Oka Gracias te lo agradeceria mucho porque ahi le estoy haciendo la lucha pero no sale...:S:S

Saludos
  #6 (permalink)  
Antiguo 11/06/2008, 00:43
Colaborador
 
Fecha de Ingreso: enero-2008
Ubicación: Unas veces aquí, otras veces allí
Mensajes: 1.482
Antigüedad: 16 años, 3 meses
Puntos: 37
Respuesta: Problema con scrollbars en VB6

Cita:
Iniciado por juxodais Ver Mensaje
Hola, espero me puedan ayudar, ando buscando la manera de controlar las barras de desplazamiento de mis sistema, el problema esque tengo Grids muy grandes (Horizontalmente) y para eso ocupo la barra horizontal, pero cuando estoy hacia la derecha del grid, al dar click sobre una linea, el scrollbar se me regresa todo a la izquerda y esto saca de onda al usuario.

Habra alguna forma de que al dar click en cualquier lado no me regrese la barra hasta el inicio del lado izquierdo??

Espero me puedan ayudar tengo rato con esto y no le he encontrado.

Saludos
Hola,

supongo que será porque el Grid tiene la propiedad SelectionMode a 1 (flexSelectionByRow). La única forma que veo de evitar eso es que le cambies esa propiedad a 0 (flexSelectionFree).
Con ello pierdes la resaltación de la fila entera, pero si esto fuera necesario, puedes jugar con los eventos EnterCell y LeaveCell para conseguirlo.

  #7 (permalink)  
Antiguo 11/06/2008, 08:14
 
Fecha de Ingreso: febrero-2006
Mensajes: 56
Antigüedad: 18 años, 2 meses
Puntos: 0
Respuesta: Problema con scrollbars en VB6

Cita:
Iniciado por Avellaneda Ver Mensaje
Hola,

supongo que será porque el Grid tiene la propiedad SelectionMode a 1 (flexSelectionByRow). La única forma que veo de evitar eso es que le cambies esa propiedad a 0 (flexSelectionFree).
Con ello pierdes la resaltación de la fila entera, pero si esto fuera necesario, puedes jugar con los eventos EnterCell y LeaveCell para conseguirlo.


Si es lo que he estado viendo, estoy tratando de hacerle asi, simulando que esta esa opcion en uno, selecciono una celda y luego lleno todo el renglon, el problema que tengo es que cuando selecciono otra celda de otro renglon, la que estaba anterior llena no se cambia de color al anterior, osea, se quedan todos los renglones que voy presinandno con fondo azul, tendras alguna idea para evitar esto??

Saludos y gracias
  #8 (permalink)  
Antiguo 11/06/2008, 11:22
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: Problema con scrollbars en VB6

Cita:
Iniciado por juxodais Ver Mensaje
Si es lo que he estado viendo, estoy tratando de hacerle asi, simulando que esta esa opcion en uno, selecciono una celda y luego lleno todo el renglon, el problema que tengo es que cuando selecciono otra celda de otro renglon, la que estaba anterior llena no se cambia de color al anterior, osea, se quedan todos los renglones que voy presinandno con fondo azul, tendras alguna idea para evitar esto??

Saludos y gracias
Bueno, si no son muchos los datos, puedes recorrer todas las filas y cambiarlas a color blanco para después cambiar el color al seleccionado...
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #9 (permalink)  
Antiguo 11/06/2008, 12:19
Colaborador
 
Fecha de Ingreso: enero-2008
Ubicación: Unas veces aquí, otras veces allí
Mensajes: 1.482
Antigüedad: 16 años, 3 meses
Puntos: 37
Respuesta: Problema con scrollbars en VB6

Cita:
Iniciado por juxodais Ver Mensaje
Si es lo que he estado viendo, estoy tratando de hacerle asi, simulando que esta esa opcion en uno, selecciono una celda y luego lleno todo el renglon, el problema que tengo es que cuando selecciono otra celda de otro renglon, la que estaba anterior llena no se cambia de color al anterior, osea, se quedan todos los renglones que voy presinandno con fondo azul, tendras alguna idea para evitar esto??

Saludos y gracias
Como te dije antes, puedes hacerlo en el evento LeaveCell, ahí vuelves a poner el renglón con fondo blanco.

  #10 (permalink)  
Antiguo 13/06/2008, 11:42
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: Problema con scrollbars en VB6

Otra idea que se me ocurre para hacerlo sería capturar los mensajes del sistema enviados al Grid, así obtenemos el último Scroll hecho, cuando hacemos Click en una fila en el evento SelChange recuperamos la última posición del Scroll. Cualquier duda con el código, puedes preguntar...
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #11 (permalink)  
Antiguo 16/06/2008, 08:13
 
Fecha de Ingreso: febrero-2006
Mensajes: 56
Antigüedad: 18 años, 2 meses
Puntos: 0
Respuesta: Problema con scrollbars en VB6

Cita:
Iniciado por David el Grande Ver Mensaje
Otra idea que se me ocurre para hacerlo sería capturar los mensajes del sistema enviados al Grid, así obtenemos el último Scroll hecho, cuando hacemos Click en una fila en el evento SelChange recuperamos la última posición del Scroll. Cualquier duda con el código, puedes preguntar...

Si puedo saber la posicion del scroolbar?? algo asi tambien andaba buscando pero no encontre, como le podria hacer??

Saludos y gracias.
  #12 (permalink)  
Antiguo 17/06/2008, 09:42
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: Problema con scrollbars en VB6

Pues bien, debes colocar este código en el módulo:
Código:
Option Explicit
Private OldWindowProc As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, lParam As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function SetScrollInfo Lib "user32" (ByVal hWnd As Long, ByVal fnBar As Long, ByRef lpsi As SCROLLINFO, ByVal fRedraw As Boolean) As Long
Private Declare Function GetScrollInfo Lib "user32" (ByVal hWnd As Long, ByVal fnBar As Long, ByRef lpsi As SCROLLINFO) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_SETREDRAW As Long = &HB&
Private Const GWL_WNDPROC = (-4)
Private Const WM_HSCROLL = &H114
Private Const SB_HORZ As Long = 0
Private Const SIF_ALL As Long = &H1F
Private Const SB_THUMBPOSITION As Long = 4
Private Type SCROLLINFO
    cbSize As Long
    fMask As Long
    nMin As Long
    nMax As Long
    nPage As Long
    nPos As Long
    nTrackPos As Long
End Type
Private Scroll As SCROLLINFO
Private vhWnd As Long
Sub PaintForm(ByVal hWnd As Long, ByVal Enabled As Boolean)
If Enabled Then
    Call SendMessage(hWnd, WM_SETREDRAW, 1&, 0&)
Else
    Call SendMessage(hWnd, WM_SETREDRAW, 0&, 0&)
End If
End Sub
Public Sub RestartScroll()
SetScrollInfo vhWnd, SB_HORZ, Scroll, True
SendMessage vhWnd, WM_HSCROLL, (IIf((Scroll.nPos < 1), 1, Scroll.nPos) * &H10000) Or SB_THUMBPOSITION, ByVal 0&
End Sub
Public Function NewWindowProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, lParam As Long) As Long
If Msg = WM_HSCROLL Then
    'Obtenemos la posición del Scroll
    Scroll.fMask = SIF_ALL
    Scroll.cbSize = Len(Scroll)
    GetScrollInfo hWnd, SB_HORZ, Scroll
    vhWnd = hWnd
End If
NewWindowProc = CallWindowProc(OldWindowProc, hWnd, Msg, wParam, lParam)
End Function
Public Sub SetWindowProc(ByVal hWnd As Long)
OldWindowProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf NewWindowProc)
End Sub
En la ventana:
Código:
 
Private Sub Form_Load()
'Cambiamos el procedimiento para capturar los mensajes
SetWindowProc Grid.hWnd
End Sub
Private Sub Grid_LeaveCell()
'Desactivamos repintado del Grid
PaintFor Grid.hWnd, False
End Sub
Private Sub Grid_SelChange()
'Restablecemos la última posición del Scroll
RestartScroll
'Activamos repintado del Grid
PaintForm Grid.hWnd, True
'Actualizamos el Grid
Grid.Refresh
End Sub
© Este código lo hice consultando los siguientes códigos disponibles en Internet:
http://www.recursosvisualbasic.com.a...r-listview.htm (Repintado de la ventana)
http://www.recursosvisualbasic.com.a...de-ventana.htm (Capturar mensajes de ventana)
http://www.forosdelweb.com/1276010-post107.html (Obtener posición de ScrollBar)
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #13 (permalink)  
Antiguo 17/06/2008, 10:16
Colaborador
 
Fecha de Ingreso: enero-2008
Ubicación: Unas veces aquí, otras veces allí
Mensajes: 1.482
Antigüedad: 16 años, 3 meses
Puntos: 37
Respuesta: Problema con scrollbars en VB6

Sigo pensando que es mas sencillo jugar con las propiedades EnterCell y LeaveCell del Grid.

(La propiedad SelectionMode a flexSelectionFree)

Código:
Private Sub MSHFlexGrid1_EnterCell()
Dim i As Integer
With MSHFlexGrid1
    For i = 0 To .Cols - 1
        .Col = i
        .CellBackColor = vbBlue
        .CellForeColor = vbWhite
    Next i
    .Col = 0
End With
End Sub

Private Sub MSHFlexGrid1_LeaveCell()
Dim i As Integer
With MSHFlexGrid1
    For i = 0 To .Cols - 1
        .Col = i
        .CellBackColor = vbWhite
        .CellForeColor = vbBlack
    Next i
    .Col = 0
End With
End Sub

  #14 (permalink)  
Antiguo 17/06/2008, 10:21
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
De acuerdo Respuesta: Problema con scrollbars en VB6

Sí, de hecho tienes razón, Avellaneda. Es más corto el código, pero a veces me gusta elegir el camino más largo porque así tenemos oportunidad de aprender mucho más... y de paso probando que se puede hacer aún con flexSelectionByRow...

Saludos
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #15 (permalink)  
Antiguo 17/06/2008, 10:33
Colaborador
 
Fecha de Ingreso: enero-2008
Ubicación: Unas veces aquí, otras veces allí
Mensajes: 1.482
Antigüedad: 16 años, 3 meses
Puntos: 37
Respuesta: Problema con scrollbars en VB6

Cita:
Iniciado por David el Grande Ver Mensaje
Sí, de hecho tienes razón, Avellaneda. Es más corto el código, pero a veces me gusta elegir el camino más largo porque así tenemos oportunidad de aprender mucho más... y de paso probando que se puede hacer aún con flexSelectionByRow...

Saludos
Bueno, es cuestión de opiniones. Yo solamente utilizo las API cuando lo que pretendo no se puede hacer con código puro de VB o cuando lo acortan. Siempre he intentado (como me enseñaron) de optimizar el código, escribir poco y que funcione.

Aprovecho para corregir un gazapo en mi respuesta anterior:

EnterCell y LeaveCell no son propiedades, sino eventos (a cualquiera se le va la olla).

  #16 (permalink)  
Antiguo 17/06/2008, 10:38
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Exclamación Respuesta: Problema con scrollbars en VB6

Cita:
Iniciado por Avellaneda Ver Mensaje
Bueno, es cuestión de opiniones. Yo solamente utilizo las API cuando lo que pretendo no se puede hacer con código puro de VB o cuando lo acortan. Siempre he intentado (como me enseñaron) de optimizar el código, escribir poco y que funcione.

Aprovecho para corregir un gazapo en mi respuesta anterior:

EnterCell y LeaveCell no son propiedades, sino eventos (a cualquiera se le va la olla).

Pues en realidad, todo en la programación es relativo. Yo aprendí por la experiencia (utilizando otros lenguajes) que los procedimientos de Visual Basic en su mayoría son más lentos que lo 'normal'. Así que uso la API siempre que puedo pues para eso fue creada o siempre que veo que resultará más rápido que escribir en VB puro (en muchas ocasiones resulta ser así, más rápido (en cuestión de procesamiento), código mejor optimizado, aunque más largo)...
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:55.