Speichern



  • Gibt noch ein Problem, wenn ich in m_sText z.b. A eingebe und in m_sText2 z.b. B eingebe, dann wird beim öffnen des Fensters nicht in das eine Eingabefeld A und in das andere B angezeigt, sondern in beiden erscheint AB.
    Hier ist der Code der fürs einlesen zuständig ist:

    void CTestDApp::OnHalloDaten()
    {
    	// TODO: Fügen Sie hier Ihren Befehlsbehandlungscode ein.
    	CDaten Daten;
    	if (Daten.DoModal() == IDOK)
    	{
    		CStdioFile OutFile; 
    		if (OutFile.Open("C:\\Data.txt", CFile::modeCreate | CFile::modeWrite)) 
    		{ 
    			OutFile.WriteString(Daten.m_sText); // Variable einer Editbox 
    			OutFile.WriteString(Daten.m_sText2);
    
    			OutFile.Close(); 
    		} 
    	}
    }
    

    Der Code zum anzeigen:

    CDaten::CDaten(CWnd* pParent /*=NULL*/)
    	: CDialog(CDaten::IDD, pParent)
    	, m_sText(_T(""))
    	, m_sText2(_T(""))
    {
    	CString strReadBuffer; 
    
    	CStdioFile ReadFile; 
    	if(ReadFile.Open("C:\\Data.txt", CFile::modeRead)) 
    		{ 
                while(ReadFile.ReadString(strReadBuffer)) 
                    {
    					m_sText=strReadBuffer;	
    					m_sText2=strReadBuffer;
    
                        //AfxMessageBox(strReadBuffer); //Zeilenweise alle Einträge 
    
    				} 
    		} 
    }
    

    Ich hoffe ihr könnt mir weiter helfen, sodass die beiden Texte nicht mehr hintereinander geschrieben werden, sondern jeder in seinem Eingabefeld angezeigt wird.



  • 123Kobold schrieb:

    ....
                while(ReadFile.ReadString(strReadBuffer)) 
                    {
    					m_sText=strReadBuffer;	
    					m_sText2=strReadBuffer;
    
                    } 
    		 
    ....
    

    Hier liegt der Fehler. Du liest in der While-Schleife "A" ein und gibst diesen Character an m_sText und m_sText2 weiter!
    21ner's hatte den Vorschlag, dass du das Lesen und Schreiben in der Reihenfolge gleich der Tabreihenfolge deiner Elemente durchführst. Somit müsste es ja möglich sein, eine For-Schleife zu programmieren und anhand der Position den aktuell eingelesenen String in das richtige Element zu schreiben.
    😉



  • Hört sich gut an Paul_C. wie soll ich das mit der For-Schleife machen. Könntest du oder jemand mir den Code ziegen, denn ich weis nicht wie ich das mit dem abfragen der Positionen machen soll.



  • Das ist eigentlich nicht schwer, wenn man weiss wie, es geht. 😉

    CEdit* pStartEdit = (CEdit*) GetDlgItem(ID_EDIT1); //Zeiger auf erste EditBox
    CEdit* pEndEdit=(CEdit*)GetDlgItem(ID_EDIT2);//Zeiger auf lezte EditBox
    int startID = pstartEdit->GetDlgCtrlID();
    int endID   = pendEdit->GetDlgCtrlID();
    
    for (int i = startID; i<= endID; i++)
    {
        ReadFile.ReadString(strReadBuffer);
        CEdit* pEdit = (CEdit*) GetDlgItem(i);
        pEdit->SetWindowText(strReadBuffer);
    }
    

    Das wäre eine Idee,die mir so einfällt.
    Eine andere:

    CEdit* pEdit = (CEdit*) GetDlgItem(ID_EDIT1);// erste EditBox
    if (pEdit)                                        // überprüfen, ob vorhanden
    {
        do
        {
            ReadFile.ReadString(strReadBuffer);       // String einlesen
            pEdit->SetWindowText(strReadBuffer);      // Text setzen
            pEdit = (CEdit*)GetNextDlgTabItem(pEdit); // Zeiger auf nächste Box setzen
        {
        while (pEdit != NULL);                        
    }
    

    Ich bin natürlich davon ausgegangen, dass du nur EditBoxen nutzt. 😉
    Ach ja, ich habe diese Beispiele nicht ausprobiert. Falls es Probleme gibt, dann melde dich.



  • Paul_C ich habe deine Vorschläge ausprobiert und folgende Fehlermeldungen erhalten. Hier ist der Code zum ersten Vorschlag und dessen Fehlermeldungen. Ich hoffe du kannst mir weiter helfen.
    Code:

    CDaten::CDaten(CWnd* pParent /*=NULL*/)
    	: CDialog(CDaten::IDD, pParent)
    	, m_sText(_T(""))
    	, m_sText2(_T(""))
    {
    	CString strReadBuffer; 
    
    	CStdioFile ReadFile; 
    	if(ReadFile.Open("C:\\Data.txt", CFile::modeRead)) 
    		{
    			CEdit* pStartEdit = (CEdit*) GetDlgItem(IDC_EDIT1); //Zeiger auf erste EditBox 
    			CEdit* pEndEdit=(CEdit*)GetDlgItem(IDC_EDIT2);//Zeiger auf lezte EditBox 
    			int startID = pstartEdit->GetDlgCtrlID(); 
    			int endID   = pendEdit->GetDlgCtrlID(); 
    
    			for (int i = startID; i<= endID; i++) 
    			{ 
    				ReadFile.ReadString(strReadBuffer); 
    				 CEdit* pEdit = (CEdit*) GetDlgItem(i); 
    				pEdit->SetWindowText(strReadBuffer); 
    			} 
    		}
    }
    

    Fehlermeldungen:
    error C2065: 'pstartEdit': nichtdeklarierter Bezeichner
    error C2227: Der linke Teil von '->GetDlgCtrlID' muss auf Klasse/Struktur/Union zeigen Typ ist ''unknown-type''
    error C2065: 'pendEdit': nichtdeklarierter Bezeichner
    error C2227: Der linke Teil von '->GetDlgCtrlID' muss auf Klasse/Struktur/Union zeigen Typ ist ''unknown-type''



  • if(ReadFile.Open("C:\\Data.txt", CFile::modeRead)) 
    {
        CEdit* pStartEdit = (CEdit*) GetDlgItem(IDC_EDIT1); //Zeiger auf erste EditBox
        CEdit* pEndEdit=(CEdit*)GetDlgItem(IDC_EDIT2);//Zeiger auf lezte EditBox 
        int startID = pstartEdit->GetDlgCtrlID();  // habe mich vertippt muss pStartEdit heissen 
        int endID   = pendEdit->GetDlgCtrlID(); //und hier pEndEdit!
    
        for (int i = startID; i<= endID; i++) 
        { 
            ReadFile.ReadString(strReadBuffer); 
            CEdit* pEdit = (CEdit*) GetDlgItem(i); 
            pEdit->SetWindowText(strReadBuffer); 
        } 
    
    }
    

    Haben sich 2 Tippfehler eingeschlichen. 😃



  • Kann das Programm jetzt ohne Probleme starten.Danke. Doch wenn ich das Dialogfenster im Menü aufrufen will erhalte ich eine Fehlermeldung und muss das Programm schließen.
    Hier ist die Fehlermeldung

    Debug Assertion Failed
    Program: ...
    File: winocc.cpp
    Line 94

    For information on how your program can cause an assertion
    failure, see the Visual C++ documentation on asserts.



  • Bei der Fehlermeldung kann ich nichts zu sagen.
    Aber setze mal ein paar Breakpoints und debug mal und schaue dir dabei die Werte der Zeiger, etc an.



  • hier ist noch der Code den ich angezeigt bekommen wenn ich bei der Fehlermeldung auf "wiederholen" klicke. Dann wechselt er in den Debug und ziegt mir diesen Code:

    CWnd* CWnd::GetDlgItem(int nID) const
    {
    	ASSERT(::IsWindow(m_hWnd));
    
    	if (m_pCtrlCont == NULL)
    		return CWnd::FromHandle(::GetDlgItem(m_hWnd, nID));
    	else
    		return m_pCtrlCont->GetDlgItem(nID);
    }
    


  • Scheint wohl, dass dein Programm eine EditBox nicht 'finden' kann.
    Dann aber versucht, einen Text zu setzen.
    Versuch mal:

    ...
    ReadFile.ReadString(strReadBuffer);
    CEdit* pEdit = (CEdit*) GetDlgItem(i); 
    if (pEdit)
        pEdit->SetWindowText(strReadBuffer); 
    ...
    

    Dann überprüft dein Programm vorher, ob der Zeiger gültig ist.



  • Hab den Code geändert doch leider erscheint die Fehlermeldung immer noch.
    Hier ist der Code:

    CDaten::CDaten(CWnd* pParent /*=NULL*/)
    	: CDialog(CDaten::IDD, pParent)
    	, m_sText(_T(""))
    	, m_sText2(_T(""))
    {
    	CString strReadBuffer; 
    
    	CStdioFile ReadFile; 
    	if(ReadFile.Open("C:\\Data.txt", CFile::modeRead)) 
    	{
    		while(ReadFile.ReadString(strReadBuffer)) 
    		{ 
    		CEdit* pStartEdit = (CEdit*) GetDlgItem(IDC_EDIT1); //Zeiger auf erste EditBox 
    		CEdit* pEndEdit=(CEdit*)GetDlgItem(IDC_EDIT2);//Zeiger auf lezte EditBox 
    		int startID = pStartEdit->GetDlgCtrlID(); 
    		int endID   = pEndEdit->GetDlgCtrlID(); 
    
    		for (int i = startID; i<= endID; i++) 
    			{ 
    				ReadFile.ReadString(strReadBuffer);
    				CEdit* pEdit = (CEdit*) GetDlgItem(i); 
    				if (pEdit) 
    				pEdit->SetWindowText(strReadBuffer);
    			}
    
    		} 
    	}
    }
    


  • Kontrolliere mal, ob das dann noch diese Zeilen sind.
    Doppelklick auf Fehlermeldung.
    Sonst zeige mal die aktuellen Fehlermeldungen.



  • Erst mal herzlichen dank, dass du dich so bemühst.
    Die Fehlermeldung ist noch die gleiche und auch die Zeilen sind die selben.

    P.S: Soll ich dir das Programm per e-mail zu schicken, sodass du dir es mal persönlich angucken kannst?(kann auch eine neue e-mail adresse erstellen und da hochladen so erfährt keiner deine e-mail adresse)



  • Du versuchst, im Konstruktor deiner Dialogklasse auf die Steuerlemente zuzugreifen. Die sind aber zu dem Zeitpunkt, wenn der Konstruktor ausgeführt wird, noch gar nicht erstellt. Üblicherweise macht man so etwas in OnInitDialog.



  • Hört sich plausibel an.
    Doch wie binde ich OnInitDialog in meinen Code ein?



  • Hallo
    hab OnInitDialog eingebunden, jetzt kann ich zwar das Dialogfeld wieder aufrufen ohne Fehler, doch wird das Eingegebene nicht gespeichert. Man erhält jedesmal wenn man das Dialogfeld aufruft leere Edit Boxen.
    Hier ist der neue Code(Zur Übersicht ist hier der komplette Code von Daten.cpp und Daten.h)
    Daten.cpp

    // Daten.cpp : Implementierungsdatei
    //
    
    #include "stdafx.h"
    #include "TestD.h"
    #include "Daten.h"
    
    // CDaten-Dialogfeld
    
    IMPLEMENT_DYNAMIC(CDaten, CDialog)
    CDaten::CDaten(CWnd* pParent /*=NULL*/)
    	: CDialog(CDaten::IDD, pParent)
    	, m_sText(_T(""))
    	, m_sText2(_T(""))
    {/*
    	CString strReadBuffer; 
    
    	CStdioFile ReadFile; 
    	if(ReadFile.Open("C:\\Data.txt", CFile::modeRead)) 
    	{
    		while(ReadFile.ReadString(strReadBuffer)) 
    		{ 
    		CEdit* pStartEdit = (CEdit*) GetDlgItem(IDC_EDIT1); //Zeiger auf erste EditBox 
    		CEdit* pEndEdit=(CEdit*)GetDlgItem(IDC_EDIT2);//Zeiger auf lezte EditBox 
    		int startID = pStartEdit->GetDlgCtrlID(); 
    		int endID   = pEndEdit->GetDlgCtrlID(); 
    
    		for (int i = startID; i<= endID; i++) 
    			{ 
    				ReadFile.ReadString(strReadBuffer);
    				CEdit* pEdit = (CEdit*) GetDlgItem(i); 
    				if (pEdit)
    				pEdit->SetWindowText(strReadBuffer);
    			}
    
    		} 
    	}*/
    }
    
    BOOL CDaten::OnInitDialog() 
    {
        CDialog::OnInitDialog();
    
    	CString strReadBuffer; 
    
    	CStdioFile ReadFile; 
    	if(ReadFile.Open("C:\\Data.txt", CFile::modeRead)) 
    	{
    		while(ReadFile.ReadString(strReadBuffer)) 
    		{ 
    		CEdit* pStartEdit = (CEdit*) GetDlgItem(IDC_EDIT1); //Zeiger auf erste EditBox 
    		CEdit* pEndEdit=(CEdit*)GetDlgItem(IDC_EDIT2);//Zeiger auf lezte EditBox 
    		int startID = pStartEdit->GetDlgCtrlID(); 
    		int endID   = pEndEdit->GetDlgCtrlID(); 
    
    		for (int i = startID; i<= endID; i++) 
    			{ 
    				ReadFile.ReadString(strReadBuffer);
    				CEdit* pEdit = (CEdit*) GetDlgItem(i); 
    				if (pEdit)
    				pEdit->SetWindowText(strReadBuffer);
    			}
    
    		} 
    	}
    	return TRUE;
    
    }
    
    CDaten::~CDaten()
    {
    }
    
    void CDaten::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	DDX_Text(pDX, IDC_EDIT1, m_sText);
    	DDX_Text(pDX, IDC_EDIT2, m_sText2);
    }
    
    BEGIN_MESSAGE_MAP(CDaten, CDialog)
    END_MESSAGE_MAP()
    
    // CDaten-Meldungshandler
    

    Hier ist Daten.h:

    #pragma once
    #include "TestD.h"
    
    // CDaten-Dialogfeld
    
    class CDaten : public CDialog
    {
    	DECLARE_DYNAMIC(CDaten)
    
    public:
    	CDaten(CWnd* pParent = NULL);   // Standardkonstruktor
    	virtual ~CDaten();
    
    // Dialogfelddaten
    	enum { IDD = IDD_DIALOG1 };
    
    protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV-Unterstützung
    	virtual BOOL OnInitDialog();
    
    	DECLARE_MESSAGE_MAP()
    public:
    	CString m_sText;
    	CString m_sText2;
    };
    


  • Habe gerade nicht viel Zeit. Vielleicht nachher.
    Kannst mir aber auch gerne dein Projekt zusenden. Vorher aber zippen und den inhalt des Debug-Ordners löschen.

    In meinem Profil findest du die E-mail-Adresse. 😉


Anmelden zum Antworten