Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-01-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Se puede asignar una cadena de texto a un record?

Hola, me explico con un ejemplo para que sea más comprensible:
Tengo un record con todos los campos de texto.

Código Delphi [-]
TregFicha = record
  RFcampo1 : string[12];
  RFcampo2 : string[40];
  RFcampo3 : string[15];
end;

rLinFicha : TregFicha;

Desde un fichero de texto voy leyendo líneas y asignándola para almacenar después en una base de datos:

Código Delphi [-]
var
  cLinea : string;
  F : TextFile;
begin
  // se abre el fichero de texto y se va leyendo
  // y ahora a leer...
  while not eof(F) do
  begin
    rLinFicha.RFcampo1 := Trim( Copy(  cLinea,   1,  12 ) );
    rLinFicha.RFcampo2 := Trim( Copy(  cLinea,  13,  40 ) );
    rLinFicha.RFcampo3 := Trim( Copy(  cLinea,  53,  15 ) );
    //
    // etc..... con todos los campos
    //
  end;

Entonces mi pregunta es si se puede hacer algo así como:

Código Delphi [-]
rLinFicha := cLinea;
Assign(rLinFicha,cLinea);
etc.

Se trata de ahorrar tiempo y principalmente de no tener que estar calculando donde empieza un campo y el siguiente, para evitar errores.
Además por si cambia la longitud de un campo, o se añada otro en medio, o se borra alguno, etc. no habría que tocar nada, porque de esta
forma hay que recalcular todo a mano.

Gracias por vuestros comentarios.
Saludos.
Responder Con Cita
  #2  
Antiguo 03-01-2012
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Si se puede. Solo tienes que definir F como F : file of TregFicha.

Código Delphi [-]
TregFicha = record
  RFcampo1 : string[12];
  RFcampo2 : string[40];
  RFcampo3 : string[15];
end;

var
  F : file of TregFicha;
  rLinFicha : TregFicha;
begin
  // se abre el fichero de texto y se va leyendo
  AssingFile(F, 'C:\texto.txt');
  Reset(F);
  // y ahora a leer...
  while not eof(F) do
  begin
     Read(f, rLinFicha);
     ...
  end;

Solo debes hacer la prueba con campos numéricos, porque no recuerdo como los grababa...
Tampoco recuerdo bien si era Read o ReadLn. Creo que era Read.
También puedes utilizar la función Seek para posicionarte y esas cosas.
Está todo en el help de Delphi.

Esto me lo acuerdo de mis tiempos de TurboPascal... Qué facil que era todo en esa época...
Responder Con Cita
  #3  
Antiguo 04-01-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Pues en principio funciona bien, aunque no sé el motivo de que se "coma" la primera letra de cada línea y luego va "descuadrándose", supongo que no he puesto la longitud correcta a algún campo.
Voy a seguir probando, gracias
Responder Con Cita
  #4  
Antiguo 04-01-2012
Avatar de ElKurgan
[ElKurgan] ElKurgan is offline
Miembro Premium
 
Registrado: nov 2005
Posts: 1.235
Poder: 20
ElKurgan Va camino a la fama
Tienes que tener en cuenta el retorno de carro, si lo tiene. Yo en ocasiones he añadido un campo más de 1 caracter de longituc, para que coja el CRLF como un caracter más

No se si esto te puede ayudar

Saludos
Responder Con Cita
  #5  
Antiguo 04-01-2012
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Esta noche estaba pensando lo mismo que ElKurgan.
  • Puede ser que cada linea termine con #13
  • Puede ser que cada linea termine con #13#10
  • Puede ser que el texto esté en unicode y el archivo comience por unos caracteres que conforman el BOM de entre 2 y 4 caracteres.
Responder Con Cita
  #6  
Antiguo 04-01-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Pues no sé, la verdad, es un texto normal y corriente, y empieza comiéndose la primera letra de cada línea
Lo he verificado con un editor hexadecimal y no hay caracteres de control, salvo el crlf del final de línea.
Es un texto bastante "limpio", en fin, haré otras pruebas.

Código:
1234567890123PRUEBADETEXTOOCUPANDOTODALALINEACOMPLETAºº
1234567890123PRUEBADETEXTOOCUPANDOTODALALINEACOMPLETAºº
1234567890123PRUEBADETEXTOOCUPANDOTODALALINEACOMPLETAºº
Responder Con Cita
  #7  
Antiguo 04-01-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

En un archivo de acceso directo los registros son contiguos y está definido exáctamente la longitud de cada registro. Los primeros cuatro bytes del primer sector del archivo de acceso aleatorio contiene el número de registros existentes y el largo de cada registro en bytes. (Este formato corresponde a Pascal, puede haber variado en tamaño en Delphi)
Código:
Sector | Byte | Contenido
-------+------+---------------------------
0      |  0   | Numero de registros  (LSB)
0      |  1   | Numero de registros  (MSB)
0      |  2   | Longitud de registro (LSB)
0      |  3   | Longitud de registro (MSB)
Es debido a esa organización que se puede acceder de forma 'directa' a cualquier registro indicando su posición. Además, como bién indica duilioisola, permite almacenar distintos tipos de datos:
Código Delphi [-]
...
type
  TRegistro = packed record
    Nombre: string[30];
    Edad: Integer;
    Vive: Boolean;
    Otro: array [1..5] of char;
  end;

var
  F: File of TRegistro;
  R: TRegistro;

A diferencia, los archivos de texto son una secuencia de caracteres dividido en líneas mediante la secuencia CR/LF y finalizan con Ctrl+Z.

Es por esto que veo difícil que resulte hacer un cast sobre el archivo secuencial. Por supuesto no habría ningún problema si el archivo a leer hubiera sido previamente guardado como tipado:
Código Delphi [-]
var
 F : file of TregFicha;

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #8  
Antiguo 04-01-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.043
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Una pena, el fichero es de texto "puro y duro", creado como 'TextFile'.
Responder Con Cita
Respuesta



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
ibdataset no me deja asignar cadena... ronimaxh Firebird e Interbase 1 16-10-2010 17:33:43
Asignar 'array property' con record.elemento yapt OOP 6 13-05-2010 21:16:05
¿Existe función para asignar a una cadena el resultado de concatenarla con otra? noob Varios 8 13-02-2009 19:34:53
Tipos Strings: no puedo asignar una cadena de mas de 255 caracteres bataola Varios 2 29-06-2007 18:34:37
Asignar una cadena al QRDBtext lirio Impresión 2 03-06-2003 21:30:15


La franja horaria es GMT +2. Ahora son las 10:14:30.


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