Entwickler-Ecke

Dateizugriff - Werte aus der INI Datei werden nicht gelesen


rafi@work - Do 21.08.03 15:36
Titel: Werte aus der INI Datei werden nicht gelesen

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TFormIvrHmpConfigTool.LoadFromIni1Click(Sender: TObject);
var
  FileLevel : string;
begin
  FGatewayIni := TIniFile.Create('bsGateway.ini');
  FileLevel := FGatewayIni.ReadString('LOGGER','FILE_LEVEL','');
end;

er liest den Wert nicht raus, was ist hier falsch?

Moderiert von user profile iconTino: Titel geändert.


Delete - Do 21.08.03 15:49

Liegt diese INI-Datei denn im Windows-Verzeichnis? Ohne Pfadangabe wird das nämlich vorausgesetzt. Kannst du auch in der Hilfe nachlesen. Notfalls gib den Pfad mit an, dann sollte es gehen.

Allgemein: du könntest dich um einen besseren Stil bemühen. Evtl. brauchst du die Variable "FGatewayIni" ja an anderer Stelle noch mal, dann will ich nichts gesagt haben. Wenn nicht, dann solltest du das INI-Objekt nach dem Benutzen auch wieder freigeben. Kurz gesagt:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
ini := TIniFile.Create('...');
if(ini <> nil) then try
  { Werte auslesen, usw. }
finally
  ini.free;
end;

Aber auch das steht IMHO in der Hilfe.


Akut-Programming - Do 21.08.03 15:53

versuchs mal so, wenn die ini im selben ordner ist wie deine app:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
uses IniFiles;

...

procedure TFormIvrHmpConfigTool.LoadFromIni1Click(Sender: TObject); 
var 
  FileLevel,pfad: string;
  FGatewayIni: TIniFile;
 begin
    pfad:=ExtractFilePath(ParamStr(0));
    FGatewayIni:=TIniFile.Create(pfad+'bsGateway.ini');
    FileLevel := FGatewayIni.ReadString('LOGGER','FILE_LEVEL',''); 
end;


Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.


rafi@work - Do 21.08.03 15:53

Danke!

ich habe es jetzt so versucht:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TFormIvrHmpConfigTool.LoadFromIni1Click(Sender: TObject);
var
  GatewayIni : TIniFile;
  FileLevel : string;
begin
  GatewayIni := TIniFile.Create('E:\work\projects\programming\delphi\IVR HMP Config Tool\bsGateway.ini');
  FileLevel := GatewayIni.ReadString('LOGGER','FILE_LEVEL','');
  GatewayIni.Free;
end;

doch leider sind alle variablen leer, was ist hier nicht richtig?

Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.


rafi@work - Do 21.08.03 15:59

@ Akut-Programming, bei deinem Beispiel sind di Variablen leider auch leer :(


Akut-Programming - Do 21.08.03 16:05

kann es sein, das du noch einen parameter vergessen hast, bei mir würde es so aussehen...

Delphi-Quelltext
1:
2:
//Beispiel
windowheight:=ini.ReadInteger('einstellungen','WindowHeight',0);

ahhja... :autsch: Du machst des ja mit n string, da haste den 3 parameter nur leer gelassen

Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.


Terra23 - Do 21.08.03 16:33

@Rafi: Ich würde vielleicht statt den direkten Pfad zu nutzen, einfach mal ParamStr(0) nehmen, denn dann liegt die INI wirklich in dem Verzeichnis, wo auch das Tool liegt.


Delete - Do 21.08.03 19:44

Nee, durch paramstr(0) gehst du nur in deinem Programm davon aus, dass die INI im selben Verzeichnis wie das Programm liegt. Tatsächlich kann sie aber an anderer Stelle sein. :wink:


MSCH - Do 21.08.03 20:00

MathiasSimmack hat folgendes geschrieben:
Nee, durch paramstr(0) gehst du nur in deinem Programm davon aus, dass die INI im selben Verzeichnis wie das Programm liegt. Tatsächlich kann sie aber an anderer Stelle sein. :wink:

na wo soll sie denn sonst liegen? übrigens mit

Delphi-Quelltext
1:
2:
pfad:=ExtractFilePath(ParamStr(0));
FGatewayIni:=TIniFile.Create(pfad+'bsGateway.ini');

wirds net funzen, da hier der Backslash vergessen wurde. Das ergibt dann grütze.

richtiger:

Delphi-Quelltext
1:
2:
pfad:=IncludeTrailingBackSlash(ExtractFilePath(ParamStr(0)));
FGatewayIni:=TIniFile.Create(pfad+'bsGateway.ini');

Es ist übrigens usus, die zum Programm gehörigen files auch dort zu lagern, wo die Applikation liegt.

grez
msch

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.


Terra23 - Do 21.08.03 20:10

@Mathias: Ich habe mich wohl einfach ein wenig verkehrt ausgedrückt. Wenn die Datei nicht existiert, wird ja eh auf den Default-Wert zurückgegriffen und ich gehe mal fest davon aus, er wird die INI auch später speichern wollen und wenn er das mit ParamStr() macht, ist es für IMHO einfacher, denn wenn er einen direkten Pfad eingibt (so wie er es tun will), kann's Probleme geben. Wer weiß, vielleicht ist E:\ bei jemandem ein CD-Laufwerk. :-)

Das war's, was ich gemeint habe..


Delete - Do 21.08.03 21:27

Terra hat´s kapiert:
MSCH hat folgendes geschrieben:
MathiasSimmack hat folgendes geschrieben:
Nee, durch paramstr(0) gehst du nur in deinem Programm davon aus, dass die INI im selben Verzeichnis wie das Programm liegt. Tatsächlich kann sie aber an anderer Stelle sein. :wink:

na wo soll sie denn sonst liegen ?

Wenn du in deinem Programm "ExtractFilePath(paramstr(0))" als Ausgangsverzeichnis benutzt, um die INI zu öffnen (s. ReadString im Beispielcode dieses Threads), wird sie nicht wie von Zauberhand auch automatisch in dem Verzeichnis der Exe auftauchen. Es obliegt deiner Verantwortung, die INI dort abzulegen. Ob nun manuell oder im Programm. Darauf wollte ich hinaus. Bitte erst nachdenken, dann kritisieren. :)

Und Ja, Terra, du hast ja recht. Man gibt nach Möglichkeit keine festen Pfade in einem Programm an, das man evtl. später veröffentlichen möchte. Man benutzt entweder "paramstr(0)" oder -wie in Luckies Fall mit seinem LuckieDIPS- irgendeinen Benutzerordner, um Konfig- und ähnliche Daten zu speichern. Ich gebe dir also unbesehen recht. Ich fand nur deine Formulierung amüsant.

Gruß.


rafi@work - Fr 22.08.03 08:49

danke allen für eure hilfe!!! so hats prima funtioniert



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TFormIvrHmpConfigTool.LoadFromIni1Click(Sender: TObject);
var 
  FileLevel,pfad: string; 
  GatewayIni: TIniFile;
begin
  // FILE_LEVEL auslesen in bsGateway.ini
  pfad:=ExtractFilePath(ParamStr(0));
  GatewayIni:=TIniFile.Create(pfad+'bsGateway.ini');
  FileLevel := GatewayIni.ReadString('LOGGER','FILE_LEVEL','');
  GatewayIni.Free;

  If (FileLevel = 'T') then
  begin
    ComboBoxFile.Text := 'ON';
  end;
  if (FileLevel = 'I') then
  begin
    ComboBoxFile.Text := 'OFF';
  end;



gruss