tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
2
ZUGRIFFE
964
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von UInt
    UInt UInt ist offline Mitglied
    Registriert seit
    Jul 2007
    Ort
    Litauen / Bayern
    Beiträge
    22
    Hallo,

    ich habe ein Tab-Control mit 2 Tabs auf dem von CFormView abgeleiten View bei der Initialisierung erzeugt. Es wäre aber gut danach bei Bedarf noch zusätzliche Tabs per Knopfdruck einfügen zu können. Wie mache ich das?

    Ich habe versucht die neuen Tabs genau so wie bei der Initialisierung einzufügen, aber ich habe es nur geschafft leere Tabs einzufügen. Wenn ich mit .create einen Dialog an den neuen Tab anbinden will, bekomme ich keine Fehler beim kompilieren, dafür aber eine Meldung „Debug Assertion Failed“ (siehe angehängtes Bild), wenn ich einen neuen Tab mit dem Inhalt einfügen will (drucke die Taste "Tab einfügen").

    Fehler:
    Wincore.cpp
    Line 624
    ASSERT(pWnd->m_hWnd==NULL) //only do once

    Ich nehme an, dass .create nur bei Initialisierung gut ist, aber was für ein Befehl benutze ich stattdessen?

    Nun zum Code, den ich dank eurem Forum zusammengestellt habe:

    .cpp
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    
    //////////////////////////////////////////////////////////////////////////////////////////////////
    // Tabs bei Initialisierung
     
    void CTest_8View::OnInitialUpdate()
    {
        TCITEM TabItem;
        int iIndex;
     
        CFormView::OnInitialUpdate();
     
        GetParentFrame()->RecalcLayout();
        ResizeParentToFit();
        
        
        // create the Tabs
        CString TabName = "Seite 1";
        iIndex = 0;
        TabItem.mask    = TCIF_TEXT | TCIF_PARAM;
        TabItem.lParam  = (LPARAM)&m_PropPage1;
        TabItem.pszText = (LPTSTR)(LPCTSTR)TabName;
        m_TabCtrl.InsertItem(iIndex, &TabItem);
        m_TabCtrl.SetItem(iIndex, &TabItem);
        
        TabName = "Seite 2";
        iIndex = 1;
        TabItem.mask    = TCIF_TEXT | TCIF_PARAM;
        TabItem.lParam  = (LPARAM)&m_PropPage2;
        TabItem.pszText = (LPTSTR)(LPCTSTR)TabName;
        m_TabCtrl.InsertItem(iIndex, &TabItem);
        m_TabCtrl.SetItem(iIndex, &TabItem);
     
        // create Dialogs
        m_PropPage1.Create(IDD_PROPPAGE_1, &m_TabCtrl);
        m_PropPage2.Create(IDD_PROPPAGE_2, &m_TabCtrl);
        
        
        // Dialog position
        CRect rcItem;
        m_TabCtrl.GetItemRect(0, &rcItem);
        m_PropPage1.SetWindowPos( NULL,
                           rcItem.left,
                           rcItem.bottom + 1,
                           0,
                           0,
                           SWP_NOSIZE | SWP_NOZORDER );
        
        
        m_PropPage2.SetWindowPos( NULL,
                           rcItem.left,
                           rcItem.bottom + 1,
                           0,
                           0,
                           SWP_NOSIZE | SWP_NOZORDER );
     
        // show the first dialog
        m_PropPage1.ShowWindow(SW_SHOW);
        m_PropPage2.ShowWindow(SW_HIDE);
        
        m_TabCtrl.SetCurSel(0);
     
    }
     
    void CTest_8View::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)
    {
        TCITEM  item;
        CWnd*   pWnd;
        int     iNewTab = m_TabCtrl.GetCurSel();
     
        item.mask = TCIF_PARAM;
     
        // aktuellen Tab ausblenden
        m_TabCtrl.GetItem(m_uiSelectedTab, &item);
        if( item.lParam )
        {
            pWnd = reinterpret_cast<CWnd*> (item.lParam);
            pWnd->ShowWindow(SW_HIDE);
        }
     
        // neuen Tab anzeigen
        m_TabCtrl.GetItem(iNewTab, &item);
        if(item.lParam)
        {
            pWnd = reinterpret_cast<CWnd*> (item.lParam);
            pWnd->ShowWindow(SW_SHOW);
        }
     
        *pResult = 0;
    }
     
    void CTest_8View::OnTcnSelchangingTab1(NMHDR *pNMHDR, LRESULT *pResult)
    {
        m_uiSelectedTab = m_TabCtrl.GetCurSel();
        *pResult = 0;
     
    }
     
    /////////////////////////////////////////////////////////////////////////////////////////////////////
    // Insert neue Tabs
    // Mit leeren Tabs scheint zu funktionieren
     
    static int TabIndex = 1;
     
    bool CTest_8View::NewTab()
    {
        TCITEM TabItem;
        TabIndex++;
        
        // create the Tabs
        CString s;
        s.Format(_T("Neuer Tab %d"), TabIndex+1);
        CString TabName = s;
        TabItem.mask    = TCIF_TEXT; // | TCIF_PARAM;
        //TabItem.lParam  = (LPARAM)&m_Dialog3;
        TabItem.pszText = (LPTSTR)(LPCTSTR)TabName;
        m_TabCtrl.InsertItem(TabIndex, &TabItem);
        m_TabCtrl.SetItem(TabIndex, &TabItem);
        
     
        // create Dialogs
        //m_Dialog3.Create(IDD_DIALOG_3, &m_TabCtrl);------> ASSERT FAILED
     
        
        
        // Dialog position
        
    /*
        CRect rcItem;           ------> ASSERT FAILED
        m_TabCtrl.GetItemRect(TabIndex, &rcItem);
        m_Dialog3.SetWindowPos( NULL,
                           rcItem.left,
                           rcItem.bottom + 1,
                           0,
                           0,
                           SWP_NOSIZE | SWP_NOZORDER );
     */  
        // show the first dialog        
        //m_Dialog3.ShowWindow(SW_SHOW);------> ASSERT FAILED
        
        m_TabCtrl.SetCurFocus(TabIndex);
        m_TabCtrl.SetCurSel(TabIndex);
        
        return true;
    }
     
    void CTest_8View::OnBnClickedButton1()
    {
        NewTab();
    }

    Helft mir bitte, ich komme nicht weiter.
    Miniaturansicht angehängter Grafiken Miniaturansicht angehängter Grafiken Neuen Tab einfügen-fehler.jpg  
     

    MFG
    UInt

  2. #2
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    Hmm, kann das sein, dass die Routine zweimal aufgerufen wird? Das ASSERT prüft nämlich, ob m_Dialog3 bereits ein HWND zugewiesen hat.

    Setz mal einen Break-Point (oder Debug To Cursor) auf m_Dialog3.Create, und sieh da vor dem Aufruf nach, ob da das HWND schon gesetzt ist. Wenn ja, muß es irgendwo vorher schon einen Aufruf von Create geben. Evtl. hast du da einen Constructor aufgerufen?
     

  3. #3
    Avatar von UInt
    UInt UInt ist offline Mitglied
    Registriert seit
    Jul 2007
    Ort
    Litauen / Bayern
    Beiträge
    22
    Hey Endurion,
    du hast Recht. Dialog3 habe ich schon vorher für einen anderen Tab-Control benutzt.
    Ich habe einfach einen neuen Dialog für die neuen Tabs gemacht und, um mehrere Tabs mit demselben Dialog offnen zu können, habe ich einen Pointer auf Dialog gemacht.

    Danke schön, du hast mir viel geholfen.
     

    MFG
    UInt

Ähnliche Themen

  1. Array - Neuen Key einfügen
    Von Sasser im Forum PHP
    Antworten: 7
    Letzter Beitrag: 23.09.10, 12:16
  2. Dune 2 neuen Befehl einfügen
    Von sight011 im Forum Coders Talk
    Antworten: 9
    Letzter Beitrag: 29.04.08, 00:04
  3. Neuen Tab einfügen 2
    Von UInt im Forum VisualStudio & MFC
    Antworten: 7
    Letzter Beitrag: 30.07.07, 10:31
  4. Neuen Datensatz einfügen
    Von Jerinca im Forum ASP
    Antworten: 2
    Letzter Beitrag: 25.10.04, 13:28
  5. Antworten: 10
    Letzter Beitrag: 03.06.04, 22:58