Komplizierte Frage zu CStdioFile



  • Ich hoffe du meinst jetzt nicht mit sondern den lustigen Kerl da.

    Versuche schon die ganze Zeit dir zu helfen. Du solltest deine Fragen nur etwas konkretisieren. Mit einfach nur geht nicht, kann dir keiner helfen.

    "learning by doing" funktioniert vieleicht wenn man zumindest die Grundlagen kennt. Und nach einem Jahr sollte man diese nicht vergessen haben wenn man sie gekannt hat.



  • Ich kenne die kleinen Grundlagen aber das mit switch kannt ich nicht, stand auch in keinem meiner bücher.

    nun zum problem:

    wenn ich die Variable m_sRActuator als CString verwende habe ich keine Möglichkeit diese als enum einzufügen, bringt mir nur Fehler.

    hier ein beispiel (auszug aus meinem programm) wie ich es immer gemacht habe und es funktioniert so ohne problem und ohne fehler

    Datei SettingsDlg.cpp

    void CSettingsDlg::InitializeControls(void)
    {
            switch (m_sCurrPara1)
    	{
    		case CHANNEL1:
    			m_sParaChannel1.SetCurSel(0);
    			break;
    		case CHANNEL2:
    			m_sParaChannel1.SetCurSel(1);
    			break;
    	}
    
    }
    
    void CSettingsDlg::OnCbnSelchangeParachannel1()
    {
    	switch (m_sParaChannel1.GetCurSel())
    	{
    		case 0:
    			m_sCurrPara1 = CHANNEL1;
    			break;
    		case 1:
    			m_sCurrPara1 = CHANNEL2;
    			break;
    	}
    }
    

    Datei SettingsDlg.h

    CComboBox m_sParaChannel1;
    Parachannel m_sCurrPara1;
    

    Datei DSOZDoc.cpp

    m_sCurrPara1 = CHANNEL1; // Default immer anzeigen
    

    Datei DSOZDoc.h

    Parachannel m_sCurrPara1;
    

    Datei Light.h

    enum Parachannel
    {
    	CHANNEL1 = 1536,	// Kanal 1
    	CHANNEL2 = 1600,	// Kanal 2
    };
    

    Somit funktioniert das ohne Probleme und auch die Praxis hat gezeigt das es so geht. Alles hat wunderbar funtkioniert.

    Deshalb ist für mich die Frage wie ich ien CString in InitializeControls oder in ein enum - einfügen kann.

    Verstehst du nun was mein Problem ist 😕

    mfg
    shona



  • keiner ne idee wie ich das OpenFile("") in ein enum bekomme, weil dann hätte ich zumindest das mal 😉



  • Kannst du mir sagen wass du mit einem enum und switch case machen möchtest.

    Du meintest doch das du mehrere tausend Einträge hast. Du willst nun nicht allen ernstes ein enum und ein switch case machen mit mehreren tausend Einträgen.

    Also noch einmal: verwende eine STL Map.

    Und übrigens ein String wandelt man in einen int mit atoi.



  • nein wollte ich nicht 😉
    In meinem beitrag mit dem beispiel sieht man was ich mit dem enum-befehl mache!!

    Keine Ahnung wie du das machst aber ohne enum-befehl funktioniert das nicht wie es soll.

    Ich hoffe auch das dir klar ist das ich eine SDI-Anwendung habe und von meinem Dialog "Einstellungen" die Variablen an die Doc übergeben muss bzw. beim öffnen des Dialog wieder da hin sende um so di einstellungen zu speichern!

    und ja ich benutze dafür auch Serialize aber diese einstellungen werden nicht übernommen.



  • Hallo Shona!

    Es tut mir leid aber du sprichts in Rätseln für mich. Tut mir leid aber ich versteh überhaupt nicht was du willst. Aber vieleicht kann dir ja jemand anders helfen.



  • und was vestehst du denn nicht? Was eine SDI-Anwendung ist?

    Ist doch einfach zu verstehen 😉 Ich hab ne SDI-Anwendung in der ich einen Dialog erstellt habe in dem man die "Einstellungen" macht.

    Damit die Einstellungen gespeichert werden können muss ich die Variablen in das Dokument einfügen bzw. mus ich diese aus dem Dialog "Einstellungen" in dieses speichern wenn ich im Dialog "Einstellungen auf "OK" drücke.

    Wenn ich dann wieder den Dialog "Einstellungen" öffne, soll ja alles noch so sein wie ich es eingestellt habe, also muss ich die Variablen vom Dokument wieder zum Dialog schicken. Damit bleiben diese solange erhalen bis ich das Programm schließe.


  • Mod

    Ich verwendet dazu UpdateAllViews aus dem CDocument.
    Jeweils mit einem Hint für Load/Commit. Bei Load werden die Daten aus dem Dokument geladen und in den Dialog übertragen. Bei Commit werden die Daten aus dem Dialog in das Dokument zurückgeschrieben.



  • Das verwende ich ja aber das bringt mir bei der neuen Combobox nix weil ich das OpenFile so nicht speichern kann bzw. es wird nicht gemacht obeohl ich alles so eingetragen habe wie sonst auch

    hier mal der CodeSnipsel dazu (nur ein Auszug das ist viel länger ;))

    void CDSOZDoc::OnSettings()
    {
    	CSettingsDlg settingsDlg;
    
    	settingsDlg.m_sRActuator = m_sRActuator;
    
    	if (IDOK == settingsDlg.DoModal())
    	{
    		m_sRActuator = settingsDlg.m_sRActuator;
    		//----------------------
    		UpdateAllViews (NULL);
    		SetModifiedFlag ();
    	}
    }
    

    So speichere ich aber nur die Variable m_sRActuator, also das diese eben die Datei immer öffnet, aber die Combobox zeigt mir damit nicht das an was ich ausgewählt habe.

    In dem Fall entweder "9300" oder "9400". Stelle ich das nun von 9300 auf 9400 und drücke "ok", sollte eigentlich diese Einstellung gespeichert sein. Wenn ich aber den Dialog jetzt wieder öffne steht die Combobox wieder auf "9300" aber es müsste "9400" sein.



  • kann mir den keiner helfen? oder ist es zu schwer zu verstehen was mein problem ist?


  • Mod

    Wird denn der Wet im Dialog überhaupt zugeordnet?
    Das kannst Du doch einfach im Debugger kontrollieren.



  • Martin Richter schrieb:

    Wird denn der Wet im Dialog überhaupt zugeordnet?
    Das kannst Du doch einfach im Debugger kontrollieren.

    und wie? in meinen büchern steht darüber nichts 😞

    Edit:
    Hab mal haltepunkte gesetz und an den zwei stellen senden und empfangen bleibt es stehen.



  • Stelle deine Projektmappenkonfiguration auf Debug (Drop-Down rechts neben dem Play/Dreieck Symbol).
    Danach klikst du mit der linken Maustaste in den grauen Balken links neben deinem Quellcode.
    Und zwar denau da wo`s interessant wird.
    Da müsste dann ein roter Punkt erscheinen.
    Dass ist der sogenannte Break-Point

    Danach drückst du [F5] und lässt dein Programm loslaufen.
    Sobald dein Programm die markierte Stelle ereicht, hält es an.

    Jetzt beginnt das debuggen.
    Mit [F10] gehst du im Programm eine Zeile weiter.
    Mit [F11] gehst du gehst du in Funktionen hinein.

    Wenn du mit der Maus über die Variablen fährst, siehst du ihren aktuellen Inhalt.
    Du kannst dir aber auch einzelne Variablen in den Reiter "Überwachen" hineinziehen um ständig zu sehen was sich da tur.
    Der Reiter Überachen ist quasi die übersichtliche Version der Reiter "Auto" und "Lokal".
    Diese Reiter findet man meißtens links unten im Fenster.

    Dass war jetzt ein Kurzer Crash-Kurs im debuggen.
    Wenn es noch Fragen gibt, wird dir gerne geholfen.



  • Vielen Dank @Sepp hat geklappt 😃

    So hab jetzt die Variable mal überwacht und vorher auch mal was in eine der Textdateien was reingeschrieben.

    Die Variable enthält bei speichern des "Einstellungen"-Dialogs den Inhalt aus der Textdatei und bei öffnen enthält der Dialog dann wieder den Inhalt. Somit funtkioniert das speichern in die Variablen perfekt.

    Nun ist es aber noch so das wenn ich den "Einstellungen"-Dialog wieder öffne ist das Drowp-Down-Menü leer und enthaöt nicht die ausgewählte Option, was aber wichtig ist.

    Hier ein Bild
    http://saved.im/mtuymdezb2wy/unbenannt-1.png

    Wie kann ich das lösen?

    Bisher habe ich das, wie schon oft gesagt, über ein die Enum-Funktion gelöst. Dies ist aber hier nicht möglich wegen der dem "OpenFile"

    MFG
    Shona



  • Hallo,

    genau so, wie du hier:

    settingsDlg.m_sRActuator = m_sRActuator;
    

    eine Variable vorbelegst, musst du auch die fehlende Einstellung erst setzen. Irgendwo musst du die Daten ja einlesen, und die müssen dann gesetzt werden, vor dem Aufruf des Dialogs.

    MfG,

    Probe-Nutzer



  • das mach ich ja mit

    m_sRActuator = settingsDlg.m_sRActuator;
    

    aber das Drop-Down-Menü wird dann nicht auf diese Einstellung gesetzt bzw. ich meine das es eben nicht ausgewählt ist, das Feld ist leer aber in der Variable ist es drin.

    Ich weiß das ich das irgendwie in das "InitializeControls" rein bringen muss aber mein Problem ist das ich nicht weiß wie ich den switch-befehl dafür mache weil das OpenFile mir Probleme macht

    HIer der switch-Befehl wie ich die Datei öffne

    switch(m_sActuator.GetCurSel())
        {
            case 0:
               m_sRActuator300 = OpenFile("9300.txt");
               break;
            case 1:
               m_sRActuator400 = OpenFile("9400.txt");
               break;
    	}
    

    Ich weiß auch das ich es ungefähr folgendermaßen aussehen muss (nur Beispiel)

    switch (keine_Ahnung_was_für_eine_Variable)
    	{
    		case test300:
    			m_sActuator.SetCurSel(0);
    			break;
    		case test400:
    			m_sActuator.SetCurSel(1);
    			break;
    	}
    

    Wie gesagt ich hab das bei den anderen immer über den enum-befehl gemacht aber hier weiß ich einfach nicht wie ich das machen soll. Bin schon am verzweifeln 😞



  • Nur eine von vielen Lösungen:

    Füge eine enum in deinen Dialog (innerhalb der Klasse CSettingsDlg ) ein:

    public:
    ...
    enum test { Test300, Test400};
    

    dann darunter eine Zustandsvariable vom Typ der enum:

    public:
    ...
    ...
    test currentTest;
    

    in OnInitDialog der CSettingsDlg-Klasse (wenn noch nicht vorhanden, dann entsprechende Nachricht hinzufügen):

    switch(currentTest)
    {
       case Test300: m_sActuator.SetCurSel(0); break;
       case Test400: m_sActuator.SetCurSel(1); break;
       default: m_sActuator.SetCurSel(-1); break;
    }
    

    Vor dem Aufruf dann das Setzen des aktuellen test:

    void CDSOZDoc::OnSettings()
    {
        CSettingsDlg settingsDlg;
    
        settingsDlg.m_sRActuator = m_sRActuator;
        settingsDlg.currentTest = CSettingsDlg::Test300; // z.B. Test300 festlegen
    
        if (IDOK == settingsDlg.DoModal())
        {
            m_sRActuator = settingsDlg.m_sRActuator;
            //----------------------
            UpdateAllViews (NULL);
            SetModifiedFlag ();
        }
    }
    

    Alles klar?

    MfG,

    Probe-Nutzer


Anmelden zum Antworten