Autor Beitrag
Baaer
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Di 03.12.02 23:09 
Hallo,
Ich wollte bei meinem Programm etwas ergänzen. Zum testen habe ich dies erst als kleines Programm laufen lassen. Alles hat wunderbar funktioniert. Nachdem ich jedoch mein Programm mit dem Neuem ergäntzte, funktionierte die Ergänzung nicht mehr.

Es kommt folgende Fehlermeldung:
Zitat:
Im Projekt ist eine Exception der Klasse EAccessViolation aufgetreten.
Meldung:'Zugriffsverletzung bei Adresse 77F42F2D in Modul 'ntdll.dll'.
Schreiben von Adresse 00403EED'. Prozeß angehalten.

Ich konnte den Fehler etwas eingrenzen. Hier der Code der mir Probleme bereitet:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
var i:integer;
    Datum:string;
    ini:Tinifile;
    begin
      try
        ini:=TIniFile.Create(ProgDir + 'Archiv.dat');
        For i:= 1 to StrToInt(ini.ReadString('Daten','Anzahl','')) do
         begin
              ini:=TIniFile.Create(ProgDir + 'Archiv.dat'); 
//Lösche ich die obige Zeile, so bekomme ich keine Fehlermeldung mehr. 
//Natürlich funktioniert dann auch der Code nicht mehr :(
              Datum:=ini.ReadString('Daten',IntToStr(i),'');
              Datenbank.Lines.Add(ini.ReadString('Dateninhalt',Datum,'') + '  ' + Datum);
              ini:=TIniFile.Create(ProgDir + Datum + '.temp')
         end;
     finally
            ini.free;
     end;
end;


MFG,
Baaer
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Di 03.12.02 23:35 
Zuerst allgemeines:

Create brauchst du nicht in einem Tray-Block schützen. Das gilt nicht nur für INI, sondern für alle Objekte.

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
  ini:=TIniFile.Create(ProgDir + 'Archiv.dat');
  try

  finally
    ini.free;
  end;


Und! Solange du das Ini-Objekt nicht mit Free freigegeben hast, brauchst du es mit Create nicht neu erstellen.

Wenn du das machst:

ausblenden Quelltext
1:
2:
3:
  with ini do try

  finaly ...


dann brauchst du nicht jedes mal ein ini vor ini.ReadString zu setzen.

ausblenden Quelltext
1:
2:
3:
  with ini do try
    StrToInt(ReadString('Daten','Anzahl',''))
  finaly ...


Das hier ist sehr Fehleranfällig:

ausblenden Quelltext
1:
StrToInt(ini.ReadString('Daten','Anzahl',''))					


Liefert String keine Zahl, dann gibt es ein Wawuuuuuusch (d.h. es geht weiter mit "finally"). Besser ist

StrToIntDef(ini.ReadString('Daten','Anzahl',''), 0)

oder gleich das

ausblenden Quelltext
1:
ini.ReadInteger('Daten','Anzahl',0)					
Wolff68
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 302
Erhaltene Danke: 1

WinXP home
D6 Prof
BeitragVerfasst: Mi 04.12.02 01:18 
Was mir auffällt ist ebenfalls das StrToInt(ini.ReadString...) Aber das hat Popov ja schon erklärt.

Zweitens weist Du 3x der ini mit Create was neues zu ohne ein Free dazwischen zu machen. Hab das noch nicht probiert, aber könnte ebenfalls Problematisch werden.
Generell: Für jedes Create auch ein Free einbauen.

Wie wärs denn einfach mit 2 ini-Variablen? inidat und initemp
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
var i:integer; 
    Datum:string; 
    inidat, iniTemp:Tinifile; 
begin 
  inidat := TIniFile.Create(ProgDir + 'Archiv.dat'); 
  For i:= 1 to inidat.ReadInteger('Daten','Anzahl',0) do 
    begin 
      Datum:=inidat.ReadString('Daten',IntToStr(i),'fehler'+IntToStr(i)); 
      Datenbank.Lines.Add(inidat.ReadString('Dateninhalt',Datum,'')+ '  ' + Datum); 
      initemp:=TIniFile.Create(ProgDir + Datum + '.temp')
        //Hier solltest Du noch irgendwas in die initemp reinschreiben...
      initemp.free;
    end; 
  inidat.free; 
end;
Ungetestet!
Über das Datum:=inidat.ReadString('Daten',IntToStr(i),'fehler'+IntToStr(i)); verhinderst Du auch, daß Du eine Datei "\.temp" anlegst.
Übrigends bestehen Dateiextensions normalerweise aus 3 Buchstaben, nicht aus 4!

_________________
"Der Mensch ist nicht was er sich vorstellt oder wünscht zu sein, sondern das was andere in ihm sehen."
LCS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: Mi 04.12.02 09:01 
Hi
Als Ergänzung zu den bereits gemachten Vorschlägen solltest du mal kontrollieren ob der Inhalt deiner Variable ProgDir korrekt ist. Das von dir beschriebene Verhalten entsteht meistens wenn du versuchst eine Ini-Datei mit einer ungültigen Pfadangabe anzulegen (Eigene leidvolle Erfahrung :wink: ).

Gruss Lothar

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...
Raphael82
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67



BeitragVerfasst: Do 05.12.02 15:26 
Kann allen Kommentaren nur beipflichten, da bleibt nicht mehr viel zu sagen. Da wäre nur noch die Frage, was du mit der Ini-Datei denn für Experimente vor hast.. Ich hoffe du bist nicht wieder einer von denen, die per Ini-Files eine Adressdatenbank anlegen wollen.
Der Zweck von ini-Dateien ist vorrangig die Initialisierung des Programms. Ini-Dateien sind nichts anderes als das was seid Win95 die Registry ist!! Von dem her macht es schonmal wenig Sinn eine ini-Datei als .dat abzulegen. Bevor du dir also all die Mühe machst überprüfe erstmal ob Ini-Dateien für dein Vorhaben überhaupt das richtige sind.

P.S.: Man will es ja nicht in die Höhe halten aber es gehört auch zum guten Programmierstil, angemessen Dateitypen für angemessene Zwecke zu benutzen :wink:

MfG, Raphael

_________________
Share your knowledge to receive perfection!
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Do 05.12.02 16:08 
Raphael82 hat folgendes geschrieben:
Ich hoffe du bist nicht wieder einer von denen, die per Ini-Files eine Adressdatenbank anlegen wollen.
Der Zweck von ini-Dateien ist vorrangig die Initialisierung des Programms.


Unabhängig dessen ist das INI-System aber gut geeignet für eine kleine Datenbank. Der Vortiel ist, daß man unabhängig dessen was das System drauf hat (BDE&Co), die INI die einzige Möglichkeit ist ohne zusätzliche Arbeit Informationen abzuspeichern. Ini ist somit ein Datenbanksystem. Allerdings keins von der normalen Sorte.