Bajar scrollbar de un control cualquiera

Iniciado por WHK, 22 Septiembre 2009, 04:58 AM

0 Miembros y 2 Visitantes están viendo este tema.

WHK

Hola, a veces he tenido un par de problemas con algunos controles de vb6, por ejemplo el webbrowser puedo hacerlo bajar de forma automática al ponerle contenido con
webbrowser.Document.body.scrollTop = webbrowser.Width

pero por ejemplo este es un cliente de chat para yahoo asi que el scroll cuando lleva demasiadas lineas queda a tope y despues hay que estar bajandolo manualmente.
También me pasa con los listview que por ejemplo a agregar una nueva fila me gustaría que bajara solo pero me encuentro con ejemplos de selecteditem y setfocus que al final si tengo el programa minimizaso se hará un desmadre o si quiero estar modificando otros textbos se me hará focus al listview y se seleccionará solo impidiendo poder visualizar las listas de mas arriba.

En fin... habrá alguna api o algo en el cual yo pueda darle un control en especifico y que me baje el scrollbar hasta al tope del final?

Si las rutinas de vb6 fueran de código libre uno podría modificar estas imperfecciones  :rolleyes:

WHK

bueno, lo del webbrowser lo solucioné eliminando las primeras lineas antes de llegar al tope, de esa forma nunca llega a causar el error pero el listview no se me ocurre como :P

LeandroA

Hola no se si el listview tenga alguna propiedad referida al scroll pero pones enviar un msg de la tecla end

ejemplo.

Option Explicit

Private Const WM_KEYDOWN As Long = &H100

Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long

Private Sub Command1_Click()
    ListView1.ListItems.Add , , Now
    SendMessage ListView1.hwnd, WM_KEYDOWN, vbKeyEnd, 0&
End Sub


Saludos

WHK

Genial! funciona de lujo!, muchas gracias!

ahora, un pequeño detalle,.. como puedo saber si el scrollbar está a tope hasta el final?, de esa forma me gustaría que cuando estubiera a tope entonces que siga bajando pero en caso contrario que no baje, así si yo estoy viendo unos datos de la parte de arriba de la lista que no me baje el scroll automaticamente hasta que lo vuelva a poner hasta abajo, entonces que ahi si siga.

Eso puedo hacerlo pero no sabría como detectar en que posición está ese bendito scrollbar  :P

De todas formas si no se puede no importa, igual ya es un gran avance  :xD

LeandroA

Con el api GetScrollInfo puedes saber esa informacion.

fijate puse un timer para ir agregando algunos items una ves que aparezca el scroll fijate que al subirlo se corta y si lo pones al final continua manteniendolo en ese lugar



Option Explicit
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
Private Declare Function GetScrollInfo Lib "user32.dll" (ByVal hWnd As Long, ByVal n As Long, ByRef lpScrollInfo As SCROLLINFO) As Long

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 Const WM_KEYDOWN As Long = &H100
Private Const SBS_VERT = 1

Private Const SIF_PAGE As Long = &H2
Private Const SIF_POS As Long = &H4
Private Const SIF_RANGE As Long = &H1


Private Sub Form_Load()
    Timer1.Interval = 500
End Sub

Private Sub Timer1_Timer()
    Dim SIF As SCROLLINFO
   
    SIF.cbSize = Len(SIF)
    SIF.fMask = SIF_RANGE Or SIF_PAGE Or SIF_POS
   
    GetScrollInfo ListView1.hWnd, SBS_VERT, SIF
   
   
    ListView1.ListItems.Add , , Now
   
    If (SIF.nPos + SIF.nPage > SIF.nMax) Then
        SendMessage ListView1.hWnd, WM_KEYDOWN, vbKeyEnd, 0&
    End If

End Sub


Saludos

WHK


seba123neo

Hola, para seleccionar la ultima fila en el listview con sus propiedades yo tengo esta funcion:

Código (vb) [Seleccionar]
Private Sub SeleccionarUltimaFila(ByVal pListview As ListView)
    pListview.ListItems(pListview.ListItems.Count).EnsureVisible
    pListview.ListItems(pListview.ListItems.Count).Selected = True
    pListview.SetFocus
End Sub


y la llamas:

Código (vb) [Seleccionar]
Call SeleccionarUltimaFila(ListView1)

saludos.

La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

WHK

no puedo hacerle focus al listview porque el software tendrá una ventana de opciones u si alguienn se pone a escribir ahi y le das focus al listview te sacará de foco el textbox e impedirá que puedas presionar botones o editar cosas ya que este listview almacena logs de accesos de servidores webs y se llenan de unas 5 o 10 filas por segundo, hacerle focus sería desastrozo pero la solución de leandro me funcionó ya que no necesito perder el foco de otro lado ni sarle selección para que baje el scrollbar de forma automática.

Además son 3 listviews diferentes y si uno se hace foco al otro se haría un desmadre xD.

Gracias de todas formas pero ya lo tengo listo.