Avatar billede megabyte_ Nybegynder
14. december 2002 - 22:14 Der er 5 kommentarer og
1 løsning

Tmemorystrem og records

Hey
Jeg har en record ser sådan ud
TMyDatabase = record
    Item1: string;
    Item2: string;
    Item3: string;
    Item4: string;
    Item6: string;
    Item6: string;
//osv der er rn 15-20 stykker i alt.
  end;

nu vil jeg gerne ligge den ind i en tmemorystrem så jeg let kan arbejde med mine forskellige records (add/del/update osv).
jeg vil også gerne gemme den når jeg er færdig med at bruge min databse og slf kunne hente den igen.
nogen der kan Hjælpe mig har set lidt på spm http://www.eksperten.dk/spm/127244

men kan ikek få det til at virke når jeg udvidre min record :(

/MB
Avatar billede doc404 Novice
15. december 2002 - 21:16 #1
Det der gør det lidt besværligt er, din record størrelse er variable fordi du bruge string og ikke string[nn].

Når du har en variable record størrelse er du nød til, at starte helt forfra når du f.eks. skal finde record nummer 5 - med mindre du laver en form for index system.

Skrivning og læsning bliver også lidt mere omstændigt, da du er nød til at skrive/læse hvert enkelt felt istedet for hele recorden på een gang.

Hvis du ikke har alt for mange records (memory afgør det spm), så kan du definerer din record som

TMyDatabase = record
  Item1 : string[16];
  Item2 : string[32];
  ..
end;

Altså, hvor du på forhånd afsætter plads til den største værdi, der kan forekomme i dit felt. Du vil måske spilde en bunke plads, men nu ved jeg ikke, hvad det er du putter i dine felter...

Men så bliver tingene lidt mere simple og du kan altid gøre det smukt senere hen...

For at skrive en record på den nuværende position

MyStream.Write(MyRec,SizeOf(TMyDatabase));

Læse

MyStream.Read(MyRec,SizeOf(TMyDatabase));

Finde record nr. 7

MyStream.Seek(7 * SizeOf(TMyDataBase),soFromEnd);

Tilføje en record

MyStream.Seek(0,soFromEnd);
MyStream.Write(MyRec,SizeOf(TMyDatabase));

Du vil få en problem med at slette en record midt i det hele fordi du ikke nemt kan "hive noget ud af midten". Men du kan f.eks. have et felt, der siger om recorden er slettet eller ej.

Du bør måske kigge på noget rigtig database ting?
Avatar billede megabyte_ Nybegynder
15. december 2002 - 21:55 #2
Jeg er ved at lave et prog til at holde styr på alel mine film i så det kan gå hen og blive en del.
det du skriver har jeg fundet ud af men jeg vil have lavet så den loader alle mine record ind i en memorystrem når programmet startet og skriver dme når det bliver lukket.
det vil sige den loader dem ind i en TList så jeg har et index nr på dem så jeg let kan rette og finde rundt i dem.
og det med at sætte  en størelse er nok en god ide men som du siger så bruger jeg mere plads en man skal.

/MB
Avatar billede doc404 Novice
15. december 2002 - 22:02 #3
mht. til at hente alle og gemme alle kan du blot skrive

MyStream.LoadFromFile('filnavn.dat')

og

MyStream.SaveToFile('filnavn.dat')

doc404
Avatar billede megabyte_ Nybegynder
15. december 2002 - 22:04 #4
doc404

Yes yes med det hjælper ikek på at få dem over i en Tlist og fra en Tlist  :)

/MB
Avatar billede megabyte_ Nybegynder
15. december 2002 - 22:15 #5
Det jeg sider og roder med lige nu så næsten virker lan hentets her fra
http://cker.wox.org/record_memorystream.rar
Så kan det være at i får en lidt bedre ide om hvad jeg snakker om

/MB
Avatar billede doc404 Novice
15. december 2002 - 22:45 #6
Jeg har ikke set din kode, men..

Start med at load alle records og så start fra en ende af

while MyStream.Read(Rec,SizeOf(TMyDatabase)) > 0 do
begin
  MyList.AddObject(Rec.Item0,TObject(MyStream.Position));
end;

Når du så skal genfinde en record (idx er index i MyList) kan du

MyStream.Seek(Integer(MyList.Objects[idx]),soFromBeginning)
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