zugriff auf ein klasse



  • hallo

    ich habe schon wider ein Problem

    ich habe zwei klassen und möchte von der einen auf die andere zugreifen

    erste klasse:

    // finalV1View.h : Schnittstelle der Klasse CFinalV1View
    //
    /////////////////////////////////////////////////////////////////////////////
    
    #if !defined(AFX_FINALV1VIEW_H__68872ACE_4AD7_414E_9BF4_AA4D235BB003__INCLUDED_)
    #define AFX_FINALV1VIEW_H__68872ACE_4AD7_414E_9BF4_AA4D235BB003__INCLUDED_
    
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    
    class CFinalV1Set;
    
    class CFinalV1View : public CRecordView
    {
    protected: // Nur aus Serialisierung erzeugen
    	CFinalV1View();
    	DECLARE_DYNCREATE(CFinalV1View)
    
    public:
    	//{{AFX_DATA(CFinalV1View)
    	enum { IDD = IDD_FINALV1_FORM };
    	CListBox	m_liste;
    	CFinalV1Set* m_pSet;
    	CString	m_bew;
    	CString	m_sen;
    	int m_counter;
    
    	//}}AFX_DATA
    
    // Attribute
    public:
    	CFinalV1Doc* GetDocument();
    
    // Operationen
    public:
    
    // Überladungen
    	// Vom Klassenassistenten generierte Überladungen virtueller Funktionen
    	//{{AFX_VIRTUAL(CFinalV1View)
    	public:
    	virtual CRecordset* OnGetRecordset();
    	virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
    
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV-Unterstützung
    	virtual void OnInitialUpdate(); // das erste mal nach der Konstruktion aufgerufen
    	virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
    	virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
    	virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
    	//}}AFX_VIRTUAL
    
    // Implementierung
    public:
    	void OnSuchen(int);
    	CString m_wait1;
    	int m_suchen_a;
    	CString m_setzen;
    	;
    	CString m_aus;
    	virtual ~CFinalV1View();
    #ifdef _DEBUG
    	virtual void AssertValid() const;
    	virtual void Dump(CDumpContext& dc) const;
    #endif
    
    protected:
    
    // Generierte Message-Map-Funktionen
    protected:
    	//{{AFX_MSG(CFinalV1View)
    	afx_msg void OnSchreiben();
    	afx_msg void OnSaveLoad();
    	afx_msg void OnSeden();
    	afx_msg void OnLoeschen();
    	afx_msg void OnHilfe();
    	//}}AFX_MSG
    	DECLARE_MESSAGE_MAP()
    };
    
    #ifndef _DEBUG  // Testversion in finalV1View.cpp
    inline CFinalV1Doc* CFinalV1View::GetDocument()
       { return (CFinalV1Doc*)m_pDocument; }
    #endif
    
    /////////////////////////////////////////////////////////////////////////////
    
    //{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ fügt unmittelbar vor der vorhergehenden Zeile zusätzliche Deklarationen ein.
    
    #endif // !defined(AFX_FINALV1VIEW_H__68872ACE_4AD7_414E_9BF4_AA4D235BB003__INCLUDED_)
    

    zweite klasse:

    #if !defined(AFX_SENSOR1_H__1101A331_1D02_406C_A9C7_CA7543EB8B7F__INCLUDED_)
    #define AFX_SENSOR1_H__1101A331_1D02_406C_A9C7_CA7543EB8B7F__INCLUDED_
    
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    // Sensor1.h : Header-Datei
    //
    
    /////////////////////////////////////////////////////////////////////////////
    // Dialogfeld Sensor 
    
    class Sensor : public CDialog
    {
    // Konstruktion
    public:
    	int a;
    	Sensor(CWnd* pParent = NULL);   // Standardkonstruktor
    
    // Dialogfelddaten
    	//{{AFX_DATA(Sensor)
    	enum { IDD = IDD_Sensor };
    	CListBox	m_liste;
    	CString	m_test;
    	CString	m_bew;
    	CString	m_ubergabe;
    	//}}AFX_DATA
    
    // Überschreibungen
    	// Vom Klassen-Assistenten generierte virtuelle Funktionsüberschreibungen
    	//{{AFX_VIRTUAL(Sensor)
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV-Unterstützung
    	//}}AFX_VIRTUAL
    
    // Implementierung
    protected:
    
    	// Generierte Nachrichtenzuordnungsfunktionen
    	//{{AFX_MSG(Sensor)
    	virtual void OnOK();
    	virtual void OnCancel();
    	//}}AFX_MSG
    	DECLARE_MESSAGE_MAP()
    };
    
    //{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ fügt unmittelbar vor der vorhergehenden Zeile zusätzliche Deklarationen ein.
    
    #endif // AFX_SENSOR1_H__1101A331_1D02_406C_A9C7_CA7543EB8B7F__INCLUDED_
    

    die zweite klasse soll auf daten von der ersten klasse zugreifen!



  • ich vermute du musst nen Zeiger auf die 1. Klasse in der 2. Klasse registrieren

    da ich das aber selbst noch nicht machen musste kann ich nicht garantiern das die antwort richtig ist ^^



  • afro82 schrieb:

    die zweite klasse soll auf daten von der ersten klasse zugreifen!

    Deine erste Klasse hat keine Daten. Sie hat nur Instanzvariablen (nicht statische Variablen). Wenn du auf die Daten einer Instanz deiner ersten Klasse zugreifen willst, musst du die Instanz der zweiten Klasse mit einem Zeiger oder einer Referenz auf die Instanz der ersten Klasse versorgen.



  • Schade, dass der Betreff bei sowas immer etwas anders ist... dieses Problem wurde bestimmt schon 100mal geklärt. 🙄

    Ruft der View den Dialog mit DoModal auf? Dann musst du da ansetzen.
    Was willst du denn dann machen?



  • ich kann es so machen...

    klass A hat include satz # include "kalssA.H"

    der include satz in kalss B einfügen.
    then ein variable der kalss a deklarieren.
    also

    CklassA klassaVariable;

    then ruf irgend eine funktion in der klasse A auf

    klassaVariable.einefunktion();

    aber du darfst nicht beide aufrufen sondern eine ruft die andere nur.

    wenn du möchtest dass beide klassen nutzen von einandern den funktionen.

    dann ich mache so.
    ich erstelle ein dritte klasse die verwaltet beide.



  • erstmal danke für eure hilfe

    ich habe folgendes gemacht habe eine funktion in Klasse 1 die ich in klasse zwei aufrufen will

    die funktion soll zu einen bestimmten punkt in meiner datenbank gehen das geht auch wenn ich das in der CFinalV1View aufrufe!!!
    die funktion!!!

    void CFinalV1View::OnSuchen(int m_a)
    {
    switch(m_a)
    {
    case 1:
      {
      m_pSet->MoveFirst();	// springt zu ersten Punkt in der Datenbank
       while(m_sen!= m_pSet->m_Sensor 
    	{
    	  m_pSet->MoveNext();	//geht zum nächsten datensatz
    	}
    	break;
    	}
    case 2:
    	{
    	m_pSet->MoveFirst();	// springt zu ersten Punkt in der Datenbank
    	while(m_bew!= m_pSet->m_Befehl)	
    	{
    	  m_pSet->MoveNext(); //geht zum nächsten datensatz
    	}
    	break;	
    	}
      }
    }
    

    nun möchte ich die suchen funktion unter der anderen klasse nutzen.

    void Sensor::OnSchreiben() 
    {
    
    UpdateData(true);
    CFinalV1View hallo;
    hallo.m_bew=m_bew;
    hallo.OnSuchen(2);
    UpdateData(false);
    }
    

    dabei kommte folgender feher:
    **
    error C2248: "CFinalV1View::CFinalV1View" : Kein Zugriff auf protected Element, dessen Deklaration in der Klasse "CFinalV1View" erfolgte**

    ich habe dann die CFinalV1View von protected auf public gesetzt

    class CFinalV1View : public CRecordView
    {
    protected: // Nur aus Serialisierung erzeugen
       // CFinalV1View(); habe ich hier entfernt 
        DECLARE_DYNCREATE(CFinalV1View)
    
    public:
        //{{AFX_DATA(CFinalV1View)
        CFinalV1View(); // habe ich eingefügt
        enum { IDD = IDD_FINALV1_FORM };
        CListBox    m_liste;
        CFinalV1Set* m_pSet;
        CString    m_bew;
        CString    m_sen;
        int m_counter;
    

    dann habe ich aber folgenden fehler so bald ich die funktion Onschreiber unetr der 2.Klasse aufrufe stürtzt bein programm ab

    im Debugmodus sagt er mir folgende fehler meldung!!!
    Nicht abgefangene Ausnahme in finalV1.exe (MFCD42D.DLL): 0xC0000005: Access Violation.
    den fehler mit der (MFCD42D.DLL) habe ich weg bekommen dadurch das ich statische biliotheken benutze aber der rest ist noch da

    und jetzt weiß ich wirklich nicht mehr weiter ich hoffe ihr könnt mir helfen



  • In

    void Sensor::OnSchreiben()

    wird eine ganz neue Instanz von CFinalV1View erstellt. Damit wird dann

    void CFinalV1View::OnSuchen(int m_a)

    aufgerufen. Könnte es evtl. möglich sein, dass m_pSet dann ebenfalls ganz neu ist und somit keinen gültigen Wert besitzt ?



  • ich werde so machen.

    hallo.m_bew=m_bew; // übergeben m_bew variable direkt an funktion

    hallo.OnSuchen(2 , m_bew);

    dann mußt du die OnSuchen function ändern daß sie 2 parameter annehmen kann

    der fehler Access Violation kommt ammeisten wenn was stimmt nicht mit der nafang oder ende der tablen oder was stimmt nicht mit den bearbeiteten Werte . ich denke an m_bew.



  • das könnte sein ich weiß es nicht wie kann ich das überprüfen?



  • ich werde so machen.

    hallo.m_bew=m_bew; // übergeben m_bew variable direkt an funktion

    hallo.OnSuchen(2 , m_bew);

    dann mußt du die OnSuchen function ändern daß sie 2 parameter annehmen kann

    der fehler Access Violation kommt ammeisten wenn was stimmt nicht mit der nafang oder ende der tablen oder was stimmt nicht mit den bearbeiteten Werte . ich denke an m_bew.



  • danke erstmal

    ich habe das geendert aber der fehler ist immer noch da !!!



  • schau mal ob du sätze in der tabelen hast. es darf die table nicht leer sein.



  • ja in der datenbank was drin und wenn ich die funktion unter der view klasse aufrufe geht das auch



  • die view klasse ist mit recordset verbunden dann benutzen wir
    m_pSet->MoveFirst();

    wenn du in andern klasse bist, die nicht mit crecordset ist.
    dann benutze

    andereklasse::MoveFirst();
    und nicht m_pSet->MoveFirst();

    es funktioniert immer bei mir



  • ich bekomme nicht die auswahl das ich MoveFirst() als funktion einfügen kann
    liegt vielleicht daran das die basis klasse von meinen 2.Klasse nicht vom type CRecordView ist sonder von Typ Dialog

    ich brauche aber den Type Dialog weil sonnst kann ich nicht DoModal() ausführen um mein dialog fester zu öffnen.

    kannst du mir vielleicht ein Beispiel geben?



  • mach ein neues projekt , das mit einer table in DB verbindet. ...SDI...

    im klassen ansicht eine neue klasse MFC klasse erstellen die mit zweite tbl verbunden ist.....dynaset ist wichtig
    eine funktion einfügen.

    void neueklasse::tuewas()
    {
      neueklasse::MoverFirst();
      while(!neueklasse::isEOF());
      {
       if(m_Name == "dokdok")
       {
        neueklasse::Delete();
        break;
       }
       else
       {
        neueklasse::MoveNext();
       }
      }
    }
    
    //in der viewklasse
    # include "neueklasse.h"
    
    void viewklasse::deletedokdok()
    {
      Cneueklasse neueklasseVariable;
      neueklasseVariable.tuewas();
    }
    


  • danke
    ich werde das gleich mal probieren

    wenn ich das anderes herum machen will also aus der neuenklasse auf die view müsste ja auch gehen oder ?



  • glaube ich nicht. ich denke in einer richtung nur.
    habe einmal versucht ....fehlgeschlagen.

    die best lösung.
    viewklasse ist unabhängig von der DB und füge extra 2 klassen für die 2 tbl und verwalte der prozess durch die viewklasse.

    viewklasse
    | |
    tbl_1_klasse tbl_2_klasse

    wenn du den verkeher hin und her zwischen die beiden tbl klassen möchtest dann durch viewklasse mit # include "headerklasse1.h"
    # include "headerklasse2.h"

    wenn in einer richtung dann wie ich vorher gemacht



  • danke

    ich glaube ich bin zu doof dafür das mit den zwei klassen raffe ich noch nicht
    ein beispiel wäer wieder schon nur wennes keine umstände macht


Anmelden zum Antworten