CRecordset.MoveNext() im Dialog funktioniert nicht



  • Dippi_81 schrieb:

    Aus der xxxView raus wärs ja:
    CRecordset* pSet = OnGetRecordset();

    Du kannst die Funktion doch einfach in den Dialog einbauen. 🙂



  • Hallo nochmal,

    also die DB ist eingebunden und es handelt sich um eine SDI Anwendung!

    also zu dokdok...
    das würde dann einwandfrei funktionieren, wenn ich das ganze DIREKT aus der xxxView.cpp heraus machen würde, da diese Klasse ja abgeleitet ist von CRecordView.
    Da ein Dialog aber von CDialog abgeleitet ist, gibts da Probleme.

    und zu estartu_de...
    wie kann ich die Funktion einfach in meinen Dialog einbinden.
    Ich muss doch vorher den Zeiger auf die Fkt OnGetRecordset() legen...

    Also SDI Anwendung->Beim Start Wizard Datenbank mit Datei Unterstützung(ODBC)
    Daraufhin wieder eine xxxView.h und xxxView.cpp erstellt.
    Wenn man im FormView einen Button erstellt und dem eine Fkt gibt, so wird die Fkt automatisch in diesen xxxView.h(.cpp) erzeugt.Dann funktioniert.
    Aber aus nem Dialog raus komm ich einfach nicht drauf!!!

    Nochmal danke für Eure Hilfe
    MfG Dippi



  • Dippi_81 schrieb:

    und zu estartu_de...
    wie kann ich die Funktion einfach in meinen Dialog einbinden.
    Ich muss doch vorher den Zeiger auf die Fkt OnGetRecordset() legen...

    Du hast einen Dialog.
    Dieser Dialog hat als Member ein Recordset.
    An das willst du von außen dran.
    Also brauchst du eine Get-Funktion.

    Soweit, so klar? 🙂

    Du bist einen Automatismus gewohnt, den du hier ganz einfach nachbauen kannst.
    Diese OnGetRecordset kannst du im Dialog nachbauen. (Ich würde sie dann nur GetRecordset nennen, aber das ist Geschmackssache. 😉 )



  • Ohh Du bist der erste der mein Problem genau verstanden hat und mich auch schon bisserl weiter geracht hat.
    Dafür schon mal vielen Dank.

    Habe es auch versucht, meine Fkt GetRecordset() einzubauen...nur ohne Erfolg.
    Muss ich dazu alle was in der xxxView.h(cpp) drinsteht umschreiben für die Dialoge?

    enum { IDD = IDD_HACCP_FORM };
    CHACCPSet* m_pSet;

    virtual CRecordset* GetRecordset();
    CHACCPDoc* GetDocument() const;
    virtual void OnInitialUpdate();

    void CMainFrame::OnInitialUpdate()
    {
    m_pSet = &GetDocument()->m_HACCPSet;
    CRecordView::OnInitialUpdate();
    }

    CRecordset* CMainFrame::GetRecordset()
    {
    return m_pSet;
    }

    Oder geht das auch einfacher...weil so (alles richtig eingefügt versteht sich) bringt er mir wieder neue Fehlermeldungen.

    Ich kann mir gut vorstellen, dass es sich absolut blöd anhört, wenn man weiß wies geht, aber ich blick grad nicht so richtig durch....

    Vielen Dank
    Dippi



  • Dippi_81 schrieb:

    Ohh Du bist der erste der mein Problem genau verstanden hat und mich auch schon bisserl weiter geracht hat.

    Ich hatte das selber mal. 😉

    CRecordset* GetRecordset();
    
    CRecordset* CDeinDlg::GetRecordset()
    {
    	return m_pSet;
    }
    

    Das sollte klappen. Sonst poste doch auch die Fehlermeldungen. 🙂
    (Du musst doch beim Funktionen-Kopieren die Klassennamen anpassen, sonst sind die Fehler klar.)



  • Da klappt, aber bedenke ob du das willst, dass Zeiger rausgegeben werden.



  • Also ok 🙂

    Ich befinde mich in der HauptKlasse "CMainFrame"
    von hier aus:

    void CMainFrame::OnEinstellungenDmpferchillerAnmelden() 
    {
    	// TODO: Add your command handler code here
    	UpdateData(TRUE);
    
    	if (m_Anmeldung.DoModal() == IDOK)
    	{
    		CString Name = m_Anmeldung.m_Name;
    		CString IP   = m_Anmeldung.m_IPAdresse;
    		CString MAC  = m_Anmeldung.m_MACAdresse;
    		CString Typ  = m_Anmeldung.m_Typ;
    		int i = m_Anmeldung.m_Schnittstelle;
    
    		//auslesen aus DB (Name + ID) um dann neue ID vergeben zu können
    		//Eintrag in DB
    		//Button erstellen
    
    		//CHoverButtonEx* m_pMoveButton = new CHoverButtonEx;
    		m_pMoveButton = new CHoverButtonEx;
    		CHoverButtonEx* pMoveButton = m_pMoveButton;
    		pMoveButton->Create("Name", WS_VISIBLE|BS_PUSHBUTTON|BS_BITMAP,
    			CRect(110,50,200,150), this, 1);
    
    		pMoveButton->SetMoveable();
    		HBITMAP hBmp;
    			hBmp =::LoadBitmap(::AfxGetInstanceHandle(),
                            MAKEINTRESOURCE(IDR_DAEMPFER));
    		pMoveButton->SetBitmap(hBmp);
    
    		pButton->CenterWindow();
    
    		CRecordset* pSet = GetRecordset(); 
    		m_pSet->AddNew();                          <== Hier Fehler
    	}
    
    }
    

    Wenn also der Dialog (m_Anmeldung.DoModal() == IDOK) ohne Probleme wieder verlassen wird, wird ein Button erstellt.
    Zusätzlich sollen dann auch die DB Einträge passieren.

    Also gehe ich davon aus, das ich meine neue "GetRecordset" in der CMainFrame einbinden muss.
    Ich habe folgendes dort hinzugefügt:
    In der MainFrame.cpp

    CRecordset* CMainFrame::GetRecordset()
    {
        return m_pSet;
    }
    

    und in der MainFrame.h

    virtual CRecordset* GetRecordset();
    CHACCPSet* m_pSet;
    

    Fehlermeldung ist:
    First-chance exception in HACCP.exe: 0xC0000005: Access Violation.
    Und zwar bei der im Code gezeigten Zeile....
    hab ich was vergessen?



  • uninitialisierter Zeiger, wo legst du dein Recordset an??? garnicht???



  • In meiner Header Datei:

    CHACCPDoc* GetDocument() const;
    
    inline CHACCPDoc* CMainFrame::GetDocument() const			// <== Datenbank
       { return reinterpret_cast<CHACCPDoc*>(m_pDocument); }	// <== Datenbank
    #endif
    

    In meiner cpp Datei:

    void CMainFrame::OnInitialUpdate()
    {
    	m_pSet = &GetDocument()->m_hACCPSet;
    	CRecordView::OnInitialUpdate();
    }
    

    Fehlermeldungen:

    Compiling...
    MainFrm.cpp
    d:\b\haccp5_1\mainfrm.h(25) : error C2143: syntax error : missing ';' before '*'
    d:\b\haccp5_1\mainfrm.h(25) : error C2501: 'CHACCPDoc' : missing storage-class or type specifiers
    d:\b\haccp5_1\mainfrm.h(25) : error C2501: 'GetDocument' : missing storage-class or type specifiers
    D:\b\HACCP5_1\MainFrm.cpp(126) : error C2227: left of '->m_hACCPSet' must point to class/struct/union
    D:\b\HACCP5_1\MainFrm.cpp(127) : error C2352: 'CRecordView::OnInitialUpdate' : illegal call of non-static member function
            c:\programme\microsoft visual studio\vc98\mfc\include\afxdb.h(1013) : see declaration of 'OnInitialUpdate'
    


  • Noch mal eine andere frag von mir.

    Ich habe jetzt das Problem das man das ja scheinbar auch, ohne direkten ODBC vorher einzurichten, mit einem connection String sich das ODBC zu sparen beziehungsweise für viel mehr leute das Programm nutzbar zu machen.

    Aber irgednwie iriege ich das mit dem ODBC nicht hin. Wo muss ich den hin schreeiben? Was ´muss ich da ändern oder ist das ein größere Umbau?



  • Hallo Jens,

    also ich hab keine Antwort auf Deine Frage, bin noch da noch nicht so der Überflieger.
    Aber eine direkte Frage an Dich.
    Du hast geschrieben, dass DU es geschafft hast, auf einem Dialog raus auf eine Datenbank zuzugreifen.
    Wenn es nicht zuviel verlangt ist, könntest Du mir den Code hier mal aufschreiben?Ich sitz da mittlerweile seit 1 1/2 Wochen dran und komm nicht weiter.
    Oder Du könntest mir Deinen Code einfach schicken, dann kann ich mir die Stelen selber raussuchen, wennst dazuschreibst wo ich suchen muss, oder ne kurze Erklärung.
    Vielen Dank und ein schönes Wochenende
    Mfg Dippi
    eMail: eiskalterengel_81@yahoo.de



  • http://www.c-plusplus.net/forum/viewtopic-var-t-is-127514.html

    da findest du ein paar infos wie ich das gemacht habe.


Anmelden zum Antworten