Avatar billede hermandsen Juniormester
26. februar 2002 - 15:08 Der er 7 kommentarer og
3 løsninger

Gem array of record der indeholder strings

Hej eksperter

Jeg står for at skulle gemme et array of record...
Altså:

type
  TFile = record
    FileName:  String;
    RemoteDir: String;
    LocalDir:  String;
    FileSize:  Integer;
end;

var
  Files: array of TFile;

procedure SaveArrayToFile(FileName: String);
var
  F: File of MyRecord;
begin
...
end

Som den opmærksomme programmør nok har set, er der strings i denne record. Det er netop der mit problem er! Jeg vil helst undgå TStringList og array of Char, hvis det er muligt!

/hermandsen
Avatar billede morten_s Nybegynder
26. februar 2002 - 15:30 #1
Prøv sådan her

type
  TFile = record
    FileName:  String[128];
    RemoteDir: String[128];
    LocalDir:  String[128];
    FileSize:  Integer;
end;
Avatar billede hermandsen Juniormester
26. februar 2002 - 15:34 #2
Kender godt metoden, men bliver det så ikke en kæmpe fil? Og så er der jo også lige problemet med hvis en streng er længere end 128!!!
Avatar billede morten_s Nybegynder
26. februar 2002 - 15:35 #3
nu er 128 byte jo ikke så meget i vore dage
Avatar billede hermandsen Juniormester
26. februar 2002 - 15:37 #4
Jeg har lige kigget på det, og et normalt filnavn (i Win98) kan indeholde LANGT mere end 128 karakterer... Men hvad så med mapper og undermapper osv... Det bliver noget langt noget!!!
Avatar billede hermandsen Juniormester
26. februar 2002 - 15:39 #5
Hmmm... Neeej, det har du sådan set ret i, men kunne man ikke lave det sådan at man først lavede en word, foran strengen, så ville man kunne få difineret hvor lang den var... Tror bare det ville blive for besværligt! Hvad er hurtigst?
Avatar billede morten_s Nybegynder
26. februar 2002 - 16:02 #6
at lave en stor streng, din fil kommer ingengan til at fylde 2 kb
Avatar billede martinlind Nybegynder
26. februar 2002 - 16:56 #7
et filnavn fylder string[255], så brug det
Avatar billede hermandsen Juniormester
28. februar 2002 - 14:57 #8
Har fundet en smart måde at lave det på, så det ikke fylder mere end det behøver! :)

Beklager at jeg blev nød til at lave spørgsmålet! I får lige nogle point til deling, fordi i svarede...
Avatar billede zerohero Nybegynder
23. oktober 2002 - 15:04 #9
Kaere Hermandsen,

Kan du ikke give mig et link eller et eksempel paa din losning af problemet? Min mail er (som du nok allerede ved) info@opengl-delphi.dk

ZeroHero
Avatar billede hermandsen Juniormester
23. oktober 2002 - 23:16 #10
Jamen selvfølgelig da! :)

Det eneste jeg egentlig har gjort er at udvikle en procedure der først skriver hvor lang strengen er, og derefter strengen:

Proceduren for neden er en under-procedure til en SaveToFile-procedure, hvor jeg har en variabel "F: File"... Det er den der skrives til i BlockWrite... Her har jeg sat den maksimale længde for strengen til at være 65535 tegn (maks-værdien for en Word), hvilket var fint for mig... Har du brug for længere eller kortere strenge kan du bare bruge en anden ordinal... ;)

Nå, ikke så meget snak, her er proceduren:

procedure WriteString(const S: String);
var
  Size: Word;
  P: PChar;
begin
  Size := Length(S);
  GetMem(P, Size+1);
  StrCopy(P, PChar(S));
  BlockWrite(F, Size, SizeOf(Word));
  BlockWrite(F, P^, Size);
  FreeMem(P);
end;

Så skal der selvfølgelig også læses fra filen igen... Det gør jeg med følgende funktion...

function ReadString: String;
var
  Count: Word;
  Buf: array [1..300] of Char;
begin
  BlockRead(F, Count, 2);
  BlockRead(F, Buf, Count);
  Result := Copy(Buf, 0, Count);
end;

Her er der igen tale om file-variablen F og jeg satte en maksgrænse på strenglængden til 300 tegn, da jeg ikke havde brug for mere... De strenge jeg havde med at gøre kunne nemlig blive længere end det... Grunden til at jeg ikke brugte en byte i stedet for en word var så at strengene godt kunne blive over de 255 tegn... :)

Nå, men jeg håber da det hjalp dig videre til dit projekt! Glæder mig til din næste OpenGL-tutorial! ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester