Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Varios tipos de datos en un fichero (https://www.clubdelphi.com/foros/showthread.php?t=89149)

xaviroch 04-10-2015 11:40:21

Varios tipos de datos en un fichero
 
Buenos dias,

Estoy intentando crear un fichero en el que quiero guardar diferentes tipos de variables, pero no lo consigo, solo se guardarun tipo de variable.

Código Delphi [-]
type
  tipo1 = record
      .....
  end;
  tipo2 = record
     .....
  end;
var
  f : file 
  t1 : tipo1
  t2 : tipo2
begin
  assignfile(f,'prueba.dat');
  rewrite(f);
  write(f,t1);
  write(f,t2);
  closefile(f);
end;


Esta seria basicamente la estructura que no funciona.

Gracias!

Casimiro Notevi 04-10-2015 12:53:28

No podemos adivinar exactamente qué problema tienes, cómo lo estás haciendo, qué quieres conseguir, etc.
Además, ¿en los puntos consecutivos qué código va? Pon el código, no podemos adivinar :)

xaviroch 04-10-2015 13:05:48

Ok, quiza he dado poca información. Es un programa de diseño grafico tipo CAD, con vectores, puntos y textos entre otros objetos. Lo que necesito es guardar todos estos datos en un fichero.

Código Delphi [-]
type
  tvector = record
      p1,p1 : Tpointer;
      col : TColor;
  end;
  ttexto = record
     pos : TPointer;
     text : String[50];
     col: TColor;
  end;
var
  f : file 
  vec : array of tvector
  texto : array of ttext
  punto : array of tpoint;
  t : integer;
begin
  assignfile(f,'prueba.dat');
  rewrite(f);
  for t:=0 to length(vec) do write(f,vec[t]);
  for t:=0 to length(texto) do write(f,texto[t]);
  for t:=0 to length(punto) do write(f,punto[t]);
  closefile(f);
end;

El problema es que tendria de definir F como file of TVect, pero entonces ya no puedo guardar mas datos.
Posiblemente podria escribir todos los datos, "tipo" a "tipo", añadiendolo al final del fichero, pero despues no sabria como abrir el fichero, espero explicarme.

Espero que me podais ayudar.

Gracias de antemano

BDWONG 04-10-2015 17:08:28

Hola
 
Puedes darle una revisada a la funciones BlockRead y BlockWrite estas no necesitan definr un File of type

mira te dejo un pequeño ejemplo que hice

Código Delphi [-]
uses
  SysUtils,Types ;

type
  TVector = record
      punto: TPoint;
      color:string[50];
  end;
  TTexto = record
     pos : TPoint;
     text :String[50];
     col: integer;
  end;
var
  myFile : file;
  vec,vecLeido :TVector;
  texto :TTexto;
begin
  //asignamos valores al record vec de tipo TVector
  vec.punto.X:=10;
  vec.punto.Y:=18;
  vec.color:='rojo';

  //asociamos el fichero con la variable
  assignfile(myFile,'prueba.dat');

  //Escribimos el bloque de memoria
  rewrite(myFile,SizeOf(vec));
  BlockWrite(myFile,vec,1);
  closefile(myFile);

  //Leemos el bloque de memoria
  Reset(myFile,SizeOf(vec));
  BlockRead(myFile,vecLeido,1);
  closeFile(myFile);

  //Escribimos los valores
  Writeln(vecLeido.punto.x);
  Writeln(vecLeido.punto.y);
  Writeln(vecLeido.color);
  Readln;

end.


link de ayuda:
http://www.delphibasics.co.uk/RTL.asp?Name=BlockWrite
http://www.delphibasics.co.uk/RTL.asp?Name=BlockRead

Saludos...

xaviroch 04-10-2015 20:03:25

Como odria cambiar el tamaño de los datos a mitad de fichero? Es decir:

//creamos fichero
rewrite(myFile,SizeOf(vec));
...
//cambiamos tamaño del registro
reset(myFile,SizeOf(texto));
...

o se como podria hacerse....

Ñuño Martínez 05-10-2015 10:43:56

Cita:

Empezado por xaviroch (Mensaje 497560)
Como odria cambiar el tamaño de los datos a mitad de fichero?

No se puede.

De todas formas, tienes que revisar cómo funciona la memoria y qué representa cada tipo de dato. Se evidencia en que lo tienes poco asimilado al intentar guardar un puntero en un archivo de disco.

xaviroch 05-10-2015 13:04:59

Hola Ñuño, no quiero guardar el puntero, de echo, en mi programa ya guardo los datos, pero ahora lo que quiero añadir es otro tido de dato en el mismo fichero.

Un fichero deberia de tener esta estructura:

Primero los datos de varios vectores (Tvector)
Despues los datos de varios Puntos (TPointer)
Despues los datos de varios Textos (TTexto)

Al crear/abrir uin fichero me hace definir el tamaño de bloque de datos, por ejemplo TVector, entonces luego ya no puedo escribir/leer otro tipo de dato con un tamaño diferente.

Perdon por ser insistente, pero estoy seguro que hay una manera "facil" de hacerlo y no la encuentro.

Ñuño Martínez 05-10-2015 18:47:54

Acabo de releer, y resulta que donde pones TPointer leí Pointer. Mis disculpas.

De todas formas, y hasta donde sé, no pueden cambiarse los tamaños de registro en un archivo abierto.

La forma "fácil", como tú dices, consiste en guardar cada campo por separado, tal como explica BDWONG. Créeme que es la más sencilla y mejor, en este caso.


La franja horaria es GMT +2. Ahora son las 15:21:23.

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