Xailer Wiki

El entorno de desarrollo definitivo en Xbase

Herramientas de usuario

Herramientas del sitio


migrar.de.xharbour.a.harbour

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
migrar.de.xharbour.a.harbour [2012/08/20 09:29] iozunigamigrar.de.xharbour.a.harbour [2022/02/07 17:03] (actual) – editor externo 127.0.0.1
Línea 30: Línea 30:
       ::nContador := n       ::nContador := n
       ...</code>Se detecta al compilar.       ...</code>Se detecta al compilar.
 +   <note>ACTUALIZACIÓN: Esto fue corregido posteriormente en Harbour, y solamente afecta a Xailer 2.7. Las versiones posteriores están libres de esta limitación.</note>
  
   * No se pueden utilizar índices de tipo array en cadenas de caracteres. Hay que utilizar la función ''Substr()'' para extraer caracteres individuales. Esto es una ampliación que se hizo en xHarbour hace mucho tiempo, y aunque trajo algunos problemas (sobretodo porque hacía muy propicio cometer errores que no eran fáciles de detectar), tenía algunas ventajas en determinados casos. No obstante, esto nunca se ha implementado en Harbour. P.ej.:<code>   * No se pueden utilizar índices de tipo array en cadenas de caracteres. Hay que utilizar la función ''Substr()'' para extraer caracteres individuales. Esto es una ampliación que se hizo en xHarbour hace mucho tiempo, y aunque trajo algunos problemas (sobretodo porque hacía muy propicio cometer errores que no eran fáciles de detectar), tenía algunas ventajas en determinados casos. No obstante, esto nunca se ha implementado en Harbour. P.ej.:<code>
Línea 39: Línea 39:
    nSuma := 0    nSuma := 0
    FOR n := 1 TO Len( cString )    FOR n := 1 TO Len( cString )
-      nSuma += Substr( cString, n, 1 ) +      nSuma += Asc( Substr( cString, n, 1 
-   NEXT</code>No se detecta durante el proceso de compilación, pero sí al ejecutar el programa. Sin embargo esta construcción si es posible:<code>+   NEXT</code>Sin embargo esta construcción si es posible:<code>
    nSuma := 0    nSuma := 0
    FOR EACH cChar IN @cString    FOR EACH cChar IN @cString
       nSuma += Asc( cChar )       nSuma += Asc( cChar )
       cChar := Upper( cChar ) // Observe como se puede cambiar incluso cada carácter de cString       cChar := Upper( cChar ) // Observe como se puede cambiar incluso cada carácter de cString
-   NEXT</code>+   NEXT</code>No se detecta durante el proceso de compilación, pero sí al ejecutar el programa.
  
  
   * Sustituir ''At()'' con 3 parámetros por ''hb_At()''. En xHarbour, la función ''At()'' admite un tercer parámetro que indica el carácter desde donde comenzar la búsqueda. En Harbour, la función ''At()'' permanece exactamente igual que en //Clipper//, es decir con dos parámetros, y cuando sea necesario utilizar ese tercer parámetro, hay que utilizar la función ''hb_At()''. Se detecta al compilar.   * Sustituir ''At()'' con 3 parámetros por ''hb_At()''. En xHarbour, la función ''At()'' admite un tercer parámetro que indica el carácter desde donde comenzar la búsqueda. En Harbour, la función ''At()'' permanece exactamente igual que en //Clipper//, es decir con dos parámetros, y cuando sea necesario utilizar ese tercer parámetro, hay que utilizar la función ''hb_At()''. Se detecta al compilar.
 +
 +
 +  * La función ''Trim()'' no admite un tercer parámetro, que indica que se deben eliminar también los caracteres ''TAB'', ''CR'' y ''LF'' del final de la cadena. Se ha añadido la función ''XA_Trim()'' a Xailer para suplir esta carencia. Por lo tanto, basta con sustituir las llamadas a ''Trim()'' o ''RTrim()'' que den error por ''XA_Trim()''. Se detecta al compilar.
 +
 +
 +  * Sustituir ''ADel()'' con 3 parámetros por ''hb_ADel()''. En xHarbour, la función ''ADel()'' admite un tercer parámetro, que indica que el array se tiene que reducir de tamaño en un elemento, en vez de dejar un valor ''Nil'' en la última posición. Harbour ignora este tercer parámetro, por lo que habrá que sustituirlo por ''hb_ADel()'' o redimensionar el array manualmente con ''ASize()'' despúes de borrar el elemento. No se detecta ni al compilar ni al ejecutar, aunque puede provocar comportamientos erróneos en las rutinas que la utilicen.
 +
 +  * Sustituir ''AIns()'' con 3 parámetros por ''hb_AIns()''. En xHarbour, la función ''AIns()'' admite un tercer parámetro, que indica que el array se tiene que agrandar de tamaño en un elemento, en vez de perder el último elemento. Harbour ignora este tercer parámetro, por lo que habrá que sustituirlo por ''hb_Ins()'' o hacer crecerr el array manualmente con ''Aadd()'' antes de insertar. No se detecta ni al compilar ni al ejecutar, aunque puede provocar comportamientos erróneos en las rutinas que la utilicen.
 +
 +  * No existe la función ''ASizeAlloc()'', ni hay nada parecido que pueda sustituirla, pero es suficiente con eliminar cualquier llamada a la misma. Se detecta al enlazar.
 +
 +
 +  * Sustituir ''hb_SetCodePage()'' por ''hb_CdpSelect()''. Se detecta al enlazar.
 +
 +
 +  * Sustituir ''Super:'' por ''::Super:''. En xHarbour y en la versión de Harbour de Xailer 2.7 se utiliza ''Super:'' para acceder a los miembros de la clase padre desde una clase hija. En la versión de Harbour de Xailer 3.0 y posteriores, esta palabra clave fue eliminada, y en su lugar hay que utilizar el miembro ''::Super'' de la clase.
  
  
Línea 60: Línea 76:
  
  
-  * Sustituir ''TTOS()'' por ''HB_TTOS()''. Se detecta al compilar.+  * Algunas funciones de fecha tienen el prefijo ''hb_'' en Harbour. Estas funciones son las siguientes: ''DateTime()''''Hour()'', ''Minute()'', ''TToS()'', ''SToT()'', ''TToC()'' y ''CToT()''. Sólo hay que añadir el prefijo ''hb_'' delante del nombre de la función. Se detecta al enlazar.
  
  
-  * Sustituir ''CTOT()'' por ''HB_CTOT()''Se detecta al compilar.+  * No se pueden utilizar índices negativos en los arrays. Hay que utilizar ''ATailarray )'' ''array[ Lenarray ]''En xHarbour se podían utilizar índices negativos en los arrays, lo que permitía acceder a elementos de la cola de dicho array. P.ej, ''aData[ -1 ]'' devolvía el último elemento del array. En Harbour no existe esta posibilidad, y no hay más remedio que utilizar ''ATail()'', que devuelve el último elemento del array, o calcular el índice basándonos en la longitud del array. No se detecta al compilar, pero sí al ejecutar el programa. 
 +<note>Puede buscar dentro de un proyecto cualquier expresión que contenga un signo menos (-) dentro de unos corchetes con esta expresión regular: ''%%\[[^\]]*-[^\[]*\]%%''
  
- +Con esto, obtendrá todos los posibles casos conflictivosLógicamente saldrán más casos, que no son incorrectos, pero ya deberá discriminarlos manualmente.</note>
-  * No se pueden utilizar índices negativos en los arraysHay que utilizar ''ATail( array )'' o ''array[ Len( array ) ]''. En xHarbour se podían utilizar índices negativos en los arrayslo que permitía acceder a elementos de la cola de dicho array. P.ej, ''aData[ -1 ]'' devolvía el último elemento del array. En Harbour no existe esta posibilidad, y no hay más remedio que utilizar ''ATail()'', que devuelve el último elemento del array, o calcular el índice basándonos en la longitud del array. No se detecta al compilar, pero sí al ejecutar el programa.+
  
  
Línea 79: Línea 95:
   * El ámbito ''PRIVATE'' en las clases funciona de forma completamente distinta en Harbour que en xHarbour. En ambos casos, este ámbito significa que ese miembro de la clase sólo puede ser accedido desde un método de la propia clase, y no desde fuera de la misma ni desde una clase hija. Pero además en Harbour, si se sobrecarga un miembro ''PRIVATE'' (es decir, se vuelve a declarar en una clase hija), se crea un nuevo miembro con el mismo nombre, pero en todo lo demás es completamente distinto al de su clase padre. Esto implica que cuando la clase padre cambia el valor de una propiedad ''PRIVATE'', la clase hija no ve ese valor. Y lo mismo ocurre si la clase hija lo cambia. A todos los efectos son dos propiedades distintas, que no pueden ser accedidas desde fuera de la propia clase, aunque tengan el mismo nombre en la clase padre y en la clase hija. Esto no era así en xHarbour, que cuando se sobrecargaba una propiedad ''PRIVATE'' en una clase hija, se podía acceder a su valor tanto desde la clase padre como desde la hija.   * El ámbito ''PRIVATE'' en las clases funciona de forma completamente distinta en Harbour que en xHarbour. En ambos casos, este ámbito significa que ese miembro de la clase sólo puede ser accedido desde un método de la propia clase, y no desde fuera de la misma ni desde una clase hija. Pero además en Harbour, si se sobrecarga un miembro ''PRIVATE'' (es decir, se vuelve a declarar en una clase hija), se crea un nuevo miembro con el mismo nombre, pero en todo lo demás es completamente distinto al de su clase padre. Esto implica que cuando la clase padre cambia el valor de una propiedad ''PRIVATE'', la clase hija no ve ese valor. Y lo mismo ocurre si la clase hija lo cambia. A todos los efectos son dos propiedades distintas, que no pueden ser accedidas desde fuera de la propia clase, aunque tengan el mismo nombre en la clase padre y en la clase hija. Esto no era así en xHarbour, que cuando se sobrecargaba una propiedad ''PRIVATE'' en una clase hija, se podía acceder a su valor tanto desde la clase padre como desde la hija.
  
 +  * La función ''ErrorNew()'' que crea un objeto ''Error'' en xHarbour admite muchos parámetros para indicar el tipo de error: ''cSubsystem'', ''nGenCode'', ''cOperation'', ''cDescription'', ''aArgs'', ''ModuleName'', ''cProcName'' y ''nProcLine''. Sin embargo en Harbour al igual que en CA-Clipper dicha función no recibe ningún parámetro. Por lo tanto, en Harbour el objeto ''Error'' creado con ''ErrorNew()'' se creará vacío de contenido. Lo más sencillo es crear una función ''MyErrorNew()'' que reciba los parámetros que usaba la versión de xHarbour y que esta se encargue de llamar a ''ErrorNew()'' y luego establecer el valor de sus miembros. No se detecta al compilar, y tampoco se produce ningún error al ejecutar el programa, pero produce objetos ''Error'' inusables.
 + 
  
 ===== A nivel C ===== ===== A nivel C =====
Línea 97: Línea 115:
  
  
-  * No existe ''hb_rectAdopt()'', hay que cambiarla por ''hb_retc_buffer()''. Se detecta al compilar.+  * No existe ''hb_retcAdopt()'', hay que cambiarla por ''hb_retc_buffer()''. Se detecta al compilar. 
 + 
 + 
 +  * No existen ''hb_retclenAdopt()'' ni ''hb_retclenAdoptRaw()'', hay que cambiarlas por ''hb_retclen_buffer()''. Hay que tener en cuenta que ''hb_retclen_buffer()'' añade un ''chr(0)'' extra al final del buffer, por lo que el buffer tiene que ser un byte más grande de lo que realmente se necesite. Se detecta al compilar.
  
  
Línea 109: Línea 130:
  
  
-===== Dentro de Xailer =====+  * No se puede utilizar ''XA_ObjSend()'' para asignar una propiedad con el valor ''Nil''. En su lugar hay que utilizar la nueva función ''XA_ObjSendNil()''.
  
-  * Es necesario enlazar el módulo //classes.c// modificado para que funcione la ampliación del motor de objetos de Xailer. La modificación consiste solamente en la adición de la función ''hb_objGetPClass()'', que devuelve la estructura ''PCLASS'' correspondiente al objeto tratado, y se encuentra al final de dicho módulo. 
  
 +  * Las macros ''ISNIL()'', ''ISNUM()'', ''ISCHARACTER()'', etc., han sido renombradas. En su lugar hay que utilizar los mismos nombres con el prefijo ''HB_'' (p.ej. ''HB_ISNIL()'', ''HB_ISNUM()'', etc.). Se detecta al compilar.
 +
 +
 +===== Dentro de Xailer =====
 +
 +  * Es necesario utilizar la //distro// de Harbour proporcionada por Xailer, debido a una modificación necesaria en el módulo //classes.c// para poder aplicar la ampliación del motor de objetos de Xailer. La modificación consiste solamente en la adición de dos pequeñas funciones al final de dicho módulo.
 +  <note>ACTUALIZACIÓN: Esto sólo se aplica a Xailer 2.7. En Xailer 3.0 ya no es necesario, y se puede utilizar cualquier versión //nightly-build// de Harbour, aunque lógicamente sólo se dará soporte a la versión de Harbour que publica oficialmente Xailer en su área de descargas.</note>
  
-  * Ahora, los eventos se guardan en una ''DATA'' interna con ámbito ''PROTECTED'' y con el mismo nombre del evento con una //F// delante, al igual que siempre se han guardado los valores reales de las propiedades. El contenido real de dicha ''DATA'' no se puede utilizar ni asignar de ninguna forma, puesto que representa punteros de memoria, y su manipulación sólo puede provocar GPFs. P.ej., el evento ''OnClick'', se guarda en la ''DATA'' interna ''FOnClick'' de ámbito ''PROTECTED''. A efectos prácticos, en lo único que afecta es en evitar nombrar a algún miembro de una clase con el mismo nombre de un evento con una F delante.+  * Ahora, los eventos se guardan en una ''DATA'' interna con ámbito ''PROTECTED'' y con el mismo nombre del evento con una //F// delante, al igual que siempre se han guardado los valores reales de las propiedades. El contenido real de dicha ''DATA'' no se puede utilizar ni asignar de ninguna forma, puesto que representa punteros de memoria, y su manipulación sólo puede provocar GPFs. P.ej., el evento ''OnClick'', se guarda en la ''DATA'' interna ''FOnClick'' de ámbito ''PROTECTED''. A efectos prácticos, en lo único que afecta es en que hay que evitar nombrar a algún miembro de una clase con el mismo nombre de un evento con una F delante.
  
  
Línea 126: Línea 153:
   * ''SetKey'' es una palabra reservada. Ha habido que cambiar el nombre del método ''SetKey'' de ''THotkey'' por ''SetHotKey''. No se detecta al compilar, pero provoca cambios de comportamiento.   * ''SetKey'' es una palabra reservada. Ha habido que cambiar el nombre del método ''SetKey'' de ''THotkey'' por ''SetHotKey''. No se detecta al compilar, pero provoca cambios de comportamiento.
  
 +  * Si utiliza el compilador **MinGW** tenga en cuenta que la sintaxis de nombre de librerías y módulos compilados cambia completamente. en el caso de las librerías sus extensión ha de ser "**.a**" pero además el nombre ha de comenzar necesariamente con el texto "**lib**". La extensión de los módulos compilados ya no es "**obj**", sino "**o**".
migrar.de.xharbour.a.harbour.1345454971.txt.gz · Última modificación: 2022/02/07 17:03 (editor externo)

Herramientas de la página