Problem mit INI Files
-
servus,
ich hab ein Problem beim Einlesen von INI-Files. Und zwar hab ich in meinem Programm 2 Profile, deren Einstellungen in einem INI-File gespeichert werden. Gespeichert werden die Daten richtig. Wenn ich das Programm starte, dann werden die Einstellungen auch richtig eingelesen. Wenn ich im Programm dann das Profil wechsle, muss die INI-Datei neu eingelesen werden, da für Profil 1&2 die gleichen Textboxen etc verwendet werden. Dann liest er allerdings nur noch die erste Einstellung ein. In die restlichen Felder schreibt er 0 (der Defaultwert).
//INI File [Profil1-RGBStart] R=12 G=12 B=102 [Profil1-RGBEnde] R=12 G=12 B=12 [Profil2-RGBStart] R=123 G=1 B=2 [Profil2-RGBEnde] R=3 G=4 B=5 //Funktion zum Einlesen readINI(1 oder 2); //readINI void __fastcall Tmain::readINI(int profil) { char *ch = new char[3]; if(profil == 1) { GetPrivateProfileString("Profil1-RGBStart","R",0,ch,100,inipfad); gr->Text = ch; ch = ""; GetPrivateProfileString("Profil1-RGBStart","G",0,ch,100,inipfad); gg->Text = ch; ch = ""; GetPrivateProfileString("Profil1-RGBStart","B",0,ch,100,inipfad); gb->Text = ch; ch = ""; GetPrivateProfileString("Profil1-RGBEnde","R",0,ch,100,inipfad); kr->Text = ch; ch = ""; GetPrivateProfileString("Profil1-RGBEnde","G",0,ch,100,inipfad); kg->Text = ch; ch = ""; GetPrivateProfileString("Profil1-RGBEnde","B",0,ch,100,inipfad); kb->Text = ch; ch = ""; delete [] ch; } else { GetPrivateProfileString("Profil2-RGBStart","R",0,ch,100,inipfad); gr->Text = ch; ch = ""; GetPrivateProfileString("Profil2-RGBStart","G",0,ch,100,inipfad); gg->Text = ch; ch = ""; GetPrivateProfileString("Profil2-RGBStart","B",0,ch,100,inipfad); gb->Text = ch; ch = ""; GetPrivateProfileString("Profil2-RGBEnde","R",0,ch,100,inipfad); kr->Text = ch; ch = ""; GetPrivateProfileString("Profil2-RGBEnde","G",0,ch,100,inipfad); kg->Text = ch; ch = ""; GetPrivateProfileString("Profil2-RGBEnde","B",0,ch,100,inipfad); kb->Text = ch; ch = ""; delete [] ch; } }Also wie gesagt, beim ersten Aufruf geht alles. Nur danach nicht mehr.
Wodran liegt das?greetz KN4CK3R
-
Ich kenne die Funktion GetPrivateProfileString() nicht im Detail.
Was ich dir vorschlagen kann ist, die TIniFile/TMemIniFile-Klasse der VCL für so etwas zu nutzen. Da sind solche Ini-Zugriffe schön gekapselt. Vielleicht löst das schon dein Problem. Oder spricht etwas gegen die Verwendung der entsprechenden Klassen?
Keep smilin'
vi.p
-
blöde Frage, aber TIniFile gibts bei mir nicht. Welche Funktion muss ich beim Installieren auswählen?
Bild
http://kn4ck3r.kn.ohost.de/borland.jpggreetz KN4CK3R
-
Hallo
TInifile ist mit Sicherheit auch in der Builder-Version dabei (ohne das du beim Setup etwas spezielles auswählen must). Such mal in der Builder-Hilfe danach.
bis bald
akari
-
das hatte ich gemacht, als ich den Post obendrüber gelesen hatte. Die Hilfe findet da natürlich auch was. Nur WO steht da leider nicht. Weil ich es nicht gefunden habe, dachte ich ich hätte es nicht mitinstalliert.
greetz KN4CK3R
-
Hallo
Dann hast du doch alles was du brauchst. In den Beispielen aus der Builder-Hilfe steht auch wie du TIniFile verwendest.
bis bald
akari
-
nope, wenn ich jetzt das Object TIniFile einbaue, dann sagt er mir, dass er die Klasse TIniFile nicht finden kann...
greetz KN4CK3R
-
Hallo
Dann hast du die Builder-Hilfe nur ganz kurz überflogen. Denn gleich auf der ersten Seite zu TIniFile steht wie die Unit heißt die man für TIniFile braucht. Und in den Beispielen wird auch gezeigt wie diese Unit konret eingebunden wird.
bis bald
akari
-
so habe alle Beispiele durchgesehen. Bei mir wird in keinem einzigen auch nur ansatzweise etwas mit INI-Files gemacht...
greetz KN4CK3R
-
siehe hier
-
KN4CK3R schrieb:
so habe alle Beispiele durchgesehen. Bei mir wird in keinem einzigen auch nur ansatzweise etwas mit INI-Files gemacht...
Gib doch einfach mal TIniFile im Hilfeindex ein. Da gibt es auch einen Punkt "TIniFile verwenden" (BCB5) oder "TiniFile Benutzung" (BCB6). Beim BDS2006 gibts das auch, allerdings nur für Delphi.
-
habs jetzt anders gelöst. Habe die Funktion genommen die ich oben gepostet hab und speichere die Werte noch zusätzlich in Variablen. Beim Profilwechsel wird dann nicht mehr die INI eingelesen, sondern nur noch die Variablen. Funzt wunderbar so

greetz KN4CK3R
-
char *ch = new char[3]; if(profil == 1) { GetPrivateProfileString("Profil1-RGBStart","R",0,ch,100,inipfad); .. ..Die Funktion erwartet als 5. Parameter die Größe des Puffers, den Du zur Verfügung stellst. Du übergibst als Größe 100 Bytes, hast aber ch nur mit 3 Bytes erzeugt. Deine "Lösung" funktioniert wahrscheinlich nur, weil Dein Ergebnis nie größer als 3 Bytes ist, aber wehe, jemand schreibt mal einen größeren Text in Deine Ini-Datei.
Rob'
-
@Rob'
Die Panne ist doch schon passiert
Beim Einlesen von "R=123" werden doch schon 4 char's benötigt: man vergesse nicht die abschließende '\0'. Und ab da kannst Du dem Programm nicht mehr trauen.Nebenbei @KN4CK3R:
Warum die 3 bzw. korret 4 char's mit new allokieren? Die kannst Du doch locker mitchar ch[4];auf dem Stack ablegen und mußt Dich nicht mal um deren Vernichtung kümmern.
-
hab mir mitlerweile ne kleine Datenbank gebastelt. Jetzt funzt alles...
greetz KN4CK3R
-
Wegen der Ini-FIles und VCL....
Borland hat glaub ich in der Hilfe vergessen anzugeben das man die datei "inifiles.hpp" mit einbinden muss...MFG Antwort
-
Hallo
Nein ist nicht vergessen
BCB-Hilfe zu TIniFile schrieb:
Unit
inifilesbis bald
akari