Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Ini auslesen und Checkbox auf True setzen? (https://www.delphipraxis.net/145527-ini-auslesen-und-checkbox-auf-true-setzen.html)

AlexII 3. Jan 2010 19:30


Ini auslesen und Checkbox auf True setzen?
 
Hallo,

ich habe ein Problem, wer kann mir helfe? Ich lese wie folgt einen Wert aus der .ini aus:

Delphi-Quellcode:
ProxyStatus := Ini.ReadBool('Default', 'ProxyStatus', True);
Wenn aber die .ini-Datei noch nicht existiert hat ProxyStatus keinen Zustand, also nicht True und nicht False, deswegen wird eine Checkbox immer leer bzw. False sein, ich will sie aber True haben. Im Objektinspektor habe ich Checked der Checkbox auf True gesetzt, beim öffnen des Programms ist sie aber immer False.

Weiß nicht mehr wie ich weiter komme.

Jens Hartmann 3. Jan 2010 19:34

Re: Ini auslesen und Checkbox auf True setzen?
 
Hallo Alex,

das ist richtig. Prüf die INI-Datei mit FileExist und ansonsten abbrechen.

[EDIT] Prüf nicht auf TRUE oder FALSE, das kann zu Problemen führen, schau Dir mal folgenden Seite an...

Prüfen auf Boolean

Gruß Jens

Matze 3. Jan 2010 19:35

Re: Ini auslesen und Checkbox auf True setzen?
 
Hallo

Zitat:

Zitat von AlexII
Wenn aber die .ini-Datei noch nicht existiert hat ProxyStatus keinen Zustand, also nicht True und nicht False

Falsch. Du gibst im 3. Parameter den Standardwert an, der genommen wird, wenn die Ini-Datei bzw. der Eintrag darin nicht existiert. In deinem Fall also "true".

Zitat:

Zitat von AlexII
deswegen wird eine Checkbox immer leer bzw. False sein, ich will sie aber True haben.

Das ist sie auch, wenn du den Status nicht wo anders setzt:

Delphi-Quellcode:
ProxyStatus := Ini.ReadBool('Default', 'ProxyStatus', True); // "true", wenn Ini bzw. der Eintrag nicht existiert
CheckBox1.Checked := ProxyStatus;
Grüße, Matze

Edit @Jens: Was? Wieso sollte ProxyStatus dann undefiniert sein? Dann wäre der Standardwert doch überflüssig. :gruebel:

AlexII 3. Jan 2010 19:38

Re: Ini auslesen und Checkbox auf True setzen?
 
Zitat:

Falsch. Du gibst im 3. Parameter den Standardwert an, der genommen wird, wenn die Ini-Datei bzw. der Eintrag darin nicht existiert. In deinem Fall also "true".
Ne der Wert wird genommen, wenn die ini-Datei existiert, aber der Eintrag nicht, bei mir existiert aber die Datei noch nicht, darum geht es.

AlexII 3. Jan 2010 19:39

Re: Ini auslesen und Checkbox auf True setzen?
 
Also ich habe das so:

Delphi-Quellcode:
if FileExists(UserAppDataDir + AppDataRootDir + AppDataProjectDir + '\Config-t.ini') then
begin
Ini := TIniFile.Create(UserAppDataDir + AppDataRootDir + AppDataProjectDir + '\Config-t.ini');
  try
    ProxyStatus := Ini.ReadBool('Default', 'ProxyStatus', True);
  finally
    Ini.Free;
end;

Jens Hartmann 3. Jan 2010 19:40

Re: Ini auslesen und Checkbox auf True setzen?
 
Zitat:

Zitat von Matze
Edit @Jens: Was? Wieso sollte ProxyStatus dann undefiniert sein? Dann wäre der Standardwert doch überflüssig.

Nein, ich habe nicht gesagt undefiniert, sondern so wie Du gesagt hast, es ist richtig, das Checkbox = true ist, weil das

Delphi-Quellcode:
Ini.ReadBool('Default', 'ProxyStatus', [b]True[/b]);
vorgegeben wurde.

[EDIT]Wenn die Datei aber noch nicht existiert, ist der Wert undefiniert, und daher eben das mit Boolean Werten

Gruß Jens

Matze 3. Jan 2010 19:40

Re: Ini auslesen und Checkbox auf True setzen?
 
Aber du erzeugst doch die Ini mit:

Delphi-Quellcode:
Ini := TIniFile.Create(...);
try
  // auslesen
finally
  // ...
end;
Da wird die Ini doch dann angelegt, falls sie nicht existiert, und anschließend geöffnet. Das hat einen nicht existierenden Eintrag zur Folge und somit den Standardwert. Oder irre ich mich?

Edit @Alex: Dann sorge dafür, dass "ProxyStatus" immer definiert ist, das ist generell zu empfehlen. Gib der Variablen bsp. zu Beginn den Standardwert (true).

AlexII 3. Jan 2010 19:41

Re: Ini auslesen und Checkbox auf True setzen?
 
Zitat:

Zitat von Jens Hartmann
das ist richtig. Prüf die INI-Datei mit FileExist und ansonsten abbrechen.

Wie abbrechen, das Programm muss doch laufen, wenn man das erste mal öffnet und die ini noch nicht vorhanden ist.

AlexII 3. Jan 2010 19:45

Re: Ini auslesen und Checkbox auf True setzen?
 
Ich hab schon zig mal ausprobiert, die Checkbox wird auf True gesetzt nur wenn der Eintrag in der ini nicht vorhanden ist, wenn die ini-Datei noch nicht existiert gib's keinen Zustand, ihr könnt das ruhig testen.

Jens Hartmann 3. Jan 2010 19:45

Re: Ini auslesen und Checkbox auf True setzen?
 
Zitat:

Zitat von Alex
Wie abbrechen, das Programm muss doch laufen, wenn man das erste mal öffnet und die ini noch nicht vorhanden ist.

Einmal, stimmt das was Matze gerade gesagt hat, mit dem INI.Create, und anders wäre es auch möglich, das einlesen halt abzubrechen, und im "finally" dein Programm mit den gewünschten Standardwerten zu initialisieren. Oder sehe ich das jetzt falsch.

Entweder Standardwerte direkt ins Programm, somit kein Problem, oder INI.Create, und richtige Standardwerte deinen Quellcode integrieren.

Gruß Jens

Blackheart 3. Jan 2010 19:45

Re: Ini auslesen und Checkbox auf True setzen?
 
Hast du denn ProxyStatus der Checkbox zugewiesen.

AlexII 3. Jan 2010 19:48

Re: Ini auslesen und Checkbox auf True setzen?
 
Zitat:

Zitat von Blackheart
Hast du denn ProxyStatus der Checkbox zugewiesen.

Ja sicher :pale:

AlexII 3. Jan 2010 19:52

Re: Ini auslesen und Checkbox auf True setzen?
 
Ich sehe gerade bei mir ist der Code falsch:

Delphi-Quellcode:
if FileExists(UserAppDataDir + AppDataRootDir + AppDataProjectDir + '\Config-t.ini') then
begin
Ini := TIniFile.Create(UserAppDataDir + AppDataRootDir + AppDataProjectDir + '\Config-t.ini');
  try
    ProxyStatus := Ini.ReadBool('Default', 'ProxyStatus', True);
  finally
    Ini.Free;
end;
Hier wird die die ini erstellt nur dann wenn sie schon vorhanden ist, wenn sie nicht vorhanden ist - geschieht nix. Hm.... :gruebel:

Muss das vllt so heißen?? :gruebel:

Delphi-Quellcode:
if FileExists(UserAppDataDir + AppDataRootDir + AppDataProjectDir + '\Config-t.ini') then
begin
  try
    ProxyStatus := Ini.ReadBool('Default', 'ProxyStatus', True);
  finally
    Ini.Free;
end else Ini := TIniFile.Create(UserAppDataDir + AppDataRootDir + AppDataProjectDir + '\Config-t.ini');

Matze 3. Jan 2010 19:54

Re: Ini auslesen und Checkbox auf True setzen?
 
Es reicht das zu schreiben:

Delphi-Quellcode:
Ini := TIniFile.Create(UserAppDataDir + AppDataRootDir + AppDataProjectDir + '\Config-t.ini');
Wenn sie nicht existiert, wird sie angelegt, sonst geöffnet.
Dein Code funktioniert so auch nicht, da du die Ini nirgendwo öffnest, wenn sie bereits existiert.

Und unterlasse bitte die Doppelposts.

Jens Hartmann 3. Jan 2010 19:55

Re: Ini auslesen und Checkbox auf True setzen?
 
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  INi : TIniFile;
  ProxyStatus : Boolean;
begin
if FileExists('.\Config-t.ini') then
begin
Ini := TIniFile.Create('.\Config-t.ini');
  try
    ProxyStatus := Ini.ReadBool('Default', 'ProxyStatus', True);
  finally
    Ini.Free;
    CheckBox1.Checked := ProxyStatus;
end;
Also, so funktinoert es bei mir wunderbar.

Und so wäre ja auch möglich...

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  INi : TIniFile;
begin
if FileExists('.\Config-t.ini') then //Abbruch, wenn INI nicht existiert. Hierbei muss die CheckBox im OI gesetzt sein
begin
  Ini := TIniFile.Create('.\Config-t.ini');
    try
      CheckBox1.Checked := Ini.ReadBool('Default', 'ProxyStatus', True);
    finally
      Ini.Free;
end;
Gruß Jens

AlexII 3. Jan 2010 19:57

Re: Ini auslesen und Checkbox auf True setzen?
 
Zitat:

Zitat von Matze
Es reicht das zu schreiben:

Delphi-Quellcode:
Ini := TIniFile.Create(UserAppDataDir + AppDataRootDir + AppDataProjectDir + '\Config-t.ini');
Wenn sie nicht existiert, wird sie angelegt, sonst geöffnet.
Dein Code funktioniert so auch nicht, da du die Ini nirgendwo öffnest, wenn sie bereits existiert.

Ja und wo schreibe ich das rein? Jetzt bin ich ganz durcheinander :roteyes:

Matze 3. Jan 2010 19:59

Re: Ini auslesen und Checkbox auf True setzen?
 
Habe ich einen Denkfehler oder wieso macht ihr das so kompliziert?

Reicht nicht das hier, ganz simpel:

Delphi-Quellcode:
Ini := TIniFile.Create(UserAppDataDir + AppDataRootDir + AppDataProjectDir + '\Config-t.ini');
try
  ProxyStatus := Ini.ReadBool('Default', 'ProxyStatus', True);
finally
  Ini.Free;
end;
Wenn die Ini-Datei nicht existiert, wird eine leere Ini angelegt (eine leere Ini-Datei wird meines Wissens auch nicht auf der Festplatte gespeichert). Dann ist kein Eintrag vorhanden und "ProxyStatus" erhält den Standardwert "true". Existiert die Ini-Datei, wird sie geöffnet. Dann erhält "ProxyStatus" den Wert, der in der Ini steht, falls der entsprechende Eintrag vorhanden ist. Andernfalls auch den Standardwert "true".

AlexII 3. Jan 2010 20:05

Re: Ini auslesen und Checkbox auf True setzen?
 
Wow.... das ist es :thumb: Thx... jetzt klappt das. :bouncing4:

Sir Rufo 4. Jan 2010 00:14

Re: Ini auslesen und Checkbox auf True setzen?
 
Zitat:

Zitat von Matze
Wenn die Ini-Datei nicht existiert, wird eine leere Ini angelegt (eine leere Ini-Datei wird meines Wissens auch nicht auf der Festplatte gespeichert). Dann ist kein Eintrag vorhanden und "ProxyStatus" erhält den Standardwert "true". Existiert die Ini-Datei, wird sie geöffnet. Dann erhält "ProxyStatus" den Wert, der in der Ini steht, falls der entsprechende Eintrag vorhanden ist. Andernfalls auch den Standardwert "true".

äh .... mit
Delphi-Quellcode:
TIniFile.Create( 'meine.ini' );
wird keine ini-Datei erzeugt, sondern nur eine Instanz der Klasse TIniFile (auch wenn es sich so lesen mag).

Existiert die Datei nicht, wird bei jedem Lesen halt einfach der Default-Wert zurückgegeben.

Erst wenn ich in die instanz etwas schreibe
Delphi-Quellcode:
WriteBool( 'Section', 'Ident', 'Value' );
und genau erst dann wird die Datei auch angelegt.

Wäre ja auch blöd ... ich will nur was lesen und produziere aber evtl. einen Schreibzugriff,
und dass dann mit niedrigen Rechten in einem geschützten Verzeichnis ...
das rummst dann wie an silvester :mrgreen:

Matze 4. Jan 2010 07:27

Re: Ini auslesen und Checkbox auf True setzen?
 
Zitat:

Zitat von Sir Rufo
äh .... mit
Delphi-Quellcode:
TIniFile.Create( 'meine.ini' );
wird keine ini-Datei erzeugt, sondern nur eine Instanz der Klasse TIniFile (auch wenn es sich so lesen mag).

Ah korrekt. Da habe ich etwas durcheinander gebracht. Gespeichert wird erst mit den Write-Funktionen, vollkommen richtig. :wall:

hoika 4. Jan 2010 07:44

Re: Ini auslesen und Checkbox auf True setzen?
 
Hallo,

ich hätte den Code einfach etwas umgebaut ...

Delphi-Quellcode:
ProxyStatus:= True; // eigentlich auch nicht notwendig

  Ini := TIniFile.Create(UserAppDataDir + AppDataRootDir + AppDataProjectDir + '\Config-t.ini');
  try
    ProxyStatus := Ini.ReadBool('Default', 'ProxyStatus', True);
  finally
    Ini.Free;
  end;


CheckBox_XXX.Checked:= ProxyStatus;

Heiko

himitsu 4. Jan 2010 07:47

Re: Ini auslesen und Checkbox auf True setzen?
 
der Grund: hier werden so komische APIs in TIniFile gekapselt, welche NUR für jeden einzelnen Lese- und Schreibzugriff die Datei intern öffnen, komplett auslesen (wenn vorhanden) und dann, bei Veränderung, die Datei neu speichern.

Drum ist TIniFile ja auch so langsam und es wird im Create noch keine Datei angelegt. :mrgreen:

hoika 4. Jan 2010 08:06

Re: Ini auslesen und Checkbox auf True setzen?
 
Hallo,

wenn es nur ums auslesen gehen soll,
kann er auch TMemIniFile nehmen.

Dann aber nat. so
Delphi-Quellcode:
MemIniFile:= TMemIniFile.Create;
try
  // ALLE Daten auslesen
finally
  MemIniFile.Free;
end;

Heiko


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