18. april 2005 - 12:26Der er
16 kommentarer og 1 løsning
Type 'Tdeck' needs finalization - not allowed in file type
har følgende kode, og får fejlmeddelelsen som står i titlen, er der nogle der lige hurtigt kan gennemskue hvorfor, har defineret længde på alle mine strings, og håbede på det var det, men det hjalp ikke rigtig.
Det er fordi du har defineret en "deckfile : file of tdeck", det kan du ikke da tdeck ikke er en fast størrelse pga. variablen Tdeck.TCards som er et variable array.
Der står i Delphi help under file types: To declare a file type, use the syntax
type fileTypeName = file of type
where fileTypeName is any valid identifier and type is a fixed-size type. Pointer types--whether implicit or explicit--are not allowed, so a file cannot contain dynamic arrays.
så ifølge det er det ikke tilladt. Men hvis du nu laver en "file of TCard" og så bruger din numberofcards når der skal gemmes til at gemme alle TCard i din "TCards: array of TCard;" en efter en.
Nå :) nu havde du fundet en løsning, det begrænser det self. således at du ikke kan have mere end 1000 Tcard og din fil vil altid indeholde 1000 selvom der måske er behov for at gemme 2
kunne du komme med lidt kode på det du foreslår, kan godt se pointen i det, men kan ikke lige gennemskue hvordan det skal kodes, og numberofcards skulle jo også gerne ligge i selve filen
Det er faktisk slet ikke nødvendig at have numberofcards variablen da størrelsen på dit dynamiske array "TCards: array of TCard;" jo fortæller hvor mange cards du har. Mht. "gemme alle TCard i din "TCards: array of TCard;" en efter en." som jeg skrev så glem det, alle cards uanset hvor mange der er kan gemme med en linie kode.
Men hvis du laver 2 procedurer, en SaveDeck og en LoadDeck, noget i stil med disse:
procedure TForm1.SaveDeck; var i : integer; begin Assignfile(Deckfile,'deckfile.dat'); Rewrite(Deckfile); Blockwrite(Deckfile,Deck.TCards[0],Length(Deck.TCards)); Closefile(Deckfile); end;
procedure TForm1.LoadDeck; var i : integer; begin Assignfile(Deckfile,'deckfile.dat'); Reset(Deckfile); SetLength(Deck.TCards,FileSize(DeckFile)); BlockRead(Deckfile,Deck.TCards[0],Length(Deck.TCards)-1); Closefile(Deckfile); end;
fandt lige det her, som jeg prøver at teste en gang.
type THest = record Mule: Real; Hale: Integer; end;
var F: File; Antal, I: Integer; HesteArray: array of THest; begin AssignFile(F, 'c:\a.dat'); Rewrite(F, 1); Antal := ListBox1.Items.Count; BlockWrite(F, Antal, SizeOf(Integer)); SetLength(HesteArray, Antal); for I := Low(HesteArray) to High(HesteArray) do begin HesteArray[I].Mule := StrToFloat(ListBox1.Items[I]); HesteArray[I].Hale := 1; BlockWrite(F, HesteArray[I], SizeOf(THest)); end; CloseFile(F); end;
Du behøver sådan set ikke array'et i dette eksempel, men efter som du så ud til at være så glad for det, så lod jeg det bare blive! ;)
Hvis du så skal loade det hele ind i array'et igen, så kan du bruge det her:
type THest = record Mule: Real; Hale: Integer; end;
var F: File; Antal, I: Integer; HesteArray: array of THest; begin FileMode := fmOpenRead; AssignFile(F, 'c:\a.dat'); Reset(F, 1); BlockRead(F, Antal, SizeOf(Integer)); SetLength(HesteArray, Antal); for I := Low(HesteArray) to High(HesteArray) do begin BlockRead(F, HesteArray[I], SizeOf(THest)); ListBox1.Items[I].Caption := FloatToStr(HesteArray[I].Mule); // HesteArray[I].Hale := 1; Jeg ved ikke lige hvad du vil med den, men det er jo op til dig end; CloseFile(F); end;
De 2 procedurer SaveDeck og LoadDeck gemmer alle Card og henter alle Card uanset hvor mange der nu er i det dynamiske array. Antallet af cards i filen henter jeg vha. FileSize(DeckFile), hvis du vil finde antallet i det dynamiske array findes det med koden Length(Deck.TCards) som bla. bruges i SaveDeck for at finde ud af hvor mange der skal gemmes.
ok, roder lidt med det, du får ihvertfald lige points, og en stor tak for hjælpen :)
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.