MagicMagor
16.06.2004, 22:36
Diesmal habe ich, denke ich, wirklich ein Problem, auf das ich mir keinen Reim machen kann.
Ich habe ein dynamisches Array "VolkDaten" dessen Inhalt ich in ein IniFile schreiben will. Das Array wird vorher dimensioniert und auch gefüllt.
Hier mal der Code der Funktion zum Schreiben in das IniFile:
procedure TPeople.ResetIniDataVolk;
var Ini: TIniFile;
i: integer;
Datei: Textfile;
b: TGroupBuilding;
u: TGroupUnit;
Test:string;
begin
ResetVolkData;
AssignFile(Datei, GamePath+'daten\volk.ini');
try
ReWrite(datei);
CloseFile(datei);
// Ini-Datei beschreiben:
Ini:=TIniFile.Create(GamePath+'daten\volk.ini');
Ini.WriteInteger('Allgemein', 'Anzahl', 4);
for i:=0 to 3 do
begin
with VolkDaten[i] do
begin
Ini.WriteString('Allgemein', 'Volk'+InttoStr(i), Name);
for b:=Farm to Military do
Ini.WriteInteger(Name, 'BuildingHP'+TGrBuildtoStr(b), BuildingHP[b]);
for u:=Regular to Artilery do
begin
Ini.WriteInteger(FVolkDaten[i].Name, 'UnitHP'+TGrUtoStr(u), FVolkDaten[i].UnitHP[u]);
Ini.WriteInteger(FVolkDaten[i].Name, 'UnitAttack'+TGrUtoStr(u), FVolkDaten[i].UnitAttack[u]);
Ini.WriteInteger(FVolkDaten[i].Name , 'UnitDefense'+TGrUtoStr(u), FVolkDaten[i].UnitDefense[u]);
end;
end;
end;
finally
Ini.Free;
end;
end;
An der fett markierten Zeile bricht das Programm dann mit einer EAccessViolation ab. Das interessante und für mich seltsame, an der Geschichte ist, daß ich vorher eine Funktion hatte, die das Array korrekt in ein IniFile geschrieben hat. Die einzigen Änderung die ich vorgenommen habe um zu obiger Prozedur zu kommen waren:
- Das Array als Property der Klasse TPeople eingeführt und die Prozedur zu einer Methode selbiger Klasse gemacht.
- Einige Schleifen eingeführt
Wenn ich obigen Code als eigenständige Prozedur aufrufe und Volkdaten[i] über das Objekt People aufrufe, kommt derselbe Fehler. Selbst wenn ich Name oder BuildingHP(b) durch konstante Werte ersetze kommt der Fehler, ebenso wenn ich die Schleife entferne und b durch einen festen Wert ersetze.
Die ersten beiden WriteBefehle werden ausgeführt, allerdings taucht der Wert von
Ini.WriteString('Allgemein', 'Volk'+InttoStr(i), Name); Nicht im IniFile auf.. wenn ich Name durch einen konstanten String ersetze allerdings schon. Aber wie gesagt, wenn ich in der abbrechende Zeile gar nicht mehr auf VolkDaten[i] zugreife taucht der Fehler trotzdem auf.
Ich hab ehrlich gesagt keine Ideen mehr wo der Fehler seine Ursache haben könnte, geschweige denn wie er zu beheben ist.
Falls ihr noch weitere Codeschnipsel braucht, einfach sagen.
ResetVolkData funktioniert übrigens tadellos.
Ich habe ein dynamisches Array "VolkDaten" dessen Inhalt ich in ein IniFile schreiben will. Das Array wird vorher dimensioniert und auch gefüllt.
Hier mal der Code der Funktion zum Schreiben in das IniFile:
procedure TPeople.ResetIniDataVolk;
var Ini: TIniFile;
i: integer;
Datei: Textfile;
b: TGroupBuilding;
u: TGroupUnit;
Test:string;
begin
ResetVolkData;
AssignFile(Datei, GamePath+'daten\volk.ini');
try
ReWrite(datei);
CloseFile(datei);
// Ini-Datei beschreiben:
Ini:=TIniFile.Create(GamePath+'daten\volk.ini');
Ini.WriteInteger('Allgemein', 'Anzahl', 4);
for i:=0 to 3 do
begin
with VolkDaten[i] do
begin
Ini.WriteString('Allgemein', 'Volk'+InttoStr(i), Name);
for b:=Farm to Military do
Ini.WriteInteger(Name, 'BuildingHP'+TGrBuildtoStr(b), BuildingHP[b]);
for u:=Regular to Artilery do
begin
Ini.WriteInteger(FVolkDaten[i].Name, 'UnitHP'+TGrUtoStr(u), FVolkDaten[i].UnitHP[u]);
Ini.WriteInteger(FVolkDaten[i].Name, 'UnitAttack'+TGrUtoStr(u), FVolkDaten[i].UnitAttack[u]);
Ini.WriteInteger(FVolkDaten[i].Name , 'UnitDefense'+TGrUtoStr(u), FVolkDaten[i].UnitDefense[u]);
end;
end;
end;
finally
Ini.Free;
end;
end;
An der fett markierten Zeile bricht das Programm dann mit einer EAccessViolation ab. Das interessante und für mich seltsame, an der Geschichte ist, daß ich vorher eine Funktion hatte, die das Array korrekt in ein IniFile geschrieben hat. Die einzigen Änderung die ich vorgenommen habe um zu obiger Prozedur zu kommen waren:
- Das Array als Property der Klasse TPeople eingeführt und die Prozedur zu einer Methode selbiger Klasse gemacht.
- Einige Schleifen eingeführt
Wenn ich obigen Code als eigenständige Prozedur aufrufe und Volkdaten[i] über das Objekt People aufrufe, kommt derselbe Fehler. Selbst wenn ich Name oder BuildingHP(b) durch konstante Werte ersetze kommt der Fehler, ebenso wenn ich die Schleife entferne und b durch einen festen Wert ersetze.
Die ersten beiden WriteBefehle werden ausgeführt, allerdings taucht der Wert von
Ini.WriteString('Allgemein', 'Volk'+InttoStr(i), Name); Nicht im IniFile auf.. wenn ich Name durch einen konstanten String ersetze allerdings schon. Aber wie gesagt, wenn ich in der abbrechende Zeile gar nicht mehr auf VolkDaten[i] zugreife taucht der Fehler trotzdem auf.
Ich hab ehrlich gesagt keine Ideen mehr wo der Fehler seine Ursache haben könnte, geschweige denn wie er zu beheben ist.
Falls ihr noch weitere Codeschnipsel braucht, einfach sagen.
ResetVolkData funktioniert übrigens tadellos.