Objekte mit IniParametern



  • Hallo,
    ich verwende zum parametrisieren meiner Applikation und dem Schnulli dahinter Inifiles sowie einen Config Dialog.
    (MS VC++6.0, Dialoganwendung)

    Da die ca 80 Parameter immer wieder benötigt werden, habe ich eine kleine Klasse geschrieben, welche die IniParameter repräsentiert.

    Ich verwende daraufhin das Array Template, und lege ein Array der Parameter an.

    Nun meine Frage:
    Wenn ich im header meiner Dialoganwendung z.b. CStrings deklariere und in der OnInitDialog Methode initialisiere bleiben deren Werte erhalten.
    Mache ich dies mit meinen Iniparameter-objekten, werden diese am ende der OnInitDialog Methode zerstört.
    Irgendwas scheine ich noch nicht ganz verstanden zu haben 😉

    Hier die entsprechenden CodeSchnipsel (ich hoffe ich habe nichts vergessen):

    "Header des Dialogs"

    protected:
    	HICON m_hIcon;
    	CString path;
    
    	CArray<CIniParam*, CIniParam*> CIniParamPropPage_1_Array;
    	CIniParam para1;
    	CIniParam para2;
    	CIniParam para3;
    

    einer der beiden Konstruktoren:

    CIniParam::CIniParam(const CString& Section, const CString& keyname, const UINT& minval, const UINT& maxval)
    {
    	m_sName=keyname;
    	m_sSection=Section;
    	m_uminVal=minval;
    	m_umaxVal=maxval;
    }
    

    Initialisierung innerhalb der OnInitDialog-Methode

    CIniParam para1 ("General", "ClockDivisor", 1, 65535);
    	CIniParam para2 ("General", "MAXBufferSize", 0, 65535);
    	CIniParam para3 ("General", "I2CMode");
    
    	IniParamInit();
    	IniParamLoad();
    

    Initmethode

    void CGui_proto_2Dlg::IniParamInit(void)
    {
    	CIniParamPropPage_1_Array.Add(&para1);
    	CIniParamPropPage_1_Array.Add(&para2);
    	CIniParamPropPage_1_Array.Add(&para3);
    }
    

    Loader aus IniDatei

    void CGui_proto_2Dlg::IniParamLoad(void)
    {
    	for (int i = 0; i<CIniParamPropPage_1_Array.GetSize();i++)
    	{	//parameter aus ini datei lesen
    		CIniParamPropPage_1_Array[i]->vIniExchange(path);
    
    		//code zum beenden bei inifile fehler einfügen
    		if (CIniParamPropPage_1_Array[i]->bIsValid(CIniParamPropPage_1_Array[i]->uGetValue())==FALSE)
    		{
    			MessageBox("Parameter \"" + CIniParamPropPage_1_Array[i]->sGetName() + "\" fehlerhaft.", "Inifile corrupt", MB_ICONERROR);
    			break;
    		}
    	}
    }
    

    Hier verwendete Funktion:

    void CIniParam::vIniExchange(CString path)
    {
    	m_uValue = GetPrivateProfileInt(this->m_sSection, this->m_sName, 0, path);
    }
    

    Im moment ist die einzige Möglichkeit bei dieser Art Implementation der IniExchange Funktion:
    Die Objekte werden einmal in der OnInitDialog Methode und ein 2. mal wenn ich die Inhalte an meinen Configdialog übergebe angelegt.

    Gruss,
    TtT

    P.S.: das hinzufügen der elemente an das array, innerhalb der extra funktion klappt auch nicht. Nur wenn sie innerhalb des OnInitDialogs angefügt werden bleiben sie erhalten.

    edit: hmpf, ich habe selbst einige fehler entdeckt... mal sehen...



  • *gg*, ich habe die objekte jetzt auf dem heap angelegt. Natürlich klappt es jetzt. Eigentlich wollte ich das vermeiden, aber so what.

    Eine andere Möglichkeit wäre gewesen die entsprechenden Initfunktionen "richtig" zu schreiben, sodass die Initialisierungen erhalten bleiben, oder?

    Gruss,
    TtT



  • Mach aus dem hier:

    CIniParam para1 ("General", "ClockDivisor", 1, 65535);
    CIniParam para2 ("General", "MAXBufferSize", 0, 65535);
    CIniParam para3 ("General", "I2CMode");
    

    Membervariablen Deines Dialoges. So hast Du sie während der gesamten Lebensdauer des Dialoges zur Verfügung und nicht nur in OnInitDialog().



  • jencas schrieb:

    Mach aus dem hier:

    CIniParam para1 ("General", "ClockDivisor", 1, 65535);
    CIniParam para2 ("General", "MAXBufferSize", 0, 65535);
    CIniParam para3 ("General", "I2CMode");
    

    Membervariablen Deines Dialoges. So hast Du sie während der gesamten Lebensdauer des Dialoges zur Verfügung und nicht nur in OnInitDialog().

    Hallo,
    das habe ich ja gemacht. (siehe header). Das Problem ist dass sie in OnitDialog überschrieben werden.
    Wie mache ich aus dem obigen Membervariablen meines Dialogs mit einer Initialisierung zu Beginn ohne sie dann irgendwo wieder zu überschreiben?

    Folgende Fakts hab ich herausgefunden:

    • In C++ muss der Konstruktor gleich bei Deklaration aufgerufen werden, ein nachträgliches Aufrufen geht nicht.
    • Bei meiner OnInitDialog Methode, werden die Objekte überschrieben
    • Im HeaderFile kann ich die Initalisierung nicht vornehmen (oder?), das habe ich nicht hinbekommen.
    • Möglichkeit a) ich implementiere in meiner Klasse CIniParam den Zuweisungsoperator (oder eine InitMethode) der mir bei aufruf die entsprechenden Parameter den Membervariablen zuweist!
    • Möglichkeit b) wäre die Deklaration eines Zeigers im Header und ein Anlegen auf dem Heap mittels des New - Operators.

    Irgendwelche Fehler?

    Gruss,
    TtT



  • Schon mal etwas von Gültigkeit von Variablen oder ähnliches gehört.

    CIniParam para1 ("General", "ClockDivisor", 1, 65535);
    

    wenn du das machst dann ist sie nur in der Funktion gültig.
    Du überschreibst damit nicht die aus der Header sondern legst neue welche eben nur in der Funktion gültig sind.



  • Unix-Tom schrieb:

    Schon mal etwas von Gültigkeit von Variablen oder ähnliches gehört.

    CIniParam para1 ("General", "ClockDivisor", 1, 65535);
    

    wenn du das machst dann ist sie nur in der Funktion gültig.
    Du überschreibst damit nicht die aus der Header sondern legst neue welche eben nur in der Funktion gültig sind.

    öh ja 🙂 hab ich ja oben geschrieben. deshalb die frage wie initialsier ich sie nachdem ich sie als member der dialogklasse deklariert hab 🙂



  • Im Konstruktor de Dialogs!

    Wenn

    CIniParam m_para1;
    

    Deine Membervariable ist, dann mit

    CMyDialog(....)
      : m_para1("General", "ClockDivisor", 1, 65535), m_para2(......
    

    Du solltest Dir vielleicht doch mittels eines Buches mal ein paar C++ Grundlagen aneignen.

    /e: oder hier vorbei schauen: http://www.cpp-tutor.de/cpp/le10/le10_01.htm



  • dohh 🙂 vielen dank, logisch!

    Bücher lagern hier massenweise (und ich hab se auch gelesen, aber teilweise wohl nich richtig^^), aber der Aufbau der mfc bereitet mir einfach noch Schwierigkeiten! Ich hab doch gewusst, da gabs was (sonst hätt ich mich mit dem anlegen aufm Heap zufrieden gegeben :))

    edit: schöner Link, man lernt ja nie aus. Da schau ich gleich mal rein!



  • Initialisierungslisten im Konstruktor hat nichts mit MFC zu tun, das ist reinstes C++ 😉



  • jencas schrieb:

    Initialisierungslisten im Konstruktor hat nichts mit MFC zu tun, das ist reinstes C++ 😉

    ich weiss, 2 Problemchen:
    a) ich hab nich mehr an die Initialisierungslisten gedacht 😉
    b) es hat ne zeit gedauert bis ich den Konstruktor des Dialogs gefunden hab



  • Vielen Dank nochmal für Euren Input.

    Gruss,
    TtT


Anmelden zum Antworten