Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Binäre Daten einlesen funktioniert nicht so ganz
Niko S. - Fr 17.07.09 13:46
Titel: Binäre Daten einlesen funktioniert nicht so ganz
Also ich würde gerne eine Datei laden die soweit ich das überblicken kann aus diesem Record besteht:
http://www.delphi-forum.de/topic_Namen+im+Record_93720.html
Das Einzige was nicht funktioniert ist das mit dem "Type" aber das ist (hoffe ich) nicht unbedingt schlim...
Nunja auf jedenfall kann ich diese Datei einfach nicht laden obwohl da nur ein Missmatch besteht unzwar Type / Type2 (Bei meinen Records)
die Ladeprozeduren sehen so aus: (original)
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| Sub LoadMaps() Dim FileName As String Dim I As Integer Dim f As Integer
Call CheckMaps
For I = 1 To MAX_MAPS temp = I / MAX_MAPS * 100 Call SetStatus("Loading maps... " & temp & "%") FileName = App.Path & "\maps\map" & I & ".dat"
f = FreeFile Open FileName For Binary As #f Get #f, , Map(I) Close #f
Next I
End Sub |
Und das habe ich über einen Stream in Delphi probiert aber irgendwie bekomme ich da keine werte raus,
kann mir da vielleicht wer helfen?
// Edit CheckMaps ist nur zum prüfen ob die Datein existieren und eventuell zu "clearen" also 0 werte einzutragen.
Narses - Fr 17.07.09 13:51
Moin!
Niko S. hat folgendes geschrieben : |
Und das habe ich über einen Stream in Delphi probiert aber irgendwie bekomme ich da keine werte raus,
kann mir da vielleicht wer helfen? |
Bestimmt, aber :gruebel: wo ist dein Code? ;)
cu
Narses
Niko S. - Fr 17.07.09 13:53
Wah doch noch was vergessen..
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| var Mapfile: TFileStream; begin MapFile := TFileStream.Create(Datei, fmOpenRead + fmShareDenyWrite); try MapFile.read(Map, SizeOf(Map)); finally FreeAndNil(MapFile); end; |
Hab so das gefühl, dass das nicht so dem code enspricht von VB aber irgendwie kann ich VB nicht so ganz lesen.
Delete - Fr 17.07.09 13:58
Was ist Map und was meinst du mit "bekomme keine Werte raus"?
Niko S. - Fr 17.07.09 14:38
steht in dem Thread im den ich verlinkt habe im ersten post.
map ist ein record..
was leider nicht ganz übereinstimmt mit den original vielleicht liegt es ja daran?
Und mit keine werte meine ich, dass die werte (zumindest in der Tile array immer 0 sind..)
//Edit
Reinhard Kern hat im vorherigen Thread ja noch einmal geantwortet und ich habe das jetzt ins "packed record"
übernommen aber die werte sind immernoch 0..
gerade bei Revision sollte der wert nicht 0 sein...
Jetzt habe ich noch einmal in "Name" einfach mal "Kamis Map" eingetragen aber mit delphi lese ich aus der Datei:
Und ich bekommen nen runtime error wenn ich das Programm wieder schließe oO
Quelltext
1: 2: 3: 4: 5: 6: 7:
| --------------------------- Error --------------------------- Runtime error 216 at 0040383E --------------------------- OK --------------------------- |
Niko S. - Sa 18.07.09 18:52
Bump
Das Problem besteht immernoch..
Hier ist der Link zum kompletten Source
http://freemmorpgmaker.com/Eclipse-Evolution-2.8-Source.rar
Ich weiß im moment nicht wie ich das Debuggen soll, ich hab so das gefühl das irgendwie alles um 1 verschoben ist oder so.
(Siehe Mapname = Kamis Map aber auslesen kann ich nur "amis Map" und irgend ein Zeichen..)
Vielleicht noch ein paar Infos:
modDatabase.bas im Client ordner: Steht der Source fürs laden und speichern
modTypes -> typendeclaration für das map format
Xentar - Sa 18.07.09 18:58
1. Runtime error mit einem FileStream? Äh, sowas hab ich ja noch nie gesehen.. Zeig bitte nochmal den aktuellen Code. Oder ist das der selbe wie oben?
2. Du verwendest in deinem Record den Typ String, OHNE eine Länge anzugeben. Das kann unter Delphi Probleme geben. Versuch mal ShortString. Das hat eine maximale Größe von 255 Zeichen.
Niko S. - Sa 18.07.09 19:04
Der code ist der Selbe..
Habs auf Shortstring geändert bis auf "name" weil dort ja länge angegeben ist..
Hab mal eine mapfile hochgeladen
Delete - So 19.07.09 06:16
Xentar hat folgendes geschrieben : |
| 1. Runtime error mit einem FileStream? |
Runtime error 216 ist eine AccessViolation.
| Zitat: |
| steht in dem Thread im den ich verlinkt habe im ersten post. |
Ich liebe es, wenn man sich seine Informationen zum helfen erst überall zusammensuchen muss.
jaenicke - So 19.07.09 08:00
In deinem Record ist ein dynamisches Array enthalten, wie soll das funktionieren? Das ist ja nur ein Pointer (4 Byte)...
Niko S. - So 19.07.09 08:09
Ich habs auch mit nem statischen Array probiert aber irgendwie funkioniert das auch nicht...
Delphi-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: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls;
type TTile = packed record Ground : LongInt; Mask : LongInt; Anim : LongInt; Mask2 : LongInt; M2Anim : LongInt; Fringe : LongInt; FAnim : LongInt; Fringe2 : LongInt; F2Anim : LongInt; Type1 : Byte; Data1 : LongInt; Data2 : LongInt; Data3 : LongInt; String1 : ShortString; String2 : ShortString; String3 : ShortString; Light : LongInt; GroundSet : Byte; MaskSet : Byte; AnimSet : Byte; Mask2Set : Byte; M2AnimSet : Byte; FringeSet : Byte; FAnimSet : Byte; Fringe2Set : Byte; F2AnimSet : Byte; end;
TMap = packed record Name : String[20]; Revision : Integer; Moral : Byte; Up : Integer; Down : Integer; Left : Integer; Right : Integer; music : ShortString; BootMap : Integer; BootX : Byte; BootY : Byte; Shop : Integer; Indoors : Byte; Tile : array[0..30] of array[0..30] of TTile; NPC : array[1..15] of Integer; SpawnX : array[1..15] of Byte; SpawnY : array[1..15] of Byte; Owner : String; Scrolling : Byte; Weather : Integer; end;
TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; procedure Button1Click(Sender: TObject); private public end;
var Form1: TForm1; Map : TMap;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); var Mapfile: TFileStream; begin MapFile := TFileStream.Create('C:\Users\Kami\Desktop\Server\Maps\map1.dat', fmOpenRead + fmShareDenyWrite); try MapFile.read(Map, SizeOf(Map)); finally FreeAndNil(MapFile); end; Memo1.Lines.Add(Map.Name); Memo1.Lines.Add(IntToStr(Map.Revision)); end;
end. |
So sieht das im Moment aus
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!