Ver Mensaje Individual
  #8  
Antiguo 13-03-2014
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Reputación: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Hola gatosoft, es un gusto leer tu aportación. Encuentro interesantes esas incidencias, afortunadamente no son secciones críticas de la biblioteca, pero hay que resolverlas:

Cita:
Empezado por gatosoft Ver Mensaje
en GHFVCL:
Código Delphi [-]
  Function ghMasterLink (Const ADataSet :TDataSet) :TMasterDataLink;
...
          If (TDataLink (DataLinks [i]) Is TMasterDataLink) And
          (TMasterDataLinkAccess (DataLinks [i]).GetDetailDataSet =
          ADataSet) Then
          Begin
            // DataSet's master data link found
            Result := DataLinks [i]; ///E2010 Incompatible types: 'TMasterDataLink' and 'TDataLink'
Ahora no puedo comprobarlo, pero este error de compilación sugiere que Embarcadero cambió la propiedad protegida TDataSource.DataLinks de una simple lista de punteros TList a una lista expresamente de objetos TDataLink (lo cual me parece bien). Con ello, el molde de tipo "TDataLink (DataLinks [i])" del If ya no debería ser necesario, siendo en cambio necesario el molde de tipo "TMasterDataLink (DataLinks [i])" en la asignación a Result. Así deberá compilar esa función en XE4:
Código Delphi [-]
          If (DataLinks [i] Is TMasterDataLink) And
          (TMasterDataLinkAccess (DataLinks [i]).GetDetailDataSet =
          ADataSet) Then
          Begin
            // DataSet's master data link found
            Result := TMasterDataLink (DataLinks [i]);

Respecto al error E2250 y la advertencia W1000 que se presentan, investigué un poco y encontré un par de textos en los que se habla de esta situación (al parecer es algo que vienen atravesando muchas bibliotecas al actualizarse a Delphi XE4/XE5): François Piette y Remy Lebeau.

En nuestro caso sugiero hacer lo siguiente:

Dentro de la unidad GHFRTL, ve a la cláusula Uses que se encuentra al comienzo de la sección Implementation, y agrega ahí la unidad System.ANSIStrings. Compila de nuevo y si ahora aparece el error "Ambiguous overloaded call to 'StrLen'", entonces agrega "System.ANSIStrings." en los dos lugares donde se usa la función StrLen. Es decir, hay que calificarla, pero sólo si aparece el error "Ambiguous overloaded" al compilar (por alguna razón Embarcadero dejó dos versiones de cabeceras idénticas de la función StrLen).
Código Delphi [-]
          // Usar StrLen calificada en este caso
          Result := Integer (System.ANSIStrings.StrLen (Digits)) - Exponent
Código Delphi [-]
        // Usar StrLen calificada en este caso
        If (Decimals < MaxInt) And (Integer (System.ANSIStrings.StrLen (Desc.Digits)) -
        Desc.Exponent <= Decimals) Then

Algo importante sobre las versiones

Varios colegas me han sugerido emplear directivas de compilación $IfDef...$Else...$EndIf para mantener el código de todas las ediciones (7..XE5) en un único grupo de archivos. Pero he de recalcar que no es mi deseo optar por esa vía. Sé que mantener paquetes separados para cada versión de Delphi supone un mayor esfuerzo por parte de mí y mis colaboradores en el proyecto, pero estoy convencido de que es mejor así, habrán visto que Borland y Embarcadero lo han hecho también de esta manera. La ventaja de peso es que es más fácil de administrar el código en ediciones limpias y separadas, haciendo copiar y pegar las veces que sea necesario, que trabajar sobre un único grupo de unidades repletas de directivas que, pensando en la variedad de versiones modernas de Delphi, terminarían ofuscando el código fuente, volviéndolo difícil de mantener por parte de los autores y difícil de consultar por parte de los usuarios. Es deseable que GH Freebrary llegue a ser un digno complemento de la RTL/VCL/FMX; olvidémonos de la puerta fácil de las directivas para versión.

Volviendo a las incidencias que reportas, Federico, mencionas que ocurre un error AV con el programa de ejemplo RelyTweet. Por la ubicación del error, parece que se trata de una cadena de caracteres vacía que no se espera que lo sea. ¿Podrías señalar la línea exacta del error, tu versión de Windows y, si no es molestia, el contenido de la pila de llamadas (call stack)? Esa pequeña aplicación trabaja perfectamente con XE2-Windows XP. Tal vez el problema esté en la función FoldString de la API de Windows o en mi función ghComposition.

Estaré atento a cualquier retroalimentación. Un saludo.

Al González.

P.D. Para mi documentación, me resultaría bueno conocer qué declaración tienen la propiedad TDataSource.DataLinks (Data.DB) y el tipo TFloatRec (System.SysUtils) en Delphi XE3, XE4 y XE5.
Responder Con Cita