UInt
Mitglied
Hallo noch einmal, 
meine dynamischen Tabs auf CFormView funktionieren jetzt halbwegs, aber noch nicht genau so wie ich es gerne möchte.
Also, ich kann Tabs mit List Control erzeugen oder löschen während das Programm läuft. Nun möchte ich der List Control des ausgewählten Tabs ein Item hinzufügen.
Es gibt aber 2 Probleme:
Ein Bisschen Code zum Anfang:
PROBLEM 1:
Ich kann im Moment nur der List Control im letzten, neu erzeugten Tab Items hinzufügen, weil mein Pointer darauf zeigt. Wie sage ich dem Pointer, dass er auf eine andere List Control zeigen soll, wenn ich einen anderen Tab wähle?
PROBLEM 2:
Ich würde gerne die ganzen, neu erzeugten Dialoge und Tabs löschen, wenn das Programm geschlossen wird. Der Code funktioniert beim Löschen der einzelnen Tabs. Aber im Destruktor von CFormView scheitert er mit eine Fehermeldung „Debug assertion failed“, wenn ich das Programm mit geöffneten Tabs schliesse. Ich bekomme keine Fehler beim Kompilieren.
Danke im Voraus.

meine dynamischen Tabs auf CFormView funktionieren jetzt halbwegs, aber noch nicht genau so wie ich es gerne möchte.

Also, ich kann Tabs mit List Control erzeugen oder löschen während das Programm läuft. Nun möchte ich der List Control des ausgewählten Tabs ein Item hinzufügen.
Es gibt aber 2 Probleme:
Ein Bisschen Code zum Anfang:
Code:
////////////////////////////////////////////////////////
// New Tab
//static int TabIndex = 1 (es werden 2 tabs bei der Initialisierung eingefüg)
// CDialog1Dlg *pDialog1
bool CTest_8View::NewTab()
{
pDialog1 = new CDialog1Dlg;
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)pDialog1;
TabItem.pszText = (LPTSTR)(LPCTSTR)TabName;
m_TabCtrl.InsertItem(TabIndex, &TabItem);
m_TabCtrl.SetItem(TabIndex, &TabItem);
// create Dialogs
pDialog1->Create(IDD_DIALOG_1, &m_TabCtrl);
// Dialog position
CRect rcItem;
m_TabCtrl.GetItemRect(0, &rcItem);
pDialog1->SetWindowPos( NULL,
rcItem.left,
rcItem.bottom + 1,
0,
0,
SWP_NOSIZE | SWP_NOZORDER );
// show the first dialog
pDialog1->ShowWindow(SW_SHOW);
m_TabCtrl.SetCurFocus(TabIndex);
m_TabCtrl.SetCurSel(TabIndex);
return true;
}
///////////////////////////////////////////////////////////
// Neuer Tab auf Tastendruck
void CTest_8View::OnBnClickedButton1()
{
NewTab();
}
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;
}
PROBLEM 1:
Ich kann im Moment nur der List Control im letzten, neu erzeugten Tab Items hinzufügen, weil mein Pointer darauf zeigt. Wie sage ich dem Pointer, dass er auf eine andere List Control zeigen soll, wenn ich einen anderen Tab wähle?
Code:
//////////////////////////////////////////////////////////
// New Item
void CTest_8View::OnBnClickedNewitem()
{
// TODO: Add your control notification handler code here
CEnterItemDlg Dlg;
// seed the random number generator so that the
// numbers will be different every time the programm runs
srand( (unsigned)time(NULL) );
char strNumber[20];
int number1 = rand() % 999; // %999 = 3 numbers from 0 to 9
int number2 = rand() % 999;
sprintf_s(strNumber, _T("%d-%d"), number1, number2);
Dlg.m_ItemNumber = strNumber;
if(Dlg.DoModal() == IDOK)
{
LVITEM lvItem;
lvItem.mask = LVIF_TEXT;
lvItem.iItem = 0;
lvItem.iSubItem = 0;
lvItem.pszText = strNumber;
?------> pDialog1->m_List.InsertItem(&lvItem); <------- ?
//pDialog1 ist Dialog mit dem List Control
}
}
PROBLEM 2:
Ich würde gerne die ganzen, neu erzeugten Dialoge und Tabs löschen, wenn das Programm geschlossen wird. Der Code funktioniert beim Löschen der einzelnen Tabs. Aber im Destruktor von CFormView scheitert er mit eine Fehermeldung „Debug assertion failed“, wenn ich das Programm mit geöffneten Tabs schliesse. Ich bekomme keine Fehler beim Kompilieren.
Code:
/////////////////////////////////////////////////////////////////////////////////
// Destruktor
CTest_8View::~CTest_8View()
{
TCITEM item;
CWnd* pWnd;
for (int i = 0; i < TabIndex; i++)
{
m_TabCtrl.GetItem(i, &item); <------ DEBUG ASSERTION FAILED
if(item.lParam)
{
pWnd = reinterpret_cast<CWnd*> (item.lParam);
pWnd->DestroyWindow();
delete pWnd;
}
m_TabCtrl.DeleteItem(i);
}
}
/////////////////////////////////////////////////////////
// delete Tab
void CTest_8View::OnBnClickedButton2()
{
// TODO: Add your control notification handler code here
TCITEM item;
CWnd* pWnd;
item.mask = TCIF_PARAM;
int iSelTab = m_TabCtrl.GetCurSel();
m_TabCtrl.GetItem(iSelTab, &item);
if(item.lParam)
{
pWnd = reinterpret_cast<CWnd*> (item.lParam);
if(!pWnd->DestroyWindow())
MessageBox("Freigeben des Tabsheets 1 fehlgeschlagen");
delete pWnd;
}
m_TabCtrl.DeleteItem(iSelTab);
// neuen Tab anzeigen
if (iSelTab == TabIndex)
{
m_TabCtrl.SetCurFocus(iSelTab--);
m_TabCtrl.SetCurSel(iSelTab);
m_TabCtrl.GetItem(iSelTab, &item);
if(item.lParam)
{
pWnd = reinterpret_cast<CWnd*> (item.lParam);
pWnd->ShowWindow(SW_SHOW);
}
TabIndex--;
return;
}
m_TabCtrl.SetCurFocus(iSelTab);
m_TabCtrl.SetCurSel(iSelTab);
m_TabCtrl.GetItem(iSelTab, &item);
if(item.lParam)
{
pWnd = reinterpret_cast<CWnd*> (item.lParam);
pWnd->ShowWindow(SW_SHOW);
}
TabIndex--;
}
Danke im Voraus.