AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi .ini Datei Schlüssel aller Abschnitte zählen
Thema durchsuchen
Ansicht
Themen-Optionen

.ini Datei Schlüssel aller Abschnitte zählen

Ein Thema von Drahcir · begonnen am 23. Jun 2012 · letzter Beitrag vom 23. Jun 2012
Antwort Antwort
Seite 1 von 2  1 2      
Drahcir

Registriert seit: 13. Jun 2012
34 Beiträge
 
Delphi 6 Personal
 
#1

.ini Datei Schlüssel aller Abschnitte zählen

  Alt 23. Jun 2012, 00:43
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:
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
Ich vermute sehr stark, das der Fehler in der Zeile liegt:

LogInIni.ReadSection(sl1[I], sl2); Warscheinlich ist der Ausdruck sl1[I] falsch, aber ich hab keine Ahnung wie ich die sonst ansprechen soll ...

Vielen Dank im vorraus für Hilfe
Es gibt nur 10 Arten von Menschen - die die Binärzahlen lesen können und den Rest
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.080 Beiträge
 
Delphi 12 Athens
 
#2

AW: .ini Datei Schlüssel aller Abschnitte zählen

  Alt 23. Jun 2012, 01:14
Wie bei fast allen Listen, fängt die Zählung bei 0 an.

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.



Zitat:
Delphi-Quellcode:
sl1 := TStringList.Create; sl2 := TStringList.Create;
sl1 := nil; sl2 := nil;
Ähhhhhhhhh?

Zitat:
Es funktioniert aber leider nicht
WAS funktioniert nicht?
Gibt es denn keine Fehlermeldungen oder eine genauere Fehlerbeschreibung? (z.B. was passert und was erwartest du stattdessen)

Zitat:
//Ini-Datei wird ordnungsgemäß freigegeben und zum Schluss gelöscht
Auch die Stringlisten? (so wie es aussieht, können diese garnicht mehr freigegeben werden, egal was man macht ... siehe dein Code aus dem vorletzen Zitat)

Und Resourcenschutzblöcke sieht man auch nicht.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (23. Jun 2012 um 01:20 Uhr)
  Mit Zitat antworten Zitat
Drahcir

Registriert seit: 13. Jun 2012
34 Beiträge
 
Delphi 6 Personal
 
#3

AW: .ini Datei Schlüssel aller Abschnitte zählen

  Alt 23. Jun 2012, 01:57
Wie bei fast allen Listen, fängt die Zählung bei 0 an.

for I := 0 to sl1.Count - 1 do
Hab ich geändert, hast natürlich recht


Zitat:
Delphi-Quellcode:
sl1 := TStringList.Create; sl2 := TStringList.Create;
sl1 := nil; sl2 := nil;
Ähhhhhhhhh?
Ja öhm ... keine Ahnung was mich da geritten hat aber das das so nicht funzt ist schon klar ... habs geändert (entfernt).

Zitat:
Es funktioniert aber leider nicht
WAS funktioniert nicht?
Gibt es denn keine Fehlermeldungen oder eine genauere Fehlerbeschreibung? (z.B. was passert und was erwartest du stattdessen)
Es gibt (nach entfernung der nil-probleme weiter oben) keine Fehlermeldung aber als Anzahl schlüssel bekomme ich immer 0 heraus

Zitat:
//Ini-Datei wird ordnungsgemäß freigegeben und zum Schluss gelöscht
Auch die Stringlisten? (so wie es aussieht, können diese garnicht mehr freigegeben werden, egal was man macht ... siehe dein Code aus dem vorletzen Zitat)

Und Resourcenschutzblöcke sieht man auch nicht.
doch die sind da, nur weiter vorne und weiter hinten in der Prozedur die ich auf wunsch auch vollständig hier rein stelle wenns gewünscht ist

Waran liegt es, das ich immer 0 als Ergebnis bekomme?
Es gibt nur 10 Arten von Menschen - die die Binärzahlen lesen können und den Rest
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#4

AW: .ini Datei Schlüssel aller Abschnitte zählen

  Alt 23. Jun 2012, 07:34
Delphi-Quellcode:
  for I := 0 to sl1.Count -1 do
  begin
    LogInIni.ReadSectionValues(sl1[I], sl2);
    Anzahl := Anzahl + sl2.count;
  end;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Drahcir

Registriert seit: 13. Jun 2012
34 Beiträge
 
Delphi 6 Personal
 
#5

AW: .ini Datei Schlüssel aller Abschnitte zählen

  Alt 23. Jun 2012, 08:41
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:
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;
Ich denke mal der Fehler taucht an der Stelle auf wo ich LogInIni.ReadSection(sl1.Strings[I], sl2); eintragen lasse, da er in der Klammer TStrings haben möchte, sl2 aber eine TStringList ist.
Wenn ich das so Laufen lasse gibts als Anzahl 0 zurück, wenn ich LogInIni.ReadSectionValues(sl1[I], sl2); mache gibts die angehängte Fehlermeldung.

Vielen Dank für die ersten Hilfen schonmal
Miniaturansicht angehängter Grafiken
fehlermeldung.jpg  
Es gibt nur 10 Arten von Menschen - die die Binärzahlen lesen können und den Rest

Geändert von TBx (25. Jun 2012 um 09:33 Uhr) Grund: Bild aus externer Quelle angehängt
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#6

AW: .ini Datei Schlüssel aller Abschnitte zählen

  Alt 23. Jun 2012, 09:40
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:
for I := 0 to hLogInFenster.cbLogIns.Items.Count - 1 do
      if hLogInFenster.cbLogIns.Items[i] = hLogInFenster.cbLogIns.Items[i+1]
4. Löschen in Listen immer rückwärts
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
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Drahcir

Registriert seit: 13. Jun 2012
34 Beiträge
 
Delphi 6 Personal
 
#7

AW: .ini Datei Schlüssel aller Abschnitte zählen

  Alt 23. Jun 2012, 09:59
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:
6. Das Parsen ist ineffizient und potentiell wird hier auch auf ungültige Adressen zugegriffen
Ok das versteh ich jetzt mal gar nicht >.>

Aber trotzdem danke, das Problem ist nun gelöst, wenn du mir noch die Frage beantworten magst wärs nett
Es gibt nur 10 Arten von Menschen - die die Binärzahlen lesen können und den Rest
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: .ini Datei Schlüssel aller Abschnitte zählen

  Alt 23. Jun 2012, 10:20
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);
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#9

AW: .ini Datei Schlüssel aller Abschnitte zählen

  Alt 23. Jun 2012, 10:58
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 ...
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.080 Beiträge
 
Delphi 12 Athens
 
#10

AW: .ini Datei Schlüssel aller Abschnitte zählen

  Alt 23. Jun 2012, 12:00
Zitat:
Delphi-Quellcode:
procedure TfrmMain.btLogInsClick(Sender: TObject);
begin
  ...
  for Zeile := 0 to hLogFenster.MemoLogAnzeige.Lines.Count-1 do begin
    ...
    if ... then begin
      ...

      {*** 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;
      ...
    end;
    ...
  end;
  ...
  LogInIni.ReadSections(sl1);
  for I := 0 to sl1.Count - 1 do begin
    LogInIni.ReadSection(sl1.Strings[I], sl2);
    Anzahl := Anzahl + sl2.Count;
  end;
  ...
end;
Theoretisch würde ich hier erwarten, daß Delphi mir in den Compilermeldungen etwas von wegen "Variable nicht initialisiert" um die Ohren haut.

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:
Delphi-Quellcode:
      try LogIns := ExtractFilePath(ParamStr(0)) + 'LogIns.ini';
          LogInIni := TIniFile.Create(LogIns);
          LogInIni.WriteString(Datum, Uhrzeit, Koordinaten);
      finally LogInIni.Free; end;
Die Initialisierung gehört niemals in den Schutzblock

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;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (23. Jun 2012 um 12:09 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz