Añadir texto a un RicjhTextBox sin desplazarlo

28/07/2003 - 14:43 por Eje | Informe spam
Buenas, os comento algo que no he sido capaz de lograr todavía y que seguro
que alguien sabe hacer.
Tengo un RichTextBox en el cual voy mostrando eventos que van ocurriendo (es
decir, su contenido se va incrementando automáticamente sin una periodicidad
determinada). La cuestión es que si alguien quiere leer lo que ha ocurrido
anteriormente se desplaza para arriba y puede verlo, pero si en ese momento
se produce algún evento que muestre texto en el control se posiciona al
final del todo, haciendo que tengas que volver al punto en el que estabas
anteriormente, lo cual es un engorro. Esto es debido a que para insertar el
texto hago un selstart del final del texto e inserto ahí la nueva cadena.
He pensado en después de grabar devolver el selstart a la posición en la que
estuviera mirando, pero no encuentro la manera de saber cómo localizar dicha
posición y además esto haría que el control "parpadeara" en el intercambio
del punto donde estaban mirando al final y vuelta al origen.
Seguro que alguien ha tenido este problema alguna vez y se le ha ocurrido
alguna manera sencilla de resolverlo.

Un saludo

Preguntas similare

Leer las respuestas

#1 Eduardo A. Morcillo [MS MVP]
28/07/2003 - 18:36 | Informe spam
He pensado en después de grabar devolver el selstart
a la posición en la que estuviera mirando, pero no encuentro la
manera de saber cómo localizar dicha posición y además esto haría que
el control "parpadeara" en el intercambio del punto donde estaban
mirando al final y vuelta al origen.



Prueba hacer eso, pero antes de insertar el texto y luego de volver a la
posicion original, desactiva la actualizacion del control enviandole el
mensaje WM_SETREDRAW a la ventana del control.

Eduardo A. Morcillo [MS MVP - VB]
http://www.mvps.org/emorcillo
Respuesta Responder a este mensaje
#2 Eduardo A. Morcillo [MS MVP]
29/07/2003 - 17:42 | Informe spam
¿Qué API tendría que usar para hacerlo?.
Por otra parte sigo sin encontrar cómo saber qué parte del textbox
están visualizando, ya que lo único que puedes saber es en qué parte
del texto se encuentra el cursor.



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 = &HB

Private Const EM_LINESCROLL = &HB6
Private Const EM_GETFIRSTVISIBLELINE = &HCE

Private Sub InsertarAlFinal(ByVal Texto As String)
Dim lFL As Long
Dim lSS As Long

' Paro la actualizacion del control
SendMessage RichTextBox1.hwnd, WM_SETREDRAW, 0, ByVal 0&

' Obtengo la primera linea visible
lFL = SendMessage(RichTextBox1.hwnd, EM_GETFIRSTVISIBLELINE, 0, ByVal 0&)

' Guardo la posicion actual del cursor
lSS = RichTextBox1.SelStart

' Inserto el texto
RichTextBox1.SelStart = Len(RichTextBox1.Text)
RichTextBox1.SelText = Texto & vbCrLf

' Coloco el cursor en la posicion original
RichTextBox1.SelStart = lSS

' Calculo el numero de lineas que debo mover
' para volver a la posicion inicial
lFL = lFL - SendMessage(RichTextBox1.hwnd, EM_GETFIRSTVISIBLELINE, _
0, ByVal 0&)

' Vuelvo a la posicion inicial
SendMessage RichTextBox1.hwnd, EM_LINESCROLL, 0, ByVal lFL

' Activo la actualizacion del control
SendMessage RichTextBox1.hwnd, WM_SETREDRAW, 1, ByVal 0&

' Refresco el control
RichTextBox1.Refresh

End Sub

Eduardo A. Morcillo [MS MVP - VB]
http://www.mvps.org/emorcillo
Respuesta Responder a este mensaje
#3 Eje
30/07/2003 - 09:33 | Informe spam
Muchas gracias, voy a probarlo y ya os comentaré.

Un saludo
Respuesta Responder a este mensaje
#4 Eje
31/07/2003 - 10:56 | Informe spam
Comprobado, funciona perfectamente. Muchas gracias por la ayuda.
Pero ahora me encuentro con otro problema.
Mi idea es que si no está moviéndose por el contenido del textbox este vaya
mostrando siempre el final, es decir, que si no están revisando el log
muestre siempre los últimos eventos, y con ese código no se desplaza nunca.
He estado mirando la documentación sobre SendMessage para intentar sacarlo
por mí mismo pero no me vienen indicaciones acerca de los parámetros (pone
siempre: Según mensaje). Supongo que habrá algún parámetro que permita
obtener la última línea del control y la última línea visible, de igual
manera que está el EM_GETFIRSTVISIBLELINE para devolver la primera línea
visible del control. Si alguien me puede indicar los valores de estos
parámetros o darme alguna dirección donde aparezcan le estaría muy
agradecido

Un saludo
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida