Zeos tutorial/es

From Lazarus wiki
Jump to navigationJump to search

Deutsch (de) English (en) español (es) français (fr) português (pt) русский (ru) 中文(中国大陆)‎ (zh_CN)

Descripción

Este tutorial trata acerca de como obtener, instalar y utilizar Zeoslib con Lazarus y FPC.

El equipo de Zeos tiene su propio foro. Es el mejor sitio para obtener más información acerca de ZeosLib y para hacer/responder cuestiones sobre su utilización y reporte de errores. Podéis acceder al mismo a través de foro sobre ZeosLib..

Gracias al equipo de ZeosDBO y colaboradores por hacer posible que este paquete esté disponible también para Lazarus / FPC. Han realizado un magnífico trabajo. Si alguno de ellos quiere contribuir a documentar en más profundidad el uso de este paquete o aportar ejemplos sencillos para su uso con diferentes bases de datos ayudaría a los que estamos empezando.

Adicionalmente existe un interesante tuorial en este sitio, tiene la opción de traducción al idioma del visitante:

http://serge-girard.developpez.com/tutoriels/temp/ZeosDBO/

Obteniendo Zeos

Zeos ha sido portado a Lazarus y se puede descargar desde Sourceforge.netaunque también hay releases que pueden obtenerse fácilmente desde su SVN siguiendo los pasos siguientes:

Windows

(desarrollo anterior hasta la revision 903: svn://zeos.firmos.at/zeos/trunk )

Linux/BSD

Instalando los componentes

Esta es una parte complicada por lo que debes tener un poco de paciencia y leer este apartado cuidadosamente.

  • Comprueba que tienes al menos la versión 1.0.4 de Lazarus (diciembre 2012) y al menos la versión 7.0.3 estable de ZeosLib.
  • Comenzar una instancia de Lazarus.
  1. Pulsar en Paquete/Abrir archivo de paquete (.lpk) desde el menú principal.
  2. Ve a .\ZEOSDBO-7.0.3-stable\packages\lazarus y abre zcomponent.lpk
  3. Presiona [Compilar] solamente si no necesitas instalar los componentes en el IDE.
  4. Presiona [Usar >>] para ver las opciones que ofrece.
  5. Selecciona Agregar al Proyecto si no quieres añadirlo al IDE o bien Instalar para que se añada a la solapa del IDE de Lazarus
  6. Pregunta si necesitas recompilar Lazarus, en concreto con el mensaje emergente El paquete "zcomponent 7.0" se marcó para instalar. Actualmente lazarus solo soporta paquetes enlazados estáticamente. La instalación completa necesita reconstruir y reiniciar Lazarus ¿Desea reconstruir ahora Lazarus?
  • Responde [Si] esta vez.
  • Espera a que la compilación termine, la ventana emergente de mensajes nos va mostrando la evolución del proceso, Lazarus debería reiniciarse después de esto.
  • Si todo está bien se debería ver la solapa [Zeos Access] en la paleta de componentes.
Zeos Components.png


Si se presenta el error "Cannot find unit ZClasses" o algo similar, entonces hay que chequear cuidadósamente como están escritos los nombres de fichero (en cuanto a mayúsculas/minúsculas) en sus ficheros de código fuente.

  • Incluso si cuadran exactamente, el paquete autogenerado del fichero fuente puede dar lugar a un tipificado incorrecto (mayúsculas/minúsculas) en la claúsula "uses" (Lazarus 0.9.18), i.e.:

Si lo anterior falla, tal como se explica en el foro de ZeosLib es conveniente ir compilando cada uno de los paquetes siguiendo el siguiente orden:

  - 1º. zcore.lpk
  - 2º. zparsesql.lpk
  - 3º. zplain.lpk
  - 4º. zdbc.lpk
  - 5º. zcomponent.lpk 

Si el resultado de la compilación individual de todos es correcto, entonces ya estaríamos en condiciones de escoger el paquete Zcomponent y con la opción de Usar >>> y a continuación Instalar tenerlo en nuestro IDE como una solapa más de componentes visuales.

  
  { Este fichero ha sido generado automáticamente por Lazarus. ¡No se debe editar!
    Esta fuente solo se utiliza para compilar e instalar el paquete.
  }
  unit Zcore; 
  interface
  uses
    Zclasses, Zcollections, Zcompatibility, Zexprparser, Zexprtoken, Zexpression, 
    Zfunctions, Zmatchpattern, Zmessages, Zsysutils, Ztokenizer, Zvariables, 
    Zvariant; 
  implementation
  end.
  • Fíjate que Lazarus ha renombrado la unit ZClasses como Zclasses, dando lugar a un conflicto de nombres. Presumiblemente este es un error en Lazarus, no de los paquetes Zeos. Un camino a seguir para solucionarlo es renombrar todos los ficheros fuente de Zeos a minúsculas. Accede a cada subdirectorio bajo src/ y ejecuta este mandato en una ventana de bash (shell) de windows:
 rename -v 'y/A-Z/a-z/' *
  • Entonces, en Lazarus, reabre el paquete (.lpk) y corrige el nombre de fichero (mayúsculas/minúsculas) seleccionando en "More..."/"Fix Files Case"
  • El paquete debería poderse compilar entonces.


Descripción de la paleta de componentes ZeosDBO

La descripción detallada de cada uno de los componentes de la paleta es:


PaletaComponentesZeos.png


Componente TZConnection (ZConnection):

Componente TZConnection (ZConnection) ===>Componente TZConnection (ZConnection):


Nos va a permitir conectar con la base de datos (BBDD). Tiene una serie de propiedades (disponibles también en el inspector de objetos) como son:


  • AutoCommit: boolean (true/false).
  • AutoEncodeStrings: boolean (true/false).
  • Catalog: ejemplo public
  • ClientCodepage: ejemplo Spanish_Spain.1252
  • Connected ( * ): boolean (true/false), si establecemos su valor a true podremos ver en tiempo de diseño si la conexión es aceptada, caso contrario nos volverá a establecer automáticamente false.
  • ControlsCodePage:
  • cCP_UTF16
  • cCP_UTF8
  • cGET_ACP
  • Database: aquí especificamos el nombre de la base de datos a la cual queremos conectar y que contendrá una o más tablas. Atención que si utilizamos SQLite, si la BBDD no existe, la crea.
  • DesignConnection: boolean (true/false), establecemos su valor a true en caso de que queramos tener activa la conexión en tiempo de diseño de forma que se autorellenen los controles de bases de datos que situemos en el formulario.
  • HostName ( * ): es el nombre del equipo que contiene la(s) base(s) de datos a las que deseamos conectar. Pueden encontrarse en una ubicación local con lo que podríamos poner localhost o bien 127.0.0.1, pero también en una ubicación en red local o incluso en internet, siendo por ejemplo para una red local 192.168.1.12. En el caso de resolver mediante resolución de nombre DNS también valdría el nombre del equipo.
  • LibraryLocation: aquí especificamos la ubicación de los ficheros librería que vamos a necesitar para el caso concreto del protocolo que escojamos. Por ejemplo si en protocolo escogemos postgresql-9 y nuestro programa lo tenemos en C:\test\ entonces como valor de LibraryLocation podríamos poner C:\test\libpq.dll. Para Linux la librería podría ser libpq.o e igualmente la situariamos en la carpeta de nuestro programa por ejemplo /opt/test/libpq.so. En Linux hay que tener en cuenta que quizá necesitemos establecer un enlace simbólico dado que la libería la podemos encontrar con el nombre adaptado a la versión de PostgreSQL para que el genérico libpq enlace a la versión instalada (Linux utiliza ampliamente el nombre del fichero para especificar las versiones del fichero independientemente que en algunos casos el formato interno también pueda contener información del formato, ver por ejemplo mandato readelf de Linux). Estas liberías (puede que necesitemos para nuestro programa otras adicionales) las podemos coger de la instalación de PostgreSQL (C:\Archivos de programa\PostgreSQL\9.x\bin) para otras bases de datos habrá que mirar donde se encuentran. En el caso de Windows también podemos ubicar esta libería en c:\windows\system32 o bien c:\windows\syswow64. Y luego decidir si se registra también o no.
  • LoginPromt: boolean (true/false). En caso de valer true debería presentarnos un cuadro de solicitud de login.
  • Name ( * ): simplemente nos deja establecer el nombre personalizado del componente de forma que es la referencia que vamos a utilizar en nuestro programa.
  • Password ( * ): aquí especificamos la palabra de paso o contraseña. Durante el periodo de diseño también la podemos rellenar en el inspector de objetos o bien en tiempo de ejecución del programa.
  • Port: es el número de puerto que se utiliza junto a HostName para identificar de forma inequívoca el equipo con el que queremos conectar. Para el caso de PostgreSQL sería por ejemplo el 5432 o 3306 para MariaDB..... Para cada tipo de base de datos suele haber uno característico aunque en la configuración se puede cambiar (Para cada tipo de base de datos es conveniente revisar la documentación para ver las que soporta).
  • Properties: algunas propiedades para la conexión a la base de datos (para cada tipo de base de datos es conveniente revisar la documentación para ver las que soporta), por ejemplo:
  • AutoEncodeStrings=ON
  • codepage=Spanish_Spain.1252
  • Protocol ( * ):
  • ASA: ASA12 / ASA7 / ASA8 / ASA9
  • firebird-x.x: firebird-1.0 / firebird-1.5 / firebird-2.0 / firebird-2.1 / firebird-2.5
  • firebirdd-x.x: firebirdd-1.5 / firebirdd-2.0 / firebirdd-2.1 / firebirdd-2.5
  • FreeTDS_MsSQL: FreeTDS_MsSQL<=6.5 / FreeTDS_MsSQL>=2005 / FreeTDS_MsSQL-2000 / FreeTDS_MsSQL-7
  • FreeTDS_Sybase: FreeTDS_Sybase<10 / FreeTDS_Sybase-10+
  • interbase-6
  • MariaDB-5
  • mssql
  • mysql: mysql / mysql-4.1 / mysql-5 / mysqld-4.1 / mysqld-5
  • oracle
  • oracle-9i
  • pooled.*
  • postgresql: postgresql / postgresql-7 / postgresql-8 / postgresql-9
  • sqlite: sqlite / sqlite-3
  • sybase
  • ReadOnly: boolean (true/false). Permite especificar si nuestra conexión va a ser de solo lectura (valor a true) o de lectura/escritura (valor a false).
  • SQLHourGlass: boolean (true/false). En caso de establecer su valor a true, entonces nos mostrará un reloj de arena mientras se espera que termine algún proceso SQL en curso.
  • Tag: etiqueta que en el inspector de objetos nos la pone predeterminada a 0.
  • TransactIsolationLevel: permite definir el nivel de aislamiento de las transacciones que se realicen:
  • tiNone
  • tiReadCommitted
  • tiReadUnCommitted
  • tiRepeatableRead
  • tiSerializable
  • UseMetaData: boolean (true/false). Permite especificar si se utilizan o no metadatos.
  • User ( * ): el nombre de usuario que utilizaremos para conectar a la base de datos seleccionada para esta conexión. Dado que permite establecer múltiples conexiones podríamos conectarnos con otro nombre de usuario y a otra base de datos distinta al mismo tiempo utilizando otro componente ZConnection.
  • Version: nos muestra la versión de Zeos DBO que estemos utilizando. A modo de ejemplo nos podría mostrar 7.1.4-stable.

Componente TZReadOnlyQuery (ZDataSet)

Componente TZReadOnlyQuery (ZDataSet) ===> Componente TZReadOnlyQuery (ZDataSet)

Nos va a permitir realizar una consulta (query) en modo solo lectura. Tiene una serie de propiedades (disponibles también en el inspector de objetos) como son:

  • Active: boolean ('true/false).
  • AutoCalcFields: Por defecto establecido a true.
  • Connection: lo vinculamos a un componente connection de los que tengamos disponibles.
  • DataSource:
  • FetchRow: por defecto a 0.
  • Filter: define la cadena de filtrado que deseamos establecer aplicada a la información retornada en la consulta.
  • Filtered: boolean (true/false). Por defecto establecido a false. Filtrado habilitado si true.
  • IndexFieldNames:
  • IsUniDirectional: por defecto a false.
  • LinkedFields:
  • MasterFields:
  • MasterSource:
  • Name: aquí podemos cambiar el nombre del componente que por defecto es ZReadOnlyQuery1.
  • Options:
doAlwaysDetailResync: boolean (true/false).
doCalcDefaults: boolean (true/false).
donDontSortOnPost: boolean (true/false).
doOemTraslate: boolean (true/false).
doPreferPrepared: boolean (true/false).
doSmartOpen: boolean (true/false).
doUpdateMasterFirst: boolean (true/false).
  • ParamCheck: boolean (true/false). Por defecto establecido a true.
  • Params: parámetros adicionales para realizar la consulta. Si no se añade ninguno aparece como 0 items.
  • Properties: propiedades (del tipo TStrings).
  • ShortedFields: Campos para ordenación, permite seleccionar (si tenemos conexión establecida en tiempo de ejecución y la query activa) del listado de campos disponibles.
  • ShortType: tipo de ordenación, podemos escoger entre:
stAscending: orden ascendente.
stDescending: orden descendente.
stIgnored: se ignora el orden.
  • SQL : aquí podemos definir la(s) sentencias de consulta (querys) que se adapten a nuestras necesidades. A modo de ejemplo podemos poner SELECT * FROM tabla que nos seleccionará todo el contenido de la tabla tabla (cambiar por el nombre de la tabla que cada uno tenga creada) de la base de datos a la que estemos conectados. Se puede establecer perfectamente mediante código de forma que cambie según nuestras necesidades.
  • Tag: etiqueta establecida por defecto a 0.

Componente TZQuery (ZDataSet)

Componente TZQuery ===> Componente TZQuery (ZDataSet)

Nos va a permitir realizar una consulta (query) en modo lectura-escritura. Tiene una serie de propiedades (disponibles también en el inspector de objetos) como son:

  • Ative ( * ): boolean (true/false).
  • AutoCalcFields:
  • CachedUpdates:
  • Connection ( * ): lo vinculamos a algún componente ZConnection, por ejemplo ZConnection1, eso ya según el nombre que le pongamos que es modificable.
  • DataSource:
  • FetchRow:
  • Filter: define la cadena de filtrado que deseamos establecer aplicada a la información retornada en la consulta.
  • Filtered: boolean (true/false). Por defecto establecido a false. Filtrado habilitado si true.
  • IndexFieldNames:
  • LinkedFields:
  • MasterFields:
  • MasterSource:
  • Name: aquí podemos cambiar el nombre del componente que por defecto es ZQuery1.
  • Options:
doAlwaysDetailResync: boolean (true/false).
doCalcDefaults: boolean (true/false).
donDontSortOnPost: boolean (true/false).
doOemTraslate: boolean (true/false).
doPreferPrepared: boolean (true/false).
doSmartOpen: boolean (true/false).
doUpdateMasterFirst: boolean (true/false).
  • ParamChar: por defecto viene establecido a :
  • ParamCheck: boolean (true/false).
  • Params: parámetros adicionales para realizar la consulta. Si no se añade ninguno aparece como 0 items.
  • Properties:
  • ReadOnly: boolean (true/false). Por defecto establecido a false.
  • Secuence:
  • SecuenceField: campo para Secuence, permite seleccionar (si tenemos conexión establecida en tiempo de ejecución y la query activa) del listado de campos disponibles.
  • ShowRecordTypes: puede tener los siguientes valores que se mostrarán u ocultarán dependiendo de si se establecen a true o false, por defecto muestra estos: [usUnmodified,usModified,usInserted]
usDeleted: boolean (true/false).
usInserted: boolean (true/false).
usModified: boolean (true/false).
usUnmodified: boolean (true/false).
  • ShortedFields: Campos para ordenación, permite seleccionar (si tenemos conexión establecida en tiempo de ejecución y la query activa) del listado de campos disponibles.
  • ShortType: tipo de ordenación, podemos escoger entre:
stAscending: orden ascendente.
stDescending: orden descendente.
stIgnored: se ignora el orden.
  • SQL ( * ): aquí podemos definir la(s) sentencias de consulta (querys) que se adapten a nuestras necesidades. A modo de ejemplo podemos poner SELECT * FROM tabla que nos seleccionará todo el contenido de la tabla tabla (cambiar por el nombre de la tabla que cada uno tenga creada) de la base de datos a la que estemos conectados. Se puede establecer perfectamente mediante código de forma que cambie según nuestras necesidades.
  • Tag: etiqueta establecida por defecto a 0.
  • UpdateMode: modo de actualización, puede tomar los siguientes valores:
umUpdateChanged: modo de actualización únicamente del contenido modificado.
umUpdateAll: modo de actualización de todo el contenido.
  • UpdateObject:
  • WhereMode:
wmWhereKeyOnly
wmWhereAll

Componente TZTable (ZDataSEt)

Componente TZTable ===> Componente TZTable (ZDataSEt)

  • Active: boolean (true/false). Para activar/desativar la tabla. Por defecto establecido a false.
  • AutoCalcFields: boolean (true/false). Permite autocalcular los campos. Por defecto establecido a true.
  • CachedUpdates: boolean (true/false). Por defecto establecido a false.
  • Connection: Permite escoger entre la(s) conexiones disponibles para nuestra tabla.
  • FetchRow: por defecto a 0.
  • Filter:
  • Filtered: Por defecto establecido a false.
  • IndexFieldNames:
  • LinkedFields:
  • MasterFields:
  • MasterSource:
  • Name: Permite definir el nombre para este componente, por defecto se asigna ZTable1 para el primer componente de este tipo.
  • Options:
doAlwaysDetailResync: boolean (true/false). Por defecto establecido a false.
doCalcDefaults: boolean (true/false). Por defecto establecido a true.
doDontSortOnPost: boolean (true/false). Por defecto establecido a false.
doOemTranslate: boolean (true/false). Por defecto establecido a false.
doPreferPrepared: boolean (true/false). Por defecto establecido a false.
doSmartOpen: boolean (true/false). Por defecto establecido a false.
doUpdateMasterFirst: boolean (true/false). Por defecto establecido a false.
  • Properties: cadenas para especificar propiedades (TStrings).
  • ReadOnly: boolean (true/false). Por deecto establecido a false.
  • Secuence:
  • SecuenceField:
  • ShowRecordTypes: permite mostrar los tipos de registro de acuerdo a sus posibles [usUnmodified,usModified,usInserted].
  • SortedFields: Campos ordenados, en el desplegable nos muestra los campos disponibles en la tabla seleccionada.
  • ShortType: tipo de ordenación, para ello disponemos de tres posibilidades stAscending, stDescending, stIgnored.
  • TableName: establecemos su valor con el nombre de la tabla con la que deseamos trabajar dentro de la base de datos que estemos utilizando.
  • Tag: Etiqueta, establecida por defecto a 0.
  • UpdateMode: modo de actualización, dispone de dos modalidades:
umUpdateChanged.
umUpdateAll.
  • UpdateObject:
  • WhereMode: dispone de dos modalidades:
wmWhereKeyOnly.
wmWhereAll.


Componente TZUpdateSQL ===> Componente TZUpdateSQL (ZSqlUpdate)

Componente TZConnectionGroup ===> Componente TZConnectionGroup (ZConnectionGroup)

Componente TZGroupedConnection ===> Componente TZGroupedConnection (ZGroupedConnection)

Componente TZStoredProc ===> Componente TZStoredProc (ZStoredProcedure)

Componente TZSQLMetadata ===> Componente TZSQLMetadata (ZSqlMetadata)

Componente TZSQLProcessor ===> Componente TZSQLProcessor (ZSqlProcessor)

Componente TZSQLMonitor ===> Componente TZSQLMonitor (ZSQLMonitor)

Componente TZSecuence ===> Componente TZSecuence (ZSecuence)

Componente TZIBEventAlerter ===> Componente TZIBEventAlerter (ZIBEventAlerter)

Componente TZPgEventAlerter ===> Componente TZPgEventAlerter (ZPgEventAlerter)

Las entradas añadidas aquí sobre componentes de ZeosDBO son para animar a otros a completar la explicación sobre los mismos, no soy un experto y hay componentes de los cuales no tengo conocimiento sobre su uso. Las pruebas que he realizado son utilizando Lazarus 1.4.0 y PostgreSQL 9.2 en local y me ha permitido establecer conexiones con BBDD y sus correspondientes tablas de una manera fluida incluyendo tipos BLOB definidos en la parte de postgres como bytea, sin problemas. Animo a que gente con más conocimiento complete las entradas. Por mi parte en la medida que tenga tiempo y vaya aprendiendo más trataré de plasmarlo aquí.

Comentarios

En el momento actual Zeos CVS para Lazarus tiene paquetes rotos. Algunos comentarios de IgD:

Utilizando una instalación limpia de Lazarus 0.9.12 (última versión estable) fuí capaz de instalar ZeosLib (13 Octubre 2005). Primero corrige los siguientes errores en ZeosLib:

  • 1. Cambia ZplainPostgreSql81.pas a ZPlainPostgresSql8x.pas en zplain.lpk
<Item22>
  <Filename Value="../../src/plain/ZPlainPostgreSql81.pas"/>
  <UnitName Value="ZPlainPostgreSql8x"/>
</Item22>

  • 2. Fix the following typos in zdbc.lpk:

a. Remove extra "/" from "build/" (remove the one that is inside the quotes)

<SearchPaths>
  <OtherUnitFiles Value="../../src/dbc/"/>
  <UnitOutputDirectory Value="build/"/>
</SearchPaths>

b. Add missing quote to unitname value

<Item43>
  <Filename Value="../../src/dbc/ZDbcASA.pas"/>
  <UnitName Value="ZDbcASA/>
</Item43>

Ahora, aquí están las instrucciones de instalación:

Antes de la versión 0.9.13 de Lazarus era necesario abrir cada uno de los paquetes de Zeos a través de Paquetes/Abrir Paquete en el siguiente orden:

  1. zcore.lpk
  2. zparsesql.lpk
  3. zplain.lpk
  4. zdbc.lpk

Entonces finalmente abre zcomponent.lpk para compilarlo e instalarlo. En Lazarus 0.9.13 > solamente puede abrir zcomponent.lpk. El IDE abrirá el resto automáticamente.

Nota: los cuatro primeros paquetes solamente necesitan ser compilados y no pueden ser instalados.

--Forest 17:41, 2 Nov 2005 (CET)

  • 3. Si compilas e instalas Lazarus con éxito, pero después de compilarse, comienza con:


Zeoserror.gif


Entonces se puede hacer:

Dentro del fichero Zeos.Inc reemplazar, en la sección "// Settings for Debug mode": {$R-} a {$R+}

--Junior 19:48, 15 Apr 2006 (GMT)

Si aún así después de mostrar un error no recuperable que permita arrancar Lazarus, nos queda la alternativa de buscar el fichero ejecutable tal como estaba antes de compilar todo y que figura como lazarus.old.exe

Hacer la primera aplicación Zeos

Las propiedades elementales necesarias para una aplicación simple funcional que se describen aquí se han marcado como referencia en los componentes de arriba como ( * ) para que esté más claro.

  • Sitúa un componente ZConnection en el formulario.
    • Establecer las propiedades de User, Password, Host, Port y Protocol (y cualquier otro parámetro que se necesite).
    • Establecer la propiedad "Set Connected" con el valor True.
  • Sitúa un componente ZQuery en el formulario (cuidado con confundirlo con ZReadOnlyQuery).
    • Establecer la propiedad "Connection" al valor de ZConnection activo.
    • Establecer la propiedad Sql a algo similar a SELECT * FROM MyTable (selecciona todo el contenido de la tabla especificada de la base de datos que se haya abierto previamente, es una sentencia SQL).
    • Establecer la propiedad "ACTIVE" al valor True.
  • Sitúa un componente DataSource de la solapa [Data Access].
    • Establecer la propiedad "DataSet" con valor igual a la ZQuery activa.
  • Sitúa un componente DBGrid de la solapa [Data Controls].
    • Establece el parámetro Datasource con el valor DataSource.
    • Si todo está bien se deberían ver los registros rellenos con datos en la tabla.

Más información sobre como trabajar con Zeos

En los siguientes enlaces se pueden encontrar artículos realmente útiles explicando el uso de Zeos y su uso interno, alguno de los cuales además tratan además sobre materias específicas de Delphi pero que pueden ser utilizadas con Lazarus también.



Por favor completar esto :)

Posibles fallos e incidencias

  • He notado que en algunas ocasiones cuando se construye Lazarus no es capaz de encontrar algunos ficheros de Zeos, como un método rápido puedes probar esto:
    • Use Components/Package Graph from the main menu.
    • Abre el paquete ZComponent.
    • Right Click on the Files item in the list.
    • Selecciona [Recompile all required].
    • Cuando pregunte "Re-Compile this and all required packages?" responder [Yes].
    • Recompila Lazarus normalmente (con paquetes).

  • Hay un error en FPC's AnsiStrComp que causa comparación no fiable PChar, esto es obvio cuando se utiliza DBGrid para editar datos, AnsiStrComp('abc', 'abcd') no puede detectarlo ya que son diferentes pero detecta AnsiStrComp('abd', 'abcd') ignorando múltiples caracteres de la segunda cadena. Este error fue encontrado por Jesusrmx. Este error probablemente será subsanado pronto, ver Bug Report.

-    function QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} IID: TGUID; out Obj): HResult; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; virtual;                                                      
-    function _AddRef: Integer; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};                                                                                                                                                 
-    function _Release: Integer; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};                                                                                                                                                
+    function QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} IID: TGUID; out Obj): HResult; {$IF (not defined(WINDOWS)) AND (FPC_FULLVERSION>=20501)}cdecl{$ELSE}stdcall{$IFEND}; virtual;
+    function _AddRef: Integer; {$IF (not defined(WINDOWS)) AND (FPC_FULLVERSION>=20501)}cdecl{$ELSE}stdcall{$IFEND};
+    function _Release: Integer; {$IF (not defined(WINDOWS)) AND (FPC_FULLVERSION>=20501)}cdecl{$ELSE}stdcall{$IFEND};
  public
    constructor Create(const Controller: IInterface);
    property Controller: IInterface read GetController;
@@ -89,7 +93,8 @@
  TContainedObject = class(TAggregatedObject, IInterface)
  protected
-    function QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} IID: TGUID; out Obj): HResult; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; override;
+    function QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} IID: TGUID; out Obj): HResult; {$IF (not defined(WINDOWS)) AND (FPC_FULLVERSION>=20501)}cdecl{$ELSE}stdcall{$IFEND}; override;
  end;
  {$ENDIF}
@@ -221,7 +226,8 @@
  Result := IInterface(FController)._AddRef;
end;
-function TAggregatedObject._Release: Integer; {$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
+function TAggregatedObject._Release: Integer; {$IF (not defined(WINDOWS)) AND (FPC_FULLVERSION>=20501)}cdecl{$ELSE}stdcall{$IFEND};


  • [Ya arreglado en trunk 1013] Tratando de compilar la revisión 903 of ZeosDBO trunk en GNU/Linux con FPC 2.6.0 o superior, da el siguiente error en ZAbstractRODataset.pas: "Error: Expected another 2 array elements". El problema es que FPC2_1UP no está definido porque el archivo src/Zeos.inc no verifica las versiones nuevas. Si estamos usando solo versiones nuevas de FPC (2.6, 2.7 o superiores) podemos modificar src/Zeos.inc agregando las lineas siguientes justo antes de {$IFDEF VER2_5}, y el error no aparece mas.
+  {$DEFINE FPC2_5UP}
+  {$DEFINE FPC2_4UP}
+  {$DEFINE FPC2_3UP}
+  {$DEFINE FPC2_2UP}
+  {$DEFINE FPC2_1UP}
+  {$DEFINE FPC2_UP}
+
   {$IFDEF VER2_5}
     {$DEFINE FPC2_5UP}