Auweia: Memberzugriff mit Zeiger



  • Hi,

    ich denke ich stehe neben mir und habe heute den größten Bockmist des Jahrhunderts programmiert.

    Da ich mich noch in der MFC C++ Rookie-Phase befinde, frage ich mal nach!!!

    Also ich baue eine Dialogbasierte Anwendung d.h. Ableitung von CWinApp und CDialog.

    class CXXLDlg : public CDialog
    

    habe ic eine Membervariable um diese öffentlich bekannt zu machen und so auf z.B. eine Listbox auch in
    Events zuzugreifen, also z.B. in

    void CXXLDlg::OnSelchangeList1()
    

    und deshalb (und jetzt kommt's) in

    BOOL CXXLDlg::OnInitDialog()
    

    folgendes gemacht!!!

    CListBox* pCListBox = (CListBox*) GetDlgItem(IDC_LIST1);	;
        pCListBox=&m_ListOfficeProg;
    

    mich schaudert's, aber ich kann's nicht besser. Darum will ich mal fragen wie's besser geht!

    Gruß
    Franky



  • Das ist in der Tat etwas unerklärlich was du da machst. Wie hast du denn die Membervariable angelegt?
    Einfach so einen Member vom Typ CListBox anzulegen bringt dich nicht weiter, da diese nicht mit dem Steuerelement verknüpft ist. Wenn du deinen Dialog im Ressourceneditor entworfen hast, dann kannst du da mit einem Rechtsklick auf das entsprechenende Element dann im erscheinenden Kontexmenü über den Eintrag "Variable hinzufügen" eine Membervariable erstellen, die dann schon mit dem Dialogelement verknüpft ist. Dann greifst du in der entsprechenden Klasse einfach über den Punktoperator (ich glaube der heißt so) zu. Das ist ja der Sinn einer Membervariablen.
    Oder du machst das mit dem Zeiger:

    CListBox* pCListBox = (CListBox*) GetDlgItem(IDC_LIST1); //reicht zum initialisieren
    pListBox->...      //so erfolgt dann der Zugriff
    


  • Hi,

    ich hatte eine Membervariable angelegt, diese ist vom Typ CString.
    Ich möchte aber ein Variable mit der ich auf die Klasse CListbox zugreife, z.B.
    in den Ereignissen. So habe ich dann vollen Zugriff auf die Listbox.

    Ich weiß das man Zeiger auf Klassen setzten kann, aber ich bin mir nicht sicher,
    ob ich damit hier richtig liege. Da ich die Klassevariable ja "global" anlege und dann intialisiere dachte ich mir könnte ich einen Zeiger setzen.

    Angelegt habe ich die Membervariable so (Header Datei):

    /////////////////////////////////////////////////////////////////////////////
    // CXXXDlg Dialogfeld
    
    class CXXXDlg : public CDialog
    {
    // Konstruktion
    public:
    	CXXXDlg(CWnd* pParent = NULL);	// Standard-Konstruktor
    
    // Dialogfelddaten
    	//{{AFX_DATA(CLauncherDlg)
    	enum { IDD = IDD_LAUNCHER_DIALOG };
    	[b]CListBox	m_ListOfficeProg;[/b]
    	//}}AFX_DATA
    
    	// Vom Klassenassistenten generierte Überladungen virtueller Funktionen
    	//{{AFX_VIRTUAL(CLauncherDlg)
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV-Unterstützung
    	//}}AFX_VIRTUAL
    
    // Implementierung
    protected:
    	HICON m_hIcon;
    
    	// Generierte Message-Map-Funktionen
    	//{{AFX_MSG(CLauncherDlg)
    	virtual BOOL OnInitDialog();
    /*	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);*/
    	afx_msg void OnPaint();
    	afx_msg HCURSOR OnQueryDragIcon();
    	afx_msg void OnSelchangeList1();
    	//}}AFX_MSG
    	DECLARE_MESSAGE_MAP()
    };
    

    initalisiert wird sie dann

    BOOL CXXXDlg::OnInitDialog()
    {
      .....
    
      // ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
    
    	[b]CListBox* pCListBox = (CListBox*) GetDlgItem(IDC_LIST1);
            pCListBox=&m_ListOfficeProg;[/b]
    
     ....
    }
    

    und dann z.B. Zugriff...

    void CXXXDlg::OnSelchangeList1() 
    {
    	int j;
    	CString strText;
    
            [b]
    	j= m_ListOfficeProg.GetCurSel();
    	m_ListOfficeProg.GetText(j,strText);
    	AfxMessageBox(strText);[/b]
    
    }
    

    aber ich weiß nicht....🙄

    Gruß
    Franky



  • CListBox* pCListBox = (CListBox*) GetDlgItem(IDC_LIST1); 
    pCListBox=&m_ListOfficeProg;
    

    Das ist überflüssig. Das macht man nur, wenn man keine Membervariable anlegt und lokal z.B. im InitDialog auf die Liste zugreifen will:

    CListBox* pCListBox = (CListBox*) GetDlgItem(IDC_LIST1);
    pCListBox->Add(..);
    pCListBox->SetCurSel(...);
    pCListBox->GetText(...);
    

    Du arbeitest doch mit m_ListOfficeProg, also nutze einfach deine Membervariable:

    //z.B.
    m_ListOfficeProg.Add(..);
    m_ListOfficeProg.SetCurSel(...);
    m_ListOfficeProg.GetText(...);
    //etc.
    

    Noch ein Nachtrag:
    Die Membervariable muss natürlich über das Studio angelegt werden bzw. du musst den entsprechenden Eintrag in den entsprechenden DoDataExchange nachtragen:

    void CXXDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	//{{AFX_DATA_MAP(CXXDlg)
    	DDX_Control(pDX, IDC_LIST1, m_ListOfficeProg);
    	//}}AFX_DATA_MAP
    }
    


  • Hi,

    Ich habe eine Membervariable angelegt! Dann habe ich alle überflüssigen Code-Teile des Assistenten rausgeschmissen. Dann lief was nich und ich habe danach die Fehler gefixt und irgendwie dachte ich mir ich müsste dann die CListbox Membervariable per Hand auf so krude Weise einfügen....

    Ja ich habe den Teil des Codes überprüft, den "Tester2" als Nachtrag angegeben hat und schwupps da ist meine Membervariable.

    Vielen Dank an alle!!!!!

    Gruß
    Franky


Anmelden zum Antworten