viernes, 2 de septiembre de 2011

Extended Codeblocks

De más está decir con la versión 2  ha habido un salto de calidad enorme, la velocidad de Harbour es impresionante y reconocido por gente como la de Xailer, que tiene su producto basado en xHarbour.
Seguramente al igual que yo, como usuario de Harbour, a veces sentirás que te pierdes las novedades que día a día se incorporan. Más allá de la sacudida interna que significó la reorganización de las librerias, también aparecieron muchas cosas interesantes, como es el caso de los extended codeblocks.

¿Y eso que es?

Es una funcionalidad que ya existía en xHarbour, al menos muy similar, aunque con una sintaxis levemente diferente. Lo que permite es poder declarar un codeblock que se extienda más de una linea, con variables locales, y con la posibilidad de usar todo el juego de instrucciones. Seguramente alguna vez te ha pasado que el código de un codeblock era tan complejo que era ilegible, y terminabas escribiendo una función que lo reemplazaba. Por ejemplo en un programa en el que trabajo en este momento, con Harbour y FiveWin, si quiero añadirle una hotkey a un GET para que llame a una función de búsqueda, escribía algo así: 

oBancoGet:bKeyDown:= {|nKey, uVal| If( nKey == VK_F2,If( !Empty(uVal:= Buscar(cDbfBancos, 'Codigo')), (oRB:Banco:= uVal,oDlg:Update()),) ,) }


En una línea tienes que montar todo: Verificar que la tecla es la que quieres, llamar a la función de búsqueda, y si esa función retorna un valor, asignarlo a la variable y actualizar el control.



Con extended codeblocks...

La cosa se ve mucho más clara:

oHC['Banco']:bKeyDown:= {|nKey|
                        LOCAL uVal
                        If nKey == VK_F2
                           If !Empty(uVal:= Buscar(cDbfBancos, 'Codigo'))
                              oRB:Banco:= uVal
                              oDlg:Update()
                           EndIf
                        EndIf
                        Return NIL
                        }

mucho más claro, verdad? Además se pueden declarar variables locales, usar IFs o cualquier otra instrucción. Es obligatorio que incluya una instrucción RETURN.

Hasta la próxima, espero que no pase tanto tiempo.