PDA

Ver la Versión Completa : Migrar de Delphi 3 a Delphi 5


inetplus
14-02-2004, 01:06:05
Tengo una aplicación programada en Delphi 3 la cual utiliza Paradox y archivos del tipo .dat, el problema se presenta con estos últimos archivos ya que al compilar el programa y ejecutarlo me indica el error "Read beyond en of file". Realmente me desconcierta porque razón en delphi 3 el programa funciona bien y en delphi 5 no, evidentemente existe una incompatibilidad entre estas versiones, que espero pueda solucionarse.

Si alguien tuvo un inconveniente similar, les agradezco me hagan saber como lo solucionaron.

jachguate
14-02-2004, 05:27:21
Hola inetplus.

Te recomiendo leer la guía de estilo de los foros (http://www.clubdelphi.com/foros/guiaestilo.php) antes de plantear tus preguntas.

En esta ocasión no has incluido ni un solo trozo de código, ni la explicación de como accedes a estos archivos .dat (que podrian ser archivos de registros, streams, etc, etc)... quizas archivos de una base de datos o que manejas con componentes de un tercero???

realmente así es imposible ayudarte.

Hasta luego.

;)

inetplus
14-02-2004, 22:03:26
Disculpas .... aqui tienes el codigo donde se genera el problema

Function VerificarFecha:Boolean; {Verifica que la fecha no sea anterior a la fecha de la ultima factura cargada}
var
Fechave:string[10];
Begin
With FVenta do
Begin
AssignFile(ArV,Caminodatos + '\' + UltimoArchivo(TipoFactura(LTipo.Caption[1])));
{$I-}
Reset(ArV); --> Aqui reconoce que el archivo tiene datos
{$I+}
If IoResult <> 0
Then FechaVe:=DateTostr(Date)
Else If Filesize(ArV) > 0
Then Begin --> lee el registro
seek(ArV,Filesize(ArV)-1); {Se posiciona al final del archivo de ventas}
Read(ArV,RV); --> No carga ningún dato
fechaVe:=RV.Fecha;
end
Else FechaVe:=DateTostr(Date);

--> El error se produce cuando valida esta fecha, ya que la varieble no contiene ningún tipo de dato.


A continuación tienes la estructura del registro:

Unit TVenta;
interface
Const
N=20;
SerieFactura=10000;
Type
RArt=Record
Codigo:String[20];
Cantidad:Real;
Medida:string[4];
Descripcion:String[80];
Bonifica:real;
Precio:Real;
end;
ADatos = Array[1..N] of RArt;
Rven=REcord
Numero:Longint;
PuntoVenta:word;
CUIT:STRING[15];
Datos:ADatos;
Fecha:String[10];
Vendedor:Word;
{Datos del cliente}
NumCli:Word;
Cliente:String[40];
Domicilio:String[100];
ConIva:Byte; {1 Resp Insc ... ,6 Monotributo}
Bonificacion:Real;
ImpuestoInt:real; {Impuesto interno}
ConVenta:Byte; {1 Ctdo , 2 CtaCte}
DescIva:real;
Stock:Boolean; {Indica si modifico el stock}
TotalVen:real;
end;
ArVenta=File Of RVen;
implementation
end.

jachguate
16-02-2004, 04:50:05
Creo que ahora te has mandado!

Te refiero de nuevo a la guia de estilo, y también el uso de la etiqueta code para evitar que se pierda la indentación del código.

No hay nada anormal en él.. por lo que puedo ver... lo único que se me ocurre es preguntarte si has revisado el archivo y estas seguro que el último registro no está en blanco?

Hasta luego.

;)

inetplus
16-02-2004, 14:00:28
Estimado Juan, tal vez no me supe explicar, según lo que yo pude observar con las herramientas de depuración y control de ejecución del lenguaje, note lo siguiente:

1. El registro y el archivo de datos fue creado, y por ende contiene datos, con el programa generado en la versión 3.

2. Al pasar este archivo de datos, con la misma estructura del registro y sus respectivos archivos de datos al programa compilado con la versión 5, pude ver que no lo lee de de la misma forma que en la versión 3 (registro de datos), ya que sólo contiene basura.

3. Me parece que el problema esta dado con la lectura en memoria de los tipos de datos que contiene el registro.

¿ Sabes si la gente de Borland introdujo algún cambio en los tipos de datos en la versión 5 ?

inetplus
16-02-2004, 23:07:31
Estuve investigando y pude comprobar que el tipo Real de Delphi 3 es distinto al de Delphi 5, es decir en el primer caso ocupa 6 bytes y en el segundo 8.

Esto se soluciona declarando las variables con Real48.

¿ Conocen alguna otra incompatibilidad ?