Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: YAcosta en Mayo 23, 2012, 04:07:56 am
-
Buenas.
Tengo este inconveniente.
con shellExecute abro una web:
ShellExecute hWnd, vbNullString, "http://www.mipagina.com", vbNullString, vbNullString, SW_SHOWNORMAL
Abro el browser y carga la web, perfecto.
Pero dado que algunas paginas que estoy consultando son extensas necesito ir al final de la pagina ¿como puedo resolverlo?
Probé con mandarle luego de la linea del shellExecute:
SendKeys "{END}"
pero no me envia al final, no hace nada. Luego puse:
SendKeys "{END}", 1000 para darle tiempo pero nada.
¿Que estoy haciendo mal?
Gracias
-
Hola Yvan mira se me ocurre pero no se si es tu caso, porque no usar las anclas, # , segun la web que pones de ejemplo parece ser tulla http://www.mipagina.com asi que parece que no abria problema ya que se las podes agregar, entonces en el shell execute pones http://www.mipagina.com#articulos donde #articulos es tu ancla
-
Hola Lea gracias.
Pero, que pasa si no se cual es el articulo porque este recién se ha creado o porque otro usuario lo ha creado, estoy usando el control ucLabelItem de tu proyecto LectorRSS entonces en el clik tengo esto:
ShellExecute Me.hWnd, vbNullString, ucLblitem2(Index).Tag, vbNullString, "C:\", SW_SHOWNORMAL
Por ejemplo, si en ucLblitem2(Index).Tag tengo:
http://www.forosperu.net/showthread.php?t=322306
donde le pongo la almohadilla? hice pruebas y no me lleva al final ¿que estoy haciendo mal?
-
lo que podes hacer, es simplemente es un scroll hasta el final.
Private Sub Command1_Click()
WebBrowser1.Document.parentWindow.scrollTo 0, 50000
End Sub
Private Sub Form_Load()
WebBrowser1.Navigate "http://leandroascierto.com/blog/"
End Sub
saludos.
-
Hola sebas, estoy escribiendo desde el móvil y quizá me equivoque pero ti cdigo ufá el scontrol webbrowser... Y no estoy usando ese control ya que abro la web en el navegador y no en la aplicación
-
claro, perdon no lei bien, bueno para eso podes usar esto:
Option Explicit
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal winHandle As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Const EM_SCROLL = &HB5
Private Const SB_BOTTOM = 7
Private Const SB_TOP = 6
Private Sub Command1_Click()
SendMessage &H4065C, EM_SCROLL, SB_BOTTOM, 0
End Sub
eso lo que hace es scrollar cualquier ventana con scrollbars, para arriba o para abajo, solo tenes que saber el handle de esa ventana, por lo cual yo usaria para ejecutar el explorador, la api CreateProcess asi podes saber el handle con el que se crea la ventana padre, ya que ShellExecute no devuelve el handle de la ventana, probalo con el bloc de notas por ejemplo y vas a ver que funciona. el tema es si tiene pestañas ahi ya no se como actua esto.
saludos.
-
Me perdí doc, he buscado sobre CreateProcess y me maree con el código de ese tema y no entendí como aplicarlo.
Volveré a insistir con el tema de # a ver si me funca.
Gracias igual
Claro que si tienes un poco de time y me sueltas una explicadita de eso te agradeceria.
Saludos
-
Hola yvan si no tome en cuenta una web dinámica, tal como lo es un foro, y tu problema es que no sabes cual es la ultima ancla, hasta el dia de hoy el ultimo post es el 10 por lo que la url seria http://www.forosperu.net/showthread.php?t=322306#10
pero de no encontrar la forma de averiguar el ancla del ultimo post no se me ocurre otra solución elegante,
no se en que lo vas a usar esto y que tan importante sea pero por tirarte una solución, es que primero descargues el html de la web y parses el contenido y averguies cual fue el ultimo post, con lo que hay consigues el ultimo ancla.
-
Correcto Leandro, es ese el problema que tengo de no saber cual es el ultimo post, porque luego seran 12 o 15.
¿Todo esto es porque es un problema del RSS?? porque el aplicativo tuyo si trae el titulo y el ultimo post, entonces revise porque y vi que el rss de tu foro si trae el ultimo post del tema que se trata, tu usas este:
http://www.leandroascierto.com.ar/foro/index.php?type=rss;action=.xml
Cuando reviso en el foro que quiero aplicar (en el del otro ya no lo hare por otros temas) obtengo este rss:
http://www.forum.planetnoize.com/index.php?p=/discussions/feed.rss
y me funciona pero me trae el titulo y el primer post.
Entonces a diferencia del tuyo tu rss ya trae los enlaces con# y por eso que al darle clic nos lleva al ultimo post lo que no sucede en mi caso.
Pregunta
¿Es un problema de la fuente? de que no tenga el rss bien creado o es que yo no estoy invocando el rss correcto porque probe con http://www.forum.planetnoize.com/index.php?type=rss;action=.xml y me da error en el contenido.
Gracias amigo
-
Hola Yvan bueno, creo que es porque la fuente no te lo permite, pero bueno lleyendo este post (http://www.forum.planetnoize.com/index.php?p=/discussion/155/abrir-planetnoize-para-saber-si-hay-mensajes) entiendo lo que quieres hacer y es mas facil, pero bueno yo hice un ejemplo un poco mas generalizado , es decir no solo para el foro de planetnoize si para algo un poco mas generalizado, claro que si vos queres lo optimizas para tu necesidad.
bien la idea es como te dije obtener el html y ubicar la ultima ancla, aqui el code
Option Explicit
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Const SW_SHOWNORMAL = 1
Private Sub Form_Load()
Dim sUrl As String
sUrl = "http://www.forum.planetnoize.com/index.php?p=/discussion/155/abrir-planetnoize-para-saber-si-hay-mensajes"
sUrl = sUrl & GetLastAnchor(sUrl)
ShellExecute Me.hwnd, vbNullString, sUrl, vbNullString, "C:\", SW_SHOWNORMAL
End Sub
Private Function GetLastAnchor(ByVal sUrl As String) As String
On Error Resume Next
Dim m_Inet As Object
Dim HtmlDOC As Object
Dim iLast As Integer
Dim i As Long
Set m_Inet = CreateObject("MSXML2.ServerXMLHTTP")
m_Inet.open "GET", sUrl, False
m_Inet.send
If m_Inet.Status = 200 Then
Set HtmlDOC = CreateObject("htmlfile_FullWindowEmbed")
HtmlDOC.body.innerHTML = StrConv(m_Inet.responseBody, vbUnicode)
iLast = HtmlDOC.anchors.length - 1
For i = iLast To 0 Step -1
If Left$(HtmlDOC.anchors.Item(i).id, 9) = "postcount" Then
If Len(HtmlDOC.anchors.Item(i).Name) > 0 Then
GetLastAnchor = "#" & HtmlDOC.anchors.Item(i).Name
End If
Exit Function
ElseIf Left$(HtmlDOC.anchors.Item(i).id, 3) = "msg" Then
GetLastAnchor = "#" & HtmlDOC.anchors.Item(i).id
Exit Function
ElseIf Left$(HtmlDOC.anchors.Item(i).Name, 4) = "post" Then
GetLastAnchor = "#" & HtmlDOC.anchors.Item(i).Name
Exit Function
End If
Next
For i = iLast To 0 Step -1
If InStr(HtmlDOC.anchors.Item(i).href, "#") > 0 Then
GetLastAnchor = Mid$(HtmlDOC.anchors.Item(i).href, InStr(HtmlDOC.anchors.Item(i).href, "#"))
If GetLastAnchor <> "#" Then Exit Function
End If
Next
If iLast > -1 Then
If Len(HtmlDOC.anchors.Item(iLast).id) > 0 Then
GetLastAnchor = "#" & HtmlDOC.anchors.Item(iLast).id
ElseIf Len(HtmlDOC.anchors.Item(iLast).Name) > 0 Then
GetLastAnchor = "#" & HtmlDOC.anchors.Item(iLast).Name
End If
End If
End If
End Function
Saludos, ahora voy a ver ese programa que estas haciendo.
-
Genial amigo, voy a estudiar el tema al toque
Muchas gracias.
-
Bien, al menos ya puedo ir al ultimo post publicado. Lastima no poder lograr que se vea en el programa ese ultimo post pero con esto al menos ya tengo resuelto lo de la web
Muchas gracias Leandro
-
Estuve viendo la aplicación, no hay problemas para mostrar el ultimo comentario, pero se van sumando otros inconvenientes, por ejemplo el paginado también hay que saber cuantas paginas se muestran para consultar la ultima que es donde esta el ultimo comentario, yo creo que para que el programa se realmente cumpla una utilidad deverias mostrar una alerta cuando alguien publico un post o alguien hizo un comentario, distingamos un post de un comentario, el post es el hilo principal tal como te lo muestra el rss y el comentario es lo que le sigue hecho por los demás usuarios.
Entonces si el primer ítem del rss cambia es porque alguien hizo un post, hay deverias mostrar un msg o ventana con la información y con un solo click te abra el navegador en dicho post, y si hay un comentario también un msg y con un click abris en dicho post, no se si me entiendes cual es mi pensamiento. pero es un punto de vista.
bueno te dejo el codigo para ver el ultimo comentario del post (Eso si, solo toma en cuenta la primera pagina, después cualquier cosa vemos eso)
Fíjate que modifique la función ahora se llama GetLastComent y tiene cuatro parámetros el primero es la url del post (osea ucLblitem2(Index).Tag) los otros cuatro parámetros son de tipo ByRef en los que carga el la URL con el ancla, Autor, Fecha, y comentario., si la funcion devuelve true es porque hay almenos hay un comentario, y salio todo bien.
Option Explicit
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Const SW_SHOWNORMAL = 1
Private Sub Form_Load()
Dim sUrl As String
Dim sUrlComentario As String
Dim sAutor As String
Dim sFechaComentario As String
Dim sMensage As String
Me.AutoRedraw = True
sUrl = "http://forum.planetnoize.com/index.php?p=/discussion/62/sigue-caido-peruhardware-y-forosperu/p2"
If GetLastComent(sUrl, sUrlComentario, sAutor, sFechaComentario, sMensage) Then
Me.Print "Url: " & sUrlComentario
Me.Print "Autor: " & sAutor
Me.Print "Fecha: " & sFechaComentario
Me.Print "Mensage: " & vbCrLf
Me.Print sMensage
Else
Me.Print "No hay comentarios en el post, solo el mensage original."
End If
'ShellExecute Me.hwnd, vbNullString, sUrlComentario, vbNullString, "C:\", SW_SHOWNORMAL
End Sub
Private Function GetLastComent(ByVal sUrl As String, ByRef sUrlComment As String, ByRef sAutor As String, ByRef sDateComment As String, ByRef sMessage As String) As Boolean
On Error Resume Next
Dim m_Inet As Object
Dim HtmlDOC As Object
Dim iLast As Integer
Dim Element As Variant
Dim sLastAnchor As String
Dim i As Integer
Set m_Inet = CreateObject("MSXML2.ServerXMLHTTP")
m_Inet.open "GET", sUrl, False
m_Inet.send
If m_Inet.Status = 200 Then
Set HtmlDOC = CreateObject("htmlfile_FullWindowEmbed")
HtmlDOC.body.innerhtml = m_Inet.responsetext 'StrConv(m_Inet.responseBody, vbUnicode)
iLast = HtmlDOC.anchors.length - 1
For i = iLast To 0 Step -1
If InStr(HtmlDOC.anchors.Item(i).href, "#") > 0 Then
sLastAnchor = Mid$(HtmlDOC.anchors.Item(i).href, InStr(HtmlDOC.anchors.Item(i).href, "#") + 1)
Exit For
End If
Next
If sLastAnchor <> "" Then sUrlComment = sUrl & "#" & sLastAnchor
For Each Element In HtmlDOC.getElementById(sLastAnchor).All
Select Case Element.className
Case "Message"
sMessage = Element.innertext
Case "DateCreated"
sDateComment = Element.innertext
Case "Author"
sAutor = Element.innertext
End Select
Next
End If
GetLastComent = Err.Number = 0
End Function
-
Si funciono Leandro!!! incluso si tiene varias paginas.
El único detallito es el refresco de las ventanas, a las siguientes veces medio que se cuelga por un segundo y luego carga bien, esto de cuando en vez.
Acabo de darme cuenta que donde dice Fecha aparece la hora, voy a revisar la fuente si es otro campo o sino lo cambio por Hora
Aqui publico las fuentes por si a alguien le interese y lo modifique segun su necesidad.
Fuentes (http://www.yacosta.com/PlanetNoize.rar)
EDITO: Eso de la alerta seria comparando?? comparando lo que se tiene vs lo que llega... o como seria?
EDITO 2: Probando el exe no parpadea nada, solo ejecutando desde el proyecto
EDITO 3: Si, si parpadea muy de cuando en cuando, habrá que hacer algun malabar, y he visto que algunas segundas paginas no esta cargando. seguire viendo, pero al menos mis amigos del foro estan happys, es un foro peruano y chonguero con bromas locales.
EDITO 4: Si, efectivamente no leet el ultimo comentario de la ultima pagina, lee el ultimo comentario de la primera pagina a pesar de mandarle la ultima página (ejemplo) comment_546. Seguiré jugando a ver si logro hacer que coja la ultima pagina
-
Bueno, no la chunto... En el código que publique en el post anterior y basado en lo alcanzo Leandro tengo lo siguiente (es prácticamente el mismo código):
Set oRssItem = Doc.getElementsByTagName("item")
If Not oRssItem Is Nothing Then
For i = 0 To ucLabelItem2.Count - 1 '(oRssItem.Length - 1)
With ucLabelItem2(i)
.Visible = True
.Caption = oRssItem(i).getElementsByTagName("title")(0).Text
HtmlDOC.body.innerhtml = oRssItem(i).getElementsByTagName("description")(0).Text
.Tag = oRssItem(i).getElementsByTagName("link")(0).Text
sUrl = ucLabelItem2(i).Tag
If GetLastComent(sUrl, sUrlComentario, sAutor, sFechaComentario, sMensage) Then '<-- Aqui
.Note = "Por " & sAutor & " Fecha: " & sFechaComentario & vbCrLf & vbCrLf & Left(sMensage, 150) & "..."
End If
.Refresh
End With
Next
End If
Dond edice <-- Aqui tenemos una función que intenta sacar el ultimo comentario del hilo y lo hace siempre que el hilo conste de una pagina, cuando tiene mas de una pagina no me sigue sacando el ultimo comentario de la primera pagina a pesar incluso de indicarle el ultimo comentario.
Dentro de esa función tenemos esto:
Private Function GetLastComent(ByVal sUrl As String, ByRef sUrlComment As String, ByRef sAutor As String, ByRef sDateComment As String, ByRef sMessage As String) As Boolean
On Error Resume Next
Dim .... declaración de variables...
Set m_Inet = CreateObject("MSXML2.serverXMLHTTP") '<--- Comentario 1
m_Inet.open "GET", sUrl, False
m_Inet.send '<---- Comentario 2
If m_Inet.Status = 200 Then
Set HtmlDOC = CreateObject("htmlfile_FullWindowEmbed")
HtmlDOC.body.innerhtml = m_Inet.responsetext '<-- Comentario 3, creo que aqui es el problema
iLast = HtmlDOC.anchors.length - 1 '<-- Comentario 4
For i = iLast To 0 Step -1 '<-- Comentario 5
If InStr(HtmlDOC.anchors.Item(i).href, "#") > 0 Then
sLastAnchor = Mid$(HtmlDOC.anchors.Item(i).href, InStr(HtmlDOC.anchors.Item(i).href, "#") + 1)
Exit For
End If
Next
If sLastAnchor <> "" Then sUrlComment = sUrl & "#" & sLastAnchor
For Each Element In HtmlDOC.getElementById(sLastAnchor).All
Select Case Element.className
Case "Message"
sMessage = Element.innertext
Case "DateCreated"
sDateComment = Element.innertext
Case "Author"
sAutor = Element.innertext
End Select
Next
End If
GetLastComent = Err.Number = 0
End Function
Comentario 1: Querer entender esto me hizo abrir otro hilo.
Comentario 2: Aquí hace que la aplicación media se cuelgue hasta que termina de leer.
Comentario 3: En esta "variable" no aparece el ultimo post agregado realmente.
Comentario 4: Esto si carga bien la cantidad de comentarios existentes.
Comentario 5: Recorre desde el final de la pagina buscando el comentario pero saca el ultimo de la primera pagina.
Y efectivamente Leandro ya había presagiado este tema y bueno lo comentaba por si alguien mas puede ver alguna luz sobre esto o como orientarme a ver por donde seguir.
Gracias.
-
Perdona Yvan que no ponga los cometarios, eso hace mucho mas facil las cosas, asi que bueno te pongo la funcón con sus comentarios, espero que lo entiendas ya que venis un poco confuso con algunas cosas.
Private Function GetLastComent(ByVal sUrl As String, ByRef sUrlComment As String, ByRef sAutor As String, ByRef sDateComment As String, ByRef sMessage As String) As Boolean
On Error Resume Next
Dim m_Inet As Object
Dim HtmlDOC As Object
Dim iLast As Integer
Dim Element As Variant
Dim sLastAnchor As String
Dim i As Integer
'Aqui se crea un objeto para obtener el html del la pagina en cuestion, algo asi como si usaras un webbrowser u otros cuantos metodos para lograr este mismo objetivo.
Set m_Inet = CreateObject("MSXML2.ServerXMLHTTP")
'aqui se indica que usamos el metodo "GET" ya que tambien existe el "POST" pero este no es el caso ,
'segundo parametro la url en cuestion y tercer parametro que no se trabaja de forma asincrona esto es lo que produce un pequeño cuelgue dela aplicacion hasta que termina de descargar el html
m_Inet.open "GET", sUrl, False
'enviamos la petición
m_Inet.send
'si el estado de la peticion es 200 en el protocolo html significa que esta ok
If m_Inet.Status = 200 Then
'este objecto se crea un objeto "Document" muy conosido en la parte javascript de html, el cual lo creamos para obtener texto plano a partir del html.
Set HtmlDOC = CreateObject("htmlfile_FullWindowEmbed")
'indicamos que el cuerpo del documento es la repuesta de nuestra peticion html
HtmlDOC.body.innerhtml = m_Inet.responsetext 'StrConv(m_Inet.responseBody, vbUnicode)
'en esta linea averiguamos cuantas anclas hay
iLast = HtmlDOC.anchors.length - 1
'hacemos un bucle desde la utlima hasta la primera
For i = iLast To 0 Step -1
'de darse esta condicion obtenemos cual es la ultima ancla
If InStr(HtmlDOC.anchors.Item(i).href, "#") > 0 Then
sLastAnchor = Mid$(HtmlDOC.anchors.Item(i).href, InStr(HtmlDOC.anchors.Item(i).href, "#") + 1)
Exit For
End If
Next
If sLastAnchor <> "" Then sUrlComment = sUrl & "#" & sLastAnchor
'aqui lo que se hace es obtener lo referido al ultimo comentario, lo cual utilizamos el ancla como referencia.
'segurmente hay otro metodo de llegar al mismo lugar en forma gerarquica como una coleccion, pero yo use este que es el que me salio.
For Each Element In HtmlDOC.getElementById(sLastAnchor).All
Select Case Element.className
Case "Message"
sMessage = Element.innertext
Case "DateCreated"
sDateComment = Element.innertext
Case "Author"
sAutor = Element.innertext
End Select
Next
End If
GetLastComent = Err.Number = 0
'Nota: es importate ver el html de la pagina para poder entender estas ultimas lineas ademas ver que es progrmacion de javascript.
'como se utilizo CreateObject no se despliega el menu con las propiedades del objecto, para que esto suseda se deve agregar las referencias de los objetos correspondiente.
End Function
y bien para el problema de la ultima pagina te tiro una pista un consulta siempre la primera, en la pirmera tenes que ver si devajo esta paginando
(http://s13.postimage.org/ifebbulwj/Image1555.jpg) (http://postimage.org/image/ifebbulwj/)
como ves este post http://www.forum.planetnoize.com/index.php?p=/discussion/51/se-cayo-peruhardware-ya-regreso
tiene 8 paginas, bien si parseas el html y buscas cual es el utlimo numero que figura podes saber tu nueva pagina a consultar que en este caso seria esta
http://www.forum.planetnoize.com/index.php?p=/discussion/51/se-cayo-peruhardware-ya-regreso/p8
por lo tanto tendrias que agregarle al pimer link "/p8" claro todo esto requiere una peticion mas, por lo que la app se te va a colgar mas aun.
-
Gracias Leandro y aclaro amigo que no era un reclamo de mi parte, sino comentaba lo que iba entendiendo y que por lo visto era poco :)
Muchísimas gracias por la explicación al detalle que ahora si me ha quedado muy claro, entiendo entonces por donde viene el tema, le voy a meter una estudiada a este asunto que ha empezado a gustarme.
Gracias amigo