Autor |
Beitrag |
jackie05
      
Beiträge: 357
|
Verfasst: Sa 24.01.09 19:06
Hallo,
ich hab da mal eine Frage, wie kann ich Felder lesen, die in der Datei sind?
Hier mal mein versuch:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| if OpenDialog1.Execute then begin Datei := TFileStream.Create(OpenDialog1.FileName, fmOpenRead); for y:=0 to High(Feld) do begin for x:=0 to High(Feld) do begin Datei.Read(Feld[x,y].Feld, SizeOf(String)); Datei.Read(Feld[x,y].Feld2, SizeOf(Integer)); Datei.Read(Feld[x,y].Feld3, SizeOf(Integer)); end; end; Datei.Free; end; |
das klappt irgendwie nicht, kann mir vieleicht jemand erklären, wie ich das ambesten machen kann?
Ich bedanke mich schonmal für die Hilfe.
MfG
|
|
jackie05 
      
Beiträge: 357
|
Verfasst: So 25.01.09 19:12
Hat keiner ne ahnung wie ich meine Felder von Datei lesen kann?
In BlitzMax kann ich so meine Felder laden:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| If Not Datei = 0 Then For Local xx:Int=0 Until FeldX For Local yy:Int=0 Until FeldY SpielFeld[xx,yy].Feld = ReadString(Datei,1) SpielFeld[xx,yy].SumeXOK = ReadInt(Datei) SpielFeld[xx,yy].SumeYOK = ReadInt(Datei) Next Next CloseFile(Datei) EndIf |
nur wie kann ich ReadInt und ReadString in Delphi benutzen?
MfG
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 25.01.09 19:21
Wenn Du uns mal erklärst, was Du genau mit "Feldern" meinst. Es scheint sich um ein 2-dimensionales Array zu handeln, seh ich das richtig? Und schau Dir Deine verschachtelten Schleifen nochmal genau an, die Laufvariable scheint nicht ganz zu stimmen.
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: So 25.01.09 19:24
Wie sieht die Datei aus, die du laden willst?
|
|
jackie05 
      
Beiträge: 357
|
Verfasst: So 25.01.09 19:29
Danke Dir.
Der Code ist von mir in BlitzMax geschrieben, ich wollte nur zeigen, wie ich es meine.
Ich möchte meine Felder in Delphi laden, dazu habe ich ein Typ mit Array verbunden:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| type TFeld = record Wert: integer; Feld: string; SumeX: integer; SumeY: integer; end;
var Form1: TForm1; Spielfeld: array[0..11,0..11] of TFeld; |
und möchte dann die werte die in der Datei stehen, die Felder übergeben.
Beispiel:
Datei.Read(Spielfeld[x,y].Wert,1)
also mit TFileStream, nur weiss ich nicht richtig, wie ich das jetzt anstellen soll.
Edit: So sieht die Datei innen aus:
Delphi-Quelltext 1:
| M M S S M S S M M S N N S N N S M S N N N N N N S N N N N N N N S N N N N N N M M S N N S N N M |
Ich hoffe, das man mir weiterhelfen kann.
Danke schonmal.
MfG
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 25.01.09 19:35
Dein Problem ist der String. SizeOf(String) ist immer 4, da es sich nur um einen Pointer handelt.
Der String scheint ja eine Länge von 1 zu haben, nimm doch einfach Char statt String als Typ. 
Zuletzt bearbeitet von jaenicke am So 25.01.09 19:35, insgesamt 1-mal bearbeitet
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: So 25.01.09 19:35
Und wie soll diese Datei interpretiert werden?
Wert, Feld, SumeX, SumeY - wie sind die in der Datei codiert? Feld scheint wie im Post drüber vermutet ein Char zu sein. Der Rest ist mir jetzt nicht so ganz klar 
|
|
jackie05 
      
Beiträge: 357
|
Verfasst: So 25.01.09 19:44
Wie die Datei Codiert ist, kann ich allerdings nicht genau beschreiben.
Hier mal ein beispiel, wie ich meine Felder in BlitzMax speicher:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| Local Datei:TStream = WriteFile("Datei.dat")
If Not Datei = 0 Then For Local xx:Int=0 Until FeldX For Local yy:Int=0 Until FeldY WriteString(Datei, SpielFeld[xx,yy].Feld) WriteInt(Datei, SpielFeld[xx,yy].SumeXOK) WriteInt(Datei, SpielFeld[xx,yy].SumeYOK) Next Next CloseFile(Datei) EndIf |
Ich weiss, das hier ist kein BlitzMax Forum, es soll ja nur ein beispiel sein, wie ich meine Felder in BlitzMax speicher.
In Delphi müsste es ja so ähnlich funktionieren, wenn ich mich nicht irre.
Edit: Ich habe das so in Delphi versucht:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TForm1.Button4Click(Sender: TObject); var x,y: integer; Datei: TFileStream; begin if OpenDialog1.Execute then begin Datei := TFileStream.Create(OpenDialog1.FileName, fmOpenRead); for y:=0 to 7 do begin for x:=0 to 5 do begin Datei.Read(Spielfeld[x,y].Feld, SizeOf(char)); Datei.Read(Spielfeld[x,y].SumeXOK, SizeOf(integer)); Datei.Read(Spielfeld[x,y].SumeYOK, SizeOf(integer)); end; end; Datei.Free; end; end; |
leider klappt das nicht so richtig.
MfG
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 25.01.09 19:47
Da musst du mit dem Debugger durchgehen und schauen wo falsche Werte gelesen werden...
|
|
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: So 25.01.09 20:14
Tip: Schreibe keine Strings oder Zahlen ohne Längenangabe in eine Datei.
Wie schon gesagt; strings = Pointer, oder Short-String oder oder oder.
Am besten immer Typ:Länge/Größe:Wert. Das ist dann auch noch kompatible, wenn ich die Datei statt
mit einem Integer mit einen Int64 lesen will
:-)Msch
_________________ ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: So 25.01.09 20:16
Für mich sieht es nicht danach aus, als wäre oben in der geposteten Datei irgendwelche Integer codiert, weder Binär noch als Text. Ich kann dir nur raten, ein allgemein bekanntes Format wie XML zu wählen. Das spart dir für die Zukunft Ärger.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 25.01.09 20:16
MSCH hat folgendes geschrieben : | Tip: Schreibe keine Strings oder Zahlen ohne Längenangabe in eine Datei.
Wie schon gesagt; strings = Pointer, oder Short-String oder oder oder.
Am besten immer Typ:Länge/Größe:Wert. Das ist dann auch noch kompatible, wenn ich die Datei statt
mit einem Integer mit einen Int64 lesen will |
Da es sich nur um einen Buchstaben handelt ist dies hier gar nicht nötig. Beim Debuggen sollte herauskommen ab wo falsche Werte ankommen. Die Frage ist z.B. ob SumeXOK und SumeYOK wirklich wie ein Delphi-Integer mir 4 Byte gespeichert werden.
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: So 25.01.09 20:18
Ich sehe zwischen den Buchstaben oben nur 8 Leerzeichen (meistens jedenfalls). Würde darauf hindeuten, dass dort tatsächlich 2 32-bit Integer sind, die im Forum nur nicht korrekt angezeigt werden. Statt Char würde ich AnsiChar schreiben, ansonsten geht es auf Delphi2009 nicht mehr.
Zuletzt bearbeitet von delfiphan am So 25.01.09 20:20, insgesamt 1-mal bearbeitet
|
|
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: So 25.01.09 20:20
Theoretisch ja - aber wer sagt, denn das ein Buchstabe nur aus 8 Bit (1 Byte) bestehen muss?
Stichwort: Unicode.
Msch
jaenicke hat folgendes geschrieben : | MSCH hat folgendes geschrieben : | Tip: Schreibe keine Strings oder Zahlen ohne Längenangabe in eine Datei.
Wie schon gesagt; strings = Pointer, oder Short-String oder oder oder.
Am besten immer Typ:Länge/Größe:Wert. Das ist dann auch noch kompatible, wenn ich die Datei statt
mit einem Integer mit einen Int64 lesen will | Da es sich nur um einen Buchstaben handelt ist dies hier gar nicht nötig. Beim Debuggen sollte herauskommen ab wo falsche Werte ankommen. Die Frage ist z.B. ob SumeXOK und SumeYOK wirklich wie ein Delphi-Integer mir 4 Byte gespeichert werden. |
_________________ ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
|
|
|