![]() |
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:
Die IniDatei sieht vollgendermassen aus:
try
IniDatei := TIniFile.Create(ChangeFileExt(ParamStr(0), '.ini')); len := IniDatei.ReadInteger('Global', 'EQ', 0); ShowMessage(IntToStr(len)); finally IniDatei.Free; end;
Delphi-Quellcode:
Weiss einer Rat, alle Variablen sind Deklariert doch in len steht immer 0 (Null)!
[Global]
EQ=1 Was mach ich falsch, ich wüsste nicht, was ich anderst gemacht haben sollte als sonst... |
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).
|
Re: IniFile - Auslesen funktioniert nicht
Deine Code funktioniert fehlerfrei.
Delphi-Quellcode:
Könnte es sein das es an dieser Zeile liegt:
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;
Delphi-Quellcode:
ChangeFileExt(ParamStr(0)) ändert den Dateinamen der Exe (also z.B. Projekt1.exe) in Projekt1.ini. Bist du sicher das diese Datei existiert?
IniDatei := TIniFile.Create(ChangeFileExt(ParamStr(0), '.ini'));
|
Re: IniFile - Auslesen funktioniert nicht
Da soll er natürlich ExtractFilePath nehmen, dennoch gehört das Create nicht ins try...
|
Re: IniFile - Auslesen funktioniert nicht
Zitat:
|
Re: IniFile - Auslesen funktioniert nicht
Zitat:
|
Re: IniFile - Auslesen funktioniert nicht
Zitat:
Ü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. |
Re: IniFile - Auslesen funktioniert nicht
Zitat:
den Dateinamen auf der HD. Aber wie wieter oben schon einmal bemerkt ist es wohl besser dies zu nehmen:
Delphi-Quellcode:
Funktioniert aber nur wenn Deine ini Datei auch im Verzeichnis der exe liegt.
IniDatei := TIniFile.Create(ExtractfilePath(ParamStr(0))+ChangeFileExt(ParamStr(0), '.ini'));
Grüße Klaus |
Re: IniFile - Auslesen funktioniert nicht
Klaus, hast du deinen Vorschlag einmal getestet?
Gruß Hawkeye |
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 |
Re: IniFile - Auslesen funktioniert nicht
Eigentlich sieht der Code wirklich fast sauber aus.
Zitat:
Zitat:
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 ![]() Gruß Jürgen |
Re: IniFile - Auslesen funktioniert nicht
Also, ich habe in meinem Code jetzt vollgendes stehen:
Delphi-Quellcode:
Die Datei Settings.ini existiert und wenn ich testweise ein Memo1.Ls.LoadFromFile('Settings.ini'); zeigt er mir den Inhalt auch an.
IniDatei := TIniFile.Create('Settings.ini');
try len := IniDatei.ReadInteger('Global', 'EQ', 0); ShowMessage(IntToStr(len)); finally FreeandNil(IniDatei); end; 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] |
Re: IniFile - Auslesen funktioniert nicht
Versuchs mal mit
Delphi-Quellcode:
INI-dateien werden normalerweise im Windows-Ordner gespeichert, also versucht
IniDatei := TIniFile.Create(ExtractFilePath(paramstr(0))+'Settings.ini');
Delphi-Quellcode:
z.B. C:\Windows\Settings.ini zu laden.
IniDatei := TIniFile.Create('Settings.ini');
|
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:
Gruß Hawkeye
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; |
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)? |
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.
|
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.
|
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.
|
Re: IniFile - Auslesen funktioniert nicht
Zitat:
|
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