Autor Beitrag
sunday_2
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 101


Delphi 7.0
BeitragVerfasst: 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

ausblenden 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
ausblenden 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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 101


Delphi 7.0
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mo 30.12.02 15:57 
Wie, du darfst nur mit typisierten Dateien arbeiten? :shock:

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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 101


Delphi 7.0
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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.

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 101


Delphi 7.0
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 101


Delphi 7.0
BeitragVerfasst: Mo 30.12.02 17:01 
Vielen Dank,

und einen 'Guten Rutsch ins neue Jahr!'

:dunce: :party: :dance:

_________________
Gruß Sunday

... wer nicht fragt, bleibt dumm!!!
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mo 30.12.02 17:12 
Gleichfalls! :)