Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > TabSheet проблемы с удалением


Автор: mishapk 12.7.2013, 17:55
Имеется форма на которой расположен PageControl1, также имеется Frame.
При нажатии на кнопку динамически создаются закладки с Фреймом.

Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   TTabSheet *NewTabSheet;
   TFrame2 *NewFrame;
   NewTabSheet = new TTabSheet(PageControl1);
   NewTabSheet->Caption = "TabSheet" + TimeToStr(Now());
   NewTabSheet->PageControl = PageControl1;
   NewFrame = new TFrame2(NewTabSheet);
   NewFrame->Parent = NewTabSheet;
   NewFrame->Label1->Caption= "TabSheet" + TimeToStr(Now());
   PageControl1->ActivePageIndex=PageControl1->PageCount-1;

}



На  фрейме расположена кнопка удаления закладки. Удалиение происходит через раз. Часто возникает ошибка.

Цитата

---------------------------
Debugger Exception Notification
---------------------------
Project Project2.exe raised exception class EAccessViolation with message 'Access violation at address 40107D8F in module 'vcl60.bpl'. Read of address 009FD94C'. Process stopped. Use Step or Run to continue.
---------------------------
OK   Help   
---------------------------


Код

void __fastcall TFrame2::Button2Click(TObject *Sender)
{

 if(Form1->PageControl1->ActivePageIndex >= 0)
{
  Form1->PageControl1->ActivePage->Free();

}


}



Подскажите как правильно сделать удаление?

Автор: Dem_max 13.7.2013, 08:35
Цитата

Form1->PageControl1->ActivePage->Free();

Так никто не удаляет !!!! 
если ты используешь new для создание объекта, то для удаления объекта должен воспользоваться только delete !!!!!!!

Автор: mishapk 13.7.2013, 09:24
Цитата(Dem_max @  13.7.2013,  08:35 Найти цитируемый пост)
Так никто не удаляет !!!! 
если ты используешь new для создание объекта, то для удаления объекта должен воспользоваться только delete !!!!!!! 

Разницы не какой все равно ошибка таже.

Автор: mishapk 13.7.2013, 11:33
Вся проблем заключается в том что удалить с собственной кнопки не может сам себя. Вікрутился через таймер на главной форме.
Вопрос. Динамически созданный фрейм тоже удалится или останется висеть в памяти?

Автор: Dem_max 15.7.2013, 03:51
Ну если ты его удалил через delete то он уничтожется

Автор: xvr 6.8.2013, 15:33
Цитата(mishapk @  12.7.2013,  17:55 Найти цитируемый пост)
  Form1->PageControl1->ActivePage->Free();

Этого делать нельзя. Точнее нельзя удалить активную вкладку - надо сначала с нее уйти куда нибудь (на соседнюю например)

Автор: SVN74 6.8.2013, 22:48
Вариант 1:
Вам поможет "PostMessage"  и обработчик в главной форме...
Главная форма должна знать количество и пути доступа к "Табам", как вариант рекомендую "табы" прописать как отдельный класс, потом создавать и удалять используя к примеру тот же "vector"...
Вариант 2:
Самый простой способ использовать TThread и в него в пихнуть события "Sender" как для создания так и для удаления через синхронизацию конечно...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)