Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/29: Рейтинг темы: голосов - 29, средняя оценка - 4.55
 Аватар для __bool
288 / 229 / 27
Регистрация: 13.06.2010
Сообщений: 744

Удаление вкладок в PageControl

04.10.2011, 14:40. Показов 5969. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уже давно пытаюсь уничтожить динамически создаваемые вкладки в TPageControl,
являющиеся производными от TTabSheet,
+ ко всему новый объект записывается в TList, что усложняет ситуацию.

Вот этот класс, объекты которого не получается удалить:
.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
TList* Tabs;
 
class TPlayList : public TsTabSheet
{
private:
    TsListBox* List;
    TStringList *TracksPathList;
public:
    bool __fastcall GetTracksList(AnsiString fname);
    __fastcall TPlayList(TComponent* Owner);
    __fastcall ~TPlayList();
    static unsigned short Count;
};
.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
__fastcall TPlayList::TPlayList(TComponent* Owner)
    : TsTabSheet(Owner)
{
    ++Count;
    List = new TsListBox(this);
    List->Parent = this;
    TracksPathList = new TStringList;  // размещение песен
    this->Name = "New"+IntToStr(Count);
    this->Caption = "New"+IntToStr(Count);
    this->Parent = MainForm->Pages;
    this->PageControl = MainForm->Pages;
    this->ParentWindow = MainForm->Handle;
}
C++
1
unsigned short TPlayList::Count = 0;
C++
1
2
3
4
5
__fastcall TPlayList::~TPlayList()
{//Специально не уменьшаю Count;
    delete List;
    delete TracksPathList;
}
Создаю вкладку:
C++
1
2
3
4
5
6
7
8
void __fastcall TMainForm::miCreateClick(TObject *Sender)
{  if (!Tabs)
    Tabs = new TList;
 
    TPlayList* newTab = new TPlayList(Pages);
    Tabs->Add(newTab);
    Pages->TabIndex = Pages->PageCount-1;
}
Как пробовал удалять:
1)
C++
1
delete ((TPlayList*)Tabs->Items[i]);
2)
C++
1
delete Tabs->Items[i];
3)
C++
1
Tabs->Delete(i);
4)
C++
1
Tabs[i].Free();
и т.д.

Пробовал по 2 разных метода. Но как результат создание очередной вкладки после удаления - Access Violation
или просто никакого удаления не происходит.. Или зависает программа

Подскажите пожалуйста правильный вариант удаления
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.10.2011, 14:40
Ответы с готовыми решениями:

Удаление динамически созданных вкладок PageControl
Всем доброго времени суток. Создаю при открытие формы вкладки на PageControle. Открываю форму так: ...

Стиль вкладок PageControl
Здравствуйте! Попытался сделать выделение жирным вкладок PageControl. Вот код void __fastcall...

Переключение вкладок PageControl
Доброго времени суток. Столкнулся с такой проблемой. Вот код, который должен по нажатию кнопок открывать новую вкладку, в которой будет...

9
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
04.10.2011, 15:08
Вот так удаляется последняя вкладка (ну и аналогично...)
C++
1
  Pages->Pages[Pages->PageCount-1]->Free();
0
 Аватар для __bool
288 / 229 / 27
Регистрация: 13.06.2010
Сообщений: 744
04.10.2011, 15:18  [ТС]
Цитата Сообщение от nick42 Посмотреть сообщение
Вот так удаляется последняя вкладка (ну и аналогично...)
C++
1
  Pages->Pages[Pages->PageCount-1]->Free();
Она удаляется(иногда). но вот создал 4 вкладки и удаляю 1-ю : все начинает мерцать и программа зависает + ко всему вылетает окно ошибки, но текста в ней нет!
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
04.10.2011, 16:27
Ну, не знаю... . Вот пример обработчика события, который позволяет добавлять и удалять вкладки, правда последовательно, но думаю, что и выборочно - без проблем:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void __fastcall TForm1::TabSheet1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
      if(X > (PageControl1->Width/2))
    {
         TTabSheet * tnew = new TTabSheet(this);
         tnew->PageControl = PageControl1;
         tnew->Name = "TabSheet"+IntToStr(PageControl1->PageCount);
         tnew->Caption = tnew->Name; 
    }
      else  delete PageControl1->Pages[PageControl1->PageCount-1];
}
0
 Аватар для __bool
288 / 229 / 27
Регистрация: 13.06.2010
Сообщений: 744
04.10.2011, 16:32  [ТС]
nick42 Для этого я и привел код своего класса, потому что у меня не просто вкладки. + обращаюсь я к ним используя контейнер TList! из которого так же нужно удалять.
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
05.10.2011, 13:04
__bool, зачем ты создаёшь TList для того, чтобы хранить указатели на вкладки,
если они итак хранятся в свойстве Pages?

Названия переменных меня просто добивают: код читать невозможно! Я же тебе уже писал про это.
Ну нельзя называть переменные Tabs, Pages, когда в классе есть точно такая же переменная!!!!

Цитата Сообщение от __bool Посмотреть сообщение
Pages->Pages[Pages->PageCount-1]
Как в такой записи можно понять, что здесь что?


Цитата Сообщение от __bool Посмотреть сообщение
__fastcall TPlayList::TPlayList(TComponent* Owner)
: TsTabSheet(Owner)
{
++Count;
List = new TsListBox(this);
List->Parent = this;
TracksPathList = new TStringList; // размещение песен
this->Name = "New"+IntToStr(Count);
this->Caption = "New"+IntToStr(Count);
this->Parent = MainForm->Pages;
this->PageControl = MainForm->Pages;
this->ParentWindow = MainForm->Handle;
}
Вот здесь надо убрать this->ParentWindow = MainForm->Handle;
Непонятно зачем Count вынесено отдельным членом класса?
Объявляй его прямо в конструкторе (меньше мусора - больше читабельности).

Зачем дополнительный TStringList с названиями песен, если они итак будут в листбоксе храниться? У TListBox итак есть свойство Items

В общем, очень и очень слабо. Программа должна быть по-максимуму простой, легко читабельной!
1
 Аватар для __bool
288 / 229 / 27
Регистрация: 13.06.2010
Сообщений: 744
05.10.2011, 16:34  [ТС]
Цитата Сообщение от Maluda Посмотреть сообщение
Зачем дополнительный TStringList с названиями песен
Он не с названиями а с адресами песен! А в плейлисте названия.
(Плеер для Vkontakte)
Цитата Сообщение от Maluda Посмотреть сообщение
Непонятно зачем Count вынесено отдельным членом класса?
Это статическая переменная Ее необходимо инициализировать именно так. (Дж.Либерти С++ за 21 день)
Цитата Сообщение от Maluda Посмотреть сообщение
Объявляй его прямо в конструкторе
переменная Count играет роль счетчика. Это очень даже не дурной тон, когда нужно узнать сколько раз был вызван конструктор. (Дж.Либерти С++ за 21 день)
Цитата Сообщение от Maluda Посмотреть сообщение
Названия переменных меня просто добивают
Ну почему же? страницы так я их и назвал Pages, или лучше как те кому лень учить англ? (stranici)?

Цитата Сообщение от Maluda Посмотреть сообщение
Pages->Pages[Pages->PageCount-1]
Вероятно у меня нашурено восприятие этого мира, но мне почему то так очень удобно
Цитата Сообщение от Maluda Посмотреть сообщение
Программа должна быть по-максимуму простой, легко читабельной!
Согласен, буду работать над этим!

А вообще Maluda Спасибо за критику! Сам не понимаю зачем мне этот TList Сначала что то задумал а потом не понял почему и оставил на случай если вспомню..

Спасибо за советы!
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
05.10.2011, 23:12
__bool, дружище, ты не обижайся, но на каждый из твоих ответов я естественно могу ответить.
Если ты считаешь нормальным назвать TPageControl Pages, так назови тогда и форму Pages,
будет Pages->Pages->Pages.
В общем, жаль, что ты не всё понял из того, что я написал.

П.С.1. Если надо что-то подсчитать, необязательно для этого выделять отдельную, особенно открытую переменную, доступную для всех!

Попробуй изменить свойство Count, например, у класса TStrings?
Компилятор сразу тебя ударит тебя по рукам и скажет, что свойство недоступно для записи.
Потому что правилом хорошего тона считается скрывать статистические члены-данные для доступа, ты можешь сделать открытую функцию получить значение, но никак не для записи.

Вот так не рекомендуется
C++
1
2
3
4
class Test {
public:
     int Count; // кол-во вызовов конструктора
}
А вот так - пример хорошего тона
C++
1
2
3
4
5
6
7
8
class Test {
private:
      int iCount; // кол-во вызовов конструктора
public:
      const int & GetCount() const {
              return iCount;
      }
}
Но главное! кому нужно, сколько раз вызывался конструктор, кроме тебя во время отладки?
Вот это я и имел ввиду, что не зачем его делать отдельным да ещё и открытым членом.

П.С.2.
Цитата Сообщение от __bool Посмотреть сообщение
Дж.Либерти С++ за 21 день
Ты бы ещё мне С++ для чайников в пример привел

Невозможно выучить С++ за 21 день! Ни одного такого человека не знаю
1
 Аватар для __bool
288 / 229 / 27
Регистрация: 13.06.2010
Сообщений: 744
06.10.2011, 00:43  [ТС]
Цитата Сообщение от Maluda Посмотреть сообщение
Pages->Pages->Pages
Вот это жесть чувак

Ты прав.
1
 Аватар для __bool
288 / 229 / 27
Регистрация: 13.06.2010
Сообщений: 744
09.10.2011, 11:00  [ТС]
Исправил ошибки, на которые указал Maluda и все работает как надо)
спасибо за помощь!
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.10.2011, 11:00
Помогаю со студенческими работами здесь

Перемещение и сортировка вкладок PageControl
Есть форма. На ней размещен PageControl с динамически создающимися страницами. Создаю 2-3 страницы. Каждая страница при этом называется...

Удаление динамически созданных вкладок
Подскажите как сделать? Создаю вкладки по нажатию кнопки void __fastcall TNewProject::CreateClick(TObject *Sender) { static...

PageControl - зачем?
Зачем PageControl в билдере? Что бы не создавать лишних форм? Тогда как убрать заголовки, что-бы переключать клавишами или с меню а не при...

Многостраничный PageControl
Доброго времени дня! Задался вопросом по поводу PageControl'a. Допустим у меня на первой вкладке есть достаточно массивный набор...

Работа с PageControl
Идея простая. На форме есть PageControl с двумя вкладками. Если кликнуть на поле первой вкладки, фокус передаётся на вторую вкладку и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru