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

Закрытие приложения при закрытии дочерней формы

26.06.2020, 17:50. Показов 1729. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день уважаемые гуру C++.

Есть проект и в нем имеется две формы Form1 и Form2.
Form2 главная (При её закрытии приложение закрывается)
Form1 дочерняя (При её закрытии приложение не закрывается)

И так Form2 вызывает по нажатию на кнопку Form1 и прячется, и на экране висит только Form1.

А вот при закрытии Form1 (Нажать на крестик) закрывается Form1, но приложение само продолжает жить.

Я пробовал сделать так:
В head я объявил
C++
1
void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
Полный текст Head ниже

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
//---------------------------------------------------------------------------
 
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ADODB.hpp>
#include <DB.hpp>
#include <ComCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TDataSource *DataSourceA;
        TADOConnection *ADOConnection1;
        TADOTable *TableArenda;
        TButton *Button1;
        TDataSource *DataSourceJ;
        TADOTable *TableJob;
        TADOTable *TableWash;
        TDataSource *DataSourceW;
        TButton *Button2;
        TButton *Button3;
        TDateTimePicker *DateTimePicker1;
        TDateTimePicker *DateTimePicker2;
        TLabel *Label1;
        TLabel *Label2;
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall Button2Click(TObject *Sender);
        void __fastcall Button3Click(TObject *Sender);
        void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
private:    // User declarations
public:     // User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
А в сам CPP Form1 я указал так

C++
1
2
3
4
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
Application->Terminate();
}
но почему-то когда я жму на крестик на этой форме, она всё равно не закрывает приложение, можно узнать от чего так?

P.S. Полный текст Form1 я прилагаю ниже:
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
#include <ComObj.hpp>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
AnsiString S;
AnsiString FXLS;
AnsiString fOut;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
Application->Terminate();
}
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 
TableArenda->Filtered = false;
TableArenda->Filter = "Äàòà >='"+DateTimePicker1->Date.FormatString("dd.mm.yyyy")+"' and Äàòà <='"+DateTimePicker2->Date.FormatString("dd.mm.yyyy")+"'";
TableArenda->Filtered = true;
  
String fTPL = "D:\\Program\\report\\reportA.xls";
  String fXLS = "D:\\Àðåíäà_îò÷åò.xls";
  Variant app, books, book, sheet, Rang, vCell;
  app = CreateOleObject("Excel.Application");
  books = app.OlePropertyGet("Workbooks");
  books.OleFunction("Open", WideString(fTPL));
  book = books.OlePropertyGet("item",1);
  sheet = book.OlePropertyGet("WorkSheets",1);
 
  vCell=sheet.OlePropertyGet("Cells").OlePropertyGet("Item",1,1);
  vCell.OlePropertySet("Value",WideString("Îò÷åò Àðåíäà"));
 
  const int bounds[4] = {0, TableArenda->RecordCount, 0, TableArenda->FieldCount};
  Variant vData = VarArrayCreate(bounds, 3, varVariant);
  TableArenda->First();
 
  for(int row = 0; row < TableArenda->RecordCount; ++row)
   {
     for(int column = 0; column < TableArenda->FieldCount; ++column)
        vData.PutElement(TableArenda->Fields->Fields[column]->AsVariant, row, column);
     TableArenda->Next();
   }
  Rang = sheet.OlePropertyGet("Range",sheet.OlePropertyGet("Cells",4,1),
         sheet.OlePropertyGet("Cells", TableArenda->RecordCount + 3, TableArenda->FieldCount));
  Rang.OlePropertySet("Value",vData);
  app.OlePropertySet("DisplayAlerts",false);
  book.OleProcedure("SaveAs",WideString(fXLS));
  app.OleProcedure("Quit");
  ShowMessage("Ãîòîâî!\nÎò÷åò çàïèñàí â ôàéë " + fXLS);
}
//---------------------------------------------------------------------------
 
//---------------------------------------------------------------------------
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.06.2020, 17:50
Ответы с готовыми решениями:

При закрытии дочерней формы с нее пропадают данные
Вопрос прост, есть главная форма на которой вызывается несколько дочерних(могут и одновременно), на одной из форм есть StringGrid, в...

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

Сохранение цвета фона формы при закрытии приложения
У меня есть компонент ColorBox1, и к ему кнопка Button с таким кодом. void __fastcall TForm2::Button9Click(TObject *Sender) { ...

9
Модератор
 Аватар для D1973
9929 / 6467 / 2457
Регистрация: 21.01.2014
Сообщений: 27,423
Записей в блоге: 3
27.06.2020, 11:12
Цитата Сообщение от Eliceyka Посмотреть сообщение
Form2 вызывает по нажатию на кнопку Form1 и прячется, и на экране висит только Form1.
Вот не надо так делать...
Цитата Сообщение от Eliceyka Посмотреть сообщение
В head я объявил
Вы руками объявили, что ли? Так надо это событие создать, а не просто написать... Иначе форма просто не узнает, что ей надо делать при закрытии...
0
2 / 2 / 1
Регистрация: 19.09.2012
Сообщений: 106
27.06.2020, 12:43  [ТС]
А как создать именно? Можете подробнее рассказать, пожалуйста?
0
 Аватар для mirso
562 / 373 / 55
Регистрация: 05.04.2009
Сообщений: 767
27.06.2020, 17:07
Цитата Сообщение от Eliceyka Посмотреть сообщение
Закрытие приложения при закрытии дочерней формы
Цитата Сообщение от Eliceyka Посмотреть сообщение
при закрытии Form1 (Нажать на крестик)
Цитата Сообщение от Eliceyka Посмотреть сообщение
А в сам CPP Form1 я указал так
Цитата Сообщение от Eliceyka Посмотреть сообщение
C++
1
2
3
4
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
Application->Terminate();
}
Цитата Сообщение от D1973 Посмотреть сообщение
Вы руками объявили
Eliceyka, тогда надо было написать в конструкторе вот это OnClose =
C++
1
2
3
4
5
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
     OnClose = FormClose;
}
0
Модератор
 Аватар для D1973
9929 / 6467 / 2457
Регистрация: 21.01.2014
Сообщений: 27,423
Записей в блоге: 3
27.06.2020, 17:20
Цитата Сообщение от Eliceyka Посмотреть сообщение
А как создать именно?
В инспекторе объектов выбираете свою форму, переходите на закладку Events, находите событие OnClose и делаете на пустом месте двойной клик. Все, заготовка обработчика создана, осталось вписать код. В Вашем случае скорее всего подтянется обработчик, уже созданный Вами вручную
0
 Аватар для mirso
562 / 373 / 55
Регистрация: 05.04.2009
Сообщений: 767
27.06.2020, 17:27
Eliceyka, вот сюда дважды кликнуть!
Миниатюры
Закрытие приложения при закрытии дочерней формы  
0
 Аватар для mirso
562 / 373 / 55
Регистрация: 05.04.2009
Сообщений: 767
29.06.2020, 18:41
Цитата Сообщение от Eliceyka Посмотреть сообщение
И так Form2 вызывает по нажатию на кнопку Form1 и прячется, и на экране висит только Form1.
Цитата Сообщение от D1973 Посмотреть сообщение
Вот не надо так делать...
D1973, почему нельзя?
C++
1
2
3
4
5
6
7
8
9
//---------------------------------------------------------------------------
 
void __fastcall TForm2::Button1Click(TObject *Sender)
{
    Form2->Visible = false;
    Form1->ShowModal();
    Form2->Visible = true;
}
//---------------------------------------------------------------------------
0
Модератор
 Аватар для D1973
9929 / 6467 / 2457
Регистрация: 21.01.2014
Сообщений: 27,423
Записей в блоге: 3
29.06.2020, 20:42
Цитата Сообщение от mirso Посмотреть сообщение
почему нельзя?
mirso, я разве говорил, что нельзя? Можно... но не нужно! Это ведь две большие разницы, правда?
Что за блажь, скрывать что-то, потом отлавливать момент когда показывать обратно... Бр-р-р-р... Не лучше ли интерфейс пересмотреть в пользу MDI-интерфейса, многозакладочной формы, наконец динамически создавать нужные формы в нужный момент и после использования уничтожать...
А так любая нештатная ситуация - и вот Вам лишний процесс болтается, а бестолковый пользователь орет, что у него программа не работает...
Для школьной задачи - еще куда ни шло, а для более серьезных вещей - это просто путь в никуда.
1
 Аватар для mirso
562 / 373 / 55
Регистрация: 05.04.2009
Сообщений: 767
29.06.2020, 20:49
Цитата Сообщение от D1973 Посмотреть сообщение
процесс болтается
Это да.
D1973, Я думаю что там не хватает чего-то такого
C++
1
2
3
4
5
6
7
8
9
10
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormCreate(TObject *Sender)
{
     AnsiString password = InputBox("ввод пароля", "введите пароль", "password");
 
     if( password != "забыл" )
        Application->Terminate();
}
//---------------------------------------------------------------------------
Тогда достаточно одной формы
0
Модератор
 Аватар для D1973
9929 / 6467 / 2457
Регистрация: 21.01.2014
Сообщений: 27,423
Записей в блоге: 3
29.06.2020, 21:01
mirso, возможно... Но если это так - то я, на месте ТС-а, просто в обязательном порядке изучил бы эту тему...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.06.2020, 21:01
Помогаю со студенческими работами здесь

Закрытие приложения при закрытии диалогового окна
Очередная микротема от новичка в Qt) Подскажите как закрыть приложение при закрытии диалогового(второго) окна на крестик? Я так...

Закрытие дочерних окон при закрытии родительского - QT
Создал 2 окна. При клике на одну из кнопок открываю 2ую форму: Form *myform = new Form; myform-&gt;show(); Но...

Закрытие форм при закрытии дочерней формы
Имеется две формы Form1.h и Form2.h. Как сделать так, чтобы при закрытии второй(дочерней) формы закрывались обе??? Пробовал так не...

Ошибка при закрытии дочерней формы
Привет! Есть баг, который никак не могу исправить. Существуют 2 формы Form1 и Form2, при этом Form1 - Главная, а Form2 - дочерняя. ...

Завершение задач при закрытии дочерней формы
Что мы имеем. - дочерняя форма программы. - мой класс, в котором реализована работа с Task-ами (ThreadController). в этом...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru