Autor Beitrag
Gruenschnabel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 41

Windows 7, 10
Delphi6, Delphi7SEportable, Delphi 10 Berlin Starter
BeitragVerfasst: Mi 15.09.10 12:08 
Servus Ihr!

Ich befasse mich gerade mit der Anwendung von Ini-Dateien und dabei bin ich auf folgendes Problem gestoßen.

Ich möchte eine Art Telefonbuchverzeichnis programmieren. In der ListBox habe ich verschiedene Gruppen angelegt und in der CheckListBox die ganzen Telefonnummern gelistet. Je nach ausgwählter Gruppe kann der Nutzer nun Häkchen setzen, welche Nummer dieser Gruppe angehören soll. Das speichern in der Ini funktioniert hervorragend:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TAktionen.BitBtn4Click(Sender: TObject);
var
i,k,_pos: Integer;  //k ist aktuell ausgewählte Gruppe, i ist für die Schleife

begin
If GruppenBox.ItemIndex <> 0   //wenn eine Gruppe ausgewählt ist, dann leg los
Then
begin
k:= GruppenBox.ItemIndex;   //bestimme die ausgewählte gruppe
l:= GruppenBox.Items[k];
_pos:= (pos('-',l)-1);  
m:= copy(l,0,_pos);     //der gruppenname wird leicht formatiert, um die ini übersichtlicher zu halten
  for i:= 0 to Telefonbuch.count-1 do begin  //Wiederhole die Schleife sooft, wie Telefonnummern in der Checklistbox da sind
      ini1:=TIniFile.create(ExtractFilePath('C:\poctool_config\zuordnung.ini'));
      ini1.WriteBool(m, Telefonbuch.Items.Strings[i], Telefonbuch.Checked[i]); //Schreib die jeweiligen werte in die Section
      ini1.Free;
      end;
      end;



das funktioniert hervorragend. nun kommt der knackpunkt. ich möchte das gerne wieder ausgelesen haben. also wenn ich eine gruppe markiere, dann sollen die entsprechenden häkchen bei den telefonnummern, also in der checklistbox gesetzt sein. ich hab verschiedene varianten probiert, aber solangsam weiß ich nicht weiter. hier mein ansatz:


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TAktionen.GruppenboxClick(Sender: TObject);
var
k,n,i,_pos: Integer;  //k ist aktuell ausgewählte Gruppe, i ist wieder für die schleife
begin
n:= telefonbuch.Count-1;     // zähle telefonnummern
k:= GruppenBox.ItemIndex;        // ermittle die markierte position
l:= GruppenBox.Items[k];         // String der aktuellen Position
_pos:= (pos('-',l)-1);
m:= copy(l,0,_pos);          // Gruppe extrahieren um Section (m) zu finden
for i:=0 to n do begin       // wiederhole n-mal, also so oft wie telefonnummern vorhanden
ini1:=TIniFile.create(ExtractFilePath('C:\poctool_config\zuordnung.ini'));
Telefonbuch.Checked[i]:= ini1.ReadBool(m, Telefonbuch.Items.Strings[i+1], false); //werte aus der ini auslesen


während ich den thread hier verfasse, bin ich der Meinung eigenltich keine Schleife zu brauchen. Habs sowohl mit, als auch ohne und in verschiedenen Varianten probiert. Ergebnisse waren eigenlich immer nur 2: Entweder überschreitet der Listenindex das Maximum oder es passiert NICHTS ohne Fehlermeldung.

Hoffe ihr versteht was ich meine und könnt mir helfen.

MfG,

Gruenschnabel

_________________
Fährst Du rückwärts an den Baum, verkleinert sich dein Kofferraum!
Tropby
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 71
Erhaltene Danke: 4

Vista, Win XP, Win 89
Turbo Delphi Ex.
BeitragVerfasst: Mi 15.09.10 13:52 
Hallo,

als erstes fällt mir auf, dass du "ExtractFilePath" benutzt. Diese Funktion gibt immer nur den Pfad zu einer Datei zurück. In deinem Fall müsste er also aus "C:\poctool_config\zuordnung.ini" "C:\poctool_config\" machen. Daher glaube ich nicht, dass die Daten richtig gespeichert werden. kann es aber im moment nicht testen.

An sonsten bnutzt du beim Lesen "i+1". Dadurch wirst du jedoch jedes mal eine Exception bekommen da du auf ein Element zugreifst was nicht existiert. Dort muss auch "i" hin.

Wichtig ist noch, dass du
ausblenden Delphi-Quelltext
1:
ini1:=TIniFile.create(ExtractFilePath('C:\poctool_config\zuordnung.ini'));					

nicht in der Schleife machst. Es reicht, wenn du einmal eine verbindung aufbaust!!

In deinemfall würde ich ExtractFilePath entfernen, da du es hier nicht brauchst wenn du absolute Pfade angibst. Die Funktion nützte ich meist in verbindung mit Application.ExeName um den Pfad zu der ausgeführten Datei zu bekommen.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
ini1:=TIniFile.create('C:\poctool_config\zuordnung.ini');
//Wiederhole die Schleife sooft, wie Telefonnummern in der Checklistbox da sind
for i:= 0 to Telefonbuch.count-1 do
begin  
  //Schreib die jeweiligen werte in die Section
  ini1.WriteBool(m, Telefonbuch.Items.Strings[i], Telefonbuch.Checked[i]); 
end;
ini1.Free;

_________________
Tropby

Für diesen Beitrag haben gedankt: Gruenschnabel
Gruenschnabel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 41

Windows 7, 10
Delphi6, Delphi7SEportable, Delphi 10 Berlin Starter
BeitragVerfasst: Mi 15.09.10 14:02 
Wunderbar, funktioniert nun alles wie es soll!

Lag wirklich an dem ExtractPath und dem Aufruf innerhalb der Schleife!!!

Wenn ich jetzt allerdings eine Gruppe mit neuen Nummern bestücken will erscheint die Fehlermeldung:

"Format '%P' ungültig oder nicht kompatibel mit Argument"

Was will delphi mir damit sagen? Der debugger springt ans ende vom quelltext des Projects...

die ini wird jedoch korrekt geschrieben?!

_________________
Fährst Du rückwärts an den Baum, verkleinert sich dein Kofferraum!
Gruenschnabel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 41

Windows 7, 10
Delphi6, Delphi7SEportable, Delphi 10 Berlin Starter
BeitragVerfasst: Mi 15.09.10 14:24 
Hier der endgültige quelltext, der allen meinen tests standgehalten hat und zufriedenstellend ist :-)

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:
procedure TAktionen.BitBtn4Click(Sender: TObject);
var
i,k,_pos: Integer;  //k ist aktuell ausgewählte ric, i ist die schleife

begin
If GruppenBox.ItemIndex <> 0
Then
begin
k:= GruppenBox.ItemIndex;
l:= GruppenBox.Items[k];
_pos:= (pos('-',l)-1);
m:= copy(l,0,_pos);

  for i:= 0 to Telefonbuch.count-1 do begin
  ini1:=TIniFile.create('C:\poctool_config\zuordnung.ini');
      ini1.WriteBool(m, Telefonbuch.Items.Strings[i], Telefonbuch.Checked[i]);
      ini1.Free;
      end;
      end;


end;
procedure TAktionen.GruppenboxClick(Sender: TObject);
var
k,n,i,_pos: Integer;  //k ist aktuell ausgewählte Gruppe, i ist die schleife
begin
n:= telefonbuch.Count-1;     // zähle telefonnummern --> 4
k:= GruppenBox.ItemIndex;        // ermittle die markierte position --> 3
l:= GruppenBox.Items[k];         // String der aktuellen Position
_pos:= (pos('-',l)-1);
m:= copy(l,0,_pos);          // Gruppe extrahieren um Section zu finden

for i:=0 to n do begin       // wiederhole n-mal (also 4x)
ini1:=TIniFile.create('C:\poctool_config\zuordnung.ini');
Telefonbuch.Checked[i]:= ini1.ReadBool(m, Telefonbuch.Items.Strings[i], false);

end;
ini1.free;
end;

_________________
Fährst Du rückwärts an den Baum, verkleinert sich dein Kofferraum!