Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 14:23

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Eigenes Dateiformat / Levels laden
BeitragVerfasst: Sa Okt 08, 2005 09:56 
Offline
DGL Member
Benutzeravatar

Registriert: So Jun 05, 2005 15:08
Beiträge: 39
Wohnort: Bei Bayreuth
Hi!

Ich progge grad an einer Engine, aber bei meiner letzten Version hatte ich das Problem, dass das Laden der Leves zu kompliziert war, weil es zu viele Variablen gab, da hab ich dann den Überblick verloren.

Jetzt wollte ich wissen: Wie kann man ein gesammtes Array von Records aus einer Datei laden, bzw. ein Dateiformat erstellen, das die Daten direkt als Record speichert, weil das Auslesen von txt-Dateien sehr umständlich ist!

Ich hoffe ich habe mich verständlich ausgedrückt :) !

MFG gmgler

_________________
Geniale Menschen sind selten ordentlich, ordentliche selten genial (Albert Einstein)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 08, 2005 10:30 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Es gibt mehere Möglichkeiten:
z.B.
viewtopic.php?t=2111
oder:
viewtopic.php?t=2010

MfG
Flo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 08, 2005 11:09 
Offline
DGL Member
Benutzeravatar

Registriert: So Jun 05, 2005 15:08
Beiträge: 39
Wohnort: Bei Bayreuth
Danke, die 2. Lösung war die, die ich gesucht habe!
Hab den Topic aber mit der Suche nicht gefunden :oops:

Danke, Mfg gmgler

_________________
Geniale Menschen sind selten ordentlich, ordentliche selten genial (Albert Einstein)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 09, 2005 17:20 
Offline
DGL Member
Benutzeravatar

Registriert: So Jun 05, 2005 15:08
Beiträge: 39
Wohnort: Bei Bayreuth
Dann hätte ich da aber doch noch eine Frage:
Ich lade mein Level immo so:
Code:
  1.  
  2. procedure LoadLevel(Level: string);
  3. var
  4. F : TFileStream;
  5. i: integer;
  6. begin
  7. F := TFileStream.Create(Level, fmOpenRead);
  8. i:=0;
  9. while i < ObjektAnzahl do begin
  10. F.Read(Objekt[i], High(Objekt));
  11. i:=i+1;
  12. end;
  13.  
  14. Form1.Caption:=floattostr(Objekt[0].Gewicht);
  15.  
  16. F.Free;
  17. end;
  18.  


Das speichern läuft genauso, nur mit read statt write, und fmCreate statt fmOpenRead.

Wärend ich den Editor laufen hab, kann ich speichern, und die Datei auch wieder laden, wenn ich aber das Programm ganz beende, und neu starte und dann lade, sind alle Daten wieder weg :cry: .

Jemand Ahnung? Irgendein Tipp woran es liegen könnte?
Mfg gmgler

_________________
Geniale Menschen sind selten ordentlich, ordentliche selten genial (Albert Einstein)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 09, 2005 17:31 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Das liegt vermutlich daran, dass du Zeiger mit abspeicherst, aber nicht den Inhalt hinter dem Zeiger. Solange das Programm noch läuft ist alles in Ordnung und das geht noch gut, aber beim Neustart steht dann an der Addresse vermutlich was anderes. Strings sind z.B. auch Zeiger und die darf man nicht einfach so in einem record abspeichern. Das geht nur mit ShortString. Wenn Objekt[0],Objekt[1] usw. Klassen sind dann geht es sowieso nicht. Dann speichert Write nur den Zeiger auf das Objekt ab.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 10, 2005 14:52 
Offline
DGL Member
Benutzeravatar

Registriert: So Jun 05, 2005 15:08
Beiträge: 39
Wohnort: Bei Bayreuth
Objekt[0],... sind Records, also muss ich String durch ShortString ersetzen oder?
Aber warum speichert das dann keine Zahlen? Z.B. :
Ich öffne den Editor, setzte Objekt[0].Gewicht:=100;
speicher.
Setzte Objekt[0].Gewicht:=0;
lade.
Objekt[0].Gewicht=100 :arrow: es funktioniert.
beende ich und lade neu: Objekt[0].Gewicht=0 :arrow: es funktioniert nicht!
mit den Zeigern ist bestimmt die richtige Erklärung, aber was kann ich dagegen tun? Die Datei in die ich speicher, und die ich lade existiert auch nach dem beenden, lässt sich aber nicht laden!

:?:

Ich hoffe, mir kann jemand weiterhelfen, Danke für eure Bemühungen!

Mfg gmgler

_________________
Geniale Menschen sind selten ordentlich, ordentliche selten genial (Albert Einstein)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 10, 2005 14:59 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Statt High(Objekt)) muß da noch High(Objekt) * sizeof(Objekt[0]) hin.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 10, 2005 15:04 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Noch was. Benutz bloß keine "normalen" Records. Du musst Packed als Zusatz bei dem Record hinzufügen, da Delphi die Records ansonsten erweitern kann. Und zwar nur intern. Wenn du also Glück hast fügt Delphi dir da noch 1-7 Bytes hinzu. Das ist beim Laden dann zwar auch so, aber wenn du das verhalten rein zufällig mal änderst bekommst du echt probleme. Oder jemand anders will die mal laden.

Code:
  1. TBlub = packed record
  2.   // Felder
  3. end;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 10, 2005 15:18 
Offline
DGL Member
Benutzeravatar

Registriert: So Jun 05, 2005 15:08
Beiträge: 39
Wohnort: Bei Bayreuth
Danke für eure schnellen Antworten, aber leider lößt dass mein Problem noch nicht :cry: .
Es sind immernoch die Daten weg, wenn ich erneut das proggi starte und lade.

_________________
Geniale Menschen sind selten ordentlich, ordentliche selten genial (Albert Einstein)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 10, 2005 15:22 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Listen und so sachen kann man auch nicht einfach so speichern. Die arbeiten alle mit Pointern. Du kannst nur die Basistypen speichern. Das sind alle Zahlen, Boolean, und Char. Alles andere is Asche.
Du musst also beim Speichern deiner Klassen die ganzen Teilkomponenten speichern, und beim Laden musst du eine neue Instanz anlegen und dann die geladenen Werte wieder an die passende STelle schreiben.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 10, 2005 15:28 
Offline
DGL Member
Benutzeravatar

Registriert: So Jun 05, 2005 15:08
Beiträge: 39
Wohnort: Bei Bayreuth
Ach so?

Aber Sascha Willems schreibt im anderen Thread (der 2. Link) :
Zitat:
...dann schau dir mal den TFileStream an, in den man direkt Records reinschreiben kann,und dessen Daten da in einem für Menschen unlesbaren Formate gespeichert werden....

_________________
Geniale Menschen sind selten ordentlich, ordentliche selten genial (Albert Einstein)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 10, 2005 15:31 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Da kenn ich mich nicht mit aus...ich hab immer nur Grunddaten geschrieben. Das is auch gar nicht sooo aufwendig. Du musst dir halt nur für Strings und Felder eigene Speicherfunktionen schreiben. Dann kannst du den Speichervorgang leicht aufdröseln z.B.
Code:
  1.  
  2. procedure speichereKlasse(Stream);
  3. begin
  4.        speichereString(Name);
  5.        speichereString(Adresse);
  6.        Stream.Write(Alter, SizeOf(Alter));
  7.        speichereFeld2i(Feld);
  8.        ...
  9. end;

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 10, 2005 15:43 
Offline
DGL Member
Benutzeravatar

Registriert: So Jun 05, 2005 15:08
Beiträge: 39
Wohnort: Bei Bayreuth
Ohhhh, ich hab den Fehler gefunden!
High(Objekt) kann nicht funktionieren, da es sich um ein statisches Arry von Records handelt, wobei einzelne stückweise ausgetauscht werden, daher gibt es speicherprobleme, die aber unterdrückt werden. Dadurch wird ObjektAnzahl auf ein par Umwegen 0, deshalb wird beim Laden einfach 0 * ein Objekt geladen, woraus natürlich nichts wird! Habs ausgebessert, jetzt gehts, vielen vielen Dank, über diesen "Exkurs" bin ich auf das Problem gekommen, was ich beim Versuch, den Loader euren Vorschlägen anzupassen, nur zufällig entdeckt habe!

Danke, mfg
gmgler

_________________
Geniale Menschen sind selten ordentlich, ordentliche selten genial (Albert Einstein)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 10, 2005 16:33 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
@Flash: Records kann man durchaus problemlos in Dateien schreiben. Man muss lediglich peinlichst darauf achten, dass keine Pointer etc. verwendet werden. Und dazu zählen auch Strings und was weiß ich nicht alles. Sollte man nur Zahlen, Bools etc habe, dann ist es völlig unproblematisch. Benutze ja auch Records um mich durch meine Speicherbereiche durchzuhangeln. ;-) Bei Listen hast du aber recht. Da geht es nicht einfach so. Ich persönlich schreibe aber auch lieber alle Werte einzeln, da es einfach sicherer ist. Man bemerkt Fehler recht schnell und kann im Hintergrund Objekte anlegen die dann ihre Daten aus der Datei laden etc.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Okt 10, 2005 16:35 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Es gibt auch noch diese TReader,TWriter Klassen die nützliche Methoden wie WriteInteger,WriteString ReadInteger,ReadString usw.. haben.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 15 Queries | GZIP : On ]