richedit con tabulador (desde recursos), ¿como?

richedit con tabulador (desde recursos), ¿como?

Postby rolando » Sun Jul 14, 2013 1:40 am

Buenas noches,

Utilizo la clase richedit y no logro hacer que funcione el tabulador dentro de la edición del texto. Cada vez que se pulsa el tabulador se sale de la edición del richedit (se sale del "custom control") y lo que quiero es que haga una tabulación en el texto.

El "Window styles" del recurso en el que uso la richedit es 0x50A01004, calculo que el problema está en el recurso donde hago la edición porque el tabulador SI FUNCIONA al compilar el sample TestRtf.prg (que utiliza window, no recurso).

Uso recursos con una DLL generada con pelles-c

Gracias.

Rolando :D
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: richedit con tabulador (desde recursos), ¿como?

Postby Antonio Linares » Sun Jul 14, 2013 6:12 pm

Rolando,

Una vez hagas REDEFINE RICHEDIT ... a continuación haz:

#define DLGC_WANTTAB 0x0002

oRichEdit:nDlgCode = DLGC_WANTTAB
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41315
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: richedit con tabulador (desde recursos), ¿como?

Postby rolando » Sun Jul 14, 2013 10:34 pm

Antonio,

Gracias por responder.

Lamentablemente no funciona lo que propones. Además estuve "mirando" la trichedit.prg y no encontré la data nDlgCode.

Saludos.

Rolando
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: richedit con tabulador (desde recursos), ¿como?

Postby Antonio Linares » Mon Jul 15, 2013 8:16 am

Rolando,

La Clase TRichEdit, como todos los demás controles, deriva de la Clase TControl y es TControl quien implementa la DATA nDlgCode.

Windows le pregunta a nuestros controles que teclas quieren procesar, y el control solicita las que desea. El método que responde a esta petición es Method GetDlgCode( nLastKey ). Al asignarle un valor a nDlgCode estamos indicando las teclas extraordinarias que queremos.

De todas formas he visto que la Clase TRichEdit tiene su propia implementación del Método GetDlgCode() por lo que habría que modificarlo para que mi propuesta funcionase, pero la implementación actual devuelve DLGC_WANTALLKEYS, lo que significa "las quiero todas" y posiblemente el propio RichEdit esta controlando que hacer al pulsar Tab (saltar al siguiente control).
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41315
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: richedit con tabulador (desde recursos), ¿como?

Postby Antonio Linares » Mon Jul 15, 2013 8:20 am

Rolando,

La solución es modificar el Método KeyDown() de la Clase TRichEdit, para que no haga nada con VK_TAB:

Code: Select all  Expand view
METHOD KeyDown( nKey, nFlags ) CLASS TRichEdit

   if nKey == VK_TAB
      return nil
   endif

   ...
 
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41315
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: richedit con tabulador (desde recursos), ¿como?

Postby Antonio Linares » Mon Jul 15, 2013 8:23 am

Aunque lo más práctico sería añadir una nueva DATA a la Clase TRichEdit lWantTab para que sea tan sencillo como:

oRichEdit:lWantTab = .T.

sin necesidad de tocar los fuentes de FWH :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41315
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: richedit con tabulador (desde recursos), ¿como?

Postby rolando » Sun Jul 21, 2013 10:00 pm

Antonio,

Después de una semana de ausencia "forzada" por problemas de salud, retomo el tema en cuestión y comento que probé con lo que indicas agregando al METHOD KeyDown:
Code: Select all  Expand view
if nKey == VK_TAB
      return nil
endif


Esto no hace ningún efecto y el tabulador hace lo mismo (sale del richedit).

Por otro lado, estuve también viendo esto de incluir una data

Code: Select all  Expand view
oRichEdit:lWantTab = .T.


Y lo hice (aunque sin entender que efecto tiene esta data sobre la TRichEdit). Comento que tampoco soluciona nada.

Gracias.

Rolando :D
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: richedit con tabulador (desde recursos), ¿como?

Postby rolando » Wed Jul 24, 2013 3:51 pm

arriba
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: richedit con tabulador (desde recursos), ¿como?

Postby rolando » Thu Jul 25, 2013 5:28 pm

+1
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: richedit con tabulador (desde recursos), ¿como?

Postby Antonio Linares » Thu Jul 25, 2013 6:40 pm

Rolando,

Te pido disculpas por mi retraso en atenderte pero he estado ocupado con FWH 64 bits y atendiendo a Lucas en ese tema.

Voy a construir un ejemplo y probamos con él
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41315
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: richedit con tabulador (desde recursos), ¿como?

Postby Antonio Linares » Thu Jul 25, 2013 6:46 pm

De momento con el ejemplo de FWH testrich.prg de la carpeta samples, añadiendo estas dos líneas:

oRich:bKeyDown = { | nKey | MsgInfo( nKey ) }
oRich:nDlgCode = DLGC_WANTALLKEYS

sigue sin detectar la tecla de tabulación...
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41315
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: richedit con tabulador (desde recursos), ¿como?

Postby Antonio Linares » Thu Jul 25, 2013 6:51 pm

Si añadimos estas tres líneas en la Clase TRichEdit ya conseguimos interceptar la tecla VK_TAB:

Code: Select all  Expand view
METHOD KeyDown( nKey, nFlags ) CLASS TRichEdit

   if nKey == VK_TAB
      MsgInfo( "VK_TAB" )
      return 0
   endif  


Ahora falta pasarle ese evento al procedimiento original del control RichEdit...
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41315
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: richedit con tabulador (desde recursos), ¿como?

Postby rolando » Thu Jul 25, 2013 10:44 pm

Antonio,

Justamente probé "detectar" la tecla TAB de la manera que indicas, colocando también un msginfo() para confirmarlo, pero no logro salir de ahí pasando ese evento a la TRichedit. Estuve buscando dentro de la clase y probando con todos los "send" que tiene pero no doy pié con bola.

Gracias por tu interés. Seguramente encontrarás la solución.

Rolando :D
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: richedit con tabulador (desde recursos), ¿como?

Postby Antonio Linares » Fri Jul 26, 2013 11:55 am

Rolando,

Buscando en google he encontrado que se trata de un error de los controles RichEdit, ya que si se devuelve el valor DLGC_WANTALLKEYS desde el Método GetDlgCode() de TRichEdit, Windows no debería darle el foco a otro control.

La solución usada para saltarse esta limitación es interceptar el mensaje WM_NEXTDLGCTL que recibe el diálogo y no hacer nada. Asi que este código debería servir.

Windows solo envía el mensaje WM_NEXTDLGCTL si esta en un control Edit ó RichEdit. Esto nos servirá. Pero lo que estoy intentando entender ahora es porque si estoy devolviendo 1 (ó .T.) que debiera decirle a Windows que no haga nada, el diálogo sigue llevándose el foco. Puedes probar este cambio y verás como detecta que intentamos irnos del RichEdit.

Code: Select all  Expand view

#define WM_NEXTDLGCTL  0x0028

METHOD HandleEvent( nMsg, nWParam, nLParam ) CLASS TDialog

   if nMsg == WM_NEXTDLGCTL
      MsgBeep()
      return 1
   endif  

   ...
 
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41315
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: richedit con tabulador (desde recursos), ¿como?

Postby Antonio Linares » Fri Jul 26, 2013 11:58 am

Falta añadir este método en la Clase TRichEdit:

Code: Select all  Expand view
  METHOD GetDlgCode( nLastKey ) INLINE ::nDlgCode


y esta línea en nuestro código:

#define DLGC_WANTCHARS 0x0080

oRich:nDlgCode = DLGC_WANTALLKEYS

aún asi, sigue sin comportarse como debiera.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41315
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 74 guests