![]() |
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:
Dann habe ich im FORM.Show meines Einstellungs Forms das hier geschreiben, um auszulesen, wie die checkboxen belegt werden müssen:
If not fileexists('name.ini') then
begin //anlegen der INI Datei end;
Delphi-Quellcode:
Und als letztes jetzt noch, das wenn man den speicher button drückt, die Einstellungen in der INI Datei geändert werden:
If ini.ReadString('bla','bla','bla')='true' then
checkbox1.checked:=true else checkbox1.checked:=false;
Delphi-Quellcode:
Soweit dazu...
if checkbox1.Checked=true then
ini02.WriteString('bla','bla','true') else ini02.WriteString('bla','bla','false'); 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 |
Re: Speicher Problem
Hast du die Ini-datei zurückgeschrieben?
|
Re: Speicher Problem
Delphi-Quellcode:
Warum arbeitest Du nicht mit Boolean
If ini.ReadString('bla','bla','bla')='true' then
checkbox1.checked:='true' else checkbox1.checked:='false'; |
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. |
Re: Speicher Problem
Zitat:
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: |
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. |
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; |
Re: Speicher Problem
Zitat:
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; |
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; |
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:
Und zum Löschen: (der Code ist auch nicht von mir)
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;
Delphi-Quellcode:
Ich hoffe in dem Code erkennt jemand den Fehler...
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 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: |
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.
|
Re: Speicher Problem
Zitat:
Das (dein) Programm statet dann beim nächsten Windowsstart. Es werden keine Einstellungen deines Programms geschrieben laut deinem Quelltext... Zitat:
Was möchtest du denn überhaubt machen ? |
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! |
Re: Speicher Problem
Meine Glaskugel sagt mir, nach deiner Problemschilderung aus Beitrag #10, dass du keinen Pfad angegeben hast im Konstruktor von TIniFile.
|
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) |
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... |
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... |
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 |
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: |
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. |
Re: Speicher Problem
Ich will jetzt nicht unhöflich sein, aber wenn du mal eher gesagt hättest dass dieser Beitrag von Lucki...
Zitat:
|
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