Page 1 of 1

Richedit5 SendMsg

Posted: Wed Aug 11, 2021 5:20 pm
by Sebastián Almirón
Hola, he hecho una aplicación que ejecutan en móviles y tablets, a través de terminal server, y en ella tengo unos RichEdit5.
El problema del que se me queja el cliente es que la edicción de los RichEdit, sobre todo el copiar/pegar, que es lo que hacen más a menudo es muy dificultosa en los móviles, concretamente seleccionar el texto que quieren pegar.

He intentado que se pueda marcar la posición de inicio y la de final que se quiere seleccionar, añadiendo un array que contine un rect, guardando las coordenadas cuando hacen doble click (en el método LDblClick) y luego cuando hacen click (en el método LButtonDown) de manera que ahí ya tengo las cuatro coordenadas del rect. Pensaba que enviando un ::SendMsg( EM_SETRECT, 0, @arect ) se quedaría seleccionado el texto que me interesa, pero no, no hace nada. Las coordenadas las he guardado tanto con ::GetRow()/::GetCol como con ::aPos[1]/aPos[2], es decir en pixeles y en lineas/columna, ordenando el array {row_inicio,colum_izquierda,row_final,colum_derecha},pero no funciona.

Resumiendo, ¿hay alguna forma de seleccionar parte del texto de un RichEdit mediante programación?, no me sirven los métodos SelectAll() ni SelectLine(). O alguna forma de cambiar la manera de seleccionar el texto a como se hace en el movil, porque es verdad que aunque se puede seleccionar pulsando dos veces la pantalla e inmediatamente deslizando el dedo, es sumamente dificil y poco practico.

Saludos

Re: Richedit5 SendMsg

Posted: Wed Aug 11, 2021 5:29 pm
by Antonio Linares

Re: Richedit5 SendMsg

Posted: Thu Aug 12, 2021 7:21 am
by cnavarro
Sebastian, no he llegado a utilizar este control en otro dispositivo que no sea un ordenador/portátil, por lo que no puedo comentar la problemática que planteas, pero, en cualquier caso, cuando estuve desarrollando esta clase, si me planteé poder hacer una selección rectangular al estilo que hago con FivEdit ( scintilla ), y, buscando documentación en la web, encontré ésto que quizás te ayude a darle un mejor enfoque a lo que necesitas ( quizás no porque lo que busques sea hacer una selección de ese tipo, pero sí cómo llevan esa selección al portapapeles ). Espero te ayude.
https://www.codeproject.com/Articles/38 ... it-control

Pd.: si saco un rato, intentaré establecer ese entorno de trabajo a ver si puedo probarlo y comprobar la problemática que planteas

Re: Richedit5 SendMsg

Posted: Thu Aug 12, 2021 9:52 am
by Sebastián Almirón
Gracias Antonio, gracias Cristobal. No, no consigo hacer lo que quiero, he probado con lo que proponeis, pero nada.
Básicamente lo ideal sería que la selección de texto se hiciera como en las tablets/moviles (o algo parecido), es decir que se muestren "las manijas" de selección y el usuario pueda moverlas a su antojo.

Invertigando un poco me he encontrado con que existe un mensaje que se le puede enviar a RichEdit precisamente para mostrar/ocultar esas "manijas" (creo), pensado para los dispositivos tactiles:
https://docs.microsoft.com/en-us/windows/win32/controls/em-settouchoptions

he intenado:
#DEFINE EM_SETTOUCHOPTIONS 1335
#DEFINE EM_GETTOUCHOPTIONS 1334
orichedit:SendMsg( EM_SETTOUCHOPTIONS, 1, .t. )

sin embargo no hace nada, le pido que me devuelva el valor:
nvalor := orichedit:SendMsg( EM_GETTOUCHOPTIONS, 1, 0 )
y siempre me devuelve 0 (falso)
https://docs.microsoft.com/en-us/windows/win32/controls/em-gettouchoptions

Bueno, gracias de todos modos, seguiré con ello y si lo consigo ya os lo diré.
Saludos

Re: Richedit5 SendMsg

Posted: Thu Aug 12, 2021 2:58 pm
by karinha
Que tal algo asi:

Code: Select all | Expand


   SendMessage(hWn, EM_SETSEL, 0, -1)
   SendMessage(hWn, WM_COPY, 0, 0)
   buf:=oClp:GetText()
 


Regrads, saludos.

Re: Richedit5 SendMsg

Posted: Thu Aug 12, 2021 5:32 pm
by Antonio Linares
Sebastian,

Prueba PostMsg() en vez de SendMsg()

Prueba tambien con:
orichedit:SendMsg( EM_SETTOUCHOPTIONS, 1, 1 ) // ya que el tercer parámetro tiene que ser numérico