Autor Beitrag
da_cara
Hält's aus hier
Beiträge: 12

Win XP SP2
D7 Ent
BeitragVerfasst: Di 02.08.05 13:23 
Hi!

Ich bekomme, sobald ich versuche 2 verschiedene Records in eine Datei zu schreiben, folgenden fehler:

Im Projekt HLSS_DB.exe ist eine Exception der Klasse ERangeError aufgetreten. Meldung: 'Fehler bei Bereichsprüfung'.

ausblenden volle Höhe 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:
type TDatenSatz_Kopf = packed record
  FileVersion: String[10];
  Typ: String[8];
  Date: String[10];
  Time: String[8];
  OffDS: LongWord;
end;

type TDatenSatz_Set = packed record
  id: String[5];
  game: String[10];
  key: String[100];
  wert: String[10];
end;

type TDatenSatz_Map = packed record
  id: String[5];
  game: String[10];
  map: String[200];
end;

procedure TMain_Form.DatenbankSpeichern1Click(Sender: TObject);
var
  Daten_Kopf: TDatenSatz_Kopf;
  Daten_Map: Array of TDatenSatz_Map;
  Daten_Set: Array of TDatenSatz_Set;
  MyFile: file of byte;
  ListItem: TListItem;
  I: Integer;
  DS: Integer;
begin
  I := ListView1.Items.Count -1;
  try
  AssignFile(MyFile,DBFile);
  ReWrite(MyFile);
// Header wird in Record gespeichert
  Daten_Kopf.FileVersion := FileVersion;
  Daten_Kopf.Date := Date;
  Daten_Kopf.Time := Time;
  Daten_Kopf.Typ := Typ;
  Daten_Kopf.OffDS := SizeOf(Daten_Kopf);
// Header wird geschrieben
  BlockWrite(MyFile,Daten_Kopf,SizeOf(TDatenSatz_Kopf));
// Map Record wird geschrieben
  if DB = 0 then
    begin
      SetLength(Daten_Map,I);
      for DS := 0 to ListView1.Items.Count -1 do
        begin
          ListItem := ListView1.Items.Item[I];
          Daten_Map[I].id := ListItem.Caption;
          Daten_Map[I].game := ListItem.SubItems[0];
          Daten_Map[I].map := ListItem.SubItems[1];
// Map Daten werden geschrieben
          BlockWrite(MyFile,Daten_Map[I],SizeOf(TDatenSatz_Map));
        end;
    end;
// Set Record wird geschrieben
  if DB = 1 then
    begin
      SetLength(Daten_set,I);
      for DS := 0 to ListView1.Items.Count -1 do
        begin
          ListItem := ListView1.Items.Item[I];
          Daten_Set[I].id := ListItem.Caption;
          Daten_Set[I].game := ListItem.SubItems[0];
          Daten_Set[I].key := ListItem.SubItems[1];
          Daten_Set[I].wert := ListItem.SubItems[2];
// Set Daten werden geschrieben
          BlockWrite(MyFile,Daten_Set[I],SizeOf(TDatenSatz_Set));
        end;
    end;
// Datei wird geschlossen
  finally
    CloseFile(MyFile);
  end;
end;


Habe schon mehrere Varianten ausprobiert. Keine mit erfolg.
Danke schon mal im Vorraus!
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 02.08.05 13:42 
Moin!

Ich bin ehrlich und gebe zu, dass ich zu faul bin, mir eine Testumgebung für deine Prozedur zu machen. Spricht was dagegen das Projekt (ohne die EXE) hier in den Anhang zu stellen?

Ganz anderer Ansatz: Wenn du nicht exorbitant viele Datensätze hast, dann würde ich INI-Dateien verwenden; damit hat man einfach viel weniger Kompatibilitätsprobleme und man kann den Output auch so lesen, ohne gleich immer einen HexEditor nehmen zu müssen. :wink:

cu
Narses
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Di 02.08.05 14:09 
anscheinedne brauchst du ja kein array, d.h. du es reicht ein TDatenSatz_Map und ein TDatenSatz_Set
aber wenn du das so machen willst wie du das im moment hast

wieso greifst du in der forschleife bzw beim hinzufügen immer auf I zu obwohl! die schleifenvariable DS heißt, das macht für mich keinen sinn

_________________
wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
smiegel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: Di 02.08.05 14:09 
Hallo,

müsste es nicht statt
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
        SetLength(Daten_Map,I); 
        for DS := 0 to ListView1.Items.Count -1 do  
        begin  
          ListItem := ListView1.Items.Item[I];  
          Daten_Map[I].id := ListItem.Caption;  
          Daten_Map[I].game := ListItem.SubItems[0];  
          Daten_Map[I].map := ListItem.SubItems[1];  
          BlockWrite(MyFile,Daten_Map[I],SizeOf(TDatenSatz_Map));  
        end;

so aussehen?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
        SetLength(Daten_Map, I);   
        for DS := 0 to ListView1.Items.Count -1 do  
        begin  
          ListItem := ListView1.Items.Item[DS];  
          Daten_Map[DS].id := ListItem.Caption;  
          Daten_Map[DS].game := ListItem.SubItems[0];  
          Daten_Map[DS].map := ListItem.SubItems[1];  
          BlockWrite(MyFile, Daten_Map[DS], SizeOf(TDatenSatz_Map));  
        end;


Die Array-Deklarationen für Daten_Map und Daten_Set kannst Du Dir schenken.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
        for DS:=0 to ListView1.Items.Count-1 do  
        begin  
          ListItem := ListView1.Items.Item[DS];  
          Daten_Map.id := ListItem.Caption;  
          Daten_Map.game := ListItem.SubItems[0];  
          Daten_Map.map := ListItem.SubItems[1];  
          BlockWrite(MyFile, Daten_Map, SizeOf(TDatenSatz_Map));  
        end;  
        ...
        // gleiches gilt analog für Daten_Set

_________________
Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
da_cara Threadstarter
Hält's aus hier
Beiträge: 12

Win XP SP2
D7 Ent
BeitragVerfasst: Di 02.08.05 20:39 
Danke für die Antworten.

Der Fehler lag in der Array Deklaration. Ich habe einfach die Array Deklaration weggelassen und den kleinen Fehler mit der Integer Var 'DS' behoben, schon gings :)

Das mitm auslesen war dann ja auch nicht mehr die kunst.

Dangöö dangöö