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!

user profile iconNiko S. hat folgendes geschrieben Zum zitierten Posting springen:
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:

Quelltext
1:
amis Map                               

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

user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:
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..30of array[0..30of TTile;
    NPC : array[1..15of Integer;
    SpawnX : array[1..15of Byte;
    SpawnY : array[1..15of Byte;
    Owner : String;
    Scrolling : Byte;
    Weather : Integer;
  end;

  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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