Warum klappt der Zugriff auf die Variable nicht
-
Habe 2 Klasse: AbiplanerDlg und DlgTab1
in Abiplaner befindet sich die Variable m_cltTreeCtrlJetzt 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 folgendesCDlgTab1 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) aufDer 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.htmlWenn 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;