Avatar billede dl Nybegynder
04. marts 2003 - 21:45 Der er 8 kommentarer og
1 løsning

Min egen Database

Jeg har en database

Type
  Mydata = Record
            Navn: String;
            Alder: Integer;
            Billede: TImage; ( hvad det nu er gemt i )
            Bil: Boolean;
            ( Andet )
          End;
  bla bla




SP er så...
Hvordan gemmer jeg disse data i en fil ( IKKE Paradoxx, eller andet ) men en fil som delphi / computeren laver.

Hvordan åbner jeg den og tilføjer og sletter, søger og alt det der...
hvis det skal laves i  mySQL  så har jeg ikke forstand på det, så må i give en god forklaring.

Jeg har prøvet med:

procedure .....
Var
  data: File of myData;
Begin
  AsignFile( Data, 'hej.dat' );
  Rewrite( data );

  writeln(data, Data.navn );

  CloseFile(Data);
End;

det virker ikke...


Håber i forstår mit problem ?

//dl
Avatar billede hermandsen Juniormester
04. marts 2003 - 22:06 #1
For det første så kan du ikke lave en File of myData;, eftersom din record både indeholder en string og en klasse (TImage, må man egentlig det?)... Disse er begge af typen Pointer, og skal derfor gemmes på en anden måde... ;)

Det er der selvfølgelig metoder til, og det er dem vi skal ha' fat på... Jeg har engang lavet det her, kunne være du kunne bruge det:

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;

procedure WriteInteger(Int: Integer);
begin
  BlockWrite(F, Int, SizeOf(Integer));
end;


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

function ReadInteger: Integer;
begin
  BlockRead(F, Result, SizeOf(Integer));
end;
Avatar billede hermandsen Juniormester
04. marts 2003 - 22:08 #2
Så skal du bare bruge
var
  F: file;
Avatar billede hermandsen Juniormester
04. marts 2003 - 22:16 #3
Og så forresten:
Til at gemme:
  AssignFile(F, FilNavn);
  Rewrite(F, 1); //Så opretter du en ny fil

Til at hente:
  AssignFile(F, FilNavn);
  FileMode := fmOpenRead; //åbner filen, kun med læse-adgang. De andre er fmOpenWrite og fmOpenReadWrite. Sidstnævnte er standard hvis du ikke har ændret FileMode.
  Reset(F, 1);

Håber det hjalp lidt! ;)
Avatar billede a_schack Nybegynder
05. marts 2003 - 08:53 #4
Du kan evt. også lave en String med en fast længde:
Navn: String[30]
Hvis man ser bort fra dit TImage, så gør det, at din record får en fast størrelse, så man kan skrive den uden problemer...
Avatar billede dl Nybegynder
05. marts 2003 - 10:11 #5
a_schack: Ok, hvordan læser jeg den så uden problemmer, of sletter i den ?

//dl
Avatar billede a_schack Nybegynder
05. marts 2003 - 10:46 #6
Her er et lille eksempel:
type //Bare en record, der kan skrives til fil uden problemer
  MyRec = Record
    Name: String[30];
    Age:  Integer;
    Bil: Boolean;
  end;

//Dette indsættes i en procedure
var
  DataFile: File of Myrec;
  Data: MyRec;
begin
  //Bare nogle data i record'en
  Data.Name:='Test';
  Data.Age:=10;
  Data.Bil:=True;
  AssignFile(DataFile, 'C:\Test.dat');
  Rewrite(DataFile); //overskriv filen
  Write(DataFile, Data); //skriv en record
  CloseFile(DataFile);
end;

//sådan læses fra filen
var
  DataFile: File of Myrec;
  Data: MyRec;
begin
  AssignFile(DataFile, 'C:\Test.dat');
  Reset(DataFile); //hop til start af fil
  while not EOF(DataFile) do //fortsæt med at læse, indtil der ikke er mere at læse
  begin
    Read(DataFile, Data); //læs data ind i record
  end;
  CloseFile(DataFile);
  ShowMessage(Data.Name + ' ' + IntToStr(Data.Age) + ' ' + BoolToStr(Data.Bil)); //bare for at se, at det virker, BoolToStr er en funktion, jeg selv har lavet
Avatar billede a_schack Nybegynder
05. marts 2003 - 10:52 #7
Hvis man skal skrive mere end én record, vil man normalt lave et dynamisk array at opbevare sine records i. Derefter skriver man dem bare i en løkke og lukker filen. Når man så vil læse dem ind igen, skal man atter have fat i sit dynamiske array (da man ikke ved, hvor mange records der er, er man nødt til at lave et dynamisk array), og læse dem ind i en løkke, som ovenfor. Sletning er straks mere problematisk, da man ikke bare kan lave et hul midt i en fil. Så er du nødt til at indlæse data i et array, fjerne de records, du ikke vil have længere, kopiere array'et over i et nyt array, der er det slettede antal records mindre en det oprindelige, så de ligger i én lang række igen, og så skrive filen.
Hvis du vil finde en record midt inde i din fil, og ikke gider at læse hele array'et igennem kan du bruge Seek(DataFile, <antal records, startende fra nul>).
Avatar billede dl Nybegynder
05. marts 2003 - 11:10 #8
A_schack>> Kan du lave et eks på hvordan man laver et arrey. Så for du 2*60 point.

//dl
Avatar billede a_schack Nybegynder
05. marts 2003 - 11:23 #9
Et lille eksempel på, hvordan man laver et dynamisk array, og forøger det. Som standard er et dynamisk array ikke initialiseret, derfor starter jeg med at at sætte det til at holde en record. Dette er et dårligt og ustabilt eksempel, men der står meget mere i Delphi's hjælp under dynamic arrays...

var
  aData1: array of MyRec;
  Data: MyRec;
  i: Integer;
begin
  Data.Name:='Test';
  Data.Age:=30;
  Data.Bil:=True;
  SetLength(aData1, 1);
  for i:=0 to 9 do
  begin
    SetLength(aData1, High(aData1) + 1);
    aData1[i]:=Data;
  end;
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