• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 429
  • Last Modified:

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.
0
Arrummzen
Asked:
Arrummzen
  • 3
  • 3
1 Solution
 
PriyeshCommented:
try

         if (strcmp(CurTab.pszText, name)==0)
         {
              SubMen.DeleteItem ( cout );
              return 1; // 1 == succses
         }
0
 
ArrummzenAuthor Commented:
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
0
 
ArrummzenAuthor Commented:
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
0
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
PriyeshCommented:
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 );
         }
    }
}
0
 
PriyeshCommented:
"pszText" should be the address of a buffer to recieve text and "cchTextMax" should be the length of the buffer pointed by pszText. So when you call GetItem without initializing these values the function will not work properly.
0
 
ArrummzenAuthor Commented:
Thanks, your code did not work, but I used to to figure out whats wrong with mine.
Thank you for your time,
Arrummzen
0

Featured Post

Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

  • 3
  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now