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


Delphi 7.0
BeitragVerfasst: Do 21.11.02 17:01 
Hi Leute,

ich hab ein riesen Prob: Ich habe in meinem Programm bisher mit Paradox 7 Tabellen gearbeitet und alles lief wunderbar. Nun sagt Chef alle Paradox 7 Tabellen raus und in typisierte Datei schreiben. :evil:
Nun gut, reinschreiben habe ich hinbekommen (denk ich).

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:
procedure TSpieldefinition.b_sound_vorClick(Sender: TObject);
var i,j: integer;
    TextDatei:TextFile;
begin
        if SaveDialog1.Execute then
        begin
           AssignFile(TextDatei,SaveDialog1.Filename);
           Rewrite(TextDatei); //Datei erstellen
       for i:=1 to 26 do
        begin
           Write(TextDatei,AEvent[i].Name);
           Write(TextDatei,AEvent[i].Zahl);
           Write(TextDatei,AEvent[i].Text);
           Write(TextDatei,AEvent[i].Grafik);
           Write(TextDatei,AEvent[i].Sound);
        end;
        for i:= 1 to 23 do
        for j:= 1 to 9 do
        begin
           Write(TextDatei,tormatrix[i,j].Name);
           Write(TextDatei,tormatrix[i,j].color);
        end;
        end;
end;

Nun will ich die Datei wieder einlesen und die Arrays (AEvent und tormatrix) wieder füllen. Habe dazu folgenden Coden bisher:
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:
procedure TSpieldefinition.b_datei_oeffnen_oeffnenClick(Sender: TObject);
var
    i,j: integer;
    Einlesen:Textfile;
begin
        if opendialog2.Execute then
           begin
              AssignFile(Einlesen, OpenDialog2.Filename);
              Reset(Einlesen);
              for i:=1 to 26 do
              begin
                 Read(Einlesen,AEvent[i].Name);
                 Read(Einlesen,AEvent[i].Zahl);
                 Read(Einlesen,AEvent[i].Text);
                 Read(Einlesen,AEvent[i].Grafik);
                 Read(Einlesen,AEvent[i].Sound);
              end;
              for i:=1 to 23 do
              for j:= 1 to 9 do
              begin
                 Read(Einlesen,tormatrix[i,j].Name);
                 Read(Einlesen,tormatrix[i,j].Color);
              end;
              button1.Click;
end;

Schmiert aber jedesmal ab, wenn ich die Datei öffnen will.
:?
Hat jemand eine :idea:

_________________
Gruß Sunday

... wer nicht fragt, bleibt dumm!!!
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Do 21.11.02 17:14 
hallo,

auf den ersten Blick:
1. closefile fehlt. damit ist die Dat noch offen und du hast keinen zugriff mehr
2. so wird das gar nix , schau dir mal eine von dir erzeugte Datei an:
wenn du eine Textdatei hast schreibst du
z.B. name rein (bsp: "Synday") bei auslesen liest du mit read aus, woher aber soll read wissen, wie lang das einzulesende sein soll?

nimm mal readln statt read und writeln statt write.
aber so wie du deinen Code aufgebuat hast, bekommst du probleme, wenn sich an der reihenfolge was ändert.

Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Do 21.11.02 17:26 
lies dir das mal durch:

www.tutorials.delphi...udateien/index.shtml

du kannst meines Wissens nach aber nicht 2 unterschiedliche Records in einer typisierten Datei unterbringen

Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Do 21.11.02 17:27 
Hallo,
sunday_2 hat folgendes geschrieben:
ich hab ein riesen Prob: Ich habe in meinem Programm bisher mit Paradox 7 Tabellen gearbeitet und alles lief wunderbar. Nun sagt Chef alle Paradox 7 Tabellen raus und in typisierte Datei schreiben. :evil:


Schlechte Idee wenn du micht fragst. Ich bin zwar abdolut kein Paradox Fan aber Datenbanken sind doch wesentlich leistungsstärker als ein einfaches Typ-File System.

sunday_2 hat folgendes geschrieben:
Nun will ich die Datei wieder einlesen und die Arrays (AEvent und tormatrix) wieder füllen.


Du kannst die hier ein Beispiel runterladen, vieleicht hilft es dir.

Gruß
Klabautermann
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Do 21.11.02 17:29 
Hallo,
Keldorn hat folgendes geschrieben:
nimm mal readln statt read und writeln statt write.

bei Typisierten Dateien sollte er tatsächlich Read und Write verwenden. Bei TextDateien ReadLn und WriteLn.

Gruß
Klabautermann
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Do 21.11.02 17:34 
Hallo,
Keldorn hat folgendes geschrieben:
du kannst meines Wissens nach aber nicht 2 unterschiedliche Records in einer typisierten Datei unterbringen

Er könnt diese zu einem Varianten Record-Typen zusammenfassen. Davon würde ich aber abraten, da er damit recht viel verschitt hat und somit Plattenplatz verschwendet.

Gruß
Klabautermann
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Do 21.11.02 17:36 
Klabautermann hat folgendes geschrieben:
Hallo,

bei Typisierten Dateien sollte er tatsächlich Read und Write verwenden. Bei TextDateien ReadLn und WriteLn.



das ist klar, aber er hat ja beides in seinen Code gemuddelt:

Zitat:

var
i,j: integer;
Einlesen:Textfile;

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
wulfskin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: Do 21.11.02 18:00 
Keldorn hat folgendes geschrieben:

du kannst meines Wissens nach aber nicht 2 unterschiedliche Records in einer typisierten Datei unterbringen
Warum sollte das nicht gehen? Wenn man weiss wie die Records aussehen, dann ist das absolut kein Problem. Ich programmieren seit je her mit Dateien, da ich kein Delphi Professional habe und deshalb leider nicht mit einer Datenbank arbeiten kann und bis jetzt habe ich alles noch in einer Datei speichern können! Warum auch nicht? Also wenn du, sunday_2, weiterhin Probleme damit hast, schreib ich dir auch ein Beispiel. Aber um ein paar Stichworte zu nennen:
"Old" Pascal:
File, BlockRead, BlockWrite (ich nehm die immer noch)
Delphi:
TFileStream

Gruß wulfskin!

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Do 21.11.02 18:06 
Hallo,
wulfskin hat folgendes geschrieben:
Keldorn hat folgendes geschrieben:

du kannst meines Wissens nach aber nicht 2 unterschiedliche Records in einer typisierten Datei unterbringen
Warum sollte das nicht gehen?

die Betonung lag auf Typisierte-Dateien. Was du verwendest sind Untypisierte-Dateien. Damit geht natürlich alles.

Gruß
Klabautermann
wulfskin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: Do 21.11.02 18:13 
Klabautermann hat folgendes geschrieben:
Hallo,
die Betonung lag auf Typisierte-Dateien. Was du verwendest sind Untypisierte-Dateien. Damit geht natürlich alles.

Gruß
Klabautermann
Ihr habt recht! Sorry! Also lieber untypisierte Dateien nehmen ;-)!

Gruß wulfskin!

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Do 21.11.02 18:14 
@wulfskin; bisher war ich der ansicht, wenn du Fileof Record Typx verwendest, da nur auch records Typx lesen schreiben kannst. Synday hat aber 2 unterschiedliche Records.
Rein vom ansatz her, woher willst du wissen, wieviele Datensätze von einem Typ in der datei drin sind. Da müßte man ja nochmal 2 zusätzliche variablen mit abspeichern, wo erstmal die anzahl mit drin steht ... und das wird so oder so doch mit einem File of Record ... nicht gehen.

Beispiel brauch ich keines, da ich meine Daten anders schreibe
(rewrite/reset ..., 1 Datensatz pro Zeile mit einem Trennzeichen (z.B. Tab),damit kann ich Änderungen in den Records besser behandeln)

Frank

edit : aarggh, zu langsam und zu viel getippert :wink:

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
sunday_2 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 101


Delphi 7.0
BeitragVerfasst: Fr 22.11.02 10:21 
OK, OK!

Erstmal danke für soviel hilfe. Das Tutoral ist übrigens echt gut gemacht.
Leider sind noch einige Fragen offen. Ich weiß zwar jetzt wie ich ein Record in eine Typisierte Datei rein und rausbekomme, aber nur bei einem normalen Record.
ausblenden Quelltext
1:
var datei: file of record;					

Wie mach ich das allerdings bei einem array auf record? Ich habe versucht
ausblenden Quelltext
1:
2:
tormatrix :file of array [0..23]of array [0..9] of TTorDaten; 
AEvent: file of array [1..26] of TEvent;

Dann bekomme ich aber bei
ausblenden Quelltext
1:
tormatrix[X,Y].Color := clWhite;					

die Fehlermeldung Array-Typ erforderlich. Bei AEvent natürlich das selbe.
Woran liegt das?
Wenn ich übrigens
ausblenden Quelltext
1:
2:
tormatrix :array [0..23]of array [0..9] of TTorDaten; 
AEvent: array [1..26] of TEvent;

deklariere, bekomme ich die Fehlermeldung Inkompatible Typen bei
ausblenden Quelltext
1:
AssignFile(AEvent,'Event.sdf');					

Und kann ich überhaupt gleichzeitig in zwei verschiedene typisierte Dateien schreiben? Ich denke mal schon, wenn nicht berichtigt mich bitte

_________________
Gruß Sunday

... wer nicht fragt, bleibt dumm!!!
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Fr 22.11.02 10:45 
Hallo,

die Datei als solche, stellt dich eine Art Dynamisches Array da.
Du warum schreibst du die Elemente deines Arrays nicht einfach in einer Schleife raus?

Gruß
Klabautermann
sunday_2 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 101


Delphi 7.0
BeitragVerfasst: Fr 22.11.02 11:14 
Hi Klabautermann,

Klabautermann hat folgendes geschrieben:
die Datei als solche, stellt dich eine Art Dynamisches Array da.
Du warum schreibst du die Elemente deines Arrays nicht einfach in einer Schleife raus?

Das versuche ich ja! :?
Leider klappt das nicht so, wie ich will. Ich poste dir mal das was ich bisher habe: Wäre echt nett, wenn du dir das mal anschaust. :wink:
Deklaration der Records
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
type
  TTorDaten = record
    Color: TColor;
    Name: String[5];
  end;
type
  TEvent = record
    Name: String[50];
    Zahl: String[10];
    Text: String[100];
    Grafik: String[100];
    Sound: String[100];
  end;

Variablendefinition:
ausblenden Quelltext
1:
2:
tormatrix : array [0..23]of array [0..9] of TTorDaten;
AEvent:  array [1..26] of TEvent;

Speicherfunktion: Es sollen die Arrays komplett gefüllt gespeichert werden.
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:
procedure TSpieldefinition.b_sound_vorClick(Sender: TObject);
var i,j: integer;
    Datei:TextFile;
    datensatz: TEvent;
begin
        if SaveDialog1.Execute then
        begin
           AssignFile(Datei,SaveDialog1.Filename);
           Rewrite(Datei); //Datei erstellen

       for i:=1 to 26 do
        begin
        Seek(Datei,FilePos(Datei)-1);
        datensatz.Name := AEvent[i].Name;
        datensatz.Zahl := AEvent[i].Zahl;
        datensatz.Text := AEvent[i].Text;
        datensatz.Grafik := AEvent[i].Grafik;
        datensatz.Sound := AEvent[i].Sound;
        Write(Datei,datensatz);
        end;
        (*for i:= 1 to 23 do
        for j:= 1 to 9 do
        begin
           Write(Datei,tormatrix[i,j].Name);
           Write(Datei,tormatrix[i,j].color);
        end; *)
        end;
        CloseFile(Datei);
end;

tormatrix ist hier ausgeklammert. War ein erster Versuch. Will jetzt erstmal ein Array in einer Typisierten Datei speichern.

Bei OnCreate und OnDestroy des Formulars habe ich folgenden Code (Derzeit allerdings inaktiv)
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TSpieldefinition.FormCreate(Sender: TObject);
var I, J, K, X, Y: Integer;
begin
(*        //Anlegen der Datei Event.sdf
        AssignFile(AEvent,'Event.sdf');
        if FileExists('Event.sdf') then
           ReSet(AEvent)
        else
           ReWrite(AEvent);
        //Anlegen der Datei Tormatrix.sdf
        AssignFile(tormatrix,'Tormatrix.sdf');
        if FileExists('Tormatrix.sdf') then
           ReSet(tormatrix)
        else
           ReWrite(tormatrix);*)
 end;
procedure TSpieldefinition.FormDestroy(Sender: TObject);
begin
(*        CloseFile(AEvent);
        CloseFile(tormatrix);*)
end;


Kennst Du vieleicht ein Tutoral über die Vorgehensweise von Arrays in Typisierte Dateien schreiben?

_________________
Gruß Sunday

... wer nicht fragt, bleibt dumm!!!
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Fr 22.11.02 11:56 
Hallo,
sunday_2 hat folgendes geschrieben:

Deklaration der Records
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
type
  TTorDaten = record
    Color: TColor;
    Name: String[5];
  end;
type
  TEvent = record
    Name: String[50];
    Zahl: String[10];
    Text: String[100];
    Grafik: String[100];
    Sound: String[100];
  end;


Da haben schon mal den ersten fehler. Wenn du das so machst, dann kann es dir Passoeren, das Dein Programm, wenn du es mal unter einer anderen DELPHI Version Kompilierst nicht mehr geht. Weil Borland die Blockgröße für Dateien geändert hat, deshalb solltest du die der Records Packen, dann werden die in der kleinst Möglichen größe gespeichert.
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
type
  TTorDaten = packed record
    Color: TColor;
    Name: String[5];
  end;
type
  TEvent = packed record
    Name: String[50];
    Zahl: String[10];
    Text: String[100];
    Grafik: String[100];
    Sound: String[100];
  end;



sunday_2 hat folgendes geschrieben:
Variablendefinition:
Speicherfunktion: Es sollen die Arrays komplett gefüllt gespeichert werden.
ausblenden Quelltext
1:
2:
3:
procedure TSpieldefinition.b_sound_vorClick(Sender: TObject);
var i,j: integer;
    Datei:TextFile;


Da haben wir Fehler Nummer 2. wie Keldorn weiter oben bemerkte, darfst du hier kein Textfile verwenden sonder musst folgende Deklaration nehmen:
ausblenden Quelltext
1:
Datei: FILE OF tEvent;					

sunday_2 hat folgendes geschrieben:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
    datensatz: TEvent;
begin
        if SaveDialog1.Execute then
        begin
           AssignFile(Datei,SaveDialog1.Filename);
           Rewrite(Datei); //Datei erstellen

       for i:=1 to 26 do
        begin
        Seek(Datei,FilePos(Datei)-1);
        datensatz.Name := AEvent[i].Name;
        datensatz.Zahl := AEvent[i].Zahl;
        datensatz.Text := AEvent[i].Text;
        datensatz.Grafik := AEvent[i].Grafik;
        datensatz.Sound := AEvent[i].Sound;
        Write(Datei,datensatz);
        end;

Soweit sollte es nach den änderungen Klappen. Allerdings kannst du es doch vereinfachen, wenn du den Zwischenschritt über datensatzt weglässt:
ausblenden Quelltext
1:
2:
for i:=1 to 26 do
  Write(Datei, AEvent[i]);

sunday_2 hat folgendes geschrieben:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
        (*for i:= 1 to 23 do
        for j:= 1 to 9 do
        begin
           Write(Datei,tormatrix[i,j].Name);
           Write(Datei,tormatrix[i,j].color);
        end; *)

Soetwas kann nicht klappen, da werder tTorDaten.Name, noch tTorDaten.Color vom Typ tEvent sind. In eine Typisierte Datei kannst du nur Daten diese einen Typs schreiben (wie Keldorn ja schon feststellte).

Ich denke damit kommst du ersteinmal ein stückchen weiter.

Gruß
Klabautermann
sunday_2 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 101


Delphi 7.0
BeitragVerfasst: Fr 22.11.02 13:05 
Hi Klabautermann,

vielen Dank, Du hast mir sehr geholfen. Wenn man sich das Ganze so anschaut, sieht das eigentlich auch ganz logisch aus.
Wenn es mal ne Wahl zum "Member of the Year" gibt, bist Du bestimmt ganz weit vorne. :wink:

_________________
Gruß Sunday

... wer nicht fragt, bleibt dumm!!!
wulfskin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: Fr 22.11.02 14:33 
Keldorn hat folgendes geschrieben:
@wulfskin; bisher war ich der ansicht, wenn du Fileof Record Typx verwendest, da nur auch records Typx lesen schreiben kannst.
Ich habe auch nicht gesagt, dass ich Fileof Record Typx benutzen möchte. Das hast du mich wohl falsch verstanden. Ich würde eine ganz normale untypisierte Datei vom Typ File estellen.

Gruß wulfskin!

P.S.: Wenn dich die Lösung auch noch interessiert, dann schreibe ich die auch noch!

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Fr 22.11.02 16:43 
wulfskin hat folgendes geschrieben:


P.S.: Wenn dich die Lösung auch noch interessiert, dann schreibe ich die auch noch!



ok, mach mal bitte, würd mich doch auch mal interessieren.

Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)