Erstellen eines Programms mit Registerkarten

caiuscäsar

Grünschnabel
Hallo zusammen,

bin wegen einer Uni-Arbeit neu in Visual Studio eingestiegen. Das geplante Programm soll aus mehreren Registerkarten bestehen, in denen Daten eingegeben werden sollen, und am Ende über einen Button die Daten in eine Datei schreiben.

Meine erste Frage:
Ich habe auf einem Dialogfenster das Steuerelement "Registerkarte" plaziert. Wie kann ich die Anzahl der Register festlegen, diese benennen und Objekte in die Register einfügen?

Ich habe schon die Möglichkeit im Forum gesehen, jede Registerkarte als eigenen Dialog zu erstellen. Das hat auch weitgehend funktioniert. Ich habe dann allerdings das Problem der Übergabe der Variablen an das "Endregister", in dem ich dann die Datren in eine Datei packen will. Gibt es da eine Möglichkeit über "globale" Variablen zu gehen?

Vielen Dank schon mal für Eure Tipps!
PS: Ruhig sehr detailierte Angaben machen, da ich noch nicht allzu fit in Visual Studio bin:rolleyes:
 
Hallo,

wenn ich dein Posting richtig interpretiere, nutzt du Visual Basic. Dann bist du hier im falschen Forum, hier geht es um C++. Oder was bedeutet der Link bei dir unter Visual Studio?

Mfg

langer
 
Hi,

na, dann sollten sich die Macher dieser Seite darum kümmern, denn bei einem vorherigen Posting eines anderen Kollegen trat dasselbe auf.
Aber zu deinem Problem:
das Steuerelement Registerkarte kenne ich gar nicht. Meinst du vielleicht das Tab-Control? Dann kann ich leider nicht weiterhelfen. Ich verwende in solchen Fällen nur PropertySheet/PropertyPage - was wesentlich flexibler ist.

Mfg

langer
 
Die Eindeutschung sollte bei den Styles und Controls aufhören, da gibt es immer Verwirrung.

Die Registerkarte ist das Tab-Control. Das kann man erst mit .NET vernünftig editieren. Bei C++/MFC muss da Handarbeit über Einzeldialoge dran. Die PropertySheet/PropertyPage vereinfacht das zwar etwas, ist aber nicht ganz dasselbe (die ist ein Dialog mit einem Tab-Control drauf und den Übernehmen,OK,Abbrechen Buttons drunter).

Du kannst die Tab-übergreifenden Variablen in deinem Dialog speichern. Damit du dann drauf zugreifen kannst, kannst du dir von dem Tab-Dialog über zweimal Parent (einmal Parent->Tab-Control, zweimal Parent->Dialog mit Tab-Control drauf) einen Pointer auf den Dialog selbst holen. Den castest du da noch auf deinen speziellen Dialogtyp und fertig:

// innerhalb eines Sub-Dialoges, der als Child in die Tab-Page eingesetzt wird.
CMeinDialog* pDialog = (CMeinDialog*)GetParent()->GetParent();
pDialog->m_VariableA = ...
 
Hier habe ich das ganze am Beispiel eines Dialoges:

So fügst Du Seiten zum TabCtrl hinzu (z.B. im InitDialog):
Code:
m_tabMyTab.InsertItem(0, "Seite 1");
m_tabMyTab.InsertItem(1, "Seite 2");
m_tabMyTab.InsertItem(2, "Seite 3");
m_tabMyTab.InsertItem(3, "Seite 4");
Dann mußt Du noch die Selchange-Nachrichten abfangen (in der MessageMap):
Code:
ON_NOTIFY(TCN_SELCHANGE, IDC_TAB_MY_TAB, OnTcnSelchangeTabDlgAppconfig)
ON_NOTIFY(TCN_SELCHANGING, IDC_TAB_MY_TAB, OnTcnSelchangingTabDlgAppconfig)

Das ist die Data-Excange-Funktion, in der Du die CTabCtrl-Variable mit der ID des Tab-Controls verknüpfst:
Code:
void CDlgMyDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_TAB_MY_TAB, m_tabMyTab);
}
Dann mußt Du natürlich diese Messagehandler schreiben:
Code:
void CDlgMyDlg::OnTcnSelchangeTabMyTab(NMHDR *pNMHDR, LRESULT *pResult)
{
    int iSel = m_tabConfig.GetCurSel();
    switch(iSel)
    {
    case 0:
        m_PropPage1.ShowWindow(SW_SHOW);
        break;
    case 1:
        m_PropPage2.ShowWindow(SW_SHOW);
        break;
    case 2:
        m_PropPage3.ShowWindow(SW_SHOW);
        break;
    case 3:
        m_PropPage4.ShowWindow(SW_SHOW);
        break;
    default:
        break;
    }
    *pResult = 0;
}
 
void CDlgMyDlg::OnTcnSelchangingTabMyTab(NMHDR *pNMHDR, LRESULT *pResult)
{
    int iSel = m_tabConfig.GetCurSel();
    *pResult = 0;
    switch(iSel)
    {
    case 0:
        m_PropPage1.ShowWindow(SW_HIDE);
        break;
    case 1:
        m_PropPage2.ShowWindow(SW_HIDE);
        break;
    case 2:
        m_PropPage3.ShowWindow(SW_HIDE);
        break;
    case 3:
        m_PropPage4.ShowWindow(SW_HIDE);
        break;
    default:
        break;
    }
}

Die entsprechenden PropertyPages mußt Du natürlich auch erzeugen (habe ich hier im OnCreate gemacht)
Code:
int CDlgAppConfig::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
    return -1;
if(!m_PropPage1.Create(IDD_PROPPAGE_1, this))
    return -1;
if(!m_PropPage2.Create(IDD_PROPPAGE_2, this))
    return -1;
if(!m_PropPage3.Create(IDD_PROPPAGE_3, this))
    return -1;
if(!m_PropPage4.Create(IDD_PROPPAGE_4, this))
    return -1;
return 0;
}


Die Klassendefinition sieht dann etwa so aus:
Code:
class CDlgMyDlg : public CDialog
{
    DECLARE_DYNAMIC(CDlgAppConfig)
public:
    CDlgMyDlg(CWnd* pParent = NULL);
    virtual ~CDlgMyDlg();
 
// Dialogfelddaten
    enum { IDD = IDD_DIALOG_MY_DIALOG };
protected:
    virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung
 
    CPropPage1 m_PropPage1;
    CPropPage2 m_PropPage2;
    CPropPage3 m_PropPage3;
    CPropPage4 m_PropPage4;
 
DECLARE_MESSAGE_MAP()
public:
    virtual BOOL OnInitDialog();
    CTabCtrl m_tabMyTab;
    afx_msg void OnTcnSelchangeTabMyTab(NMHDR *pNMHDR, LRESULT *pResult);
    afx_msg void OnTcnSelchangingTabMyTab(NMHDR *pNMHDR, LRESULT     *pResult);
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
};
 
Ganz einfach rechts bei den Steuerelementen haste tabControl das wählst du aus und zieht auf deinem Form einfach eins so gross wie du willst.Dann ist an dem ausgewählten TabControl ganz rechts oben in der ecke ein ganz kleines Symbol da klickste drauf da kannste dann die Tabpages erstellen.
 
Ganz einfach rechts bei den Steuerelementen haste tabControl das wählst du aus und zieht auf deinem Form einfach eins so gross wie du willst.Dann ist an dem ausgewählten TabControl ganz rechts oben in der ecke ein ganz kleines Symbol da klickste drauf da kannste dann die Tabpages erstellen.
Aber nicht im Visual C++ 6 oder Visual C++ .NET 2003.
 
Warum nutzt du nicht MS Visual Studio 2005? Du arbeitest doch für die Uni. Wahrscheinlich ist deine Uni bei der E-Acadamy. Da kriegst du die Vollversion von VS 2005 und nicht nur die Express, welche eh frei ist soweit ich weiß.

Somit wärst du schonmal up-to date was deine Entwicklungsumgebung angeht. Und dir kann, so vermute ich, schneller geholfen werden.

Zu TabCtrl gibt es ebenfalls vieles zum Thema Tabs. Einfach mal da reinschauen. Kostet zwar erst etwas Mühe und Überwindung lohtn sich aber auf jedenfall.

Gruß
DonCube
 

Neue Beiträge

Zurück