Daten in der Registry und in einem *.ini-File speichern
-
Hallo!
Für mein Maschinensteuerprogramm soll ein Einrichter (Administrator) die Einstellungsvorgaben für bestimmte Artikel anlegen können. Dabei werden pro Artikel etwa 35-40 Eingaben (Double- oder Byte-Werte) benötigt. Ebenfalls fallen Float- und Double-Werte aus Kalibrierroutinen an.
Der normale Benutzer soll beim Programmstart allerdings nur eine Konfigdatei auswählen und laden können, ohne sie modifizieren zu dürfen. Allerdings soll beim Programmstart die letzte ausgewählte Konfiguration geladen werden.
Meine Idee ist jetzt, die Einstellungsvorgaben in einem Ini-File abzulegen. Ich weiß das dies nicht mehr zeitgemäß ist. Ich möchte aber auch mal auf nur einen Zahlenwert zugreifen können (sowohl lesen als auch schreiben), ohne alles aus der Datei laden zu müssen. Der Zugriff über die Keys der Ini-Datei scheint mir dafür geeignet. Den Pfad der zuletzt ausgewählten Konfigdatei könnte man als Schlüssel in der Registry hinterlegen.
Nun meine Fragen:
1. Ist es sinnvoll das so zu machen oder hat jemand von Euch noch eine andere Idee?
2. Gibt es eine Klasse, die mir Float- und Double-Werte direkt in ein ini-File schreibt und wieder liest? Bei Code-Guru hatte ich zwar was gefunden, es lässt sich allerdings nicht compilieren (Fehlermeldungen).
3. In welchen Eintrag der Registry schreibe ich meine Programmdatein? Der Anwendungsassistent hat, wie ich gesehen habe, in folgenden Schlüsseln Einträge für mein Programm angelegt:HKEY_CURRENT_USER\Software\MeinProg
HKEY_USERS\Software\MeinProgIch kenne mich leider in diesen Dingen noch nicht aus und bin da erst mal auf Eure Hilfe angewiesen.
Vorab vielen Dank.
-
Wie wäre es denn mit einer SQL Datenbank anstatt einer Ini - Datei?
Ist wesentlich sicherer in der Handhabung und du kannst anstatt Konfigdateien auch einzelne Tabellen anlegen. So sparst du dir Dateien auf dem System und Einträge in der Registry ebenfalls. Der Nutzer muss nur sagen was er haben will und zack ist es da. Man kann hier wahrscheinlich auch viel flexibler arbeiten.
-
Habe noch nie was mit SQL gemacht. Was meinst Du mit sicherer? Bei den Zugriffen auf die Datenbankdatei muss ich ja auch sicherstellen ob die Datei existiert und ob man die öffnen kann. Ist es da möglich auch Werte als float oder double abzulegen?
Könntest Du wenn möglich mal ein kleines Beispiel posten?
-
Ist auf jeden Fall möglich man kann dort alle möglichen Werte ablegen.
Schau doch mal auf www.mysql.de und da in die Dokumentation.
Was meinst du für Beispiele?
-
http://www.sql-und-xml.de/sql-tutorial/ hier kannst du auch mal reinschauen.
Ein kleine tutorial zum selbststudium in SQL.
-
Vielen Dank erst mal. Ist allerdings noch ne Menge Arbeit da dahinterzusteigen.
Nachmal zum Abspeichern in der Registry: in welchen Schlüssel schreibt man üblicherweise die Werte des Programms rein?
-
Kommt drauf an ob der Eintrag Allgemeingültig ist - dann in den HK_LOCAL_MACHINE und wenn er Nutzerabhängig sein sollte dann in den HK_Current_User
-
Hallo AndyDD,
kennst du dich mit XML aus? Das Abspeichern in einem XML-File wäre eine Alternative zur Registry.Tester2
-
Tester2 schrieb:
Hallo AndyDD,
kennst du dich mit XML aus? Das Abspeichern in einem XML-File wäre eine Alternative zur Registry.Tester2
@Tester2: Leider nicht wirklich. Aber werde mich da mal schlau machen müssen. Aber kann man in einer XML-Datei nicht nur XML-Daten ablegen?
@CrazyPlaya: Werde es dann in HK_LOCAL_MASCHINE ablegen. Da muss ich allerdings die Einträge noch vom Programm erzeugen lassen, da es dort noch keine gibt. Wie kann man eigentlich abfragen ob es einen bestimmten Schlüssel schon gibt?
-
Mit RegCreateKeyEx s.MSDN
Erzeugt einen neuen Eintrag und wenn dieser schon vorhanden ist öffnet er diesen
-
Mit RegCreateKeyEx s.MSDN
Erzeugt einen neuen Eintrag und wenn dieser schon vorhanden ist öffnet er diesen
-
Werde ich mal machen. Ich hab jetzt mal ein wenig mit GetPrivateProfileString() und WritePrivateProfileString() rumprobiert. Man kann damit zumindest die gängigsten Zahlendatentypen, die sich in einen String umwandeln (und auch wieder zurückkonvertieren) lassen abspeichern. Offensichtlich braucht man sich dabei nicht mal um das Öffnen und Schließen der entsprechenden Datei zu kümmern.
-
Eigentlich kann man in einer XML ablegen, was man lustig ist, man muss sich nur an die Tag-Syntax halten. Man muss die XML auch nicht mit einem Parser lesen bzw. schreiben, ist aber natürlich zu empfehlen.
Tester2
-
Ach ja, wenn du wirklich die Registry beschreiben/ lesen willst, guck doch mal nach den Methoden:
RegOpenKeyEx(HKEY_LOCAL_MACHINE,...) RegQueryValueEx(...) RegCloseKey(...)
damit habe ich gute Erfahrungen gemacht.
Tester2
-
Danke @Tester2,
die Zugriffsroutinen für die Registry hab ich schon implementiert und die funktionieren auch. Mit XML will ich mich irgendwann befassen, ohne jetzt schon zu wissen was mich erwartet. Bin auf dem Gebiet Neuling. Kannst Du da irgendwelche Tutorials empfehlen?
-
Nein, kann leider nichts Vernünftiges empfehlen. Hab meine Kenntnisse auch nur durchs Googeln, Codeproject.com, Erfahrung von Kollegen etc.
Tester2
-
Hallo, du könntest auch ein paar nette Funktionen der Klasse CWinApp nutzen.
CWinApp *pApp = AfxGetApp(); pApp->WriteProfileString("SECTION_ONE", "IDENTIFIER", "Mein Text"); CString Text = pApp->GetProfileString("SECTION_ONE", "IDENTIFIER", "ALT_Text wenn kein Eintrag vorhanden ist");
Es gibt da
- WriteProfileString,
- WriteProfileInt,
- WriteProfileBinary,
- GetProfileString,
- GetProfileInt,
- GetProfileBinary.
Diese Daten laufen einfach in die INI deines Programmes.
Diese Datei heißt %WINDIR%\PROGRAMMNAME.ini.Wenn du davor eine Variable deiner CWinApp änderst (ich bin mir leider nicht mehr sicher welche - aber das müsste in der MSDN bei der Beschreibung der oben genannten Funktionen stehen), dann schreiben diese Funktionen einfach in die Registry!
So einfach ist das.
-
Vielen Dank erst mal. Sollte man da aber nicht WritePrivateProfileString() benutzen? Da kann man den Dateinamen incl. Pfad angeben. Das man String und Int schreiben kann habe ich auch schon rausgefunden. Neu war mir das mit dem Binary. Gibt es allerdings auch eine vorgefertigte Funktion für Fließkommazahlen (float oder double) oder muss man die immer in einen String umwandeln und als String in die Ini schreiben bzw. wieder zurückkonvertieren?