Шаг 6.
Библиотека OWL.
Закрытие окна. Функция CanClose()

    На этом шаге мы рассмотрим использование функции CanClose().

    Целью любой программы является обработка данных. К примеру, текстовый процессор обрабатывает текстовые файлы, а электронная таблица обрабатывает значения и формулы по различным алгоритмам для выполнения финансовых расчетов. Вся эта обработка данных означает: когда пользователь заканчивает работу, данные, связанные с окном, почти наверняка подвергаются каким-либо изменениям. Вот почему каждое профессионально выполненное приложение напоминает пользователю о необходимости сохранить измененный файл.

    Любой объект OWL-программы, так же, как и любое окно, производное от TWindow, содержит функцию CanClose(), которая автоматически вызывается, когда пользователь пытается закрыть приложение или окно. Функция CanClose() приложения вызывает CanClose() основного окна, а та, в свою очередь, - CanClose() каждого дочернего окна. Прежде, чем приложение или окно закрывается, каждая функция CanClose() должна возвратить TRUE.

    Если CanClose() для ваших оконных классов не определена, то CanClose() класса TWindow возвращает TRUE, не выполняя никаких действий. Поэтому, если вы хотите защитить данные пользователя, необходимо переопределить CanClose() для каждого оконного класса, состояние которого требует проверки перед закрытием. В следующем примере показано, как это сделать.

#include <owl\applicat.h>
#include <owl\framewin.h>

// Класс приложения.
class TApp : public TApplication
{
  public:
   TApp(): TApplication() {}
   void InitMainWindow ();
};

// Класс главного окна.
class TWndw : public TFrameWindow
{
  public:
    TWndw (TWindow *parent, const char far *title);
  protected:
    BOOL CanClose();
};

// Реализация класса TWndw.
// TWndw::TWndw() - это конструктор главного окна.
TWndw::TWndw(TWindow *parent, const char far *title):
	 TFrameWindow(parent, title)
{
  // Задать размер и расположение окна.
  Attr.X = 100;
  Attr.Y = 100;
  Attr.W = 400;
  Attr.H = 300;
}

// TWndw::CanClose{}
// Эта функция, переопределяющая функцию CanClose()
// базового класса, позволяет пользователю
// подтвердить, что он хочет закрыть основное окно.
// Закрытие главного окна влечет закрытие всей программы.
BOOL TWndw::CanClose()
{
  //Переспросить пользователя, можно ли закрывать окно
  int result = MessageBox("Вы действительно хотите закрыть окно?",
			"Закрытие окна", MB_YESNO | MB_ICONQUESTION );

  //Если CanClose() возвращает TRUE, окно закроется.
  if (result==IDYES) return TRUE;
  else return FALSE;
}

//Создание главного окна приложения.
void TApp::InitMainWindow()
{
  TFrameWindow *wndw = new TWndw(0, "Демонстрация использования функции 
             CanClose()");
  SetMainWindow(wndw);
}

int OwlMain(int, char* [])
{
  return TApp().Run();
}
Текст этой программы можно взять здесь.

    Окно, создаваемое в результате работы программы, показано на рисунке 1.


Рис.1. Результат работы приложения

    Все в этом примере должно быть вам знакомо - все, за исключением функции CanClose() класса TWndw:

BOOL TWndw::CanClose()
{
  //Переспросить пользователя, можно ли закрывать окно
  int result = MessageBox("Вы действительно хотите закрыть окно?",
			"Закрытие окна", MB_YESNO | MB_ICONQUESTION );

  //Если CanClose() возвращает TRUE, окно закроется.
  if (result==IDYES) return TRUE;
  else return FALSE;
}

    Когда пользователь пытается закрыть окно или завершить приложение, вызывается функция CanClose(). В этой функции окно сообщений спрашивает пользователя, действительно ли он хочет закрыть окно. Если пользователь нажимает клавишу Да, CanClose() возвращает TRUE, и программа закрывает окно. Если пользователь нажимает кнопку Нет, CanClose() возвращает FALSE, и программа оставляет все, как есть.

    Разумеется, представленная выше версия CanClose() - только учебный пример. Для практического применения она ценности не имеет. В реальной программе у вас будет флаг, который отслеживает, изменял ли пользователь данные в окне. Если этот флаг равен TRUE в момент вызова CanClose() (что означает: все изменения были сохранены), вы закрываете приложение без отображения окна сообщений. Если флаг установлен в FALSE, вы спрашиваете пользователя, не желает ли он сохранить текущий файл. Следует не только предоставить возможность сохранить файл, но и возможность отменить команду Close, если она была сделана случайно. Такие окна сообщений обычно содержат кнопки Да, Нет и Отмена. В этом случае функция CanClose() может может быть реализована следующим образом:

BOOL TWndw::CanClose()
{
  if (saveFlag) return TRUE;
  int result = MessageBox("Файл был изменен. Сохранить изменения?",
                        "Закрытие окна", MB_YESNOCANCEL | MB_ICONQUESTION );
  if (result == IDYES) 
  {
    SaveFile();
    return TRUE;
  }
  else
    if (result == IDNO)  return TRUE;
    else return FALSE;
}

    На следующем шаге мы приведем пример законченного приложения.




Предыдущий шаг Содержание Следующий шаг