04. marts 2003 - 21:45Der 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 );
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 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;
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);
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...
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
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>).
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;
Synes godt om
Ny brugerNybegynder
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.