Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi IniFile - Auslesen funktioniert nicht (https://www.delphipraxis.net/75486-inifile-auslesen-funktioniert-nicht.html)

Cyberbob 20. Aug 2006 05:01


IniFile - Auslesen funktioniert nicht
 
Hallo, ich habe ein Problem mit IniFiles. Ich möchte einen Wert in einer Sektion auslesen, das funktioniert allerdings nicht.

Mein Code:
Delphi-Quellcode:
try
  IniDatei := TIniFile.Create(ChangeFileExt(ParamStr(0), '.ini'));
  len := IniDatei.ReadInteger('Global', 'EQ', 0);
  ShowMessage(IntToStr(len));
finally
  IniDatei.Free;
end;
Die IniDatei sieht vollgendermassen aus:
Delphi-Quellcode:
[Global]
EQ=1
Weiss einer Rat, alle Variablen sind Deklariert doch in len steht immer 0 (Null)!

Was mach ich falsch, ich wüsste nicht, was ich anderst gemacht haben sollte als sonst...

Daniel B 20. Aug 2006 05:08

Re: IniFile - Auslesen funktioniert nicht
 
Das Create vor dem try setzen und Inifile muss als TIniFile deklariert sein in der Prozedur bei den variablen. Besser im Finally ein FreeAndNil(IniFile).

Balu der Bär 20. Aug 2006 09:07

Re: IniFile - Auslesen funktioniert nicht
 
Deine Code funktioniert fehlerfrei.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
 iniDatei : TIniFile;
 len : Integer;
begin
try
  IniDatei := TIniFile.Create(ChangeFileExt(ParamStr(0), '.ini'));
  len := IniDatei.ReadInteger('Global', 'EQ', 0);
  ShowMessage(IntToStr(len));
finally
  IniDatei.Free;
end;
end;
Könnte es sein das es an dieser Zeile liegt:
Delphi-Quellcode:
IniDatei := TIniFile.Create(ChangeFileExt(ParamStr(0), '.ini'));
ChangeFileExt(ParamStr(0)) ändert den Dateinamen der Exe (also z.B. Projekt1.exe) in Projekt1.ini. Bist du sicher das diese Datei existiert?

Daniel B 20. Aug 2006 09:23

Re: IniFile - Auslesen funktioniert nicht
 
Da soll er natürlich ExtractFilePath nehmen, dennoch gehört das Create nicht ins try...

mkinzler 20. Aug 2006 09:26

Re: IniFile - Auslesen funktioniert nicht
 
Zitat:

dennoch gehört das Create nicht ins try...
Warum nicht ?

Balu der Bär 20. Aug 2006 09:27

Re: IniFile - Auslesen funktioniert nicht
 
Zitat:

Zitat von Daniel B
Da soll er natürlich ExtractFilePath nehmen, dennoch gehört das Create nicht ins try...

Ich hab auch nie das Gegenteil behauptet. ;)

Khabarakh 20. Aug 2006 09:32

Re: IniFile - Auslesen funktioniert nicht
 
Zitat:

Zitat von mkinzler
Zitat:

dennoch gehört das Create nicht ins try...
Warum nicht ?

Weil's keinen Sinn ergibt?
Überleg doch mal, was passiert, sollte eine Exception im ctor ausgelöst werden. Der Ini-Variablen wird kein Pointer zugewiesen, da der Code sofort ins Finally springt. Und da Delphi keinen lokalen Variablen initialisiert, knallt es höchstwahrscheinlich dann beim Aufruf von Free, weil IniDatei sonstwohin zeigen kann.

Klaus01 20. Aug 2006 10:05

Re: IniFile - Auslesen funktioniert nicht
 
Zitat:

Zitat von Balu der Bär
Könnte es sein das es an dieser Zeile liegt:
Delphi-Quellcode:
IniDatei := TIniFile.Create(ChangeFileExt(ParamStr(0), '.ini'));
ChangeFileExt(ParamStr(0)) ändert den Dateinamen der Exe (also z.B. Projekt1.exe) in Projekt1.ini. Bist du sicher das diese Datei existiert?

Das tut es mitnichten, es ändert die Extension des übergebenen Dateinamen, aber ändert nicht
den Dateinamen auf der HD.

Aber wie wieter oben schon einmal bemerkt ist es wohl besser dies zu nehmen:

Delphi-Quellcode:
IniDatei := TIniFile.Create(ExtractfilePath(ParamStr(0))+ChangeFileExt(ParamStr(0), '.ini'));
Funktioniert aber nur wenn Deine ini Datei auch im Verzeichnis der exe liegt.

Grüße
Klaus

Hawkeye219 20. Aug 2006 10:12

Re: IniFile - Auslesen funktioniert nicht
 
Klaus, hast du deinen Vorschlag einmal getestet?

Gruß Hawkeye

Klaus01 20. Aug 2006 10:17

Re: IniFile - Auslesen funktioniert nicht
 
@Hawkeye

nein :o( aber jetzt schon
und da ist etwas dopplet gemoppelt.
In ChangeFileExt ist der komplette Pfad schon enthalten.
Daher kann der Vorschlag vergessen werden.

Danke und Grüße
Klaus

Jürgen Thomas 20. Aug 2006 10:29

Re: IniFile - Auslesen funktioniert nicht
 
Eigentlich sieht der Code wirklich fast sauber aus.
Zitat:

Zitat von Khabarakh
Zitat:

Zitat von mkinzler
dennoch gehört das Create nicht ins try...Warum nicht ?

Weil's keinen Sinn ergibt?
Überleg doch mal, was passiert, sollte eine Exception im ctor ausgelöst werden. Der Ini-Variablen wird kein Pointer zugewiesen, da der Code sofort ins Finally springt. Und da Delphi keinen lokalen Variablen initialisiert, knallt es höchstwahrscheinlich dann beim Aufruf von Free, weil IniDatei sonstwohin zeigen kann.

Also ändern wie folgt (im übrigen unveränderte Kopie):
Zitat:

Zitat von Cyberbob
Mein Code:
Delphi-Quellcode:
IniDatei := TIniFile.Create(ChangeFileExt(ParamStr(0), '.ini')); //  verschoben
try
  len := IniDatei.ReadInteger('Global', 'EQ', 0);
  ShowMessage(IntToStr(len));
finally
  IniDatei.Free;
end;
Was mach ich falsch, ich wüsste nicht, was ich anderst gemacht haben sollte als sonst...

Ich sehe auch keinen Fehler (und die anderen Autoren ebenfalls nicht wirklich) - natürlich unter der Voraussetzung, dass die Ini wirklich im Programmverzeichnis liegt.

In solchen Fällen bietet es sich immer an, schrittweise im Debugger vorzugehen - Haltepunkt auf TIniFile.Create - und die lokalen Variablen zu prüfen. Außerdem könntest Du zusätzlich eine Stringliste erzeugen, in die Du nacheinander alle Sections und alle Werte einträgst und mit ShowMessage anzeigen lässt - siehe das Beispiel zu Delphi-Referenz durchsuchenTIniFile.ReadSections.

Gruß Jürgen

Cyberbob 20. Aug 2006 17:54

Re: IniFile - Auslesen funktioniert nicht
 
Also, ich habe in meinem Code jetzt vollgendes stehen:

Delphi-Quellcode:
  IniDatei := TIniFile.Create('Settings.ini');
  try
    len := IniDatei.ReadInteger('Global', 'EQ', 0);
    ShowMessage(IntToStr(len));
  finally
    FreeandNil(IniDatei);
  end;
Die Datei Settings.ini existiert und wenn ich testweise ein Memo1.Ls.LoadFromFile('Settings.ini'); zeigt er mir den Inhalt auch an.
Dennoch kommt er zum ShowMessage und Zeigt mir 0 an! Eine Exception wird auch nicht ausgelöst, das Programm läuft weiter und der Compiler/Debugger meckert auch nicht

[EDIT] Hab jetzt mal nen Haltepunkt bei try gesetzt, Bei IniDatei Zeigt er mir jetzt "IniDatei = ()" an. Was bedeutet das, das nicht zugewiesen ist?
Dennoch bringt er keine Exception. [/EDIT]

Thanatos81 20. Aug 2006 18:24

Re: IniFile - Auslesen funktioniert nicht
 
Versuchs mal mit
Delphi-Quellcode:
IniDatei := TIniFile.Create(ExtractFilePath(paramstr(0))+'Settings.ini');
INI-dateien werden normalerweise im Windows-Ordner gespeichert, also versucht

Delphi-Quellcode:
IniDatei := TIniFile.Create('Settings.ini');
z.B. C:\Windows\Settings.ini zu laden.

Hawkeye219 20. Aug 2006 18:29

Re: IniFile - Auslesen funktioniert nicht
 
Bevor wir jetzt noch tagelang weiter raten: füge bitte die folgende Prozedur in dein Programm ein und rufe sie dort auf, wo du den Wert aus der Ini-Datei laden möchtest. Teile uns dann bitte mit, was in der Messagebox steht, die beim Aufruf erscheint.

Delphi-Quellcode:
procedure CheckIni;
const
  SECTION = 'Global';
  KEY = 'EQ';
var
  Ini : TIniFile;
  FileName : string;
  Value : Integer;
begin
  FileName := ExtractFilePath(ParamStr(0)) + 'Settings.ini';
  if FileExists(FileName) then
    begin
      Ini := TIniFile.Create(FileName);
      try
        if Ini.SectionExists(SECTION) then
          if Ini.ValueExists(SECTION, KEY) then
            begin
              Value := Ini.ReadInteger(SECTION, KEY, 0);
              ShowMessage ('Der gelesene Wert: ' + IntToStr(Value));
            end
          else
            ShowMessage ('Der Schlüssel "' + KEY + '" existiert nicht!')
        else
          ShowMessage ('Der Abschnitt "' + SECTION + '" existiert nicht!');
      finally
        Ini.Free;
      end;
    end
  else
    ShowMessage ('Die Datei "' + FileName + '" existiert nicht!');
end;
Gruß Hawkeye

Cyberbob 20. Aug 2006 18:41

Re: IniFile - Auslesen funktioniert nicht
 
@Thanatos81: Hat funktioniert danke! Jetzt zeigt er mir den Richtigen Wert an!


Dank an alle!


Was ist eigentlich der Unterschied zwischen IniDatei.Free und FreeandNil(IniDatei)?

ManuMF 21. Aug 2006 14:31

Re: IniFile - Auslesen funktioniert nicht
 
Der zweite Befehl ist besser, da dem Objekt auch noch zusätzlich nil zugewiesen wird, wie der Name der Funktion schon sagt.

Muetze1 21. Aug 2006 16:35

Re: IniFile - Auslesen funktioniert nicht
 
... wobei, wenn es sich um eine lokale Variable handelt (ini) und danach nix mehr relevantes an Code kommt, was die INI betrifft, dann reicht ein .Free vollkommen.

Thanatos81 21. Aug 2006 16:44

Re: IniFile - Auslesen funktioniert nicht
 
Dann schon, ich zB hab mir aber trotzdem angewöhnt auch in solchen Fällen FreeAndNil zu verwenden um es dann an anderen Stellen automatisch zu nutzen und nicht "aus Versehen" .Free zu verwenden.

Muetze1 21. Aug 2006 18:00

Re: IniFile - Auslesen funktioniert nicht
 
Zitat:

Zitat von Thanatos81
Dann schon, ich zB hab mir aber trotzdem angewöhnt auch in solchen Fällen FreeAndNil zu verwenden um es dann an anderen Stellen automatisch zu nutzen und nicht "aus Versehen" .Free zu verwenden.

Hatte ich früher auch, bin aber nun wieder dazu über gegangen FreeAndNil() wirklich nur noch da zu verwenden, wo eine erneute Abfrage oder Verwendung der Variable in Frage kommt. So habe ich auch im Destructor keine FreeAndNil()'s drin...


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz