Link to home
Start Free TrialLog in
Avatar of Arrummzen
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.
Avatar of Priyesh
Priyesh

try

         if (strcmp(CurTab.pszText, name)==0)
         {
              SubMen.DeleteItem ( cout );
              return 1; // 1 == succses
         }
Avatar of Arrummzen

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
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
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,name) == 0)
         {
              m_Tab1.DeleteItem ( cout );
         }
    }
}
ASKER CERTIFIED SOLUTION
Avatar of Priyesh
Priyesh

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Thanks, your code did not work, but I used to to figure out whats wrong with mine.
Thank you for your time,
Arrummzen