Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Werte aus einer Ini Datei Lesen funktioniert nicht so ganz (https://www.delphipraxis.net/173531-werte-aus-einer-ini-datei-lesen-funktioniert-nicht-so-ganz.html)

Back2Code 1. Mär 2013 12:14

Werte aus einer Ini Datei Lesen funktioniert nicht so ganz
 
Also ich bin gerade dabei die Sektionen, Abschnitte & Werte jeweils in eine Stringlist zu packen. Es funktioniert eigentlich alles richtig, außer das Auslesen der Werte. Da bekomm ich ledliglich die Werte immer von dem letzten Abschnitt.

Wie bekomm ich es jetzt hinn, dass ALLE Werte von allen Abschnitten in meiner Stringlist vorhanden sind.


Hier ein Auszug von meinem Code:

Delphi-Quellcode:
procedure TFrmHpt.OpenIniAndFillOutDB(inilist: TStringList);
var i, ii, jj, j, x, Value, AbschnittsZähler: Integer;
    Modul, Abschnitt, fullFileName: String;
    ini: TIniFile;
    Sektionen, Werte, Schlüssel, Abschnitte : TStringList;
begin
  //ShowMessage((inilist.Strings[2]));
  for i := 0 to inilist.Count-1 do
  begin
    ini := TIniFile.Create(inilist.Strings[i]);
    Sektionen := TStringList.Create;
    Abschnitte := TStringList.Create;
    Schlüssel := TStringlist.Create;
    Werte := TStringList.Create;
    fullFileName := inilist.Strings[i];
    Modul := ExtractFileName(fullFileName); // Dateiname aktueller Ini i z.b hphabirgendwas.ini;
    AbschnittsZähler := INISectionsCount(fullFileName); // Abschnittszäher = Wie viele Abschnitte gibt es in der aktuellen Ini
    Ini.ReadSections(Sektionen); // Jetzt sind alle Sektionen in der StringList Sektionen

    //Alle Abschnitte in die Stringlist Abschnitte packen
    for j := 0 to Sektionen.Count-1 do // Schleife und durch jede Sektion durchgehen
      begin
        ini.ReadSection(Sektionen.Strings[j], Abschnitte);
      end;

    // Alle Werte mit Abschnitten davor in die Stringlist Werte packen
    for jj := 0 to Abschnitte.Count-1 do
      begin
        ini.ReadSectionValues(Sektionen.Strings[jj], Werte); //<-- Da muss irgendwo der Fehler liegen
      end;

  Sektionen.SaveToFile  ('C:\Users\adminn\Desktop\aTest\Sektionen.txt');
  Abschnitte.SaveToFile ('C:\Users\admin\Desktop\aTest\Abschnitte.txt');
  Werte.SaveToFile      ('C:\Users\admin\Desktop\aTest\Werte.txt');

mkinzler 1. Mär 2013 12:15

AW: Werte aus einer Ini Datei Lesen funktioniert nicht so ganz
 
Erzeuge die IniFile-Instanz mal außerhalb der Schleife

Back2Code 1. Mär 2013 12:30

AW: Werte aus einer Ini Datei Lesen funktioniert nicht so ganz
 
Jetzt sagt er mir :

Listenindex überschreitet das Maximum(1637344)

mkinzler 1. Mär 2013 12:39

AW: Werte aus einer Ini Datei Lesen funktioniert nicht so ganz
 
Wo?

Back2Code 1. Mär 2013 12:40

AW: Werte aus einer Ini Datei Lesen funktioniert nicht so ganz
 
Zitat:

Zitat von mkinzler (Beitrag 1205595)
Wo?

Beim einlesen der Inis.

mkinzler 1. Mär 2013 12:46

AW: Werte aus einer Ini Datei Lesen funktioniert nicht so ganz
 
Poste noch einmal den aktuellen Code

Back2Code 1. Mär 2013 12:48

AW: Werte aus einer Ini Datei Lesen funktioniert nicht so ganz
 
Hier:

Delphi-Quellcode:
procedure TFrmHpt.Import1Click(Sender: TObject);
var Pfad: string;
    IniPfade: TStringlist;
begin
  IniPfade := TStringList.Create;
  processing := True;
  try
  Application.CreateForm(TFrmLoading, FrmLoading);
  SelectDirectory('Ordner auswählen', '' ,Pfad);
  FrmLoading.Show;

  GetFilesInDirectory(Pfad, '*.ini', IniPfade, True, True );

  OpenIniAndFillOutDB(IniPfade);

  FrmLoading.Hide;
  finally
    processing := False;
    IniPfade.Free;
  end;
end;

// readSections = alle sektionen auslesen // readsection = bestimmte sektion auslesen
procedure TFrmHpt.OpenIniAndFillOutDB(inilist: TStringList);
var i, ii, jj, j, x, Value, AbschnittsZähler: Integer;
    Modul, Abschnitt, fullFileName: String;
    ini: TIniFile;
    Sektionen, Werte, Schlüssel, Abschnitte : TStringList;
begin
  //ShowMessage((inilist.Strings[2]));
  for i := 0 to inilist.Count-1 do
  begin
    ini := TIniFile.Create(inilist.Strings[i]);
    Sektionen := TStringList.Create;
    Abschnitte := TStringList.Create;
    Schlüssel := TStringlist.Create;
    Werte := TStringList.Create;
    fullFileName := inilist.Strings[i];
    Modul := ExtractFileName(fullFileName); // Dateiname aktueller Ini i z.b hphabirgendwas.ini;
    AbschnittsZähler := INISectionsCount(fullFileName); // Abschnittszäher = Wie viele Abschnitte gibt es in der aktuellen Ini
    Ini.ReadSections(Sektionen); // Jetzt sind alle Sektionen in der StringList Sektionen

    //Alle Abschnitte in die Stringlist Abschnitte packen
    for j := 0 to Sektionen.Count-1 do // Schleife und durch jede Sektion durchgehen
      begin
        ini.ReadSection(Sektionen.Strings[j], Abschnitte);
      end;

    // Alle Werte mit Abschnitten davor in die Stringlist Werte packen
    for jj := 0 to Abschnitte.Count-1 do
      begin
        ini.ReadSectionValues(Sektionen.Strings[jj], Werte);
      end;

  Sektionen.SaveToFile  ('C:\Users\admin\Desktop\aTest\Sektionen.txt');
  Abschnitte.SaveToFile ('C:\Users\admin\Desktop\aTest\Abschnitte.txt');
  Werte.SaveToFile      ('C:\Users\admin\Desktop\aTest\Werte.txt');

  end;


  // Jeweile Ini von inilist.Strings[i] öffnen. Sektionen / Values / Modulname holen und in Datenbank schreiben.
  // Überprüfen ob bereits vorhanden, wenn nicht dann eintragen.
end;

p80286 1. Mär 2013 12:49

AW: Werte aus einer Ini Datei Lesen funktioniert nicht so ganz
 
Delphi-Quellcode:
       // Alle Werte mit Abschnitten davor in die Stringlist Werte packen
    for jj := 0 to Abschnitte.Count-1 do
      begin
        ini.ReadSectionValues(Sektionen.Strings[jj], Werte); //<-- Da muss irgendwo der Fehler liegen
      end;
Auch wenn es passen sollte:
for jj := 0 to Abschnitte.Count-1 do
ini.ReadSectionValues(Sektionen.Strings[jj], Werte);
das ist zumindestens ungeschickt.

Gruß
K-H

Klaus01 1. Mär 2013 12:50

AW: Werte aus einer Ini Datei Lesen funktioniert nicht so ganz
 
.. steht in inilist.Strings[i] der komplette Pfad (mit iniNamen) der ini Datei?

Grüße
Klaus

Back2Code 1. Mär 2013 12:52

AW: Werte aus einer Ini Datei Lesen funktioniert nicht so ganz
 
Zitat:

Zitat von Klaus01 (Beitrag 1205601)
.. steht in inilist.Strings[i] der komplette Pfad (mit iniNamen) der ini Datei?

Grüße
Klaus

Richtig. Hab eben auch noch die Procedure eins oben drüber gepostet, dann sollte ersichtlicher sein woher die Daten wie worein kommen.

Dalai 1. Mär 2013 12:54

AW: Werte aus einer Ini Datei Lesen funktioniert nicht so ganz
 
Zitat:

Zitat von Robin2k (Beitrag 1205599)
Hier:

Und wo ist die Änderung, die Stringlisten vor der Schleife zu erzeugen? Du hast da lustige Speicherlecks.

PS: Die hartkodierten Pfade lässt du am besten auch gleich weg.

MfG Dalai

Back2Code 1. Mär 2013 12:56

AW: Werte aus einer Ini Datei Lesen funktioniert nicht so ganz
 
Zitat:

Zitat von Dalai (Beitrag 1205603)
Zitat:

Zitat von Robin2k (Beitrag 1205599)
Hier:

Und wo ist die Änderung, die Stringlisten vor der Schleife zu erzeugen? Du hast da lustige Speicherlecks.

PS: Die hartkodierten Pfade lässt du am besten auch gleich weg.

MfG Dalai

Das Problem ist dann, dass es mit dem Erstellen des Inifiles nicht mehr ging, da ja inilist.Strings[i] genutzt wird von der Schleife...Ich weiß leider nicht wie ich anderst besser machen könnte.

Uwe Raabe 1. Mär 2013 12:57

AW: Werte aus einer Ini Datei Lesen funktioniert nicht so ganz
 
Delphi-Quellcode:
ini.ReadSectionValues(Sektionen.Strings[jj], Werte); //<-- Da muss irgendwo der Fehler liegen
Genau! Bei jedem Aufruf wird der aktuelle Inhalt von Werte gelöscht.

Back2Code 1. Mär 2013 12:59

AW: Werte aus einer Ini Datei Lesen funktioniert nicht so ganz
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1205608)
Delphi-Quellcode:
ini.ReadSectionValues(Sektionen.Strings[jj], Werte); //<-- Da muss irgendwo der Fehler liegen
Genau! Bei jedem Aufruf wird der aktuelle Inhalt von Werte gelöscht.

Wie kann ich das Löschen verhindern bzw, dass ich alle Werte von allen Sektionen in der Stringlist speichere?

Dalai 1. Mär 2013 13:00

AW: Werte aus einer Ini Datei Lesen funktioniert nicht so ganz
 
Zitat:

Zitat von Robin2k (Beitrag 1205606)
Das Problem ist dann, dass es mit dem Erstellen des Inifiles nicht mehr ging, da ja inilist.Strings[i] genutzt wird von der Schleife...

Das ist doch nicht das Problem, sondern das hier:
Delphi-Quellcode:
for i := 0 to inilist.Count-1 do
  begin
    ini := TIniFile.Create(inilist.Strings[i]);
    Sektionen := TStringList.Create;
    Abschnitte := TStringList.Create;
    Schlüssel := TStringlist.Create;
    Werte := TStringList.Create;
    [...]
    Sektionen.SaveToFile ('C:\Users\admin\Desktop\aTest\Sektionen.txt');
  Abschnitte.SaveToFile ('C:\Users\admin\Desktop\aTest\Abschnitte.txt');
  Werte.SaveToFile ('C:\Users\admin\Desktop\aTest\Werte.txt');
Das ist doch Käse. Erzeuge die Listen ini, Sektionen & Co einmalig vor der Schleife und leere sie, sofern nötig, mit TStringList.Clear innerhalb der for-Schleife. [ADD] Und zu jedem TStringList.Create gehört ein TStringList.Free.[/ADD]

MfG Dalai

p80286 1. Mär 2013 13:04

AW: Werte aus einer Ini Datei Lesen funktioniert nicht so ganz
 
Zitat:

Zitat von Dalai (Beitrag 1205603)
PS: Die hartkodierten Pfade lässt du am besten auch gleich weg.

Wenn Du dies hier meinst:
Delphi-Quellcode:
Sektionen.SaveToFile ('C:\Users\admin\Desktop\aTest\Sektionen.txt');
Abschnitte.SaveToFile ('C:\Users\admin\Desktop\aTest\Abschnitte.txt');
Werte.SaveToFile ('C:\Users\admin\Desktop\aTest\Werte.txt');
Das begeistert zwar nicht, aber ist wohl nur für die Testausgabe.
Oder war das Deine Bewerbung für den Job in Rom ;-)

Gruß
K-H

Back2Code 1. Mär 2013 13:06

AW: Werte aus einer Ini Datei Lesen funktioniert nicht so ganz
 
Ja also wie es der Ordner vermuten lässt, besteht die Speicherfunktion lediglich für Teste bis ich sehe, dass meine Stringlisten richtig gefüllt sind.

Uwe Raabe 1. Mär 2013 13:07

AW: Werte aus einer Ini Datei Lesen funktioniert nicht so ganz
 
Zitat:

Zitat von Robin2k (Beitrag 1205609)
Wie kann ich das Löschen verhindern bzw, dass ich alle Werte von allen Sektionen in der Stringlist speichere?

Du brauchst eine weiter StringList, die du mit
Delphi-Quellcode:
ReadSectionValues
verwendest. Danach überträgst du das per
Delphi-Quellcode:
Werte.AddStrings
.

p80286 1. Mär 2013 13:08

AW: Werte aus einer Ini Datei Lesen funktioniert nicht so ganz
 
Delphi-Quellcode:
Sektionen := TStringList.Create;
Abschnitte := TStringList.Create;
Schlüssel := TStringlist.Create;
Werte := TStringList.Create;
for i := 0 to inilist.Count-1 do begin
    ini := TIniFile.Create(inilist.Strings[i]);
   
.....
   ini.free;
end;
Da Ini für jede inilist[i] neu gebraucht wird, oder geht's auch anders?

Gruß
K-H

Uwe Raabe 1. Mär 2013 13:11

AW: Werte aus einer Ini Datei Lesen funktioniert nicht so ganz
 
Übrigens: der Sinn von Abschnitte erschließt sich nicht ganz. ReadSectionValues liest immer Key-Value Paare ein.

Überhaupt bleibt deine eigentliche Absicht bei dem Code verborgen. Einzig der Kommentar am Ende bringt etwas Licht, stimmt aber nicht mit dem Code überein.

Dalai 1. Mär 2013 13:11

AW: Werte aus einer Ini Datei Lesen funktioniert nicht so ganz
 
Zitat:

Zitat von p80286 (Beitrag 1205613)
Das begeistert zwar nicht, aber ist wohl nur für die Testausgabe.

Naja, kann man machen, aber es gibt auch so schicke Komponenten, in die man Stringlisten speichern lassen kann. Für eine Testausgabe ist es sicher benutzbar. Dennoch kann man auf den Punkt der hartkodierten Pfade nicht oft genug hinweisen. Selbst heutzutage sehe ich noch Software, die hartkodierte Pfade nutzt, die Adminrechte voraussetzt oder ähnliche Geschichten. Das kotzt mich aus Administratorensicht einfach nur an, denn die Admins müssen dann die Scheiße wegräumen oder drumrumlaufen, die ihnen die Programmierer (oder solche, die behaupten, welche zu sein) hinterlassen haben.

Sorry für OT.

MfG Dalai

Popov 1. Mär 2013 13:12

AW: Werte aus einer Ini Datei Lesen funktioniert nicht so ganz
 
Zitat:

Zitat von Dalai (Beitrag 1205612)
Das ist doch Käse. Erzeuge die Listen ini, Sektionen & Co einmalig vor der Schleife und leere sie, sofern nötig, mit TStringList.Clear innerhalb der for-Schleife.

Muss er nicht. Jeder Aufruf von ReadSections und ReadSection löscht die vorherige, also die alte Liste.

Back2Code 1. Mär 2013 13:13

AW: Werte aus einer Ini Datei Lesen funktioniert nicht so ganz
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1205617)
Übrigens: der Sinn von Abschnitte erschließt sich nicht ganz. ReadSectionValues liest immer Key-Value Paare ein.

Überhaupt bleibt deine eigentliche Absicht bei dem Code verborgen. Einzig der Kommentar am Ende bringt etwas Licht, stimmt aber nicht mit dem Code überein.

Also im Grunde genommen lese ich ein Verzeichnis ein, hole mir dort alle *Ini Dateien und beginne die einzulesen. Da will ich jeweils pro Ini Datei nochmal in verschiedene Stringlisten die Sektion, Abschnitt sowie Wert unterteiln, da ich diese dann später wiederum in eine Datenbank übertragen möchte.

Dalai 1. Mär 2013 13:15

AW: Werte aus einer Ini Datei Lesen funktioniert nicht so ganz
 
Zitat:

Zitat von Popov (Beitrag 1205620)
Zitat:

Zitat von Dalai (Beitrag 1205612)
Das ist doch Käse. Erzeuge die Listen ini, Sektionen & Co einmalig vor der Schleife und leere sie, sofern nötig, mit TStringList.Clear innerhalb der for-Schleife.

Muss er nicht. Jeder Aufruf von ReadSections und ReadSection löscht die vorherige, also die alte Liste.

Jeder Aufruf von ReadSection(s) leert die Liste, ja. Damit spart man sich das Clear (deswegen schrieb ich ja "sofern nötig"). Dennoch ist das wiederholte Erzeugen der Listen innerhalb der Schleife unnötig und verursacht Speicherlecks, zumal es überhaupt kein zugehöriges sl.Free gibt.

MfG Dalai

Popov 1. Mär 2013 13:33

AW: Werte aus einer Ini Datei Lesen funktioniert nicht so ganz
 
Habe ich auch nichts anderes behauptet. Im Code wird doppelt gemoppelt, Speicherlecks erstellt und immer wieder aufs neue unnötig TStringLists erstellt.

EDIT:

Übrigens, finde nur ich das etwas sonderbar oder ist es neuerdings, also in neuen Delphiversionen möglich Umlaute in Bezeichnern zu verwenden?

Delphi-Quellcode:
Schlüssel := TStringlist.Create;

DeddyH 1. Mär 2013 13:39

AW: Werte aus einer Ini Datei Lesen funktioniert nicht so ganz
 
In aktuellen Delphis kein Thema, auch wenn ich so etwas nach wie vor vermeide.

p80286 1. Mär 2013 14:23

AW: Werte aus einer Ini Datei Lesen funktioniert nicht so ganz
 
[OT]
Zitat:

Zitat von Dalai (Beitrag 1205619)
Zitat:

Zitat von p80286 (Beitrag 1205613)
Das begeistert zwar nicht, aber ist wohl nur für die Testausgabe.

Naja, kann man machen, aber es gibt auch so schicke Komponenten, in die man Stringlisten speichern lassen kann. Für eine Testausgabe ist es sicher benutzbar. Dennoch kann man auf den Punkt der hartkodierten Pfade nicht oft genug hinweisen. Selbst heutzutage sehe ich noch Software, die hartkodierte Pfade nutzt, die Adminrechte voraussetzt oder ähnliche Geschichten. Das kotzt mich aus Administratorensicht einfach nur an, denn die Admins müssen dann die Scheiße wegräumen oder drumrumlaufen, die ihnen die Programmierer (oder solche, die behaupten, welche zu sein) hinterlassen haben.

Sorry für OT.

MfG Dalai

:thumb::thumb::thumb:

Gruß
K-H

Sir Rufo 1. Mär 2013 18:18

AW: Werte aus einer Ini Datei Lesen funktioniert nicht so ganz
 
Verrate doch mal was du eigentlich mit der ganzen Aktion bezweckst.

Kann es sein, dass du die Ini-Dateien zusammenführen möchtest?


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:03 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