Avatar billede kfz Nybegynder
18. april 2005 - 12:26 Der 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.

Tcard = record
  Name: string[50];
  Cost: 1..50;
  Race: TRaces;
  Race_Name: string[100];
  Civilization: TCivilizations;
  Type_: TTypes;
  Rules_Text: array [1..20] of string[200];
  Rules: TRules;
  Flavor_Text: string[100];
  Power: 1..50000;
  powerplus: boolean;
  Mana_Number: 1..50;
  Image: timage;
  Artist: string[50];
  Rarety: Char;
  Collector_Number: string[5];
  Set_: TSets;
end;
Tdeck = record
  numberofcards: 1..5000;
  TCards: array of TCard;
end;
type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Image1: TImage;
    Label1: TLabel;
    Memo1: TMemo;
    RadioGroup1: TRadioGroup;
    procedure Image1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    deck: tdeck;
    deckfile: file of tdeck;
  end;
Avatar billede kroning Nybegynder
18. april 2005 - 12:52 #1
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.
Avatar billede kfz Nybegynder
18. april 2005 - 12:59 #2
ville jeg så kunne lave en file of tcards
hvis tcards er et array self.

er 100% sikker på at jeg tidligere har lavet noget der lignede meget, og det virkede fint
Avatar billede kfz Nybegynder
18. april 2005 - 13:01 #3
så virker det, har gjort følgende

  Name: string[50];
  Cost: 1..50;
  Race: TRaces;
  Race_Name: string[100];
  Civilization: TCivilizations;
  Type_: TTypes;
  Rules_Text: array [1..20] of string[200];
  Rules: TRules;
  Flavor_Text: string[100];
  Power: 1..50000;
  powerplus: boolean;
  Mana_Number: 1..50;
  Image: timage;
  Artist: string[50];
  Rarety: Char;
  Collector_Number: string[5];
  Set_: TSets;
end;
TCards = array[1..1000] of TCard;
type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Image1: TImage;
    Label1: TLabel;
    Memo1: TMemo;
    RadioGroup1: TRadioGroup;
    procedure Image1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    cardfile: file of TCards;
  end;
Avatar billede kfz Nybegynder
18. april 2005 - 13:01 #4
kroning>>smid lige et svar.
Avatar billede martinlind Nybegynder
18. april 2005 - 13:04 #5
hvorfor ikke bare  cardfile: file of TCard; så har du ikke din begrænsning på 1000
Avatar billede kroning Nybegynder
18. april 2005 - 13:09 #6
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.
Avatar billede kroning Nybegynder
18. april 2005 - 13:11 #7
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
Avatar billede kfz Nybegynder
18. april 2005 - 13:15 #8
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
Avatar billede martinlind Nybegynder
18. april 2005 - 13:16 #9
VAR
  MyFile : File of TCard;

viker fint og er ikke et dynamisk array, og så kan du gemme 2 eller 10000 hvis det er det du vil.
Avatar billede kfz Nybegynder
18. april 2005 - 13:22 #10
men hvordan finder jeg så ud af hvor mange der er, skal jeg bare køre indtil EOF???
Avatar billede kroning Nybegynder
18. april 2005 - 13:24 #11
Er lige ved at lave et eks.
Avatar billede kfz Nybegynder
18. april 2005 - 13:32 #12
ok.
Avatar billede kroning Nybegynder
18. april 2005 - 13:37 #13
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;

Så burde det vel kunne gøre det.
Avatar billede kfz Nybegynder
18. april 2005 - 14:18 #14
det jeg ville have noget kode på var din ide med
VAR
  MyFile : File of TCard;

altså hvordan jeg finder ud af hvor mange der så er i filen, det eksempel du har givet, har jeg styr på.
Avatar billede kfz Nybegynder
18. april 2005 - 14:31 #15
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;
Avatar billede kroning Nybegynder
18. april 2005 - 14:43 #16
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.
Avatar billede kfz Nybegynder
18. april 2005 - 15:24 #17
ok, roder lidt med det, du får ihvertfald lige points, og en stor tak for hjælpen :)
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