Autor |
Beitrag |
sunday_2
Beiträge: 101
Delphi 7.0
|
Verfasst: Mo 30.12.02 13:34
Hi Leute,
ich habe folgendes Prob:
Ich nutze ein Record in dem ein anderes Record drin ist. Wenn ich das Programm compiliere bekomme ich die Fehlermeldung "Typ 'TStatistik' benötigt Finalization - nicht im Dateityp erlaubt. Ich hab allerdings keine Ahnung warum er diese Fehlermeldung ausgibt. Ich kann den Fehler nicht finden. Ich poste einfach mal den Code. Vieleicht ist es ja ein recht banaler Fehler.
1. record
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| type TSpieler = packed record Punktekonto: array of integer; Platz: integer; PlTemp: boolean; hoechstePunktzahl: integer; Speedkonto: array of integer; SchussNr: integer; Name: string[25]; Vorname: string[25]; Mannschaft:string[30]; Str: string[30]; plz: string[5]; ort: String[30]; land: String[20]; telefon: String[30]; alter: String[5]; Torgrafik: array of TBitmap; end; |
2. record
Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| type TStatistik = packed record Feld: array[1..23] of array[1..9] of Integer; Schussnr: integer; Spielnr: integer; Wiederholung_spiel: integer; spielerergebnisse: array of TSpieler; //hier ist das erste record implementiert end; |
hier will ich die Datei schreiben
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure Tfun_football.Statistik_allgemein(); var i,j: integer; FStatistik: File of TStatistik; // hier kommt die Fehlermeldung begin setLength(statistik.spielerergebnisse,akt_Spieler); for i:=0 to akt_Spieler do begin for j:= 0 to StrToInt(regeln.anzahl_schuss) do begin statistik.spielerergebnisse[i].Punktekonto[j]:= game[i].Punktekonto[j]; statistik.spielerergebnisse[i].Speedkonto[j] := game[i].Speedkonto[j]; end; statistik.spielerergebnisse[i].Name:= game[i].Name; statistik.spielerergebnisse[i].Vorname:= game[i].Vorname; statistik.spielerergebnisse[i].Mannschaft:= game[i].Mannschaft; end; AssignFile(FStatistik,ExtractFilePath(ParamStr(0))+'Statistik_allgemein.kpt'); if FileExists('Statistik_allgemein.kpt') then Seek(FStatistik,fileSize(FStatistik)-1); ReWrite(FStatistik); write(FStatistik,statistik); end; |
_________________ Gruß Sunday
... wer nicht fragt, bleibt dumm!!!
|
|
Udontknow
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Mo 30.12.02 15:40
Hi!
Diese Meldung erscheint deshalb, weil du dynamische Datenstrukturen (z.B. die Bitmaps oder auch die dynamischen Arrays) in einem Record hast. Dieser ist dann nicht per "File of" speicherbar, da das Programm ja nicht weiss, was es z.B. dann beim Speichern eines Bitmaps machen soll.
Cu,
Udontknow
|
|
sunday_2
Beiträge: 101
Delphi 7.0
|
Verfasst: Mo 30.12.02 15:50
Gibt es denn eine Möglichkeit die Sachen doch zu speichern. Ich darf übrigens nur mit typisierte Dateien arbeiten.
_________________ Gruß Sunday
... wer nicht fragt, bleibt dumm!!!
|
|
Udontknow
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Mo 30.12.02 15:57
Wie, du darfst nur mit typisierten Dateien arbeiten?
Es gibt keine Möglichkeit, Records mit dynamischen Inhalt in eine typisierte Datei zu quetschen. Eine typisierte Datei geht eben gerade davon aus, das jeder Record den gleichen Speicherplatz benötigt.
Du musst weg von der typisierten Datei und z.B. einen Stream benutzen.
Mache das demjenigen klar, der meint, typisierte Dateien wären ein Muss.
Cu,
Udontknow
|
|
sunday_2
Beiträge: 101
Delphi 7.0
|
Verfasst: Mo 30.12.02 16:04
was ist denn ein stream???
auflage ist, das ich keine Datenbanken nutzen darf.
_________________ Gruß Sunday
... wer nicht fragt, bleibt dumm!!!
|
|
Udontknow
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Mo 30.12.02 16:14
Na, da kann ich dich beruhigen, das ist nix mit Datenbanken.
Ein Stream wird genutzt, um Datenmengen zu verarbeiten und dann auf vielfältigste Weise zu benutzen. So kannst du Daten in einen Stream schreiben, der dann die Daten an eine IP sendet oder sie dir komprimiert in eine Datei schreibt.
Für deine Zwecke ist ein TFileStream ausreichend.
Hier mal ein Beispiel, um 3 Variablen in eine Datei zu speichern und sie wieder auszulesen.
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| var Z1:Integer; var Z2:Byte; var Z3:String[50];
procedure TForm1.SaveVars; var Stream:TFileStream; begin Stream:=TFileStream.Create('C:\Test.dat', fmCreate); try Stream.WriteBuffer(Z1,SizeOf(Z1)); Stream.WriteBuffer(Z2,SizeOf(Z2)); Stream.WriteBuffer(Z3,SizeOf(Z3)); finally Stream.Free; end; end;
procedure TForm1.LoadVars; var Stream:TFileStream; begin Stream:=TFileStream.Create('C:\Test.dat', fmOpenRead); try Stream.ReadBuffer(Z1,SizeOf(Z1)); Stream.ReadBuffer(Z2,SizeOf(Z2)); Stream.ReadBuffer(Z3,SizeOf(Z3)); finally Stream.Free; end; end; |
Du musst dann eine Routine schreiben, die die einzelnen Daten aus dem File herausliest. Bei einem Array musst du noch die Anzahl der Elemente ebenfalls abspeichern, damit du beim Einlesen weisst, wie oft du welchen Record nun lesen musst. Das ganze geht dann natürlich auch verschachtelt.
Cu,
Udontknow
|
|
sunday_2
Beiträge: 101
Delphi 7.0
|
Verfasst: Mo 30.12.02 16:45
Danke erstmal
ich glaub mit dem Umstellen habe ich jetzt erstmal genug zu tun.
Nur noch eine Frage: Kann ich bei einem Stream auch Daten anhängen?
Die Procedure die ich oben beschrieben habe, soll nämlich folgendermaßen funktionieren. Im Spielbetrieb werden die Ergebnisse nach jedem Spiel in einem Stream geschrieben (je Länger der Spielbetrieb desto mehr Ergebnisse für das Stream). Wird der Spielbetrieb beendet und der Statistikteil aufgerufen, soll der Stream ausgelesen und danach geleert oder gelöscht werden. Damit soll verhindert werden, das die Daten nicht mehrfach in den Statistikteil kommen.
_________________ Gruß Sunday
... wer nicht fragt, bleibt dumm!!!
|
|
Udontknow
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Mo 30.12.02 16:53
Natürlich kannst du Daten anhängen. Solange der Stream nicht freigegeben ist, kannst du so oft WriteBuffer aufrufen, wie du willst. Die Daten werden nacheinander in die Datei geschrieben.
Wenn du nach dem Schliessen aber die Datei erneut per Stream öffnen willst und diese Datei nicht überschreiben, sondern erweitern willst, musst anstelle fmCreate den Parameter fmOpenReadWrite verwenden, und du musst den Cursor ans Ende des Streams stellen (Stream.Position:=Stream.Size-1).
Cu,
Udontknow
|
|
sunday_2
Beiträge: 101
Delphi 7.0
|
Verfasst: Mo 30.12.02 17:01
Vielen Dank,
und einen 'Guten Rutsch ins neue Jahr!'
_________________ Gruß Sunday
... wer nicht fragt, bleibt dumm!!!
|
|
Udontknow
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Mo 30.12.02 17:12
Gleichfalls!
|
|