![]() |
.ini Datei Schlüssel aller Abschnitte zählen
ich habe erneut ein Problem, wieder mit .ini-Dateien.
Es geht drum aus einem .ini-file aus einer unbekannten anzahl Abschnitte die anzahl aller Schlüssel auszulesen. Mein Ansatz ist, alle Abschnitte in eine Stringlist zu laden, diese Name für name die Schlüssel zählen zu lassen und nach jedem Abschnitt auf eine Variable zu addieren. Es funktioniert aber leider nicht und ich erhoffe mir hier zumindest einen ansatz wo mein Denkfehler ist :)
Delphi-Quellcode:
Ich vermute sehr stark, das der Fehler in der Zeile liegt:
var sl1, sl2 : TStringlist;
I, Anzahl : Integer; LogInIni : TIniFile; begin //Ini-Datei wird ordnungsgemäß angelegt und auch schon vorher verwendet sl1 := TStringList.Create; sl2 := TStringList.Create; sl1 := nil; sl2 := nil; Anzahl := 0; LogInIni.ReadSections(sl1); for I := 1 to sl1.Count do begin LogInIni.ReadSection(sl1[I], sl2); Anzahl := Anzahl + sl2.count; end; hLogInFenster.Label1.Caption := IntToStr(Anzahl); //Ini-Datei wird ordnungsgemäß freigegeben und zum Schluss gelöscht
Delphi-Quellcode:
Warscheinlich ist der Ausdruck
LogInIni.ReadSection(sl1[I], sl2);
Delphi-Quellcode:
falsch, aber ich hab keine Ahnung wie ich die sonst ansprechen soll ...
sl1[I]
Vielen Dank im vorraus für Hilfe :) |
AW: .ini Datei Schlüssel aller Abschnitte zählen
Wie bei fast allen Listen, fängt die Zählung bei 0 an. :roll:
Delphi-Quellcode:
for I := 0 to sl1.Count - 1 do
Tipp: Das nächste Mal nimmst du dir den Debugger und/oder schaust genau(er) hin, was wirklich ausgelesen und verarbeitet wird. Denn sonst wäre dir bestimmt aufgefallen, daß du im ersten Schleifen-Durchgang den Namen der zweiten Sektion bekommen hast. :zwinker: Zitat:
Zitat:
Gibt es denn keine Fehlermeldungen oder eine genauere Fehlerbeschreibung? (z.B. was passert und was erwartest du stattdessen) Zitat:
Und Resourcenschutzblöcke sieht man auch nicht. |
AW: .ini Datei Schlüssel aller Abschnitte zählen
Zitat:
Zitat:
Zitat:
Zitat:
Waran liegt es, das ich immer 0 als Ergebnis bekomme? |
AW: .ini Datei Schlüssel aller Abschnitte zählen
Delphi-Quellcode:
for I := 0 to sl1.Count -1 do
begin LogInIni.ReadSectionValues(sl1[I], sl2); Anzahl := Anzahl + sl2.count; end; |
AW: .ini Datei Schlüssel aller Abschnitte zählen
Liste der Anhänge anzeigen (Anzahl: 1)
es tut mir leid aber das funktioniert immer noch nicht >.> ich hau hier jetzt einfach mal den ganzen quelltext samt fehlermeldung die dabei entsteht rein
(Ja ich weiß ich hab ne komische Art der Sortierung...):
Delphi-Quellcode:
Ich denke mal der Fehler taucht an der Stelle auf wo ich
procedure TfrmMain.btLogInsClick(Sender: TObject);
var I, Zeile, Anzahl : Integer; LogInIni : TIniFile; Ein, Datum, DatumAusgelesen, Uhrzeit, Koordinaten, LogIns : string; sl1, sl2 : TStringlist; begin hLogInFenster := TfrmLogInAnzeige.Create(frmMain); hLogInFenster.Left := frmMain.Left + frmMain.Width + 20; hLogInFenster.Top := frmMain.Top; for Zeile := 0 to hLogFenster.MemoLogAnzeige.Lines.Count-1 do begin ein := Utf8ToAnsi(hLogFenster.MemoLogAnzeige.Lines[Zeile]); if (pos(cbSpieler.Text, Ein) <> 0) //In einer TCombobox eingetragener Wert AND (pos('logged in with entity id', ein) <> 0) //Ein weiteres "SuchWort" im Text then begin {*** Uhrzeit ***} for I := 12 to 19 do Uhrzeit := Uhrzeit + ein[I]; DatumAusgelesen := leftStr(Ein,10); {*** Datum ***} for I := 9 to 10 do Datum := Datum + DatumAusgelesen[I]; Datum := Datum + '.'; for I := 6 to 7 do Datum := Datum + DatumAusgelesen[I]; Datum := Datum + '.'; for I := 1 to 4 do Datum := Datum + DatumAusgelesen[I]; hLogInFenster.cbLogins.Items.Add(Datum); //eintragen der Daten in eine TCombobox {*** Koordinaten ***} Koordinaten := copy(Ein, pos('(',Ein)+1,200); Delete(Koordinaten,pos(')',Koordinaten),1); {*** Eintragen des Datums, Uhrzeit und Koordinaten in die .ini ***} try LogIns := ExtractFilePath(ParamStr(0)) + 'LogIns.ini'; LogInIni := TIniFile.Create(LogIns); LogInIni.WriteString(Datum, Uhrzeit, Koordinaten); finally LogInIni.Free; end; {*** Zurücksetzen der Variablen ***} Uhrzeit := ''; Datum := ''; Datumausgelesen := ''; end; {*** Löschen doppelter Einträge ***} for I := 0 to hLogInFenster.cbLogIns.Items.Count - 1 do if hLogInFenster.cbLogIns.Items[i] = hLogInFenster.cbLogIns.Items[i+1] then hLogInFenster.cbLogIns.Items.Delete(i); end; {****** Hier hat das Programm Probleme ... *****} sl1 := TStringList.Create; sl2 := TStringList.Create; Anzahl := 0; LogInIni.ReadSections(sl1); for I := 0 to sl1.Count - 1 do begin LogInIni.ReadSection(sl1.Strings[I], sl2); // Ich denke mal hier liegt das Problem mit Schreiben nach sl2 Anzahl := Anzahl + sl2.Count; end; hLogInFenster.Label1.Caption := IntToStr(Anzahl); {****** *****} hLogInFenster.Show; end;
Delphi-Quellcode:
eintragen lasse, da er in der Klammer TStrings haben möchte, sl2 aber eine TStringList ist.
LogInIni.ReadSection(sl1.Strings[I], sl2);
Wenn ich das so Laufen lasse gibts als Anzahl 0 zurück, wenn ich
Delphi-Quellcode:
mache gibts die angehängte Fehlermeldung.
LogInIni.ReadSectionValues(sl1[I], sl2);
Vielen Dank für die ersten Hilfen schonmal |
AW: .ini Datei Schlüssel aller Abschnitte zählen
1. LogInini wird gar nicht garantiert erzeugt
2. Logini wird wenn sie erzeugt wurde zumindest wieder freigegeben ein Zugriff darauf ist also gar nicht zulässig 3. hier greifst du auf Items außerhalb der Liste zu
Delphi-Quellcode:
4. Löschen in Listen immer rückwärts
for I := 0 to hLogInFenster.cbLogIns.Items.Count - 1 do
if hLogInFenster.cbLogIns.Items[i] = hLogInFenster.cbLogIns.Items[i+1]
Delphi-Quellcode:
for I := hLogInFenster.cbLogIns.Items.Count - 1 downto 0 do
5. sl1 und sl2 werden nicht freigegeben 6. Das Parsen ist ineffizient und potentiell wird hier auch auf ungültige Adressen zugegriffen den Fehler laut Anhang kann ich nicht mit dem Zugriff in Zusammenhang bringen |
AW: .ini Datei Schlüssel aller Abschnitte zählen
Vielen Dank, das Problem war wirklich das ich erst die ini freigebe und dann versuche drauf zuzugreifen, nachdem ich das .free ans ende gestetzt habe funktioniert es :)
hab auch sl1 und sl2 nun freigeben lassen und mit downto hast du natürlich auch recht, zumindest das hätte mir auffallen müssen. Hab das Erzeugen der Datei nun auch an den Anfang gestellt damit das gewährleistet ist. Zitat:
Aber trotzdem danke, das Problem ist nun gelöst, wenn du mir noch die Frage beantworten magst wärs nett :) |
AW: .ini Datei Schlüssel aller Abschnitte zählen
Anstatt nachher auf doppelte Einträge zu prüfen, könntest du auch schon vor dem Eintragen prüfen, ob es den Eintrag schon gibt.
Delphi-Quellcode:
if hLogInFenster.cbLogins.Items.IndexOf( Datum ) < 0 then
hLogInFenster.cbLogins.Items.Add(Datum); |
AW: .ini Datei Schlüssel aller Abschnitte zählen
statt mit Schleifen über z.B. ein[I] den String zusammenzubasteln, was schief geht wenn z.B. "ein" kürzer wäre als erwartet könntest Du Dir mal COPY anschauen ...
|
AW: .ini Datei Schlüssel aller Abschnitte zählen
Zitat:
Das LogInIni wird nur innerhalb der der Schleife und in dem IF initialisiert, also wenn es dort nie vorbeikommt, dann kann es danach nicht initialisiert sein. Außerdem wird es da in der Schleife nicht nur initialisiert, sonder auch gleich wieder freigegeben, womit es nach der Schleife auch wieder nicht mehr vorhanden ist. An deiner Stelle würde ich zukünftig nie wieder .Free (erst garncht .Destroy), sondern nur noch FreeAndNil verwenden. PS: Zitat:
Denn was passiert, wenn es beim Initialisieren (Erstellen des Objektes) knallt? Genau, es kanllt im Finally auch nochmal.
Delphi-Quellcode:
LogIns := ExtractFilePath(ParamStr(0)) + 'LogIns.ini';
LogInIni := TIniFile.Create(LogIns); // kurz vorm Try erstellen (dazwischen darf kein "gefährlicher" Code mehr kommen) try LogInIni.WriteString(Datum, Uhrzeit, Koordinaten); finally LogInIni.Free; end; // oder LogInIni := nil; // erstmal als "leer" initialisieren try LogIns := ExtractFilePath(ParamStr(0)) + 'LogIns.ini'; // das kann in oder vor dem Try stehen LogInIni := TIniFile.Create(LogIns); // und später erstellen (wird im es Try-Finally nochmal freigegeben, dann nur mit FreeAndNil freigeben+finalisieren) LogInIni.WriteString(Datum, Uhrzeit, Koordinaten); finally LogInIni.Free; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz