Arrummzen
asked on
MFC- Tab Control - Problem implementing dynamic tabs.
I want to be able to add tabs dyanmicly to the tab control during program operation, I will not know witch tabs or in what order they will need to be added.
I tried solving this problem by assigning an index to each tab so I could add and remove them by useing there index however If I have tabs 1,2 and 3 on a form and 1 is removed then 2 becomes 1 and 3 becomes 2. This messess things up.
To solve the probelm I want to identify the tabs by there names. So I added a "add tab by name" and "remove tab by name" meathod.
[code]
int CappDlg::DeleateTabByName (char name[])
{
TCITEM CurTab;
CurTab.mask = TCIF_TEXT;
int num = SubMen.GetItemCount();
num++;
int cout;
for ( cout = 0 ; cout <= num ; cout++)
{
BOOL fail = SubMen.GetItem ( cout , &CurTab );
if ( fail = FALSE )
{
AfxMessageBox ("ERROR");
}
if ( CurTab.pszText == name)
{
SubMen.DeleteItem ( cout );
return 1; // 1 == succses
}
}
return 0; // 0 == failure
return -1; // -1 means not implemented
}
int CappDlg::addTabByName (char name[])
{
TC_ITEM TabCtrlItem;
TabCtrlItem.mask = TCIF_TEXT;
TabCtrlItem.pszText = name;
SubMen.InsertItem ( 1 , &TabCtrlItem );
return 1; // 1 == succsess
}
[code/]
The add tab by name function works correcly but the remove tab by name tab does not. Why does the remove tab by name function fail to work?
I tried debuging and I find that CurTab's sting value is bad, it says that the pointer is invalied. I don't see how this could be however becuse the GetItem meathod returns true.
I have no idea why thid does not work but it might have something to do with the invalid string in CurTab.
I tried solving this problem by assigning an index to each tab so I could add and remove them by useing there index however If I have tabs 1,2 and 3 on a form and 1 is removed then 2 becomes 1 and 3 becomes 2. This messess things up.
To solve the probelm I want to identify the tabs by there names. So I added a "add tab by name" and "remove tab by name" meathod.
[code]
int CappDlg::DeleateTabByName (char name[])
{
TCITEM CurTab;
CurTab.mask = TCIF_TEXT;
int num = SubMen.GetItemCount();
num++;
int cout;
for ( cout = 0 ; cout <= num ; cout++)
{
BOOL fail = SubMen.GetItem ( cout , &CurTab );
if ( fail = FALSE )
{
AfxMessageBox ("ERROR");
}
if ( CurTab.pszText == name)
{
SubMen.DeleteItem ( cout );
return 1; // 1 == succses
}
}
return 0; // 0 == failure
return -1; // -1 means not implemented
}
int CappDlg::addTabByName (char name[])
{
TC_ITEM TabCtrlItem;
TabCtrlItem.mask = TCIF_TEXT;
TabCtrlItem.pszText = name;
SubMen.InsertItem ( 1 , &TabCtrlItem );
return 1; // 1 == succsess
}
[code/]
The add tab by name function works correcly but the remove tab by name tab does not. Why does the remove tab by name function fail to work?
I tried debuging and I find that CurTab's sting value is bad, it says that the pointer is invalied. I don't see how this could be however becuse the GetItem meathod returns true.
I have no idea why thid does not work but it might have something to do with the invalid string in CurTab.
ASKER
I got
"Unhandled exception at 0x004f0950 in E-Ref.exe: 0xC0000005: Access violation reading location 0xcccccccc."
I am not sure what this means but I do not think its good...
Thank you for your time,
Arrummzen
"Unhandled exception at 0x004f0950 in E-Ref.exe: 0xC0000005: Access violation reading location 0xcccccccc."
I am not sure what this means but I do not think its good...
Thank you for your time,
Arrummzen
ASKER
IT appears to me that the SubMen.GetItem ( cout , &CurTab ); call is not working correctly. I don't know why its not working however. All I know is that when I call GetItem on the first 3 tabs I am not getting a single valid string pointer returned when there should be a valid string.
Thank you for your time,
Arrummzen
Thank you for your time,
Arrummzen
try this.
int CappDlg::DeleateTabByName (char* name)
{
char szTabText[256] ;
TCITEM CurTab;
CurTab.mask = TCIF_TEXT;
CurTab.pszText = szTabText ;
CurTab.cchTextMax = 256 ;
int num = m_Tab1.GetItemCount();
num++;
int cout;
for ( cout = 0 ; cout <= num ; cout++)
{
BOOL fail = m_Tab1.GetItem ( cout , &CurTab );
if ( fail = FALSE )
{
AfxMessageBox ("ERROR");
}
if (strcmp(CurTab.pszText,nam e) == 0)
{
m_Tab1.DeleteItem ( cout );
}
}
}
int CappDlg::DeleateTabByName (char* name)
{
char szTabText[256] ;
TCITEM CurTab;
CurTab.mask = TCIF_TEXT;
CurTab.pszText = szTabText ;
CurTab.cchTextMax = 256 ;
int num = m_Tab1.GetItemCount();
num++;
int cout;
for ( cout = 0 ; cout <= num ; cout++)
{
BOOL fail = m_Tab1.GetItem ( cout , &CurTab );
if ( fail = FALSE )
{
AfxMessageBox ("ERROR");
}
if (strcmp(CurTab.pszText,nam
{
m_Tab1.DeleteItem ( cout );
}
}
}
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Thanks, your code did not work, but I used to to figure out whats wrong with mine.
Thank you for your time,
Arrummzen
Thank you for your time,
Arrummzen
if (strcmp(CurTab.pszText, name)==0)
{
SubMen.DeleteItem ( cout );
return 1; // 1 == succses
}