Tabs, Dialoge und wie bekomme ich Zugriff auf die Werte der Dialoge

Indian

Erfahrenes Mitglied
Hi

Ich habe eine Klasse CMyTabCtrl welche von CTabCtrl abgeleitet ist und die dazugehörigen Dialog, beim click auf dem Tab, ladet. Das funktioniert wunderbar.

Mein Problem ist das ich kein Zugriff auf die Werte der geladenen Dialog bekomme. Obwohl zu jedem Dialog eine Klasse erstellt ist. Ich möchte zum Beispiel von einem Edit Feld einfach denn eingegebenen String holen, der ist jedoch immer leer. So bin ich vorgegangen

Hauptdialog Headerdatei: Erstelle Objekt von abgleitete Klasse
Code:
...
CMyTabCtrl m_IDCTabConfig;
...

Hauptdialog cpp Datei: Erstelle Tabs und Initialisiere die Dialoge zu den Tabs. Siehe Unten abgeleitete Klasse
Code:
BOOL CConfigDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

        m_IDCTabConfig.InsertItem(0,_T("Pfade"));
        m_IDCTabConfig.Init();

	return TRUE;  // return TRUE unless you set the focus to a control
}

Inder folgenden Funktion versuche ich auf ein Editfeld zuzugreifen.Ich erstelle eine neues Objekt von dem TabDialog und versuche darüber auf denn String im Editfeld zuzugreifen. Ist jedoch immer leer
Code:
void CConfigDlg::OnBnClickedButtonSaveToIni()
{
	CString path;
	CConfigTabPath TabPath;  //Dialog welcher angezeigt wird wenn auf denn Tab geklickt wird
	TabPath.GetDlgItemText(IDC_EDIT_PICTURE_PATH,path);
}


Wie kann ich auch denn String vom Steuerelement zugreifen ?

Abgeleitet MyTabCtrl Klasse falls ihr sie braucht um zu verstehen was ich gemacht hab
Code:
CMyTabCtrl::CMyTabCtrl()
{
	//dont forget to increase array index x of m_TabPage[x] in header file
	m_TabPage[0] = new CConfigTabPath;

    m_PageNumber = 1;
}


CMyTabCtrl::~CMyTabCtrl()
{
	for(int i=0; i < m_PageNumber; i++)
    {
		delete m_TabPage[i];
    }//end for
}


BEGIN_MESSAGE_MAP(CMyTabCtrl, CTabCtrl)
	ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()


// CMyTabCtrl-Meldungshandler
void CMyTabCtrl::Init()
{
	m_CurrentPage=0;

	//init dialog to tab
        m_TabPage[0]->Create(IDD_CONFIG_TAB_PATH, this);

	//show first tab, hide the rest
    m_TabPage[0]->ShowWindow(SW_SHOW);

    SetRec();
}

void CMyTabCtrl::SetRec()
{
    CRect tabRec, itemRec;
    int nX, nY, nXz, nYz;

    GetClientRect(&tabRec);
    GetItemRect(0, &itemRec);

    nX=itemRec.left;
    nY=itemRec.bottom+1;
    nXz=tabRec.right-itemRec.left-1;
    nYz=tabRec.bottom-nY-1;

    m_TabPage[0]->SetWindowPos(&wndTop, nX, nY, nXz, nYz, SWP_SHOWWINDOW);

    for(int i=1; i < m_PageNumber; i++)
    {
		m_TabPage[i]->SetWindowPos(&wndTop, nX, nY, nXz, nYz, SWP_HIDEWINDOW);
    }//end for
}


void CMyTabCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
	CTabCtrl::OnLButtonDown(nFlags, point);

	if(m_CurrentPage != GetCurFocus())
    {
		m_TabPage[m_CurrentPage]->ShowWindow(SW_HIDE);
        m_CurrentPage=GetCurFocus();
        m_TabPage[m_CurrentPage]->ShowWindow(SW_SHOW);
        m_TabPage[m_CurrentPage]->SetFocus();
    }//end if
}
 
Zuletzt bearbeitet:
Du sagst es doch schon:

Du erzeugst eine neue Instanz der Klasse. Die hat überhaupt nix mit dem eingesetzten Dialog in der TabControl zu tun.
Du musst die Edit in dem TabControl-Member m_TabPage[0] (da hast du den Dialog ja eingesetzt) benutzen. Wenn m_TabPage[0] nur vom Typ CDialog* ist, dann musst du da auf deinen CConfigTabPath casten:


( (CConfigTabPath*)m_IDCTabConfig.m_TabPage[0] )->GetDlgItemText(IDC_EDIT_PICTURE_PATH,path);
 
vielen dank , ich wusste das das der Fehler war jedoch wusste ich nicht wie ich es anderst machen soll

so Kleinigkeiten fehlen mir halt. Das mit cast war es

Danke dir vielmals. Funktioniert.
 
achja noch ne frage..

Ist es möglich auf die Funktionen bzw. Variablen des Dialoges zuzugreifen ?
Geht das genauso ?
 
Geht genauso, das GetDlgItemText wird ja bereits als Member des Dialogs verwendet.
 
Zurück