Warum klappt der Zugriff auf die Variable nicht



  • Habe 2 Klasse: AbiplanerDlg und DlgTab1
    in Abiplaner befindet sich die Variable m_cltTreeCtrl

    Jetzt würde ich gerne das selktierte Item in DlgTab1 laden:

    CAbiplanerDlg var; 
    var.m_ctlTreeCtrl.GetSelectedItem();
    

    Leider bekomm ich eine zugriffsverletzung und weis nicht wieso...



  • ist m_ctlTreeCtrl denn public?

    wenn ja dann poste mal die klasse CAbiplanerDlg. vielleicht kann dann jemand helfen



  • Ja ist sie....
    Hier die Klasse:

    // AbiplanerDlg.h : Headerdatei
    //
    
    #pragma once
    #include "afxcmn.h"
    #include "DynTabCtrl.h"
    #include "CAutoCompleteEdit.h"
    #include "afxwin.h"
    
    // CAbiplanerDlg Dialogfeld
    class CAbiplanerDlg : public CDialog
    {
    // Konstruktion
    public:
    	CAbiplanerDlg(CWnd* pParent = NULL);	// Standardkonstruktor
    
    // Dialogfelddaten
    	enum { IDD = IDD_ABIPLANER_DIALOG };
    
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV-Unterstützung
    
    // Implementierung
    protected:
    	HICON m_hIcon;
    
    	// Generierte Funktionen für die Meldungstabellen
    	virtual BOOL OnInitDialog();
    	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    	afx_msg void OnPaint();
    	afx_msg HCURSOR OnQueryDragIcon();
    	DECLARE_MESSAGE_MAP()
    
    private:
    	DynTabCtrl m_ctlTabCtrl;
    	CString m_strEditSearch;
    	CAutoCompleteEdit m_ctlEditSearch;
    
    public:
    	void LoadDBAutoCmp();
    	CButton m_ctlCheckCase;
    	afx_msg void OnBnClickedButtonSearch();
    	afx_msg void OnBnClickedCheck1();
    	afx_msg void OnTvnSelchangedTree1(NMHDR *pNMHDR, LRESULT *pResult);
    	afx_msg void OnBnClickedButton1();
    	CTreeCtrl m_ctlTreeCtrl;
    
    	CString str, szParent;
    };
    


  • // edit: hab mich verlesen. das nachfolgende ist falsch.

    private:
        DynTabCtrl m_ctlTabCtrl;
    

    m_ctlTabCtrl ist private nicht public...ändere das in

    public:
        DynTabCtrl m_ctlTabCtrl;
    


  • Gut hab ich gemacht... Das ändert aber leider nichts. Mit dem oben gezeigten Zuigriffsversuch klappts leider immer noch nicht.



  • tut mir leid hab mich verlesen. m_ctlTabCtrl und m_ctlTreeCtrl sieht sehr änlich aus.



  • Ich hab es mal folgendermaßen Versuch (Hat letztes mal auch geklappt) , jedoch gibt es auch hier eine Zugriffsverletzung.
    In der AbiplanerDlg mache ich beim selektieren eines Items folgendes

    CDlgTab1 vari;
    	vari.m_TreeCtrl = &m_ctlTreeCtrl;
    

    Anschließend versuche ich z.B. so darauf zuzugreifen:

    m_TreeCtrl->GetRootItem();
    

    Wieso geht das denn nicht!? Ich habs bei einem anderen Projekt auch so hinbekommen...



  • Hallo,

    hast du diese Zeilen:

    CAbiplanerDlg var; 
    var.m_ctlTreeCtrl.GetSelectedItem();
    

    exakt so direkt hintereinander im Quelltext stehen? Wenn ja, das kann nicht funktionieren, denn wenn ein Dialog noch nicht aufgerufen wurde, existieren noch keinerlei Fenster, und jeder Zugriff auf solche Elemente muß fehlschlagen (wie kann ein Item ausgewählt sein, wenn der Dialog noch nicht einmal angezeigt ist?). Hilfreich sind auch immer die exakten Fehlermeldungen, außerdem hilft der (Einzelschritt-) Debug-Modus vor der kritischen Stelle.

    MfG



  • Ich habe es exakt so im quelltext stehen, da es eigentlich nur ein einziger hauptdialog ist, in sofort bei programmstart in einem TabCtrl ein ListCtrl angezeigt wird. Also sollte alles doch schon existieren, oder!?
    Vielleicht hilf das hier zum genaueren Verständniss: http://www.c-plusplus.net/forum/viewtopic-var-t-is-102424.html



  • ok, dann liegt vielleicht ein Verständnisproblem (sowohl von deiner als auch von meiner Seite) vor. Mit dieser Zeile:

    CAbiplanerDlg var;
    

    erstellst du einen völlig neuen Dialog, der mit bereits angezeigten überhaupt nichts zu tun hat, jetzt schreibst du aber:

    DarkAzReaL schrieb:

    in sofort bei programmstart in einem TabCtrl ein ListCtrl angezeigt wird.

    also der Dialog wird schon angezeigt 😕 ? Auch habe ich den Satz nicht ganz verstanden (Dialog wird in einem TabCtrl angezeigt?), ich nehme an, du meintest, der Dialog enthält ein TabCtrl mit ListCtrl. Also, wird der Dialog schon angezeigt? Ist es ein CAbiplanerDlg? Wenn ja, dann die Frage, warum versuchst du, einen neuen CAbiplanerDlg-Dialog anzuzeigen? Oder handelt es sich um einen CDlgTab1-Dialog, oben hast du diese Klasse erwähnt, aber nur die CAbiplanerDlg-Klasse angegeben, und deine anfängliche Frage war:

    DarkAzReaL schrieb:

    Jetzt würde ich gerne das selktierte Item in DlgTab1 laden:

    CAbiplanerDlg var; 
    var.m_ctlTreeCtrl.GetSelectedItem()
    

    Also ich blicke noch nicht durch, was du genau erreichen willst.

    Habe gerade nach der Vorschau-Funktion für meine Antwort entdeckt, daß du noch einen Hinweis auf einen andere Frage von dir mit dem gleichen Thema gegeben hast. Dann fasse ich das eigentliche Problem so auf:

    Wie transportiert man Daten von einem Dialog in einen anderen? (Richtig?)

    Sehr einfach ist es, wenn man eine Member-Variable im "Ziel-Dialog" anlegt, und diese vor der Anzeige übergibt:

    CDlgTab1 dt;
    dt.m_strText = "zu uebergebender Text"; // m_strText ist CString-Member von CDlgTab1
    
    int ret = dt.DoModal();
    

    In OnInitDialog der Klasse CDlgTab1 wird dann der Eintrag in das ListCtrl mit dem Wert der Member-Variable m_strText, auf die man jetzt einfach zugreifen kann, getätigt.

    MfG

    MfG



  • Zum besseren Verständniss:
    - Ich habe einen Hauptdialog
    - Dort befindet sich ein TabCtrl und eine TreeCtrl
    - Um mit den einzelnen Tabs arbeiten zu können, wird in diese jeweils ein neuer Dlg gelaneb (DlgTab1)
    - Wenn ich jetzt mit der ListCtrl vom DlgTab1 aus arbeiten will tritt mein Fehler (Speicherverletzung) auf

    Der Tab bzw. dessen Dlg wird wie folgt eingefügt/erstellt:

    m_ctlTabCtrl.InsertItem(new CDlgTab1(), "Aufgabenfeld I", IDD_DIALOG_AF1);
    


  • DarkAzReaL schrieb:

    Ich habe es exakt so im quelltext stehen, da es eigentlich nur ein einziger hauptdialog ist, in sofort bei programmstart in einem TabCtrl ein ListCtrl angezeigt wird. Also sollte alles doch schon existieren, oder!?
    Vielleicht hilf das hier zum genaueren Verständniss: http://www.c-plusplus.net/forum/viewtopic-var-t-is-102424.html

    Wenn du

    CAbiplanerDlg var;
    var.m_ctlTreeCtrl.GetSelectedItem();
    

    machst, kann es nicht funktionieren. dein m_ctlTreeCtrl existiert zwar in einem CAbiplanerDlg, aber nicht in var. Beziehungsweise noch nciht.

    Wo in deinem Programm machst du denn den Zugriff auf TreeCtrl?



  • Der Zugriff soll über DlgTab1 erfolgen. Deshalb dachte ich ich übergem diesem Dlg grad die Adresse der Membervariable m_ctlTreeCtrl und greife dann darauf zu.

    Übergabe im AbiplanerDlg:

    CDlgTab1 vari;
    	vari.m_TreeCtrl = &m_ctlTreeCtrl;
    

Anmelden zum Antworten