ini-Datei lesen und Variablen global zur Verfügung stellen? :)



  • Hallo,

    ich bin (totaler) MFC-Anfänger. Das mal zuerst.

    Nun zu meinem Problem:
    Ich habe eine dialogbasierende Anwendung, die aus einem Hauptfenster und mehreren Unterfenstern besteht.

    Im OnInitDialog() lese ich eine .ini-Datei mit CStdioFile aus, die folgendermaßen aussieht:

    [MEDAKO]
    splashscreen=1
    auto_openfile=1
    multi_medako=1
    [MYSQL]
    mysqlhost=10.40.40.10
    mysqlname=DB1
    mysqluser=DBUSER
    mysqlpass=DBPASS
    [WEB]
    webuser=WEBUSER
    webpass=WEBPASS

    Die Variablen schreibe ich lokal in CStrings, z.b.: CString m_sSQL_USERNAME.

    Die Unterfenster heissen nun z.B.: MySQL-Einstellungen oder Web-Einstellungen.

    Leider werden die Variablen dort nicht angezeigt. 😕 Wie übergebe ich die Variablen an die Funktion OnShowMysqlSettings() ?

    Eine "ausführliche" Erklärung wäre sehr hilfreich. :=)

    Vielen Dank im voraus

    Gruss
    kk3003

    P.S.: In der FAQ bzw. mit der Suchfunktion habe ich leider keine Lösung/Hilfe gefunden.



  • Zuerst mal.
    Wie hollst du dir die Werte aus einer INI-Datei mit CStdioFile?
    Dazu gibt es bereits Methoden in der MFC.

    GetPrivateProfileString
    

    Um die Werte dann einem Dialog zu übergeben brauchst du den Zeiger auf diesen Dialog.
    Bzw. könntest du auch eine EInstellungsklasse machen auf die jeder Dialog zugriff hat.



  • es gibt spezille klassen die auf sowas spezialisiert sind

    da kannst du gleich nach einer section suchen oder nach bestimmten key's

    die fkt könnte so aussehen

    [User]
    Name=blub
    Password=osterhase
    ...-.....

    m_userpw = GetValueName("User","Password");

    Mit den Klassen kannst du dann acuh einfach so eine .ini auf generieren und key anhängen ect.

    Vielleicht wirst du hier oder bei codeproject oder so fündig.



  • sollte eher so aussehen

    m_userPw = myinifile.GetValueName("User","Password");



  • Hi,

    schon mal vielen Dank für die ganzen Antworten.

    Ich lese die ASCII-Datei (ini) mit CStdio::ReadString aus:

    CString m_username = "username=peter";
    

    Danach schneide ich die uninteressanten Sachen mit Replace ab.

    m_username.Replace("username=","");
    

    Da meine ini statisch ist, und ich weiss was darin vorkommt, reicht mir eine reine Zeichenketten-Behandlung vollkommen aus. 🙂

    Leider stehen wie gesagt, diese Variablen nur im Hauptdialog zur Verfügung.
    Öffne ich eine Unterfenster von CDialog abgeleitet, werden die Variablen dort nicht angezeigt. 😞

    Gruss
    kk3003



  • Wenn du sie dort nicht reinschreibst können sie auch nicht angezeigt werden.
    Und auch wenn es dir reicht ReadString bei einer INI zu verwenden solltest du trotzdem die Win-API verwenden.



  • kk3003 schrieb:

    Leider stehen wie gesagt, diese Variablen nur im Hauptdialog zur Verfügung.
    Öffne ich eine Unterfenster von CDialog abgeleitet, werden die Variablen dort nicht angezeigt. 😞

    kk3003

    Das ist schon klar!

    Denkst du wenn es in einem dialog ist, dann stehen die variablen in allen dialogen in den membervaribalen?

    Am besten du schreibst im dialog b eine memberfunktion die das setzt oder die alles setzt. oder halt nur die eine variable

    dann rufst du das in etwa so auf ( im hauptdialog )

    CBlub dlg;
    
    dlg.SetPW(m_dasPw);  // m_dasPw gehört ja zu A und nicht zu Blub ;)
    
    if( !dlg.DoModal()) {
    
    // fehlerbehandlung
    }
    


  • @UNIX-TOM:
    Ich habe auf Deiner Seite gesehen, dass Du eine Klasse geschrieben hast, die Konnektivität zwischen CPP und MySQL herstellt. Leider habe ich keine Doku dazu gefunden. Gibt es dazu was?

    P.S: Wenn ich an einem Rechner im Netzwerk eine Datenbank im Netz kontaktieren will (Abfragen, etc.), kann hierfür diese/Deine Klasse verwende? Oder ist das eine reine lokale Geschichte?

    Danke für Antwort

    Gruss
    kk3003



  • Am besten verwendest du für sowas das Singleton-Muster. Das heisst grob
    skizziert, du schreibst eine Klasse mit einer statische Methode die dir
    immer genau ein und dieselbe Instanz dieser Klasse zurückliefert. Beim
    erstmaligen Zugriff erzeugst du diese Instanz. Die zum Zugriff notwendigen
    Methoden implementierst du wie bei jeder anderen Klasse auch.
    Das bedeutet, von jedem Punkt deines Programmes kann über diese Methode
    die Objektinstanz geholt werden und anschliessend deren Member entsprechend
    den INI-Parameter abgerufen bzw. gesetzt werden.

    Ich hoffe, ich hab dein Problem richtig interpretiert. 🙂



  • kk3003 schrieb:

    @UNIX-TOM:
    Ich habe auf Deiner Seite gesehen, dass Du eine Klasse geschrieben hast, die Konnektivität zwischen CPP und MySQL herstellt. Leider habe ich keine Doku dazu gefunden. Gibt es dazu was?

    P.S: Wenn ich an einem Rechner im Netzwerk eine Datenbank im Netz kontaktieren will (Abfragen, etc.), kann hierfür diese/Deine Klasse verwende? Oder ist das eine reine lokale Geschichte?

    Danke für Antwort

    Gruss
    kk3003

    Es gibt keine Doku. Such mal hier bzw. in der FAQ.
    Die Klasse ist aber so einfach das man nur in die Header schauen muss um sie zu verwenden.
    Es reicht wenn du die Header einbindest. Die LIB wird automatisch gelinkt wenn sie auch gefunden wird. Wichtig sind aber auch die Header, LIB, DLL von MySQL.
    Die Klasse übernimmt eine IPADRESSE etc. SOmit zugriff auf JEDEN MySQL.
    Darf nicht kommerziell verwendet werden.


Anmelden zum Antworten