Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-01-2019
MicrodeltaAmpos MicrodeltaAmpos is offline
Registrado
 
Registrado: ene 2019
Posts: 3
Poder: 0
MicrodeltaAmpos Va por buen camino
Fibplus y Delphi 10.2

Hola a todos

Tengo escrita una aplicación desarrollada con Delphi 2006 que accede a una base de datos Firebird 2.1.5 utilizando los componentes Fibplus 6.4.1.
Hace varios años que esta aplicación está cumpliendo estupendamente con su cometido.

Ahora bien, me han pedido compilar esta aplicación con Delphi 10.2.3 Community Edition y los componentes Fibplus 7.632.3171 Release descargados
de internet. Al ejecutar la aplicación y dar de alta o modificar registros de la BD aparece incansablemente el mensaje de error 'Access violation...'.
Ejecutando la aplicación en modo de depuración me doy cuenta que estos errores tienen su origen en el código fuente de los componentes Fibplus.

Alguien puede decirme si la versión Fibplus 7.632.3171 es compatible con Delphi 10.2.3 ? O dicho de otra forma, existe alguna versión Fibplus
compatible con Delphi 10.2.3, o hay que olvidarse de Fibplus y utilizar FireDAC ?

Gracias.
Responder Con Cita
  #2  
Antiguo 11-01-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.022
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Mira los enlaces de abajo del todo, a ver si te sirven.
Responder Con Cita
  #3  
Antiguo 14-01-2019
MicrodeltaAmpos MicrodeltaAmpos is offline
Registrado
 
Registrado: ene 2019
Posts: 3
Poder: 0
MicrodeltaAmpos Va por buen camino
He seguido los enlaces que me has pasado...hasta llegar a la web https://github.com/madorin/fibplus.
Ese grupo de voluntarios que se ha propuesto mantener vivos a los Fibplus está realizando una gran labor sobretodo por la gran dificultad que representa tener que adaptar código fuente escrito por otros.
Por lo que entiendo estas versiones de Fibplus no son del todo seguras ya que siguen apareciendo mensajes de error en las aplicaciones que las usan. El compañero que me pasó la versión Fibplus que tengo instalada con Delphi 10.2 me comenta que los bajo de esta web con el distintivo D25.
Por ahora no veo seguro migrar a esta versión de FibPlus la aplicación que te comenté.

Seguiré buscando información...
Gracias por los enlaces.
Responder Con Cita
  #4  
Antiguo 28-04-2019
manelb manelb is offline
Miembro
 
Registrado: mar 2017
Posts: 280
Poder: 8
manelb Va por buen camino
Dos problemas con OnValidate

Saludos a todos…
Primero que nada, comentar que no soy un experto programador, ni mi ocupación directa sea esta, pero voy a intentar aportar mi granito de arena para ayudar a solucionar este problema.
Por lo tanto, ruego comprensión si la terminología empleada no es la más adecuada y sobre todo por la falta de rigurosidad técnica en mi exposición.

También es cierto que me ha sorprendido la poca participación en este hilo, bien porque realmente seamos pocos los usuarios de FIBs, o pocos de nosotros lo estemos intentando con las nuevas versiones de Delphi.

En referencia al problema, parece ser que realmente son dos, pero que se producen o están relacionados directamente con el evento onvalidate de TField.
Incluso el origen del problema podría ser el mismo, aunque no hemos podido llegar a esta conclusión.

Me han iluminado, entre otros, unos hilos del foro de Al González hablando sobre SetData, Validate, GetData y sobre los tipos de parámetros de algunos procedimientos que han cambiado de Pointer a TValueBuffer en las últimas versiones de Delphi.
También largas explicaciones de Casimiro sobre Unicode, que sigue costándome entender.

Como creo que me voy a extender un poco, mejor pongo cada uno de los dos problemas en mensajes separados.

Última edición por manelb fecha: 28-04-2019 a las 13:02:59.
Responder Con Cita
  #5  
Antiguo 28-04-2019
manelb manelb is offline
Miembro
 
Registrado: mar 2017
Posts: 280
Poder: 8
manelb Va por buen camino
Access Violation

El primero de ellos es un error que está registrado en la propia página de descarga de los componentes en github y que adjunta un pequeño ejemplo con base de datos incluida
https://github.com/madorin/fibplus/issues/30

El error consiste en un extraño y aleatorio “Access Violation”.
Se produce, bien al validar el campo, bien al hacer post del registro o bien al salir de la ventana.

Parece ser, por las pruebas que hemos realizado, que sucede cuando en el evento
onvalidate se utiliza el acceso al valor del campo validado usando la sentencia Sender.AsString.

En las pruebas realizadas hemos apreciado que si utilizamos Sender. AsAnsiString en lugar de Sender.AsString ya no se produce el error y de momento este apartado lo damos por solucionado.
Quiero creer que no vamos a tener ningún problema con Unicode siempre que no utilicemos otros idiomas.
Los expertos en Unicode me podríais confirmar este punto??
Responder Con Cita
  #6  
Antiguo 28-04-2019
manelb manelb is offline
Miembro
 
Registrado: mar 2017
Posts: 280
Poder: 8
manelb Va por buen camino
OnValidate para Integer devuelve 0

El segundo problema es que en el mismo evento onvalidate, los campos de tipo integer i smallint siempre devuelven 0 cuando se accede a su valor para proceder a su validación.
El siguiente evento
Código Delphi [-]
procedure TForm1.Validate(Sender: TField);
begin
  ListBoxSalida.Items.Add('Validate: '+sender.FieldName+': '+sender.AsString);
end;
conectado a campos de diferentes tipos e introduciendo siempre el valor ‘100’, devolvería el siguiente resultado:

Validate: SMALLINT: 0
Validate: INTEGER: 0
Validate: BIGINTEGER: 100
Validate: FLOAT: 100
Validate: NUMERIC: 100
Validate: CHAR_5: 100
Validate: VARCHAR_10: 100

Sobra decir que si utilizamos Firedac el resultado es el correcto, por lo que para investigar hemos tratado de comparar el comportamiento de los dos sistemas.

Parece ser que el problema se origina en el siguiente procedimiento de la unidad Data.DB debido a que la variable FValidating siempre es False cuando procede de FibPlus
Código Delphi [-]
function TIntegerField.GetValue(var Value: Longint): Boolean;
Begin
  if (FIOBuffer <> nil) and not FValidating then
    TDBBitConverter.UnsafeFrom(0, FIOBuffer);
  Result := GetData(FIOBuffer);
  if Result then
    case DataType of
      ftShortint:
        Value := TDBBitConverter.UnsafeInto(FIOBuffer);
      ftByte:
        Value := TDBBitConverter.UnsafeInto(FIOBuffer);
      ftSmallint:
        Value := TDBBitConverter.UnsafeInto(FIOBuffer);
      ftWord:
        Value := TDBBitConverter.UnsafeInto(FIOBuffer);
      ftLongWord:
        Value := TDBBitConverter.UnsafeInto(FIOBuffer);
      Else
        Value := TDBBitConverter.UnsafeInto(FIOBuffer);
      end;
end;


Investigando a quien corresponde la responsabilidad de mantener el valor de la variable FValidating nos encontramos con que en Firedac, se ejecuta el siguiente código(uno u otro en función del parámetro Buffer)
Código Delphi [-]
procedure TField.Validate(Buffer: TValueBuffer);
var
  prevBuffer: TValueBuffer;
begin
  if Assigned(OnValidate) then
  begin
    { Use the already assigned FValueBuffer if set }
    if FValueBuffer = nil then
      FValueBuffer := Buffer;
    FValueBuffer := Copy(FValueBuffer);
    prevBuffer := Copy(Buffer);
    FValidating := True;
    try
      OnValidate(Self);
    finally
      FValidating := False;
      Move(prevBuffer[0], Buffer[0], Length(Buffer));
    end;
  end;
end;

{$IFNDEF NEXTGEN}
procedure TField.Validate(Buffer: Pointer);
begin
  if Assigned(OnValidate) then
  begin
    { Use the already assigned FValueBufferPtr if set }
    if FValueBufferPtr = nil then
      FValueBufferPtr := Buffer;
    FValidating := True;
    try
      OnValidate(Self);
    finally
      FValidating := False;
    end;
  end;
end;
{$ENDIF !NEXTGEN}

Mientras que en los Fibs el trabajo equivalente lo realiza el siguiente procedimiento de la unidad FIBDataset, que no tiene en cuenta la variable FValidating, ya que utiliza un sistema diferente para controlar el estado de validación del campo
Código Delphi [-]
procedure TFIBCustomDataSet.DoFieldValidate(Field:TField;Buffer:Pointer);
begin
  if Assigned(Field.OnValidate) then
  begin
   Include(FRunState,drsInFieldValidate);
   Try
    FValidatingFieldBuffer:=Buffer;
    FValidatedField:=Field;
    FValidatedRec:= ActiveRecord;
    Field.OnValidate(Field);
   Finally
     Exclude(FRunState,drsInFieldValidate);
     FValidatingFieldBuffer:=nil;
   end;
  end;
end;


Llegados a este punto desearía conocer algunas opiniones y si os parece acertado o no el razonamiento que hemos hecho.

Soluciones???

Nosotros proponemos una pequeña modificación en TFIBCustomDataSet.DoFieldValidate de los fibs, introduciendo 3 linieas de código en el inicio del evento para que quede tal que así:
Código Delphi [-]
procedure TFIBCustomDataSet.DoFieldValidate(Field:TField;Buffer:Pointer);
begin
  if field is TIntegerField then  //lineas añadidas
    Field.Validate(Buffer)          // para solucionar problema onvalidate
  else                                             //en campos de tipo integer y smallint

  if Assigned(Field.OnValidate) then
  begin
   Include(FRunState,drsInFieldValidate);
   Try
    FValidatingFieldBuffer:=Buffer;
    FValidatedField:=Field;
    FValidatedRec:= ActiveRecord;
    Field.OnValidate(Field);
   Finally
     Exclude(FRunState,drsInFieldValidate);
     FValidatingFieldBuffer:=nil;
   end;
  end;
end;

De esta forma, el tratamiento de los campos integer lo delegamos al mismo procedimiento que usan los Firedac, y el resto de tipos de campos que no presentan error se siguen tratando igual que hasta ahora.
Que os parece??

Gracias por aguantar el rollo ….
Saludos a todos
Responder Con Cita
  #7  
Antiguo 29-04-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.022
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Gracias por compartirlo.
No he tenido oportunidad de probarlo, a ver si puedo dedicarle un poco de tiempo
Responder Con Cita
  #8  
Antiguo 30-04-2019
XusF XusF is offline
Registrado
 
Registrado: abr 2019
Posts: 2
Poder: 0
XusF Va por buen camino
Solución propuesta

Siguiendo la solución de manelb, he implementado esta versión un poco más simple. En lugar de diferenciar si el campo es TIntegerField o no, podemos hacerlo de la siguiente forma:

Código Delphi [-]
procedure TFIBCustomDataSet.DoFieldValidate(Field:TField;Buffer:Pointer);
begin
  if Assigned(Field.OnValidate) then
  begin
   Include(FRunState,drsInFieldValidate);
   try
      FValidatingFieldBuffer:=Buffer;

      FValidatedField:=Field;
      FValidatedRec:= ActiveRecord;
      Field.Validate(Buffer);

   finally
     Exclude(FRunState,drsInFieldValidate);
     FValidatingFieldBuffer:=nil;
   end;
  end;
end;

Llamamos al método Field.Validate para actualizar el estado de la variable FValidating siempre (sea o no un IntegerField) y de paso conservamos las asignaciones que hace el TFIBCustomDataSet.DoFieldValidate.
Responder Con Cita
  #9  
Antiguo 25-09-2023
Zento Zento is offline
Miembro
 
Registrado: may 2017
Posts: 12
Poder: 0
Zento Va por buen camino
Cita:
Empezado por manelb Ver Mensaje
El error consiste en un extraño y aleatorio “Access Violation”.
Se produce, bien al validar el campo, bien al hacer post del registro o bien al salir de la ventana.
He actualizado de XE2 a 10.3 y estoy empezando a tener problemas con FIBPlus. Salta un access violation cada vez en un punto distinto del código fuente al trabajar con strings, pero tanto con AsString como con AsAnsiString así que por aquí voy más perdido. ¿Seguís trabajando con estos componentes? ¿Con la versión que hay en GitHub?
Responder Con Cita
  #10  
Antiguo 25-09-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.022
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Has seguido los consejos anteriores?
Aparentemente no hay muchas quejas al respecto sobre fibplus, se supone que está funcionando bien.
Está actualizado hasta delphi 11, ¿has instalado la última versión?
En todo caso, ¿puedes crear un sencillo programa de pruebas donde ocurra el error?
Responder Con Cita
  #11  
Antiguo 25-09-2023
Zento Zento is offline
Miembro
 
Registrado: may 2017
Posts: 12
Poder: 0
Zento Va por buen camino
No puedo pasar de Delphi 10.3 Rio ya que es la que hay licenciada y sí, he seguido los consejos.

Lo extraño es que sólo me pasa con un DM y de forma totalmente aleatoria. En otros DM de la aplicación no parece haber problema. Es rarísimo. Llevo horas quitando eventos, recreando campos, queries... En cuanto uso algún evento de un campo string en concreto, explota todo pero cada vez por un sitio. Me lleva loco y estoy ya sin ideas. Por eso no puedo poner un proyecto mínimo provocando el error, tampoco. Si consigo aislarlo y no corregir el problema, informaré con el programa sencillo.

Entiendo perfectamente que así poco podréis ayudarme pero era más por si a alguien le ha pasado sentirme menos bicho raro.
Responder Con Cita
  #12  
Antiguo 25-09-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.022
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Si te pasa sólo en un DM y no ocurre en otros, entonces se supone que el problema va a estar ahí.
Intenta "minimizar" código poco a poco, quitando cosas hasta que llegues al mínimo donde encuentres la forma de reproducir el error.
Responder Con Cita
  #13  
Antiguo 25-09-2023
manelb manelb is offline
Miembro
 
Registrado: mar 2017
Posts: 280
Poder: 8
manelb Va por buen camino
Hola Zento, y saludos a todos...

Cita:
Empezado por Zento Ver Mensaje
He actualizado de XE2 a 10.3 y estoy empezando a tener problemas con FIBPlus. Salta un access violation cada vez en un punto distinto del código fuente al trabajar con strings, pero tanto con AsString como con AsAnsiString así que por aquí voy más perdido. ¿Seguís trabajando con estos componentes? ¿Con la versión que hay en GitHub?
Nosotros finalmente optamos por migrar a Firedac.

En ese momento no nos dio confianza continuar con FIBPlus, aunque hay compañeros que continúan utilizándolo y parece ser que sin problemas.

Siento no poder ayudarte

Suerte ...
Responder Con Cita
  #14  
Antiguo 27-09-2023
Zento Zento is offline
Miembro
 
Registrado: may 2017
Posts: 12
Poder: 0
Zento Va por buen camino
Aquí sigo con mi dolor... He preparado los componentes necesarios para el proyecto en Delphi 11 Alexandria por si hubiese alguna mejora y sigo con los mismos problemas. He probado con una versión reducida al mínimo del EXE y algo pasa en ese DM que hace que todo explote. Estoy pensando que puede haber algo en las opciones de compilación que hace que los punteros dejen de apuntar donde toca y se producen AV internos en el componente. No me he visto en una igual desde que programaba código sin manejar en C.
Responder Con Cita
  #15  
Antiguo 27-09-2023
Zento Zento is offline
Miembro
 
Registrado: may 2017
Posts: 12
Poder: 0
Zento Va por buen camino
Cita:
Empezado por manelb Ver Mensaje
Nosotros finalmente optamos por migrar a Firedac.

¿Sabes si existe algún sistema que automatice el cambio? Quizá con GExperts que tiene un reemplazador de componentes...



Me lo estoy planteando nuevamente, ya que en el salto desde XE2 ya se planteó la opción porque se notaba que en el soporte que Devrace estaba en las últimas.
Responder Con Cita
  #16  
Antiguo 27-09-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.022
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Zento Ver Mensaje
Aquí sigo con mi dolor... He preparado los componentes necesarios para el proyecto en Delphi 11 Alexandria por si hubiese alguna mejora y sigo con los mismos problemas. He probado con una versión reducida al mínimo del EXE y algo pasa en ese DM que hace que todo explote.
¿Tienes otros DM con componentes iguales y funciona bien?
Responder Con Cita
  #17  
Antiguo 28-09-2023
Zento Zento is offline
Miembro
 
Registrado: may 2017
Posts: 12
Poder: 0
Zento Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
¿Tienes otros DM con componentes iguales y funciona bien?
Así es, e incluso más complicados. El proyecto tiene 45 DMs y más de 150 units en total. Sólo he detectado problemas en este en concreto.


He hecho cambios también en la estructura de la base de datos, como quitar CHARSET o COLLATION, sin éxito también. Me he quedado ya sin ideas así que voy a dedicar algo de tiempo a pasar a IBObjects este DM en concreto. Pasaría a FireDAC pero tener tres sistemas de acceso a base de datos ya me parece demasiado y prefiero unificar aunque en un futuro igual tropiece con la misma piedra.
Responder Con Cita
  #18  
Antiguo 28-09-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.022
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
O sea, tienes un proyecto con 45 DM, y en uno tienes problemas, sólo en ese único, ¿y la solución es cambiar los componentes?
Eso no tiene absolutamente ninguna lógica, porque está claro "lógicamente" que el problema está ahí, no en los componentes.
¿Has probado a quitar el componente y volver a ponerlo de nuevo desde la paleta? a veces se cuenta que algunos han solucionado cosas raras con cualquier componente del tipo que sea, borrándolo y poniendo de nuevo otro igual.


De todas formas es fácil seguir con el "debug" el programa y ver exactamente en qué línea tienes el problema y comprobar qué está ocurriendo ahí.
Responder Con Cita
  #19  
Antiguo 28-09-2023
Zento Zento is offline
Miembro
 
Registrado: may 2017
Posts: 12
Poder: 0
Zento Va por buen camino
Sé que no tiene ninguna lógica. Estoy ya más en modo pataleta que buscar soluciones.


He reducido el problema al mínimo, metiendo los componentes en un nuevo proyecto con un único form, controles y componentes no visuales de base de datos juntos. Pues también termina fallando, en otro punto, pero falla.


No hay una única línea de código, ojalá. A veces es en un AsString, calculando el puntero donde guardar el dato en el TFIBStringField, en otras es al llamar a Open, accediendo a un TList interno del componente TpFIBTable, a veces es en un OnCalcFields, en el DataEvent interno... Eso es lo me que lleva de cabeza, que no hay lógica ninguna en cómo falla.
Responder Con Cita
  #20  
Antiguo 28-09-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.022
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Bueno, si tienes problemas con ellos entonces deberás decidir, ya sé que es complicado cambiar.
En los últimos proyectos estoy usando los IBX que trae Delphi y van muy bien, te lo digo por si acaso no has pensado en ellos.
Son "casi" iguales a FIBplus (son primos hermanos).
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
FibPlus en Delphi XE5 eibarra Conexión con bases de datos 2 12-08-2014 11:09:54
Delphi 2010 + FIBPlus 6.9.6 + Campos Memo guillotmarc Conexión con bases de datos 4 29-03-2010 23:04:17
FibPlus para Delphi 2009 miado Conexión con bases de datos 3 12-01-2009 15:37:56
FIBPlus emeritos Lazarus, FreePascal, Kylix, etc. 3 19-06-2004 17:56:40
FibPlus Malon Conexión con bases de datos 4 22-04-2004 02:41:49


La franja horaria es GMT +2. Ahora son las 14:34:33.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi