Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Speicher Problem (https://www.delphipraxis.net/88950-speicher-problem.html)

Z32 23. Mär 2007 14:49


Speicher Problem
 
Hallo,

Ich habe ein Problem beim speichern von Einstellungen in INI Dateien und blicke überhaupt nicht, was da nicht stimmt.

Also mein Programm erstellt sich beim starten eine INI Datei, aber nur dann wenn sie noch nicht vorhanden ist. Das habe ich im MainForm.Create so gelöst:

Delphi-Quellcode:
If not fileexists('name.ini') then
begin
//anlegen der INI Datei
end;
Dann habe ich im FORM.Show meines Einstellungs Forms das hier geschreiben, um auszulesen, wie die checkboxen belegt werden müssen:

Delphi-Quellcode:
If ini.ReadString('bla','bla','bla')='true' then
checkbox1.checked:=true
else
checkbox1.checked:=false;
Und als letztes jetzt noch, das wenn man den speicher button drückt, die Einstellungen in der INI Datei geändert werden:

Delphi-Quellcode:
if checkbox1.Checked=true then
ini02.WriteString('bla','bla','true')
else
ini02.WriteString('bla','bla','false');
Soweit dazu...

Das klappt auch alles, aber nur solange, wie man sich nicht abmeldet, oder neu startet. Danach stehen alle Einstellungen wieder auf der Standard Einstellung, also so wie die Einstellungen gemacht werden, wenn die INI Datei neu angelegt wird. Das finde ich äußerst merkwürdig und bräcuhte da mal eure Hilfe.

Nur so als Info, es gibt eine Einstellung, da erstelle ich einen Autostarteintrag, auch wenn meine Anwendung nach einer neuen Anmeldung mir sagt die Funktion wäre aus, startet das Programm trotzten automatisch...

Ich hoffe ihr könnt mir da weiterhelfen... :gruebel:

//EDIT: Fehler im Code behoben

mkinzler 23. Mär 2007 14:57

Re: Speicher Problem
 
Hast du die Ini-datei zurückgeschrieben?

Blackheart 23. Mär 2007 15:06

Re: Speicher Problem
 
Delphi-Quellcode:
If ini.ReadString('bla','bla','bla')='true' then
checkbox1.checked:='true'
else
checkbox1.checked:='false';
Warum arbeitest Du nicht mit Boolean

Nuclear-Ping 23. Mär 2007 15:08

Re: Speicher Problem
 
Inis braucht man nicht zurückschreiben, soweit ich weiß. Hab zumindest noch nie irgendwas von wegen ini.Save oder so in die Richtung benutzt. Weiß aber auch nicht, ob das zurückschreiben erst beim Free passiert.

Allerdings sehe ich in dem Code da ein paar Unsauberkeiten.

Die Klasse "TIniFile" implementiert nicht nur ReadString und WriteString, sondern auch ReadBool, WriteBool, ReadInteger, WriteInteger, ReadFloat, WriteFloat, usw.

Du kannst also gleich mit CheckBox1.Checked := Ini.ReadBool ('Section', 'Ident', TRUE { Default }) zuweisungen machen. Und umgekehrt genauso: Ini.WriteBool ('Section', 'Ident', CheckBox1.Checked);

FormShow ist auch kein guter Platz, um solche Sachen zu machen. Warum machst du das nicht gleich mit im FormCreate?

Weiterhin brauchst du nicht prüfen, ob die Ini schon existiert. Ini := TIniFile.Create (FileName) erstellt die Ini, falls sie nicht vorhanden ist, ansonsten wird sie geöffnet und geladen.

Z32 23. Mär 2007 15:14

Re: Speicher Problem
 
Zitat:

Zitat von mkinzler
Hast du die Ini-datei zurückgeschrieben?

Was genau ist damit gemeint? Wie kann ich denn was zurückschreiben?


Zu Nuclear-Ping:

Ok dann werde ich meinen Code mal ein bisschen überarbeiten. Aber kann das den die Lösung für mein Problem sein? Wo hackst denn da, also mal von ein paar unreinheiten im Code, die ich jetzte ausbessern werde... :wink:

Blackheart 23. Mär 2007 15:22

Re: Speicher Problem
 
Am Besten Du zeigst mal deinen kompletten Code sonst ist das nur ein Raten.
Schon das hier kann nich klappen checkbox1.checked:='false'; da ein Boolean erwartet wird.

Nuclear-Ping 23. Mär 2007 16:59

Re: Speicher Problem
 
Mit "zurückschreiben" ist wohl das Speichern gemeint. Aber meiner Erfahrung nach ist das bei Ini-Files nicht explizit nötig.
Delphi-Quellcode:
procedure TMyForm.LoadSettings;
var
  Ini: TIniFile;
begin
  Ini := TIniFile.Create ('Pfad\Dateiname');

  try
    MyInput.Text := Ini.ReadString ('Bla', 'MyInput', '');
    MyCheckbox.Checked := Ini.ReadString ('Bla', 'MyCheckbox', TRUE);
    ...
  finally
    FreeAndNil (Ini);
  end;
end;

procedure TMyForm.SaveSettings;
var
  Ini: TIniFile;
begin
  Ini := TIniFile.Create ('Pfad\Dateiname');

  try
    Ini.WriteString ('Bla', 'MyInput', MyInput.Text);
    Ini.WriteBool ('Bla', 'MyCheckbox', MyCheckbox.Checked);
    ...
  finally
    FreeAndNil (Ini);
  end;
end;

Z32 23. Mär 2007 21:42

Re: Speicher Problem
 
Zitat:

Zitat von Blackheart
Am Besten Du zeigst mal deinen kompletten Code sonst ist das nur ein Raten.
Schon das hier kann nich klappen checkbox1.checked:='false'; da ein Boolean erwartet wird.

Das war nur ein abschreibe Fehler, im Orginal Code steht da natürlich das richtige...

Den ganzen Code könnte ich natürlich posten, aber eigentlic steht der doch schon in meinem ersten Beitrag, nur das halt noch Inhalt da ist. Ich werde morgen aber mal den überarbeiteten Code schreiben.

Aber kann es vielleicht auch daran liegen?:

Delphi-Quellcode:
ini:=tinifile.create(filename);
try
   //zugriff auf ini datei
   try
      //zugriff auf registry
   finally
      //zugriff auf registry ende
   end;
finally
ini.free
end;

turboPASCAL 24. Mär 2007 04:32

Re: Speicher Problem
 
Nein, nicht an der try..finally Verschachtelung.

Übrigens:

Delphi-Quellcode:
procedure TMyForm.LoadSettings;
  //...

  try
    MyInput.Text := Ini.ReadString ('Bla', 'MyInput', '');
    MyCheckbox.Checked := Ini.ReadString ('Bla', 'MyCheckbox', TRUE); // <---<< ? String und Bool ?
    //...
 
end;
Delphi-Quellcode:
procedure TMyForm.LoadSettings;
var
  Ini: TIniFile;
begin
  Ini := TIniFile.Create ('Pfad\Dateiname');
  try
    MyInput.Text := Ini.ReadString ('Bla', 'MyInput', '');
    MyCheckbox.Checked := Ini.ReadBoolean ('Bla', 'MyCheckbox', TRUE);
    ...
  finally
    FreeAndNil (Ini);
  end;
end;

Z32 24. Mär 2007 18:39

Re: Speicher Problem
 
So, hab jetzt nochmal ein bisschen an meiner Anwendung rumgebastelt un dabei folgendes Festgestellt:

Wenn ich aus meinen Einstellungen die Autostartfunktion entferne, läuft das Programm einwandfrei und ohne probleme, auch nach einem Neustart sind alle Einstellungen noch richtig. Halt so wie das alles so sein muss. Mit der Autostarteinstellung hab ich das oben geschilderte Problem, dass alle eingestelleten Einstellungen nach einem neustart verloren sind.

Das heiß ein meiner Autostartfunktion muss ein fehler sein, ich poste mal den Code:

Zum Eintragen: (der Code zum reinschreiben ist nicht von mir)

Delphi-Quellcode:
var Reg: TRegistry

Reg := TRegistry.Create;
try
   Reg.RootKey := HKEY_CURRENT_USER;
   Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', True);
   Reg.WriteString('FMManager', ParamStr(0));
   Reg.CloseKey;
finally
   Reg.Free;
end;
Und zum Löschen: (der Code ist auch nicht von mir)

Delphi-Quellcode:
Reg := TRegistry.Create;
try
   Reg.RootKey := HKEY_CURRENT_USER;
   Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', True);
   Reg.DeleteValue('FMManager');
   Reg.CloseKey;
finally
   Reg.Free;
end;
Ich hoffe in dem Code erkennt jemand den Fehler...

Ich habe ja so eine Vermutung, obwohl die eigntlich nicht sein kann. Und zwar, dass durch diese Autostarfunktion, immer die nur die Anwendung irgentwohinkopiert wird und dann ausgeführt wird, daraus folgt, dass die INI's immer wieder neu erstellt werden.

Könnte das stimmen? :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:23 Uhr.
Seite 1 von 3  1 23      

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