Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
 Аватар для GreeNicee
185 / 155 / 88
Регистрация: 04.10.2014
Сообщений: 397

Динамическое удаление веток TreeView

28.04.2015, 20:42. Показов 1898. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Делаю аналог комнат в RC/TC и тому подобным программам, речь идет конкретно об интерфейсе. Решил использовать CategoryPanelGroup, на нем динамически создаются, удаляются и т.д. CategoryPanel (комнаты) а на них уже TreeView, каждая ветка - пользователь. При клике на другой комнате, пользователь удаляется из предыдущей комнаты (name, которой хранится в переменной) и добавляется в той комнате, на которую кликнул. Ничего сложного вроде бы нету, логических ошибок я не вижу)).Работает переход между комнатами ОДИН раз, на все следующие критует. Подскажите в чем проблема.
Создаем комнату
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    UnicodeString namepan;
    namepan = InputBox("Создание канала", "Введите название канала","");
    if (namepan != "")
    {
        TCategoryPanel *panel = new TCategoryPanel(CatPanGroup);
        panel->Name = "channel" + IntToStr(i); // из БД
        panel->Caption = namepan;
        panel->PopupMenu = PopupMenuChannel;
        panel->PanelGroup = CatPanGroup;
 
 
        TTreeView *tree = new TTreeView(panel);
        tree->Name = "tree" + IntToStr(i); //из БД
        tree->Parent = panel;
        tree->Align = alClient;
        tree->OnClick = catbutClick;
 
        i++;
Переходим между комнатами
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void __fastcall TFGroup::catbutClick(TObject *Sender)
{
        TTreeView *tree = (TTreeView *)Sender;
 
    if (tree->Name != LastChannelID)
    {
        TTreeView *treelast = (TTreeView *)(FGroup->FindComponent(LastChannelID));
        for (int j = 0; i < treelast->Items->Count+1; j++)
        {
            if (treelast->Items->Item[j]->Text == Nick)
            {
                treelast->Items->Item[j]->Free();
                break;
            }
        }
        tree->Items->Add(NULL, Nick);
        LastChannelID = tree->Name;
    } 
}
на событии OnShow у формы, заполняются переменные Nick и LastChannelID (вы заходите на основной канал)

Добавлено через 3 часа 37 минут
Неужели все так плохо или я некорректно задал вопрос?) Пугающее молчание...
Критует с ошибкой AccessViolation.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.04.2015, 20:42
Ответы с готовыми решениями:

TreeView динамическое создание дерева
Доброго дня. Пишу, но чувствую криво выходит, собственно, как ПРАВИЛЬНО - динамически создать дерево. Есть цикл, в нем по условию некие...

Динамическое построение дерева в TreeView по заданной структуре
Доброго дня. Подскажите пожалуйста , как правильно построить дерево в этой ситуации. Имеется структура и её объявление typedef struct ...

Идентификация веток в TreeView
В БД есть 2 таблицы-вопросов и ответов. в TreeView отображаются номера вопросов(типа вопрос1, вопрос2 и тд).Нужно, чтобы при нажатии на...

8
place status here
 Аватар для gunslinger
3190 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,023
28.04.2015, 21:08
1) Какого здесь делают i и j
C++
1
for (int j = 0; i < treelast->Items->Count+1; j++)
2) Старшие товарищи (т. е. более умные, чем я; поэтому стоит им доверять) советуют использовать delete вместо Free()
C++
1
treelast->Items->Item[j]->Free();
0
 Аватар для GreeNicee
185 / 155 / 88
Регистрация: 04.10.2014
Сообщений: 397
28.04.2015, 21:11  [ТС]
с delete() совершенно такая-же ошибка. Сначала я вместо три-виева использовал CategoryButtons (там через indexOf искал последний "канал".Короче) то, что я в счетном цикле его ищу - это не очень правильно, но нормально работает и ошибка явно в другом(но в чем я не врубаюсь)
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33400 / 21510 / 8236
Регистрация: 22.10.2011
Сообщений: 36,910
Записей в блоге: 12
28.04.2015, 21:23
Минимальный проект, на котором воспроизводится ошибка, приложи (с четким описанием, на что жать и в какой последовательности, чтобы ошибку воспроизвести). Повторить по описанию не удалось, после замены i на j и убирания +1 в цикле все нормально удаляется, ошибки не возникают...
0
 Аватар для GreeNicee
185 / 155 / 88
Регистрация: 04.10.2014
Сообщений: 397
28.04.2015, 21:44  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
Минимальный проект, на котором воспроизводится ошибка, приложи (с четким описанием, на что жать и в какой последовательности, чтобы ошибку воспроизвести). Повторить по описанию не удалось, после замены i на j и убирания +1 в цикле все нормально удаляется, ошибки не возникают...
Накидал по быстрому). Нужно создать канал, перейти в него и попробовать перейти обратно(либо создать еще канал и перейти на него). Первый переход работает нормально,а дальше крит


http://rghost.ru/6Cz2tjj9t
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33400 / 21510 / 8236
Регистрация: 22.10.2011
Сообщений: 36,910
Записей в блоге: 12
28.04.2015, 22:12
Перед тем, как что-то делать с найденным treeview, проверяй, действительно ли он был найден:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void __fastcall TForm1::TreeView1Click(TObject *Sender)
{
    TTreeView *tree = (TTreeView*)Sender;
 
    if (tree->Name != LastChannelID)
    {
        TTreeView *treelast = (TTreeView*)(Form1->FindComponent(LastChannelID));
        if (treelast)
            for (int j = 0; j < treelast->Items->Count; j++)
            {
                if (treelast->Items->Item[j]->Text == Nick)
                {
                    treelast->Items->Item[j]->Free();
                    break;
                }
            }
        tree->Items->Add(NULL, Nick);
        LastChannelID = tree->Name;
    }
    else
        ShowMessage(tree->Name + " " + LastChannelID);
}
, тогда не будет никаких вылетов. Дорабатывай дальше под свои нужды...
1
 Аватар для GreeNicee
185 / 155 / 88
Регистрация: 04.10.2014
Сообщений: 397
28.04.2015, 23:04  [ТС]
Спасибо большое)Просто я относительно недавно работаю с объектами(а в си вообще 3 недели), не знал, что можно проверять найден-ли объект))

Добавлено через 43 минуты
Ошибка исчезла) но, по неведомым мне причинам, удаляются ветки три-виева только со статически созданного компонента, а с динамически созданного - отказываются удалятся. Причем сам компонент находится)))
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33400 / 21510 / 8236
Регистрация: 22.10.2011
Сообщений: 36,910
Записей в блоге: 12
28.04.2015, 23:22
Лучший ответ Сообщение было отмечено GreeNicee как решение

Решение

Цитата Сообщение от GreeNicee Посмотреть сообщение
Причем сам компонент находится)))
Не находится. Тут вот какая штука: твой FindComponent ищет только те компоненты, которыми владеет форма (поскольку вызывается для Form1), Когда создаешь компонент в дизайнере, им тоже владеет форма, а компонентами TreeView, созданными динамически, форма НЕ владеет, ими владеет панель (в конструктор TreeView передается именно панель). Замени:
C++
1
2
3
4
5
        TTreeView *tree = new TTreeView(Form1); // Вот тут panel на Form1
        tree->Name = "tree" + IntToStr(i);
        tree->Parent = panel;
        tree->Align = alClient;
        tree->OnClick = TreeView1Click;
, все тут же начнет удаляться...
1
 Аватар для GreeNicee
185 / 155 / 88
Регистрация: 04.10.2014
Сообщений: 397
28.04.2015, 23:37  [ТС]
еще раз спасибо)особенно за разьяснения
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.04.2015, 23:37
Помогаю со студенческими работами здесь

Копировать тект дочерних веток treeview при нажатии на главную
Привет всем, у меня вопрос по treeview, может кто знает как сделать чтоб можно было при нажатии на главную ветку копировать названия всех...

Удаление веток реестра
Мне необходимо с BAT файла выполнить удаление ключей реестра. Необходимо пробежаться по ветках реестра каждого пользователя на компьютере...

Удаление изображений из истории всех веток
Как удалить физически из истории всех веток все изображения, кроме тех, которые в определённой папке?

Удаление ряда файлов, папок и веток реестра
Здравствуйте. Я хочу сделать батник который проверит небольшую кучу папок и папок реестра. Причём надо сделать так, чтобы сначала всё...

Хочу сделать, чтобы TreeView не выглядел как дерево, а как в редакторах кодов одной линией без веток
Хочу сделать, чтобы TreeView не выглядел как дерево, а как в редакторах кодов одной линией без веток..


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru