Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Ini-Datei komplett auslesen (https://www.delphipraxis.net/53829-ini-datei-komplett-auslesen.html)

PierreB 23. Sep 2005 11:17


Ini-Datei komplett auslesen
 
Moinsen :hi:

wiedermal ein klitzekleines Problem:

Ich habe da eine Ini-Datei, die wie folgt aufgebaut ist:
Zitat:

[Data]
Weihnacht=24.12.2005
Treiber=15.10.2005
Dann habe ich noch 2 Listboxen, in die eine sollen alle Namenswerte, in die zweite alle Datumswerte. Nur leider gelingt
es mir nicht alle Daten nur anhand der Section in die Listboxen zu laden. Ich hatte folgendes probiert:
Delphi-Quellcode:
for i := 0 to 100 do
ListBox1.Items.Add(Ini.Readstring('Data', '', ''));
War sozusagen nur ein erster Versuch, hat logischerweise nicht funktioniert, denn es sind zu wenig Werte angeben.
Kann mir bitte jemand helfen ?

Vielen Dank schonmal,

P.S.: Außer der Name der Section (in diesem Falle "Data") ist nichts bekannt...

alcaeus 23. Sep 2005 11:22

Re: Ini-Datei komplett auslesen
 
Moin,

TIniFile kennt die Methoden [oh]ReadSections, ReadSection, ReadSectionValues[/oh], damit solltest du eigentlich das erreichen was du willst.

Greetz
alcaeus

t0mt0m 23. Sep 2005 11:24

Re: Ini-Datei komplett auslesen
 
Hi Pierre,

ohne jetzt mal ein Codebeispiel zu geben ein ganz schnelle Antwort. :)
Schau dir mal den Befehl ReadSection an, mit dem Du eine komplette Section einlesen kannst. Alle Inhalte werden Dir in einer Stringlist zurückgegeben.

Grüße

Tom

t0mt0m 23. Sep 2005 11:26

Re: Ini-Datei komplett auslesen
 
mh.. ich war zu langsam... :) also streich das "schnelle" aus meinem vorigen Post ;)

PierreB 23. Sep 2005 11:45

Re: Ini-Datei komplett auslesen
 
Ah, danke erstmal an euch beide, ich guck mir das mal genauer an. :-)

marabu 23. Sep 2005 12:12

Re: Ini-Datei komplett auslesen
 
Hi Pierre,

wenn du die Schlüssel und die Werte aus deiner Steuerdatei auseinander reißt, indem du sie in zwei verschiedene Listboxen packst, machst du dir eine Menge Arbeit. Zieh dir doch einen ValuListEditor auf deine Form - und schon geht alles wie von selbst:

Delphi-Quellcode:
procedure TMainForm.LoadButtonClick(Sender: TObject);
var
  ini: TMemIniFile;
begin
  ini := TMemIniFile.Create(ChangeFileExt(ParamStr(0), '.ini'));
  ini.ReadSectionValues('Data', VLE.Strings);
  ini.Free;
end;
Grüße vom marabu

bigg 23. Sep 2005 13:31

Re: Ini-Datei komplett auslesen
 
Falls es dich interessiert, ich habe dazu eine Unit geschrieben, da mir die Funktionen von Borland nicht ausreichten. (nicht objektorientiert =)

Delphi-Quellcode:
unit MyIni;
interface

uses Windows, SysUtils, Classes;

procedure ReadSections(Ini, Sections: TStringList);
function ReadSection(Ini, Section: TStringList; SectionName: String): Integer;
function SectionExists(Sections: TStringList; SectionName: String): Boolean;
function ValueExists(Section: TStringList; Value: String): Boolean;
function IsValue(const Input, ValueName: String): Boolean;

function ReadString(Section: TStringList; Value: String): String;
function ReadInteger(Section: TStringList; Value: String): Integer;
function ReadBool(Section: TStringList; Value: String): Boolean;

procedure WriteType(Ini: TStringList; SectionName, ValueName, Value: String);
procedure WriteString(Ini: TStringList; SectionName, ValueName, Value: String);
procedure WriteInteger(Ini: TStringList; SectionName, ValueName: String; Value: Integer);
procedure WriteBool(Ini: TStringList; SectionName, ValueName: String; Value: Boolean);

function TrimIni(Ini: TStringList): TStringList;

implementation

////////////////////////////////////////////////////////////////////////////////
// Entfernt Tabs und Leerzeichen an Anfang und Ende eines
// jeden Eintrags in einer Liste
////////////////////////////////////////////////////////////////////////////////

function TrimIni(Ini: TStringList): TStringList;
var i: Integer;
begin
  Result := Ini;

  for i := 0 to Ini.Count -1 do
  begin if Ini[i] <> '' then
  begin
    Ini[i] := Trim(Ini[i]);

  end;
  end;
end;

////////////////////////////////////////////////////////////////////////////////
// Alle Gruppen auslesen
////////////////////////////////////////////////////////////////////////////////

procedure ReadSections(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 := pos(']', Ini[i]);

      if p > 2 then
      Sections.Add(Copy(Ini[i], 1, p));
    end;
  end;
  end;
end;

////////////////////////////////////////////////////////////////////////////////
// Alle Werte einer Section auslesen
////////////////////////////////////////////////////////////////////////////////

function ReadSection(Ini, Section: TStringList; SectionName: String): Integer;
var i, p: Integer;
var s, sn: String;
begin
Section.Clear;
Result := -1;

  if SectionName <> '' then
  begin sn := LowerCase(SectionName);
    for i := 0 to Ini.Count -1 do
    begin if Ini[i] <> '' then
      begin if Ini[i][1] = '[' then
        begin
          p := pos(']', Ini[i]);

          if p > 2 then
          begin s := LowerCase(Copy(Ini[i], 2, p - 2));
            if s = sn then
            begin
              Result := i + 1;
              Break;
            end;
          end;
        end;
      end;
    end;
  end;

  // Kopiere bis zur nächsten Gruppe
  if Result > -1 then
  begin for i := Result to Ini.Count - 1 do
  begin if Ini[i] <> '' then
  begin
    if Ini[i][1] <> '[' then
    Section.Add(Ini[i]) else
    Break;
  end;
  end;
  end;
end;

////////////////////////////////////////////////////////////////////////////////
// Existiert eine Gruppe?
////////////////////////////////////////////////////////////////////////////////

function SectionExists(Sections: TStringList; SectionName: String): Boolean;
var i, p: Integer;
var s, sn: String;
begin
  Result := False;

  if SectionName <> '' then
  begin sn := LowerCase(SectionName);

    for i := 0 to Sections.Count -1 do
    begin if Sections[i] <> '' then
      begin if Sections[i][1] = '[' then
        begin
          p := pos(']', Sections[i]);

          if p > 2 then
          begin s := LowerCase(Copy(Sections[i], 2, p - 2));
            if s = sn then
            begin
              Result := True;
              Break;
            end;
          end;

        end;
      end;
    end;
  end;
end;

////////////////////////////////////////////////////////////////////////////////
// Existiert ein Wert in einer Gruppe?
////////////////////////////////////////////////////////////////////////////////

function ValueExists(Section: TStringList; Value: String): Boolean;
var i: Integer;
var s: String;
begin
  Result := False;

  if Value <> '' then
  begin s := LowerCase(Value);
    for i := 0 to Section.Count -1 do
    begin
      if IsValue(Section[i], Value) then
      begin
        Result := True;
        Break;
      end;
    end;
  end;
end;

////////////////////////////////////////////////////////////////////////////////
// Ermittelt, ob in einem String ein bestimmter Wert existiert
////////////////////////////////////////////////////////////////////////////////

function IsValue(const Input, ValueName: String): Boolean;
var p: Integer;
var s, i: String;
begin
  Result := False;

  if (ValueName <> '') and (Input <> '') then
  begin p := Pos('=', Input);

    if p <> 0 then
    begin s := LowerCase(Trim(Copy(Input, 1, p -1)));

      if s <> '' then
      begin
        i := LowerCase(ValueName);
        if s = i then Result := True;
      end;

    end;
  end;
end;

////////////////////////////////////////////////////////////////////////////////
// Schreibt einen Wert in eine Ini
// Existiert die Gruppe nicht, wird sie angelegt
////////////////////////////////////////////////////////////////////////////////

procedure WriteType(Ini: TStringList; SectionName, ValueName, Value: String);
var i, p, f: Integer;
var s, Key: String;
var Sections: TStringList;
begin

  if ValueName <> '' then
  begin if SectionName <> '' then
    begin Sections := TStringList.Create;
      try
        ReadSections(Ini, Sections);
        Key := ValueName + '=' + Value;

        if SectionExists(Sections, SectionName) then
        begin for i := 0 to Ini.Count -1 do
          begin if Ini[i] <> '' then
            begin if Ini[i][1] = '[' then // Gruppe suchen
              begin p := Pos(']', Ini[i]);

                if p <> 0 then
                begin s := LowerCase(Copy(Ini[i], 2, p -2));

                  if s = LowerCase(SectionName) then
                  begin // Gruppe gefunden

                    for f := i + 1 to Ini.Count -1 do
                    begin
                      if f = Ini.Count -1 then
                      begin if IsValue(Ini[f], ValueName) then
                      begin // Wert gefunden
                        Ini[f] := Key; // Spalte überschreiben
                        Break;
                      end else Ini.Add(Key); // Wert konnte nicht gefunden werden, schreibe ihn ans Dateiende
                      end else
                          begin if Ini[f] <> '' then
                            begin
                              if Ini[f][1] <> '[' then
                              begin if IsValue(Ini[f], ValueName) then
                              begin // Wert innerhalb der Gruppe gefunden
                                Ini[f] := Key; // Spalte überschreiben
                                Break;
                              end;
                              end else
                              begin // Gruppen-Ende
                                Ini.Insert(f, Key); // Wert ans Ende der Gruppe einfügen
                                Break;
                              end;
                              end;
                          end;
                    end;

                    Break;
                  end;
                end;
              end;
            end;
          end;
        end else // SectionExists
        begin // Gruppe existiert nicht
          Ini.Add('');
          Ini.Add('[' + SectionName + ']');
          Ini.Add(Key);
        end;

      finally Sections.Free;
      end;

    end;
  end;
end;

////////////////////////////////////////////////////////////////////////////////
// Schreibt einen String-Wert in eine Ini (TStringList)
////////////////////////////////////////////////////////////////////////////////

procedure WriteString(Ini: TStringList; SectionName, ValueName, Value: String);
begin
  WriteType(Ini, SectionName, ValueName, '"' + Value + '"');
end;

////////////////////////////////////////////////////////////////////////////////
// Schreibt einen Integer-Wert in eine Ini (TStringList)
////////////////////////////////////////////////////////////////////////////////

procedure WriteInteger(Ini: TStringList; SectionName, ValueName: String; Value: Integer);
var s: String;
begin
  try s := IntToStr(Value); except s := '0'; end;
  WriteType(Ini, SectionName, ValueName, s);
end;

////////////////////////////////////////////////////////////////////////////////
// Schreibt einen Boolean-Wert in eine Ini (TStringList)
////////////////////////////////////////////////////////////////////////////////

procedure WriteBool(Ini: TStringList; SectionName, ValueName: String; Value: Boolean);
var s: String;
begin
  if Value then s := '1' else s := '0';
  WriteType(Ini, SectionName, ValueName, s);
end;

////////////////////////////////////////////////////////////////////////////////
// Liest einen Wert aus einer Gruppe aus
// ReadString(Gruppe, Wert): Rückgabewert
////////////////////////////////////////////////////////////////////////////////

function ReadString(Section: TStringList; Value: String): String;
var i, p: Integer;
var s: String;
begin
  Result := '';

  if Value <> '' then
  begin s := LowerCase(Value);
    for i := 0 to Section.Count -1 do
    begin
      p := Pos('=', Section[i]);

      if p <> 0 then
      begin if s = Trim(LowerCase(Copy(Section[i], 1, p -1))) then
        begin
          Result := Trim(Copy(Section[i], p + 1, Length(Section[i]) - p));

          if Result <> '' then
          begin if Result[1] = '"' then
          begin

            for p := 2 to Length(Result) do
            begin if Result[p] = '"' then
            begin
               Result := Copy(Result, 2, p -2);
               Break;
            end;
            end;

          end;
          end;

          Break;
        end;
      end;
    end;
  end;

end;

////////////////////////////////////////////////////////////////////////////////
// Einen Integer-Wert einer Gruppe auslesen
////////////////////////////////////////////////////////////////////////////////

function ReadInteger(Section: TStringList; Value: String): Integer;
begin
  try Result := StrToInt(ReadString(Section, Value)); except Result := -1; end;
end;

procedure ReadIntegerEx(Section: TStringList; Value: String; Input: Integer);
begin
  if ValueExists(Section, Value) then
  Input := ReadInteger(Section, Value);
end;

////////////////////////////////////////////////////////////////////////////////
// Einen Boolschen-Wert einer Gruppe auslesen
////////////////////////////////////////////////////////////////////////////////

function ReadBool(Section: TStringList; Value: String): Boolean;
var i: Integer;
begin
  i := ReadInteger(Section, Value);

  if i = 0 then
  Result := False else
  Result := True;
end;

procedure ReadBoolEx(Section: TStringList; Value: String; Input: Boolean);
begin
  if ValueExists(Section, Value) then
  Input := ReadBool(Section, Value);
end;


end.

PierreB 23. Sep 2005 13:56

Re: Ini-Datei komplett auslesen
 
Zitat:

Zitat von marabu
Hi Pierre,

wenn du die Schlüssel und die Werte aus deiner Steuerdatei auseinander reißt, indem du sie in zwei verschiedene Listboxen packst, machst du dir eine Menge Arbeit. Zieh dir doch einen ValuListEditor auf deine Form - und schon geht alles wie von selbst:

Delphi-Quellcode:
procedure TMainForm.LoadButtonClick(Sender: TObject);
var
  ini: TMemIniFile;
begin
  ini := TMemIniFile.Create(ChangeFileExt(ParamStr(0), '.ini'));
  ini.ReadSectionValues('Data', VLE.Strings);
  ini.Free;
end;
Grüße vom marabu

Moin marabu,

vielen Dank, geht wirklich supi so, ich werds so machen. :thumb:

@bigg: Da ich derzeit viel mit Ini-Dateien zu tun habe, werde ich mir deine Unit mal genauer angucken, vielen Dank. :-)

PierreB 6. Okt 2005 14:07

Re: Ini-Datei komplett auslesen
 
Moinsen,

ich muss nochmal kurz stören: :stupid:

Als mit dem Code von marabu lade ich also die Datumswerte in den ValueListEditor. Gibt es nun eine einfache Möglichkeit die Daten zu ordnen, also das das älteste Datum ganz oben in der Liste steht ?

Danke schonmal,

Luckie 6. Okt 2005 14:09

Re: Ini-Datei komplett auslesen
 
Ich kenn die Komponente nicht, aber falls die keine eigene Methode zum Sortiren kennt, einfach in einem Zwischenschritt selber sotieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:20 Uhr.
Seite 1 von 2  1 2      

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