Delphi-PRAXiS

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:

Hafish 24. Mär 2007 19:09

Re: Speicher Problem
 
Das könntest du ganz einfach prüfen, indem du anstatt 'name.ini' einfach mal 'C:\name.ini' benutzt. Da ich diese Fehler mit dem fehlenden Programm-Verzeichnis satt bin benutzte ich immer eine Prozedur, die den Pfad der Exe-Datei ergänzt.

turboPASCAL 24. Mär 2007 19:15

Re: Speicher Problem
 
Zitat:

Ich habe ja so eine Vermutung, obwohl die eigntlich nicht sein kann. Und zwar, dass durch diese Autostartfunktion, immer die nur die Anwendung irgentwohinkopiert wird und dann ausgeführt wird,
Du schreibst in die Registrie(rungsdatei) von Windows. Das kannst du mit dem Programm REGEDIT nachschauen. Also nicht in eine Inidatei.
Das (dein) Programm statet dann beim nächsten Windowsstart.
Es werden keine Einstellungen deines Programms geschrieben laut deinem Quelltext...


Zitat:

daraus folgt, dass die INI's immer wieder neu erstellt werden.
Hm, was ne. :gruebel:

Was möchtest du denn überhaubt machen ?

TonyR 24. Mär 2007 19:51

Re: Speicher Problem
 
Mit dieser sche** Reg-Datenbank würde ich gar nischt machen :gruebel:
Ich würde eine Verknüpfung in den Autstart-Ordner legen... (bei dsdt.info steh beschrieben wie eine Verknüpfung erstellt wird und hier in der DP bestimmt auch...)...

Weil ein paar Posts weiter oben mal was wegen dem Speichern der Ini "gelabert" wurde: Die Ini speichert sich nach jedem Write auf Win2k und XP automatisch, bei Win98 erst beim freigeben. Falls man es dort (win98 oder auch auf 2k/XP) aber manuell machen will (lat. manus - die Hand... Ein Schelm der böses dabei denkt! :wink: ), dann kann man auf die Funktion Ini.UpdateFile (oder so ähnlich) zurückgreifen!

Luckie 24. Mär 2007 21:19

Re: Speicher Problem
 
Meine Glaskugel sagt mir, nach deiner Problemschilderung aus Beitrag #10, dass du keinen Pfad angegeben hast im Konstruktor von TIniFile.

Z32 25. Mär 2007 12:02

Re: Speicher Problem
 
Nochmal das ganze, aber etwas klarer jetzt :)

Also ich habe eine INI Datei, da speicher ich Einstellungen rein, das hat auch alles ganz gut geklappt, aber seitdem ich eine Einstellung mit drin habe, das das Programm beim Windowsstart automatisch startet (siehe #10), gehen alle Einstellung, bei einem Neustart verloren. Das heiß die INI Datei ist wieder "leer".

Und meine Frage war jetzt, warum das so ist und was an dem Autostart Code falsch ist. (Ich gehe mal davon aus, das es am Code für den Autostart liegt, da es vorher ja geklappt hat)

Z32 26. Mär 2007 15:34

Re: Speicher Problem
 
Hat denn keiner mehr eine Idee, woran das liegen könnte?

Ich wüste ganz gerne was an dem Code für den Autostart nicht stimmt...

TonyR 26. Mär 2007 16:16

Re: Speicher Problem
 
Der Code ist eigentlich richtig...

Geh bitte noch mal selber alles durch und lege uns hier zusammenfassend nochmal das Problem dar :wink:
Ansonsten kann dir bestimmt niemand helfen...
Und zusätzlich dazu, wäre vllt. ein bisschen mehr Code auch hilfreich...

hoika 26. Mär 2007 16:56

Re: Speicher Problem
 
Hallo,

beim Autostart musst du auch bei "Ausführen in"
den Pfad deiner Exe eintragen.
Um solche Problem zu vermeiden, solltest du den Ini-Pfad komplett
ermitteln per

Application.HelpFile := ExtractFilePath(Application.ExeName)+'meineini.ini ';


Per Process-Monitor (sysinternals.com) kannst du feststellen,
welche Ini geöffnet wird.
Dazu nach dem ersten ReadString ein MessageDlg und dann nachguggen,
was er aufgemacht er (Filter auf Exe benutzen)


Heiko

Z32 26. Mär 2007 17:05

Re: Speicher Problem
 
Stimmt, daran habe ich garnicht gedacht auch den Pfad der INI Datei anzugeben, sieht zwar kniffilig aus, werde aber mal nachher versuchen das umzusetzten.

Ich meld mich dann nochmal...danke für den Denkanstoß, jetzt weiß ich immerhin worans hapert :wink:

Blackheart 26. Mär 2007 17:36

Re: Speicher Problem
 
Das hättest Du einfacher haben können, Du wurdest öfter aufgefordert mal mehr als deinen Bruchhaften Code zu zeigen.
Dann wäre das Thema schon durch ohne alles erraten zu müssen.

TonyR 26. Mär 2007 17:40

Re: Speicher Problem
 
Ich will jetzt nicht unhöflich sein, aber wenn du mal eher gesagt hättest dass dieser Beitrag von Lucki...
Zitat:

Zitat von Luckie
Meine Glaskugel sagt mir, nach deiner Problemschilderung aus Beitrag #10, dass du keinen Pfad angegeben hast im Konstruktor von TIniFile.

...schon die Lösung bzw. die Hinführung zur Lösung war, dann wäre das Thema auch erledigt :wink:


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