Avatar billede ossys Mester
08. december 2014 - 13:12 Der er 9 kommentarer

TFilestream or Record

Jeg anvender Delphi 2007 (og Delphi XE5). Jeg har ikke tidligere anvendt TFilestream, men nu har jeg behov for at kunne gemme records nemt og smidigt. Jeg har problemer med at anvende TFilestream sammen med typen Record. Problemet har tilsyneladende ikke noget at gøre med opbygningen af den anvendte record. En simpel code som nedenstående giver kun "sludder" i datafilen.  Hvorfor går det galt.

Jeg har prøvet at søge i gamle spørgsmål og svar på Eksperten uden at kunne finde noget brugbart. Er der mon en barmhjertig sjæl som kan hjælpe mig?

Tyoe
  TRecOplysninger:Record
                ForNavn:string;
                Efternavn:String;
              end;

var
  fsDataFile:TFilestream;
  OplysninGer:TRecOplysninger; 

Const
  DatafileName='Filename';


begin
  Oplysninger.Navn:='Niels';
  Oplysninger.Efternavn:='Nielsen';
//
  fsDataFile:= Tfilestream.Create(Datafilename,fmcreate or ShareDenyNone); 
  fsDatafile.WriteBuffer(Oplysninger,sizeof(Oplysninger));
  fsDatafile.Free;
//
end;
Avatar billede MADOlsen Forsker
08. december 2014 - 14:27 #1
Tyoe
  TRecOplysninger:Record
                ForNavn:string;
                Efternavn:String;
              end;

var
  fsDataFile:TFilestream;
  OplysninGer:TRecOplysninger; 

Const
  DatafileName='Filename';


begin
  Oplysninger.Navn:='Niels';
  Oplysninger.Efternavn:='Nielsen';
//
  fsDataFile:= Tfilestream.Create(Datafilename,fmcreate or ShareDenyNone); 
  fsDatafile.WriteBuffer(Oplysninger,sizeof(Oplysninger));
  fsDatafile.Free;
//
end;


Det var nemmere at hjælpe dig, hvis du ikke havde lavet så mange stavefejl (markeret med fed), da du "kopiere" koden herind ;-)

Prøv at ændre følgende linie:

fsDatafile.WriteBuffer(Oplysninger,sizeof(Oplysninger));

til

fsDatafile.WriteBuffer(Oplysninger.Fornavn[1],ByteLength(Oplysninger.Fornavn));  fsDatafile.WriteBuffer(Oplysninger.Efternavn[1],ByteLength(Oplysninger.Efternavn));
Avatar billede ossys Mester
08. december 2014 - 16:31 #2
Tak for din respons og undskyld de MANGE stavefejl.

Jeg har ikke mulighed for i øjeblikket at prøve dit forslag. Umiddelbart ser det lidt underlig ud, at hver enkelt felt i recorden skal gemmes! Det virker ikke som nogen "elegant" løsning, men hvis det er vejen, må jeg jo gøre som du anviser. Problemet er, at jeg har "mange" felter af forskellige typer i min record!
Avatar billede ossys Mester
09. december 2014 - 00:34 #3
@Fedeko

Jeg har prøvet dit forslag. Compileren kender IKKE "ByteLength"; Jeg har prøvet med SixeOf() og Length() men jeg får exception fejl (Stream Write Error)!

Jeg må søge videre! Har du andre forslag?
Avatar billede ossys Mester
09. december 2014 - 13:43 #4
@Fedeko

Jeg har fået det til at fungere sådan (underligt ikke?):

eksempel:

WriteBuffer(Pointer(Fornavn)^,Length(Fornavn));

Er det slet ikke muligt at gemme hele recordstructuren i et hug? og hvis ikke, hvorfor ikke?
Avatar billede MADOlsen Forsker
10. december 2014 - 09:23 #5
Undskyld det forsinkede svar, har lige været ramt af lidt juletravlhed.

Nu ved jeg ikke, hvad du skal bruge det gemte til, men (mis?)forstod det bare sådan, at du skulle kunne læse filen i en teksteditor efterfølgende.

Er dette ikke tilfældet, er der ikke noget i vejen for at gøre det, som du gør.

Hvis du prøver at hente de gemte data ind igen med nedenståede kode, vil du se, at recordens data er identisk med de data du havde smidt i den, da du gemte.

var
  fsDataFile:TFilestream;
  Oplysninger:TRecOplysninger;
Const
  DatafileName='Filename';
begin
  fsDataFile:= Tfilestream.Create(Datafilename,fmOpenRead);
  fsDatafile.ReadBuffer(Oplysninger,SizeOf(TRecOplysninger));
  ShowMessage(Oplysninger.ForNavn + ' ' + Oplysninger.Efternavn);
  fsDatafile.Free;
end;
Avatar billede ossys Mester
10. december 2014 - 12:40 #6
@fedeko
Tak for din interesse for mit problem. Du ledte mig trods alt på rette vej. Mit store (forståelses)problem er stadig om (og måske hvorfor ikke) der er mulighed for at gemme hele bufferen (recorden) i et hug? Du får point, hvis du vil fortælle mig hvordan jeg giver dig dem?
Avatar billede MADOlsen Forsker
10. december 2014 - 13:17 #7
Du gemmer den i et hug, på den måde, som du skriver i dit oprindelige spørgsmål. Men da det er binære data, der gemmes, ser det mærkeligt ud i en teksteditor.

Så hvis du vil have mulighed for at læse filen selv, er det mig bekendt ikke muligt, uden at gemme hver enkelt string manuelt.
Avatar billede Olescholesch Nybegynder
23. december 2014 - 00:55 #8
@Fedeko

Tak for din interesee.
Jeg kan ikke finde ud af at give dig point og lukke tråden?
Avatar billede MADOlsen Forsker
23. december 2014 - 09:28 #9
Hvis du kunne bruge mine indlæg til noget, lukker du ved at acceptere dette svar. Hvis ikke, accepterer du bare dit eget svar i stedet :-)
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

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