Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi ReadBool Ini-File (https://www.delphipraxis.net/75162-readbool-ini-file.html)

pilic 15. Aug 2006 11:00


ReadBool Ini-File
 
Hi,

mein Problem ist, dass mein Programm die Informationen in der ini nicht richtig ausliest. Es soll beim Starten der Anwendung den Status der Checkboxen ermitteln. Das funktioniert aber nicht. Sie bleiben leer, da ich als dritten Parameter false angegeben habe. Ich habe schon die Tipps in anderen Threads ausprobiert, aber keiner hat mir geholfen. Da das Schreiben in die Datei ja funktioniert, poste ich mal nur den Bereich in dem ausgelesen werden soll.

Delphi-Quellcode:
procedure TForm1.FormActivate(Sender: TObject);
begin
ini:=TIniFile.create(ExtractFilePath(ParamStr(0))+
'settings.ini');
  with ini do
  try
  CheckBox1.Checked := ReadBool('myOne', '1', False);
  CheckBox2.Checked := ReadBool('myOne', '2', False);
  CheckBox3.Checked := ReadBool('myOne', '3', False);
  CheckBox4.Checked := ReadBool('myOne', '4', False);
  finally
    ini.free;
end;
end;
Cheerio

mkinzler 15. Aug 2006 11:15

Re: ReadBool Ini-File
 
Poste mal die Ini-Datei.

pilic 15. Aug 2006 11:21

Hier die ini
 
Noch eine Frage: Fürs nächste Mal, welchen Code soll ich benutzen um eine ini-Datei zu posten? :wink:
Zitat:

[myOne]
1=1
2=1
3=0
4=0

mkinzler 15. Aug 2006 11:23

Re: ReadBool Ini-File
 
Beneene die Eigenschaft 1 zum Test mal in c1 um.

pilic 15. Aug 2006 11:30

Re: ReadBool Ini-File
 
Hat auch nicht geholfen. Kanns auch sein, dass es an einer Einstellung an der IDE liegt?

Jürgen Thomas 15. Aug 2006 11:44

Re: Hier die ini
 
Zitat:

Zitat von pilic
[myOne]
1=1
2=1
3=0
4=0

Deine Werte sind integer, nämlich 0/1. Eigentlich speichert TIniFile bool-Werte mit:
Zitat:

1=True
2=True
3=False
4=False
Wenn es eine Version gibt, die statt True/False 1/0 speichert, oder wenn Du die Ini-Datei nicht verändern willst, dann versuche doch Folgendes:
Delphi-Quellcode:
with TIniFile.create(ExtractFilePath(ParamStr(0)) + 'settings.ini')
do begin
  try
    CheckBox1.Checked := ReadInteger('myOne', '1', 0) = 1;
    CheckBox2.Checked := ReadInteger('myOne', '2', 0) = 1;
    CheckBox3.Checked := ReadInteger('myOne', '3', 0) = 1;
    CheckBox4.Checked := ReadInteger('myOne', '4', 0) = 1;
  finally
    free;
  end;
end;
Viel Erfolg! Jürgen

pilic 15. Aug 2006 11:51

Re: ReadBool Ini-File
 
Danke,

aber das funktioniert leider auch nicht. Du meinst also, dass es an der IDE liegt, aber müsste es dann nicht bekannt sein, dass es bei meiner Version dieses Problem/diesen Bug gibt. Ich habe es aber auch schon mit einer if-Abfrage probiert, aber nicht ausdrücklich mit Integerwerten. Dann werde ich das mal ausprobieren.

freak4fun 15. Aug 2006 11:54

Re: ReadBool Ini-File
 
Lädst du auch die richtige Datei, bzw. ist die Datei vorhanden? Lass dir doch mal den Dateipfad ausgeben. :)

MfG
freak

pilic 15. Aug 2006 11:57

Re: ReadBool Ini-File
 
Ich arbeite noch nicht lange mit Delphi und deswegen bin ich mir auch nicht ganz sicher, aber ich meine dass das
Delphi-Quellcode:
TIniFile.create(ExtractFilePath(ParamStr(0)) + 'settings.ini')
zu bedeuten hat, dass die Datei auf jeden Fall im richtigen Verzeichnis liegt.

Jürgen Thomas 15. Aug 2006 11:59

Re: ReadBool Ini-File
 
An der IDE eher nicht, allenfalls am Compiler oder an Runtime-Packages. Aber auch das ist äußerst unwahrscheinlich.

Vergleiche doch mal den Code, mit dem der Checked-Status in die ini-Datei geschrieben wird (oder stelle diesen Abschnitt hier zur Verfügung), mit den Read-Befehlen; vielleicht fällt dadurch ein wesentlicher Unterschied auf.

Zitat:

Zitat von pilic
Ich arbeite noch nicht lange mit Delphi und deswegen bin ich mir auch nicht ganz sicher, aber ich meine dass das
Delphi-Quellcode:
TIniFile.create(ExtractFilePath(ParamStr(0)) + 'settings.ini')
zu bedeuten hat, dass die Datei auf jeden Fall im richtigen Verzeichnis liegt.

So ist es dann, wenn sie beim Lesen und Schreiben so aufgerufen wird, mit Sicherheit.

Jürgen

pilic 15. Aug 2006 12:06

Re: ReadBool Ini-File
 
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
ini:=TIniFile.create(ExtractFilePath(ParamStr(0))+
'settings.ini');
try
ini.WriteBool('myOne','c1',Checkbox1.Checked);
ini.WriteBool('myOne','c2',Checkbox2.Checked);
ini.WriteBool('myOne','c3',Checkbox3.Checked);
ini.WriteBool('myOne','c4',Checkbox4.Checked);
finally
  ini.free;
end;
end;
Also das einzige, was mir hier auffällt ist, dass zwischen ")", "+" und "'settings.ini'" keine Leerzeichen sind, aber das dürfte ja kein Problem darstellen. Das "c" vor den Zahlen ist übrigens auch im Read-Bereich.

Michael Habbe 15. Aug 2006 12:18

Re: ReadBool Ini-File
 
Habe meine Änderung mal mit ^ hervorgehoben.
Zitat:

Zitat von pilic
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
  ini := TIniFile.create(IncludeTrailingBackslash(ExtractFilePath(ParamStr(0))) + 'settings.ini');
                         ^^^^^^^^^^^^^^^^^^^^^^^^ // wichtig
  try
    ini.WriteBool('myOne', 'c1', Checkbox1.Checked);
    ini.WriteBool('myOne', 'c2', Checkbox2.Checked);
    ini.WriteBool('myOne', 'c3', Checkbox3.Checked);
    ini.WriteBool('myOne', 'c4', Checkbox4.Checked);
  finally
    ini.free;
  end;
end;

ExtractFilePath gibt kein "\" zurück, es sei denn, die Anwendung wurde in "c:\" gestartet. IncludeTrailingBackSlash fügt das abschließende "\" hinzu. Es könnte also sein, dass Deine Anwendung wer weiss wo eine ini geschrieben hat.


Zitat:

Zitat von Jürgen Thomas
Zitat:

Zitat von pilic
[myOne]
1=1
2=1
3=0
4=0

Deine Werte sind integer, nämlich 0/1. Eigentlich speichert TIniFile bool-Werte mit:
Zitat:

1=True
2=True
3=False
4=False

Das ist nicht richtig. Wenn man mit WriteBool schreibt, wird schon 1/0 in die Ini geschrieben, welches ja für True/False steht. Das funktioniert alles wunderbar. Ich setze es zu Dutzenden in meiner Anwendung ein.

ManuMF 15. Aug 2006 12:22

Re: ReadBool Ini-File
 
Bei mir steht in der INI ebenfalls 0 bzw. 1.

Das mit dem "\" könnte es natürlich sein.

P.S.: Aber die Delphi-Hilfe sagt, in neueren Versionen sollte Delphi-Referenz durchsuchenIncludeTrailingPathDelimiter verwendet werden.

mkinzler 15. Aug 2006 12:22

Re: ReadBool Ini-File
 
ExtractFilePath soolte eigentlich den Slash auch zurückliefern.

ManuMF 15. Aug 2006 12:24

Re: ReadBool Ini-File
 
@mkinzler: Aber der Einsatz von Iclude... sollte doch nicht schaden, oder?

pilic 15. Aug 2006 12:27

Re: ReadBool Ini-File
 
Vielleicht kann ich es ja noch irgendwann gebrauchen, aber leider hilft es mir im Moment nicht weiter. Aber das kann ich mir irgendwie nicht vorstellen, dass das stimmt, denn die Datei konnte schon bearbeitet werden. Ich könnte mir jetzt nur noch vorstellen, dass es an irgendeiner Einstellung im OI o.ä. hängen könnte, bloß weiß ich nicht welche das sein könnte. :gruebel:

Jürgen Thomas 15. Aug 2006 12:40

Re: ReadBool Ini-File
 
Zitat:

Zitat von Michael Habbe
Das ist nicht richtig. Wenn man mit WriteBool schreibt, wird schon 1/0 in die Ini geschrieben, welches ja für True/False steht. Das funktioniert alles wunderbar. Ich setze es zu Dutzenden in meiner Anwendung ein.

Ich hatte extra bei mir in mehreren Ini-Dateien (Delphi Pro) nachgeschaut; dort steht überall "True/False" drin.

Aber das braucht uns tatsächlich nicht zu stören; wenn Read/Write mit der gleichen Version erledigt wird, stimmt es schon überein. Ich muss mich natürlich für die Verwirrung entschuldigen.

Aber hier finden wir den wirklichen Fehler:
Zitat:

Zitat von pilic
Delphi-Quellcode:
CheckBox1.Checked := ini.ReadBool('myOne','1',false);
//  usw.
Delphi-Quellcode:
ini.WriteBool('myOne','c1',Checkbox1.Checked);
//  usw.
Das "c" vor den Zahlen ist übrigens auch im Read-Bereich.

Aber das ist doch genau der Unterschied: Gespeichert werden die Werte unter "c1" ff., gelesen unter "1" ff. Das muss natürlich in Übereinstimmung gebracht werden.

Jürgen

Muetze1 15. Aug 2006 12:45

Re: ReadBool Ini-File
 
Zitat:

Zitat von mkinzler
ExtractFilePath soolte eigentlich den Slash auch zurückliefern.

Es kann auch ein Result ohne abschliessenden Backslash geben, wenn es der Rootpath ist, dann gibt er nur bis zum Doppelpunkt der Laufwerksangabe zurück.

pilic 15. Aug 2006 12:48

Re: ReadBool Ini-File
 
Ich entschuldige mich vielmals, dass ich es nicht noch klarer formuliert habe. Aber ich habe nicht grundlos unter mein Posting geschrieben:
Zitat:

Das "c" vor den Zahlen ist übrigens auch im Read-Bereich.
Ich dachte einfach nur, dass es nicht nötig wäre den Bereich noch mal zu posten, nur weil darin 4 "c"s mehr vorkommen. Aber ich werde jetzt mal den vollständigen Code posten. Ist ja nicht so lang.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IniFiles, ShellAPI, ExtCtrls;

type
  TForm1 = class(TForm)
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    CheckBox3: TCheckBox;
    CheckBox4: TCheckBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Button1: TButton;
    Button2: TButton;
    RadioGroup1: TRadioGroup;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    RadioButton3: TRadioButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;
  var
  Form1: TForm1;
  ini:   TIniFile;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
if (CheckBox1.Checked = True)
then
begin
shellexecute(form1.Handle, 'open', PChar('pics.bat'), nil, nil, sw_show);
end;
if (CheckBox2.Checked = True)
then
begin
shellexecute(form1.Handle, 'open', PChar('vids.bat'), nil, nil, sw_show);
end;
if (CheckBox3.Checked = True)
then
begin
shellexecute(form1.Handle, 'open', PChar('docs.bat'), nil, nil, sw_show);
end;
if (CheckBox4.Checked = True)
then
begin
shellexecute(form1.Handle, 'open', PChar('arch.bat'), nil, nil, sw_show);
end;
Form1.Close;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ini := TIniFile.create(IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0))) + 'settings.ini');
try
ini.WriteBool('myOne','c1',Checkbox1.Checked);
ini.WriteBool('myOne','c2',Checkbox2.Checked);
ini.WriteBool('myOne','c3',Checkbox3.Checked);
ini.WriteBool('myOne','c4',Checkbox4.Checked);
finally
  ini.free;
end;
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
ini := TIniFile.create(IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0))) + 'settings.ini');
  with ini do
  try
  CheckBox1.Checked := ReadBool('myOne', 'c1', False);
  CheckBox2.Checked := ReadBool('myOne', 'c2', False);
  CheckBox3.Checked := ReadBool('myOne', 'c3', False);
  CheckBox4.Checked := ReadBool('myOne', 'c4', False);
  finally
    ini.free;
end;
end;
end.

Michael Habbe 15. Aug 2006 13:02

Re: ReadBool Ini-File
 
Ich weiss jetzt nicht, ob Deine Zeilen funktionierten, habe aber mal eine Änderung für den Namen der ini vorzuschlagen. So hast Du immer automatisch eine Ini passend zum Anwendungsnamen. Das geht natürlich so nicht, wenn mehrere Echsen auf die gleiche Ini zugreifen sollen. Das mit der Funktion hat aber den Vorteil, dass Du an jeder Stelle im Programm den richtigen Ini-Namen zurückbekommst.

Delphi-Quellcode:
function AppIniName:String;
begin
  result := ChangeFileExt(ParamStr(0), '.ini');
  // alternativ
  // result := IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0)))
  //           + 'settings.ini';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ini := TIniFile.create(AppIniName);
  try
    ...
  finally
    free;
  end;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
  ini := TIniFile.create(AppIniName);
  with ini do
  try
    ...
  finally
    ini.free;
  end;
end;

Hawkeye219 15. Aug 2006 13:07

Re: ReadBool Ini-File
 
Bist du sicher, daß der Eventhandler 'FormActivate' mit deinem Formular verbunden ist, d.h. ist der Name der Routine im Objektinspektor beim Ereignis 'OnActivate' sichtbar? Dieses Ereignis wird übrigens immer ausgelöst, wenn das Formular den Fokus erhält. Möchtest du in diesem Fall auch immer die .ini-Datei einlesen?

Zitat:

Zitat von Muetze1
Es kann auch ein Result ohne abschliessenden Backslash geben, wenn es der Rootpath ist, dann gibt er nur bis zum Doppelpunkt der Laufwerksangabe zurück.

Das gilt aber nur dann, wenn man beim Übergabeparameter auf den Slash verzichtet:

Delphi-Quellcode:
s := ExtractFilePath('C:test.dat');
In diesem Fall würde eine Klammern mit IncludeTrailingBackslash unter Umständen den falschen Pfad liefern. Den korrekten erhält man dann mit:

Delphi-Quellcode:
s := ExtractFilePath(ExpandFileName('C:test.dat'));
Gruß Hawkeye

TBx 15. Aug 2006 13:09

Re: ReadBool Ini-File
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo!

Ich habe Deinen Quelltext überarbeitet und in ein Demoprojekt gehängt.
Funktioniert unter Delphi6 gut.

Teste das doch mal aus und guck Dir auch meine Kommentare bitte gut an.

Hope it helps

onlinekater

Jürgen Thomas 15. Aug 2006 13:10

Re: ReadBool Ini-File
 
Zitat:

Zitat von pilic
Ich entschuldige mich vielmals, dass ich es nicht noch klarer formuliert habe. Aber ich habe nicht grundlos unter mein Posting geschrieben:
Zitat:

Das "c" vor den Zahlen ist übrigens auch im Read-Bereich.
Ich dachte einfach nur, dass es nicht nötig wäre den Bereich noch mal zu posten, nur weil darin 4 "c"s mehr vorkommen.

Sorry, das hatte ich nicht so verstanden.

In Deinem Quelltext scheint eigentlich nichts falsch zu sein. Mir fällt aber Folgendes auf:
Zitat:

Zitat von pilic
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  //  usw.
  Form1.Close;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
  ini := TIniFile.create(IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0))) + 'settings.ini');
  try
    ini.WriteBool('myOne','c1',Checkbox1.Checked);
    ini.WriteBool('myOne','c2',Checkbox2.Checked);
    ini.WriteBool('myOne','c3',Checkbox3.Checked);
    ini.WriteBool('myOne','c4',Checkbox4.Checked);
  finally
    ini.free;
  end;
end;

Durch Button1Click wird sofort das Formular geschlossen. Der Status wird also nur dann in die Ini-Datei geschrieben, wenn manuell Button2 gedrückt wird.

Vorschlag: Der Code für Button2Click wird in das Ereignis OnClose verschoben.

War's denn das? Jürgen

pilic 15. Aug 2006 13:21

Re: ReadBool Ini-File
 
Also dann bedanke ich mich mal bei allen, insbesondere bei Onlinekater, und werde das erstmal so übernehmen und mich erst später damit befassen, da die Anwendung so schnell wie möglich fertig sein sollte.
Ach Jürgen, daran lag's nicht, aber trotzdem danke.

Cheerio


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:09 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