0 / 0 / 0
Регистрация: 10.03.2018
Сообщений: 6
1

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

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

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

Попытаюсь объяснить мою проблему. Есть список сотрудников кое-какой организации. Я в приложении пытаюсь реализовать возможность добавления нового сотрудника. Выглядит это так: при нажатии на кнопку "Добавить" создается небольшая форма, где находятся 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.05.2019, 03:39
Ответы с готовыми решениями:

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

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

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

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

1
1702 / 898 / 207
Регистрация: 25.11.2009
Сообщений: 1,847
30.05.2019, 09:34 2
Лучший ответ Сообщение было отмечено 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
30.05.2019, 09:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.05.2019, 09:34
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru