Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Проверка на сохранение


Автор: s1lver 10.7.2009, 22:50
WinXp
CodeGear RAD 2009


Подскажите как проверить сохранен ли документ перед закрытием программы.  smile 

Вот пробую так но вываливаются ошибки

Код

void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{   //проверяем документ перед закрытием
 if (memo[PageControl1->ActivePageIndex]->Modified)
 { int res = Application->MessageBoxA("Текст документа не сохранен","Warning");
switch (res)
case IDYES:N14Click(Sender) ;
break;
case IDCANCEL:CanClose = false;

 }
}

Автор: Usper 10.7.2009, 23:09
Какие ошибки? 
switch неправильно используется (не хватает фигурных скобок).

Автор: s1lver 10.7.2009, 23:30
Цитата

Какие ошибки? 


[BCC32 Error] Unit1.cpp(1436): E2034 Cannot convert 'const char *' to 'const wchar_t *'
[BCC32 Error] Unit1.cpp(1436): E2342 Type mismatch in parameter 'Text' (wanted 'const wchar_t *', got 'const char *')
[BCC32 Error] Unit1.cpp(1437): E2193 Too few parameters in call to '_fastcall TApplication::MessageBoxA(const wchar_t *,const wchar_t *,int)'
[BCC32 Error] Unit1.cpp(1438): E2379 Statement missing ;
[BCC32 Warning] Unit1.cpp(1444): W8004 'res' is assigned a value that is never used


Автор: Данкинг 10.7.2009, 23:38
Цитата(s1lver @  11.7.2009,  00:30 Найти цитируемый пост)
[BCC32 Error] Unit1.cpp(1437): E2193 Too few parameters in call to '_fastcall TApplication::MessageBoxA(const wchar_t *,const wchar_t *,int)'

Ну так - чего не хватает в вызове MessageBoxA ? smile 

Цитата(s1lver @  11.7.2009,  00:30 Найти цитируемый пост)
[BCC32 Error] Unit1.cpp(1438): E2379 Statement missing ;

А эта ошибка что значит? smile 

Цитата(s1lver @  11.7.2009,  00:30 Найти цитируемый пост)
[BCC32 Warning] Unit1.cpp(1444): W8004 'res' is assigned a value that is never used

Да, это самая страшная из всех ошибок. smile 

Автор: s1lver 10.7.2009, 23:42
дык а что там за число такое должно быть

вот вообще страшное дело намутил  smile 

Код

 if (memo[PageControl1->ActivePageIndex]->Modified)
 {
    if (memo[PageControl1->ActivePageIndex]->Lines->Count>0)
    {
    if (MessageBox(0,"Сохранить содержимое окна редактирования? ",
    "Подтвердите сохранение",MB_YESNO)==IDYES)
    {
    N14Click(Sender);
    }
    }};


вроде при попытке закрыть документ в случае изменения или добавления данных выводит окно, но потом вылетает ошибка 

Автор: Данкинг 10.7.2009, 23:48
Цитата(s1lver @  11.7.2009,  00:42 Найти цитируемый пост)
дык а что там за число такое должно быть

Не знаю, смотри, как объявлен MessageBoxA.

Цитата(s1lver @  11.7.2009,  00:42 Найти цитируемый пост)
но потом вылетает ошибка 

А тут-то какая именно ошибка вылетает?

Автор: s1lver 10.7.2009, 23:49
Что лучше проверить на наличие данных в поле или на модификацию?

Добавлено через 1 минуту и 58 секунд
Цитата

А тут-то какая именно ошибка вылетает? 


Вообще-то не знаю что за ошибка там. При отключенном подавлении ошибок ничего нет, и не происходит, а при включенном вылетает сообщение которое задал в случае ошибки  smile

Добавлено через 3 минуты и 58 секунд
я подозреваю что ошибка происходит вот из-за этих строчек

Код

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{  //при закрытии формы сохраняем значения листа макросов в файл
Form1->ListBox1->Items->SaveToFile("macros/maclist.macsv");


Код

//загружаем в макрос лист значения из файлов
 Form1->ListBox1->Items->LoadFromFile("macros/maclist.macsv");


вот, но ничего умнее придумать не смог

Автор: s1lver 11.7.2009, 00:06
С этим разобрался.  smile 

Подскажите как проверить наличие активных табов? т.е создан ли сейчас таб или нет smile 

Автор: Данкинг 11.7.2009, 00:13
Цитата(s1lver @  11.7.2009,  00:49 Найти цитируемый пост)
При отключенном подавлении ошибок ничего нет, и не происходит, а при включенном вылетает сообщение которое задал в случае ошибки

Как так? smile Если сообщение об ошибках отключено, но ошибка происходит, то транслятор всё равно вываливается же. 

Цитата(s1lver @  11.7.2009,  01:06 Найти цитируемый пост)
Подскажите как проверить наличие активных табов? т.е создан ли сейчас таб или нет 

Не совсем понял. Но в любом случае, можно завести логическую переменную и присваивать ей true при создании этих самых табов (или что там тебе нужно).

Автор: s1lver 11.7.2009, 00:26
Цитата

Как так? smile Если сообщение об ошибках отключено, но ошибка происходит, то транслятор всё равно вываливается же. 


Вообщем ApplicationEvents юзаю ничего не вываливается при работе программы. При компиляции ошибок нет.


Цитата


Не совсем понял. Но в любом случае, можно завести логическую переменную и присваивать ей true при создании этих самых табов (или что там тебе нужно).


Что-то не получается


Код

#pragma resource "*.dfm"
TForm1 *Form1;

int tab =0;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{

}

при проверке

Код


void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{    //проверяем документ перед закрытием
if ([color=red]tab=1[/color]) {
    
 if (memo[PageControl1->ActivePageIndex]->Modified)
 {
    if (memo[PageControl1->ActivePageIndex]->Lines->Count>0)
    {
    if (MessageBox(0,"Сохранить содержимое окна редактирования? ",
    "Подтвердите сохранение",MB_YESNO)==IDYES)
    {
    N14Click(Sender);
    }  
    }}};
}



при добавлении таба

Код

tab =1;


и вот такая ошибка вылазит:

[BCC32 Warning] Unit1.cpp(1723): W8060 Possibly incorrect assignment

Автор: Данкинг 11.7.2009, 00:35
Цитата(s1lver @  11.7.2009,  01:26 Найти цитируемый пост)
и вот такая ошибка вылазит:

[BCC32 Warning] Unit1.cpp(1723): W8060 Possibly incorrect assignment

Это не ошибка, это предупреждение. smile 

Автор: s1lver 11.7.2009, 00:45
Цитата

Это не ошибка, это предупреждение.


Легче от этого не стало  smile 

Автор: Данкинг 11.7.2009, 00:49
Цитата(s1lver @  11.7.2009,  01:45 Найти цитируемый пост)
Легче от этого не стало 

В каком смысле - хочешь сказать, что из-за этого не запускается программа? smile 
Тогда давай более полный код с этим tab =1.

Автор: 586 11.7.2009, 09:11
Цитата
[BCC32 Warning] Unit1.cpp(1723): W8060 Possibly incorrect assignment

В if вместо "==" написали "=".

Автор: s1lver 11.7.2009, 09:37
Цитата
В if вместо "==" написали "=". 


Уф, так не вылетает при отсутствии табов, но зато проверка идет только на модификацию файла, а на создание и добавление нового ее нет smile 

Код

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{    //проверяем документ перед закрытием
if (tab ==1) {
    
 if (memo[PageControl1->ActivePageIndex]->Modified)
 {
    if (memo[PageControl1->ActivePageIndex]->Lines->Count>0) <- вот это пропадает при проверке
    {
    if (MessageBox(0,"Сохранить содержимое окна редактирования? ",
    "Подтвердите сохранение",MB_YESNO)==IDYES)
    {
    N14Click(Sender);
    }  
    }}};

}

Автор: 586 11.7.2009, 10:16
Цитата(s1lver @  11.7.2009,  10:37 Найти цитируемый пост)
а на создание и добавление нового ее нет

После загрузки файла в новую вкладку нужно поставить свойство edit->Modified = false.
При сохранении файла тоже нужно поставить свойство edit->Modified = false.
А проверка
Цитата(s1lver @  11.7.2009,  10:37 Найти цитируемый пост)
if (memo[PageControl1->ActivePageIndex]->Lines->Count>0)

здесь лишняя, т.к. пользователь может открыть файл с текстом, и стереть из него весь текст. Вкладка будет изменена, а предупреждение не будет выдано.

Т.к. табов может быть несколько, следует сделать проверку для нескольких табов. Не понятно, почему проверка делается для одного таба.

Автор: s1lver 11.7.2009, 10:23
Цитата

Цитата(s1lver @  11.7.2009,  10:37 Найти цитируемый пост)
а на создание и добавление нового ее нет

После загрузки файла в новую вкладку нужно поставить свойство edit->Modified = false.
При сохранении файла тоже нужно поставить свойство edit->Modified = false.
А проверка
Цитата(s1lver @  11.7.2009,  10:37 Найти цитируемый пост)
if (memo[PageControl1->ActivePageIndex]->Lines->Count>0)

здесь лишняя, т.к. пользователь может открыть файл с текстом, и стереть из него весь текст. Вкладка будет изменена, а предупреждение не будет выдано.


Спасибо, сейчас попробую сам доделать чтобы не мучить вопросами. smile 

Цитата

Т.к. табов может быть несколько, следует сделать проверку для нескольких табов. Не понятно, почему проверка делается для одного таба.


Вот это момент я упустил...

Автор: 586 11.7.2009, 11:08
Код
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
    CanClose = true;
    for(int i = 0; i < PageControl1->PageCount; ++i)
    {
        if(memo[i]->Modified)
        {
            int code = MessageBox(Handle,
                (String("Сохранить вкладку \"") +
                    PageControl1->Pages[i]->Caption +
                    String("\"?")).c_str(),
                "", MB_ICONQUESTION | MB_YESNOCANCEL);
            if(code == IDCANCEL)
            {
                CanClose = false;
                break;
            }
            if(code == IDYES)
            {
                // save
            }
        }
    }
}

Автор: s1lver 11.7.2009, 16:19
Код

CanClose = true;


что-то не понял что ту происходит?

Автор: Данкинг 11.7.2009, 16:44
Цитата(s1lver @ 11.7.2009,  17:19)
Код

CanClose = true;


что-то не понял что ту происходит?

Разрешение на закрытие формы (и программы в целом). Если false, то программа не закроется.

Автор: s1lver 11.7.2009, 17:16
А два обработчика не будут конфликтовать между собой FormCloseQuery и FormClose ?

Просто в первом идет проверка на модификация а во втором автоматическая запись из листбокса

Автор: s1lver 11.7.2009, 17:38
Спасибо всем за помощь, вопрос решен smile 

Автор: 586 11.7.2009, 17:44
Код, который может блокировать закрытие формы, лучше писать в FormCloseQuery.

Сначала вызывается событие FormCloseQuery, в случае, если CanClose истинно, вызывается FormClose.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)