Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 10.03.2018
Сообщений: 6

Удаление формы с объектами

30.05.2019, 03:39. Показов 1026. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.

Попытаюсь объяснить мою проблему. Есть список сотрудников кое-какой организации. Я в приложении пытаюсь реализовать возможность добавления нового сотрудника. Выглядит это так: при нажатии на кнопку "Добавить" создается небольшая форма, где находятся DBEdit'ы. В них вносится информация о человеке. После нажатия кнопки, на созданной форме, "Сохранить" или "Отмена" происходит удаление формы и объектов на ней, и сохранение или удаление информации о человек соответственно.

Проблема заключается в том, что при удалении формы выскакиевает ошибка "Access violation at address 00468239 in module 'Project1.exe'. Read of address 20736920". Не понимаю из-за чего эта ошибка появляется.

Ранее я писал другое приложение, блокнот, и реализовал вызов справки о блокноте похожим образом. Там всё хорошо работает.


Создание формы
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
Form1->Enabled = false;
 
       TBorderIcons BI; //настройка для отображения элементов управления формой
        BI.Clear();
 
        DataModule2->IBDataSet1->Insert(); //добавить новую запись в таблицу (*.fdb)
        DataModule2->IBDataSet1->FieldByName("WARNINGS")->AsString="0/3";
 
        //форма для добавления нового сотрудника
        fInsertForm = new TForm(Form1);
        fInsertForm->Parent = Form1;
        fInsertForm->Name = "fInsertForm";
        fInsertForm->Caption = "Добавить нового сотрудника";
        fInsertForm->Height = 203;
        fInsertForm->Width = 222;
        fInsertForm->Left = 336;
        fInsertForm->Top = 168;
        fInsertForm->Show();
        fInsertForm->BorderStyle = bsDialog;
        fInsertForm->BorderIcons = BI;
        fInsertForm->Position = poScreenCenter;
 
        //описание к текстовым полям
        Labels[0] = new TLabel(fInsertForm);
        Labels[0]->Parent = fInsertForm;
        Labels[0]->Name = "Wfio";
        Labels[0]->Caption = "ФИО";
        Labels[0]->Top = 56;
        Labels[0]->Left = 8;
 
        Labels[1] = new TLabel(fInsertForm);
        Labels[1]->Parent = fInsertForm;
        Labels[1]->Name = "WPhoneNumber";
        Labels[1]->Caption = "Номер тел.";
        Labels[1]->Top = 80;
        Labels[1]->Left = 8;
 
        Labels[2] = new TLabel(fInsertForm);
        Labels[2]->Parent = fInsertForm;
        Labels[2]->Name = "selectRole";
        Labels[2]->Caption = "Должность";
        Labels[2]->Top = 112;
        Labels[2]->Left = 8;
 
 
        //текстовое полу, куда вводится ФИО
        DBEdits[0] = new TDBEdit(fInsertForm);
        DBEdits[0]->Parent = fInsertForm;
        DBEdits[0]->Name = "fio";
        DBEdits[0]->Top = 48;
        DBEdits[0]->Left = 80;
        DBEdits[0]->DataSource = DataModule2->DataSource1;
        DBEdits[0]->DataField =  "FULL_NAME";
 
        //текстовое полe, куда вводится номер телефона
        DBEdits[1] = new TDBEdit(fInsertForm);
        DBEdits[1]->Parent = fInsertForm;
        DBEdits[1]->Name = "PhoneNumber";
        DBEdits[1]->Top = 72;
        DBEdits[1]->Left = 80;
        DBEdits[1]->DataSource = DataModule2->DataSource1;
        DBEdits[1]->DataField = "PHONE_NUMBER";
 
        //список с должностями, для выбора
        selectRole = new TDBComboBox(fInsertForm);
        selectRole->Parent = fInsertForm;
        selectRole->Name = "sRoleCBOX";
        selectRole->Top = 104;
        selectRole->Left = 72;
        selectRole->DataSource = DataModule2->DataSource1;
        selectRole->DataField = "DPOSITION";
        selectRole->Items->Add("Зам. директора");
        selectRole->Items->Add("Менеджер");
        selectRole->Items->Add("Член команды");
        selectRole->Items->Add("Стажер");
 
        //кнопка для закрыия формы добавления нового сотрудника
        Btns[0] = new TButton(fInsertForm);
        Btns[0]->Parent = fInsertForm;
        Btns[0]->Name = "close";
        Btns[0]->Caption = "Отмена";
        Btns[0]->Width = 110;
        Btns[0]->Left = 105;
        Btns[0]->Top = 148;
        Btns[0]->OnClick = onCloseInsertForm;
 
        Btns[1] = new TButton(fInsertForm);
        Btns[1]->Parent = fInsertForm;
        Btns[1]->Name = "save";
        Btns[1]->Caption = "Сохранить";
        Btns[1]->Width = 110;
        Btns[1]->Left = 0;
        Btns[1]->Top = 148;
        Btns[1]->OnClick = onCloseAndSaveInsertForm;
кнопка отмены
C++
1
2
DataModule2->IBDataSet1->Delete();
delete fInsertForm;
кнопка сохранения
C++
1
2
DataModule2->IBDataSet1->Post();
delete fInsertForm;
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.05.2019, 03:39
Ответы с готовыми решениями:

Создание и удаление при взаимодействии с динамически созданными объектами
Добрый день. У меня на форме PageControl с динамически создающимися страницами, на каждой странице создаются несколько компонентов в том...

Вывод печати всей формы с объектами на принтер
Реально ли вывести на печать принтеру всю форму со всеми объектами. У меня на форме около 30 ListBox'ов, Label'ов с 2 десятка и кнопочки. И...

Контейнер с объектами класса, добавление и удаление
Есть класс, он должен хранить статический контейнер с ссылками на объекты этого-же класса, как сделать что-бы при создании объекта, объект...

1
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
30.05.2019, 09:34
Лучший ответ Сообщение было отмечено Milky Wey как решение

Решение

Milky Wey, а код отмены и сохранения вызывается на самой fInsertForm? Если да, то так нельзя.

Вообще такой подход неверен. Зачем постоянно создавать и удалять форму, которая часто используется? Такая форма должна быть в списке автосоздаваемых (создаваемых при запуске программы).
Когда нужно - показываешь её модально и смотришь на результат.

C++
1
2
3
4
5
6
7
8
    if (fInsertForm->ShowModal() == mrOk)
    {
    //нажата кнопка сохранить
    }
    else
    {
    //нажата отмена или форма просто закрыта
    }
на форме fInsertForm у кнопки "Отмена" нужно выставить свойство MdalResult в mrCancel. Для кнопки "Сохранить" либо свойство MdalResult = mrOk, либо, если предварительно нужно сделать проверку заполнения полей, сделать такой обработчик OnClick
C++
1
2
3
4
5
6
void __fastcall TfInsertForm::B_OkClick(TObject *Sender)
{
    if (/*всё заполнено корректно*/)
        ModalResult = mrOk;
}
//
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.05.2019, 09:34
Помогаю со студенческими работами здесь

Работа с динамически созданными объектами: удаление
Как удалять созданные объекты. И еще немного не по теме, но ... как определить тип хранимый в object. Спасибо.

Изменение размера формы с объектами
Добрый день всем! Существует уже готовая программа, размер формы - 1280х1024. Теперь поставили задачу сделать еще и с разрешением 1024х768...

Загрузка объектных переменных объектами формы
Добрый день или ночь! Я так понимаю, те контролы которые находятся на форме-это ОБЪЕКТЫ формы! Такая проблема: как загрузить в...

Управление объектами на одной форме с другой формы
Здравствуйте! имеются две независимые формы. грубо говоря, одна для ввода (form1), другая для вывода (form2). каким образом можно...

Создание, заполнение объектами и удаление динамического массива. Выдает run time error
Компилятор ни на что не ругается, но консоль вылетает с виндовской ошибкой #ifndef Point_HPP // anti multiply including gates ...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru