PDA

Ver la Versión Completa : String mayor a 255 para record


totote
19-04-2009, 00:24:44
Buenas gente, necesito guardar en un archivo de registro tres datos, un título un link a un sitio de internet y una descripción que es un código html, pero resulta que la descripción por lo general tiene más de 255 caracteres y ahí es cuando se me complica, hay a alguna forma de extender el tamaño de los String?

mi registro está compuesto de la siguiente forma


THistorial = record
Titulo: String[255];
Link: String[255];
Descripcion: String[255];
end;


Saludos :D

dec
19-04-2009, 00:39:57
Hola,

No sé si dependerá de alguna directiva de compilación o algo así, pero, yo puedo declarar el tipo tal que así, sin problemas:


type
THistorial = record
Link: String;
Titulo: String;
Descripcion: String;
end;


Creo que Delphi es muy capaz de trabajar con algo así. No sé si algún otro compañero podrá añadir algo al respecto. ;)

totote
19-04-2009, 00:46:44
lo intenté, pero cuando declaro un archivo del tipo registor me devuelve este error

[DCC Error] Principal.pas(165): E2155 Type 'THistorial' needs finalization - not allowed in file type

para declarar uso este código


var
Reg: file of THistorial;
begin
//....
end;

dec
19-04-2009, 01:00:48
Hola,

Hum... me temía algo así... pero, como no especificaste si era un tipo para usar en un archivo (o no leí bien tu mensaje), por eso dije lo que dije... pero, sí es cierto que me suena alguna limitación en el caso que dices. Lamento no poder darte ninguna solución en este caso: no tengo idea de si sería posible, o tendrías que conformarte con los 255 caracteres (supongo que no...), lo lamento de veras. :(

DarkMan
19-04-2009, 01:06:37
Realmente si es necesario especificar un límite en cada string, de lo contrario cada registro tendría un tamaño diferente, es por ello que depende de la longitud de los strings que contenga. Puedes probar a usar AnsiString en lugar de String:

THistorial = record
Titulo: String[255];
Link: String[255];
Descripcion: AnsiString[1000];
end;

Para comprobar lo que digo, prueba a ver el tamaño de las dos estructuras (la que tu mostraste, y la de Dec) con SizeOf() y notarás la diferencia.

Un saludo.

totote
19-04-2009, 01:11:03
Bueno dec gracias igual, he puesto una solución temporlamente para siempre hasta que encuentre algo mejor, pero el registro me ha quedado así


THistorial = record
Titulo: String[255];
Link: String[255];
D1: String[255];
D2: String[255];
D3: String[255];
D4: String[255];
end;


y para separarlo lo hago de esta forma


procedure GuardarHistorial;
var
Reg: file of THistorial;
Historial: THistorial;
LHistroial: TLink;
i: Integer;
aux: String;
begin
AssignFile(Reg,Opciones.AppDir + 'Historial.dat');
Rewrite(Reg);
//....
if Length(aux) > 255 then
begin
Historial.D1:= Copy(aux,1,255);
Delete(aux,1,255);
if Length(aux) > 255 then
begin
Historial.D2:= Copy(aux,1,255);
Delete(aux,1,255);
if Length(aux) > 255 then
begin
Historial.D3:= Copy(aux,1,255);
Delete(aux,1,255);
Historial.D4:= aux;
end
else
Historial.D3:= aux;
end
else
Historial.D2:= aux;
end
else
Historial.D1:= aux;
Write(Reg,Historial);
//...
CloseFile(Reg);
end;

totote
19-04-2009, 01:15:36
DarkMan, me devuelve este error si lo hago de tu forma

[DCC Error] Principal.pas(294): E2029 ';' expected but '[' found

DarkMan
19-04-2009, 03:11:04
DarkMan, me devuelve este error si lo hago de tu forma

[DCC Error] Principal.pas(294): E2029 ';' expected but '[' found

Vaya, tienes razón. Por lo pronto se me ocurre otra solución más viable:

THistorial = record
Titulo: String[255];
Link: String[255];
Descripcion: Array [0..1000] of Char;
end;

Puedes trabajar con Descripcion como si un string se tratara.

Un saludo.