AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi INIDatei: Namen der Sections auslesen
Thema durchsuchen
Ansicht
Themen-Optionen

INIDatei: Namen der Sections auslesen

Ein Thema von Z32 · begonnen am 13. Feb 2007 · letzter Beitrag vom 13. Feb 2007
Antwort Antwort
Z32
(Gast)

n/a Beiträge
 
#1

INIDatei: Namen der Sections auslesen

  Alt 13. Feb 2007, 16:28
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:
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;
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.

Vielleicht kenn ja einer eine einfachere Methode oder sieht den Fehler....
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: INIDatei: Namen der Sections auslesen

  Alt 13. Feb 2007, 16:35
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;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#3

Re: INIDatei: Namen der Sections auslesen

  Alt 13. Feb 2007, 16:38
Es wird viel einfacher: Mit Delphi-Referenz durchsuchenTIniFile.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.
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
Z32
(Gast)

n/a Beiträge
 
#4

Re: INIDatei: Namen der Sections auslesen

  Alt 13. Feb 2007, 16:44
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]);
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: INIDatei: Namen der Sections auslesen

  Alt 13. Feb 2007, 16:45
Guck dir die Ausgabe an....
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
bigg
(Gast)

n/a Beiträge
 
#6

Re: INIDatei: Namen der Sections auslesen

  Alt 13. Feb 2007, 16:48
Die etwas kompliziertere Variante wäre dann noch diese:

Delphi-Quellcode:
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;
Benötigt werden 2 Listen vom Typ TStringList.
  Mit Zitat antworten Zitat
Z32
(Gast)

n/a Beiträge
 
#7

Re: INIDatei: Namen der Sections auslesen

  Alt 13. Feb 2007, 17:03
Zitat von Luckie:
Guck dir die Ausgabe an....
mach ich...hab ich

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.
  Mit Zitat antworten Zitat
Antwort Antwort


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 13:41 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