Autor Beitrag
magic87
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45


Delphi 7, PHP
BeitragVerfasst: Do 05.04.07 12:42 
Möchte Einträge in einer INI-Datei speichern und auslesen. Die Dateien befinden sich in einer Listbox. Das Problem ist.. ich habe eine Bibliothek, also eine Unit, wo ich meine ganzen Klassen deklariert habe. Unter anderem die Klasse Autoliste, die die beiden Proceduren LoadINI und SaveINI von mir bekommen hat. In der anderen Unit will ich die beiden proceduren dann im OnCreate und OnClose aufrufen - jedoch gibts da immer eine Zugriffsverletztung, wenn ich die Form wieder schließe. Das hat zur Folge, das er gar nichts in die INI schreibt. Hier mein Quelltext:

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:
// Die beiden Proceduren von der Klasse Autoliste(die vom Typ)
{--------------------------------- INI Laden ----------------------------------}
procedure TAutoliste.LoadINI;
var
  i,x : integer;
begin
  ini := TIniFile.create(ExtractFilePath(Application.ExeName)+'Einstellungen.ini'); // INI beim Start erstellen
  i:=Ini.ReadInteger('Sektion1','Zeilen',count); //Wieviele Einträge sind Vorhand
  for x:=0 to i-1 do // Anzahl der Einträge
  begin
    Ini.ReadString ('Sektion1','Marke'+IntToStr(x),Auto.marke); //Strings speichern
  end;
  Ini.Free;
end;

{-------------------------------- INI speichern -------------------------------}
procedure TAutoliste.SaveINI;
var
  x:integer;
begin
  ini.WriteInteger('Sektion1','Zeilen',Count);// Fehler??
  for x:=0 to Count-1 do
  begin
    ini.WriteString('Sektion1','Marke'+intToStr(x), Auto.marke);
  end;
  ini.Free;
end;

// Hier die Proceduren Form.Create und Form.Close von meiner Form
{************************* Einstellungen speichern ****************************}
procedure TForm_Einstellungen.FormCreate(Sender: TObject);
begin
  Markenliste := TAutoliste.create;
  Markenliste.LoadINI;
end;

{************************* Einstellungen speichern ****************************}
procedure TForm_Einstellungen.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
begin
  if CanClose = true then
  begin
   Markenliste.SaveINI;
  end;
end;

// Markenliste ist vom Typ TAutoliste und TAutoliste ist eine Klasse abgeleitet von TList


Ich hoffe mir kann jemand weiterhelfen und jemand versteht mein Problem.

Liebe Grüße.. magic87
freak4fun
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 604
Erhaltene Danke: 4

Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
BeitragVerfasst: Do 05.04.07 13:29 
Kannst du da nicht durchsteppen und den Fehler genauer eingrenzen? Woher kommt das Count?

_________________
"Ich werde auf GAR KEINEN Fall…!" - "Keks?" - "Okay, ich tu's."
i++; // zaehler i um 1 erhoehen
magic87 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45


Delphi 7, PHP
BeitragVerfasst: Do 05.04.07 13:33 
das count soll die Anzahl der Einträge in der Liste wiedergeben.Die Proceduren sind ja innerhalb der Klasse TAutoliste und TAutoliste hab ich von TList abgeleitet.
Ich denke das der Fehler daran liegt, das ich ohne Übergabeparameter arbeite. Ich weiß nicht so recht, wie ich zwischen den beiden Units handeln soll.
freak4fun
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 604
Erhaltene Danke: 4

Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
BeitragVerfasst: Do 05.04.07 13:41 
Was macht das?
ausblenden Delphi-Quelltext
1:
 i:=Ini.ReadInteger('Sektion1','Zeilen',count); //Wieviele Einträge sind Vorhand					


Wenn der Eintrag Zeilen in der Section Sektion nicht existiert, wird Count zurückgegeben. Dann gehst du die Marken durch, die es eventuell nicht gibt. Welchen Wert hat Count da?

Du gibst im Load das Ini wieder Frei!
ausblenden Delphi-Quelltext
1:
Ini.Free;					


Wenn du dann Speichern drückst, ist Ini nicht initialisiert bzw. nil.

MfG
freak

_________________
"Ich werde auf GAR KEINEN Fall…!" - "Keks?" - "Okay, ich tu's."
i++; // zaehler i um 1 erhoehen
magic87 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45


Delphi 7, PHP
BeitragVerfasst: Do 05.04.07 15:26 
habs jetzt so:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TAutoliste.LoadINI;
var
  i,x : integer;
begin
  ini := TIniFile.create(ExtractFilePath(Application.ExeName)+'Einstellungen.ini'); // INI beim Start erstellen
  i:=Ini.ReadInteger('Sektion1','Zeilen',0); //Wieviele Einträge sind Vorhand   // i bekommt Anzahl der Zeilen
  for x:=0 to i-1 do // von 0 bis zum Ende der Liste
  begin
    Ini.ReadString ('Sektion1','Marke'+IntToStr(x),Auto.marke); //Den String auslesen
  end;
end;


Das mit dem ini.free ist mir klar! Das war einfach blöd von mir! Habe die ini ja global deklariert. Aber Der Rest müsste dann doch eigentlich stimmen oder nicht? Jetzt gibt er 0 zurück. Das mit dem i := Ini.ReadInteger.... hab ich gemacht, damit er weiß, wie oft er die Schleife durchlaufen soll. Jetzt gibt er 0 zurück, wenn Zeilen nicht in Sektion1 gefunden wird. Irgendwo muss jetzt noch eine Kleinigkeit falsch sein!?
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Do 05.04.07 17:49 
Hallo,

ReadString ist eine Funktion die den gelesenen String zurückliefert.

ausblenden Delphi-Quelltext
1:
2:
3:
sHierHin := ini.ReadString(...);
//oder so
ListBox.Items.Add(ini.ReadString(...));
wie ReadInteger, nur halt ein String als Rückgabewert.

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )