INIDatei: Namen der Sections auslesen
Hallo,
ich habe ein Problem beim auslesen der Namen der Sections einer INI Datei. Also ich meine diese Namen: [xxxx]<=Namen dieser Section y=z Und möchte nun nacheinander aus jeder Section etwas auslesen, das Problem ist eben, dass ich weder weiß wie viele Sections es gibt, noch wie sie heißen. Ich habe mir jetzt folgendes überlegt: 1.) Auslesen wie viele Sections gibt es 2.) Alle Section-Namen in eine unsichtbare Combobox laden 3.) Mit einer FOR Schleife 1 to anzahl-der-Sections zählen und in der Schleife eine Variable mitzählen lassen welches Item aus der Combobox geladen werden muss. Die Fuction zu auslesen, wei viele Sections es gibt:
Delphi-Quellcode:
{FUNCTION VON www.dsdt.info}
function INISectionsCount(const AFilename: String): Integer; var ISectionCount: Integer; i: Integer; SCurr: String; SLIni: TStringList; begin SLIni := TStringList.Create; ISectionCount := 0; try SLIni.LoadFromFile(AFilename); If SLIni.Count <> 0 then begin For i := 0 to SLIni.Count - 1 do begin SCurr := SLIni.Strings[i]; If (SCurr <> '') and (SCurr[1] = '[') and (SCurr[Length(SCurr)] = ']') then Inc(ISectionCount); end; end finally SLIni.Free; end; Der auslese teil:
Delphi-Quellcode:
Das Problem ist jetzt, das beim addieren von einlesen1 und einlesen2 ungenauhigkeiten auftreten. Ich glaube das das am Code liegt, weil der ja ziemlich unpraktisch ist, aber mir ist keine andere Möglichkeit bekannt Anzahl und Namen von Sections aus einer INI Datei auszulesen.
uses: inifiles;
var ini01: tinifile var anzahlsections, zaehler:integer; var einlesen1, einlesen2: real; var pfad: string; anzahlsections:=0; einlesen1:=0; einlesen2:=0; zaehler:=-1; anzahlsections:=INISectionsCount('kvload.ini'); ini01:=TIniFile.create(ExtractFilePath(ParamStr(0))+'kvload.ini'); try ini01.ReadSections(combobox3.Items); finally ini01.Free; end; for i:= 1 to anzahlsections do begin zaehler:=zaehler+1; pfad:=combobox3.Items[zaehler]; ini01:=TIniFile.create(ExtractFilePath(ParamStr(0))+'kvload.ini'); try einlesen1:=ini01.ReadFloat(pfad,'Untersection',0); finally ini01.Free; end; einlesen2:=einlesen2+einlesen1; end; Vielleicht kenn ja einer eine einfachere Methode oder sieht den Fehler.... |
Re: INIDatei: Namen der Sections auslesen
Ich würde es so machen (wenn ich dein Problem richtig verstanden habe):
Delphi-Quellcode:
uses
IniFiles; procedure TForm1.Button1Click(Sender: TObject); var ini: TIniFile; sl: TStringList; i: Integer; begin ini := TIniFile.Create('c:\boot.ini'); try sl := TStringList.Create; try try ini.ReadSections(sl); ShowMessage('Anzahl der Sektionen: ' + IntToStr(sl.Count)); for i := 0 to sl.Count - 1 do ShowMessage('Sektion: ' + IntToStr(i+1) + #13#10 + 'Sektionsname: ' + sl.Strings[i]); except on E: Exception do ShowMessage(E.Message); end; finally sl.Free; end; finally ini.Free; end; end; |
Re: INIDatei: Namen der Sections auslesen
Es wird viel einfacher: Mit TIniFile.ReadSections bekommst Du direkt die Namen aller Sections in eine Stringliste, die z.B. direkt nach ComboBox.Items übertragen werden kann. Damit ist Count sofort bekannt. Jürgen
Nachtrag: Natürlich war ich zu langsam. Lies es als Erläuterung für Luckie. |
Re: INIDatei: Namen der Sections auslesen
Das sieht ja wesentlich kürzer und klarer aus...bin garnicht auf dei Idee gekommen das mit einer Stringlist zu machen. Werde ich direkt mal einbauen und schauen ob das besser klappt.
Aber eine Frage habe ich noch was heißt das hier: Code von Luckie ShowMessage('Sektion: ' + IntToStr(i+1) + <#13#10> + 'Sektionsname: ' + sl.Strings[i]); |
Re: INIDatei: Namen der Sections auslesen
Guck dir die Ausgabe an.... ;)
|
Re: INIDatei: Namen der Sections auslesen
Die etwas kompliziertere Variante wäre dann noch diese:
Delphi-Quellcode:
Benötigt werden 2 Listen vom Typ TStringList.
const MAX_INI_SIZE = 262144;
//////////////////////////////////////////////////////////////////////////////// // Größe einer Datei ermitteln //////////////////////////////////////////////////////////////////////////////// function GetFileSize(const FileName: String): Int64; var FileHandle: Cardinal; var Data: WIN32_FIND_DATA; begin Result := -1; FileHandle := FindFirstFile(PChar(FileName), Data); try if FileHandle > 0 then begin Int64Rec(Result).Hi := Data.nFileSizeHigh; Int64Rec(Result).Lo := Data.nFileSizeLow; end; finally Windows.FindClose(FileHandle); end; end; //////////////////////////////////////////////////////////////////////////////// // Entfernt Tabs und Leerzeichen an Anfang und Ende eines // jeden Eintrags in einer Liste //////////////////////////////////////////////////////////////////////////////// procedure TrimIni(const Ini: TStringList); var i: Integer; begin for i := 0 to Ini.Count -1 do if Ini[i] <> '' then Ini[i] := Trim(Ini[i]); end; //////////////////////////////////////////////////////////////////////////////// // Versucht eine "Ini-Datei" einzulesen //////////////////////////////////////////////////////////////////////////////// function OpenIni(const FileName: String; const Ini: TStringList): Boolean; var FileSize: Int64; begin Result := False; FileSize := GetFileSize(FileName); if FileSize <> -1 then begin if FileSize < MAX_INI_SIZE then begin try Result := True; Ini.LoadFromFile(FileName); except Result := False; end; if Result then TrimIni(Ini); end; end; end; //////////////////////////////////////////////////////////////////////////////// // Alle Gruppen auslesen //////////////////////////////////////////////////////////////////////////////// procedure ReadSections(const Ini, Sections: TStringList); var i, p: Integer; begin Sections.Clear; for i := 0 to Ini.Count -1 do begin if Ini[i] <> '' then begin if Ini[i][1] = '[' then begin p := PosShaAsm5(']', Ini[i]); // ersetzen durch POS() if p > 2 then Sections.Add(Copy(Ini[i], 1, p)); end; end; end; end; |
Re: INIDatei: Namen der Sections auslesen
Zitat:
erstellt eine neue Zeile in der Showmessage. hehe Ich habe übrigens jetzt den Code von Luckie verwendet, da ich den am leichtesten verstehe und der am besten zum meinem Problem passt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:52 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