Форум программистов, компьютерный форум, киберфорум
C++/CLI Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
3 / 3 / 1
Регистрация: 08.03.2020
Сообщений: 170

Работа с деструктором

17.06.2020, 22:49. Показов 1769. Ответов 17

Студворк — интернет-сервис помощи студентам
Привет. Мне нужно реализовать в деструкторе процесс сохранения данных. Когда пользователь завершает работу, ему выскакивает окошко о том что "хочет ли он сохранить изменения", да/нет.
Код на сохранения в форме такой:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private: System::Void сохранитьToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) {
    SaveFileDialog SaveAsFDlg;
    StreamWriter^ myStream;
    SaveAsFDlg.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
    if (SaveAsFDlg.ShowDialog() != System::Windows::Forms::DialogResult::OK) return;
    myStream = gcnew StreamWriter(SaveAsFDlg.OpenFile());
    if (myStream == nullptr)
    {
        MessageBox::Show(L"Ошибка открытия файла");
        return;
    }
    String^ OutStr;
    for (int i = 0; i < dataGridView1->RowCount; i++)
    {
        for (int j = 0; j < dataGridView1->ColumnCount; j++)
        {
            OutStr = dataGridView1->Rows[i]->Cells[j]->Value + " ";
            myStream->Write(OutStr);
        }
        myStream->Write(Environment::NewLine);
    }
    myStream->Close();
}
Код класса:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#pragma once
using namespace System;
namespace EmpMNS // Наше собственное пространство имен
{
    public ref class Mammal
    {
    public:
        Mammal(void);
    public:
        String^ Name;
        String^ Type;
        double Height;
        double Weight;
        int Age;
        int Children;
        String^ Home;
    };
}
Как это можно реализовать?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.06.2020, 22:49
Ответы с готовыми решениями:

Ошибка с Деструктором
Проблема заключается в следующем: Имеется класс Вектор, в котором есть поля два поля (для координат и их количества). Есть конструктор по...

Не работает с деструктором
#define st system(&quot;pause&quot;); #include &lt;iostream&gt; using namespace std; class temp{ public: int a; unsigned int b; void...

Проблемы с деструктором
Вот код : #include&lt;iostream.h&gt; #include&lt;string.h&gt; struct Value { char val_1; int val_2; bool val_3; };

17
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
18.06.2020, 00:00
Цитата Сообщение от sokk28 Посмотреть сообщение
в деструкторе
Что за деструктор?
Цитата Сообщение от sokk28 Посмотреть сообщение
Как это можно реализовать?
Проблема непонятна.
0
3 / 3 / 1
Регистрация: 08.03.2020
Сообщений: 170
18.06.2020, 00:26  [ТС]
nd2
Когда пользователь закрывает программу срабатывает деструктор, в котором должен находится код, который спросит перед выходом его о том что нужно ли сохранять данные из datagridview или нет.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
18.06.2020, 00:51
Цитата Сообщение от sokk28 Посмотреть сообщение
Код на сохранения в форме такой:
Оформи в виде функции, вызывай где нужно.

Добавлено через 21 минуту
Цитата Сообщение от sokk28 Посмотреть сообщение
код, который спросит перед выходом его о том что нужно ли сохранять данные из datagridview или нет.
MessageBox::Show(), обрабатывай возвращаемый результат.
0
3 / 3 / 1
Регистрация: 08.03.2020
Сообщений: 170
18.06.2020, 10:07  [ТС]
nd2
S_el
Решил сделать выход по-другому, но теперь появилась проблема, смотрите
C++
1
2
3
4
5
6
7
8
9
private: System::Void setting_FormClosing(System::Object^  sender, System::Windows::Forms::FormClosingEventArgs^  e)
    {
    System::Windows::Forms::DialogResult result;
    result = MessageBox::Show("Вы действительно хотите выйти?", "Вы уверены?", MessageBoxButtons::YesNo, MessageBoxIcon::Question);
    if (result == ::DialogResult::Yes)
        return;
    else
        e->Cancel = true;
    }
Но оно выдает ошибку при компиляции на строчку 404, что-то с Yes не так.
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
18.06.2020, 10:18
sokk28,
C++
1
if (result == Windows::Forms::DialogResult::Yes)
0
3 / 3 / 1
Регистрация: 08.03.2020
Сообщений: 170
18.06.2020, 11:00  [ТС]
nd2
S_el
Изменил, но все тоже самое и даже хуже

Может сам код кривой?
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
18.06.2020, 11:02
значит еще и System:: добавьте.

У вас какие пространства имен используются?
0
3 / 3 / 1
Регистрация: 08.03.2020
Сообщений: 170
18.06.2020, 11:15  [ТС]
S_el
Добавил System, заработало, спасибо
Только почему-то при закрытии программы не вылазит никакое окошко

Добавлено через 11 минут
S_el
Не знаете в чем может быть проблема?
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
18.06.2020, 11:46
sokk28, да нет, код корректный. Если прикрепите проект то посмотрю.
0
3 / 3 / 1
Регистрация: 08.03.2020
Сообщений: 170
18.06.2020, 11:53  [ТС]
S_el
Вот у меня есть кнопка отвечающая за выход, нужно что бы при попытке выхода, появлялось окошко с запросом о сохранении, но как реализовать сам процесс сохранения у меня что-то не вышло, может нужно как-то передать данные из функции сохранения?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private: System::Void выходToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) {
    //Close();
    auto result = MessageBox::Show(
        "Вы хотите сохранить изменения?",
        "Подтвердите сохранение",
        MessageBoxButtons::YesNo,
        MessageBoxIcon::Question);
    if (result == System::Windows::Forms::DialogResult::Yes) {
        System::Void сохранитьToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e);
        Application::Exit();
    }
    else
        Application::Exit();
    
}
Само сохранение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private: System::Void сохранитьToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) {
    SaveFileDialog SaveAsFDlg;
    StreamWriter^ myStream;
    SaveAsFDlg.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
    if (SaveAsFDlg.ShowDialog() != System::Windows::Forms::DialogResult::OK) return;
    myStream = gcnew StreamWriter(SaveAsFDlg.OpenFile());
    if (myStream == nullptr)
    {
        MessageBox::Show(L"Ошибка открытия файла");
        return;
    }
    String^ OutStr;
    for (int i = 0; i < dataGridView1->RowCount; i++)
    {
        for (int j = 0; j < dataGridView1->ColumnCount; j++)
        {
            OutStr = dataGridView1->Rows[i]->Cells[j]->Value + " ";
            myStream->Write(OutStr);
        }
        myStream->Write(Environment::NewLine);
    }
    myStream->Close();
}
Проект : GV(DataGrid+Form2+class).rar
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
18.06.2020, 13:57
Лучший ответ Сообщение было отмечено sokk28 как решение

Решение

sokk28, вот это:
C++
1
System::Void сохранитьToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e);
просто объявление, а функции в C++ вызываются через круглые скобки:
C++
1
        сохранитьToolStripMenuItem_Click(sender, e);
1
3 / 3 / 1
Регистрация: 08.03.2020
Сообщений: 170
18.06.2020, 15:09  [ТС]
S_el
Спасибо, а как такое еще сделать на "крестик"? Ну когда пользователь просто нажимает справа с верху на крестик и происходит тоже самое как и через меню?
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
18.06.2020, 15:29
sokk28, закиньте тоже самое в обработчик закрытия кнопки из вашего предыдущего сообщения - Работа с деструктором

но еще лучше добавьте метод onQuit и вызывайте его из обоих обработчиков.
0
3 / 3 / 1
Регистрация: 08.03.2020
Сообщений: 170
18.06.2020, 15:35  [ТС]
S_el
Я пробовал закинуть в тот обработчик, но он не открывается( обработчик красного крестика (закрыть)), при двойном нажатии на него выскакивает обработчик всей формы.
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
18.06.2020, 15:57
sokk28, у вас в обработчике красного крестика идет удаление строки из грида.

C++
1
2
3
4
private: System::Void toolStripButton1_Click(System::Object^  sender, System::EventArgs^  e) {
    int ind = dataGridView1->SelectedCells[0]->RowIndex;
    dataGridView1->Rows->RemoveAt(ind);
}
0
3 / 3 / 1
Регистрация: 08.03.2020
Сообщений: 170
18.06.2020, 20:43  [ТС]
S_el
Вы не так поняли, не тот крестик, но я уже решил.
Такая проблема, что этот код
C++
1
2
3
4
5
6
7
8
9
10
11
auto result = MessageBox::Show(
        "Вы хотите сохранить изменения?",
        "Подтвердите сохранение",
        MessageBoxButtons::YesNo,
        MessageBoxIcon::Question);
    if (result == System::Windows::Forms::DialogResult::Yes) {
        сохранитьToolStripMenuItem_Click(sender, e);
        Application::Exit();
    }
    else
        Application::Exit();
когда вылазит окошко с да или нет, и нажимаешь на нет, то оно появляется еще раз.

Добавлено через 2 часа 32 минуты
S_el
Пробовал через отладку, оно доходит до else, выполняет его, закрывает форму эту и потом начинает выполнять код заново

Добавлено через 36 минут
nd2
Можете помочь?

Добавлено через 1 час 33 минуты
Проблему решил
C++
1
Application::ExitThread();
1
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
18.06.2020, 23:45
sokk28, не вызывайте Application::Exit(); при выходе, оно может создавать событие закрытия, отсюда и дубль.
А приложение само завершится после того как форма закроется.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.06.2020, 23:45
Помогаю со студенческими работами здесь

Проблема с деструктором
Помогите реализовать алгоритм: Пусть имеется класс сотрудников примерно следующего вида: Unit { char name; Unit *Master;...

Объясните код с деструктором
using System; class Destruct { public int x; public Destruct(int i) { x = i; } // Вызывается при утилизации объекта. ...

Что не так с деструктором?
#define _CRT_SECURE_NO_WARNINGS #include&lt;iostream&gt; #include&lt;vector&gt; #include &lt;iomanip&gt; #include &lt;algorithm&gt; using namespace std; ...

Класс с Конструктором и Деструктором
напишите класс, содержащий закрытые целочисленные переменные , характеризующие координаты точки в пространстве и ее температуру(с плавающей...

Класс с непустым деструктором
Доброго времени суток. Необходимо создать класс, который должен содержать освобождающий занятые классом ресурсы. Вот такое я написал: ...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Инструменты 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" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru