Диалоги

Организация взаимодействия приложения с пользователем




Уроки Delphi
  1.  Первая программа
  2.  Использование компонентов
  3.  События Delphi
  4.  Типы данных Delphi
  5.  Создание своих типов данных
  6.  Выражения и операторы
  7.  Работа с файлами в Delphi
  8.  Дополнительные формы
  9.  Подпрограммы в Delphi
  10. Исключительные ситуации
  11. Взаимодействие приложения с пользователем
  12. Указатели в Delphi
  13. Обзор компонентов
  14. Работа со строками
  15. Создание интерфейса
  16. Графика в Delphi
  17. Многопоточность в Delphi
  18. Динамическое создание
        компонентов
Поиск по сайту




 Это важно:
   Метод Application.ProcessMessages;

 Это полезно:
   Параметр Sender в обработчиках событий;










Бояться не надо



   Взаимодействие приложения с пользователем присутствует в каждой программе. Приложение должно иметь возможность сообщить пользователю о том или ином развитии событий, предоставить возможность принять решение и сообщить его программе. Для этого Delphi предоставляет программисту несколько способов, в зависимости от необходимого уровня взаимодействия приложения с пользователем в каждом конкретном случае.

Функция ShowMessage

   Простейший случай такого взаимодействия - просто проинформировать пользователя. Ну хотя бы о том, что в процессе вычисления произошло деление на нуль. Простое информационное сообщение укажет пользователю на необходимость внести изменение в данные расчёта. Для создания простого информационного сообщения служит встроенная функция ShowMessage:

  ShowMessage('На нуль делить нельзя!');

  Функция ShowMesage допускает выведение сообщения в несколько строк. Для этого нужно воспользоваться стандартными символами перехода на другую строку: #10#13:

  ShowMessage('возникла ошибка деления на нуль.'+#10#13+'Исправьте введённые данные.');

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

procedure TForm1.Button1Click(Sender: TObject);
var x, y: Integer;
begin
try
  x:=StrToInt(Edit1.Text);
  y:=StrToInt(Edit2.Text);
  if y=0 then
    begin
      ShowMessage('На ноль делить нельзя!'+#10#13+'Исправьте ввод.');
      Edit2.SetFocus;
      exit;
    end;
  Label3.Caption:='Значение: '+FloatToStr(x/y);;
except
  ShowMessage('Должны быть введены целые числа, исправьте!');
  Edit1.SetFocus;
end;
end;


   Данная программа предупреждает пользователя как о вводе нуля, так и вообще о введении нечисловых данных или нецелых чисел. Информационное окошко выводится в модальном режиме, то есть, при выдаче сообщения работа программы прерывается, и продолжится только после закрытия окна с оператора, следующего за вызовом функци ShowMessage:






Функция MessageDlg

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

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

function MessageDlg(const Msg: String; DlgType: TMsgDlgType;
  Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;

Параметры функции MessageDlg:
   Msg - выводимое сообщение, с возможностью вывода в несколько строк, DlgType - тип диалога, например "Опасность, Ошибка, Информация, Подтверждение", и т.д., Buttons - множество кнопок с соответствующими заголовками, HelpCtx - в большинстве случаев можно использовать "0" - ноль. Для каждого из типов диалога выводится своя пиктограмма, что, несомненно, прибавляет красочности и информативности окну, выводимому данной функцией.

   Для того чтобы получить более полную информацию о параметрах, воспользуйтесь справкой Delphi: нажмите CTRL и щёлкните мышкой по функции или нужному параметру. Откроется модуль с полным описанием.

   Функция MessageDlg возвращает значение, соответствующее данному пользователем ответу на вопрос. Это значение несложно получить в целую переменную и проанализировать, перед тем как использовать в программе. Например, нажатие на кнопку "Yes" возвращает значение "6", результат нажатия любых других кнопок также несложно получить.

   Например, для того чтобы организовать диалог закрытия приложения, программа может использовать такой вариант функции MessageDlg:

  Result:=MessageDlg('Вы действительно хотите закрыть приложение?', mtConfirmation, [mbYes, mbNo], 0);
  if Result=6 then Application.Terminate;

Пример.
   Организуем диалог, запрашивающий у пользователя разрешение сохранить изменения в текстовом редакторе в файл перед закрытием приложения:

procedure TForm1.Button1Click(Sender: TObject);
var Result: Integer;
begin
if Memo1.Modified
  then Result:=MessageDlg('Сохранить изменения?', mtConfirmation, [mbYes, mbNo, mbCancel], 0);
case Result of
  2: exit;//Нажатие "Cancel", выходим из функции, без закрытия приложения
  6: Memo1.Lines.SaveToFile('ИмяФайла.txt');//Нажатие "Yes", сохраняем файл
  7: ;//Нажатие "No", ничего не делаем
else exit;//Если окно закрыли нажатием на "крестик" в заголовке - тоже выходим без закрытия приложения
end;
Application.Terminate;//Закрываем приложение
end;



   Видим, что по сравнению с функцией ShowMessage функция MessageDlg имеет более развитый интерфейс. Можно управлять заголовком окна, пиктограмой выводимой в том или ином типе запроса, и набором кнопок, позволяющим получить и проанализировать ответ пользователя. Пользуясь этим, функцию MessageDlg с успехом можно использовать вместо функции ShowMessage.

Русификация функции MessageDlg

   Конечно, такие заголовки кнопок как, например, "Yes", "No", "Cancel" давно стали стандартом и понятны пользователям без перевода. Однако, применяя функцию MessageDlg в программе, где все остальные надписи выводятся на русском языке, можно видеть что английский интерфейс её окна смотрится чужеродно. Воникает вопрос, как можно русифицировать заголовок окна и названия кнопок такой удобной и полезной функции как MessageDlg.

   Есть несколько способов сделать это. Заголовок и названия кнопок функции MessageDlg берутся из модуля consts.pas и при компиляции помещаются в ресурсы приложения. Поэтому, изменив данные константы в упомянутом модуле, и перекомпилировав приложение, мы получим вполне себе русскоязычное окно, выводимое функцией MessageDlg.

   Однако, что-то менять в стандартных модулях Delphi не всегда правильно. Есть другой способ, связанный с динамическим формированием функции MessageDlg. Этот способ позволяет перед выводом на экран динамически изменить параметры функции. Вот как, пользуясь этим способом, можно русифицировать запрос на сохранение текста в предыдущей программе:

procedure TForm1.Button1Click(Sender: TObject);
begin
if Memo1.Modified then
with CreateMessageDialog('Сохранить изменения?', mtInformation, [mbYes, mbNo, mbCancel]) do
try
  Caption := 'Запрос на сохранение';//Изменение заголовка окна
  (FindComponent('Yes') as TButton).Caption := 'Да';//Русификация кнопки "Yes"
  (FindComponent('No') as TButton).Caption := 'Нет';//Русификация кнопки "No"
  (FindComponent('Cancel') as TButton).Caption := 'Отмена';//Русификация кнопки "Cancel"
  ShowModal;//Вызов диалогового окна в модальном режиме
  case ModalResult of//Анализ результата закрытия модального диалогового окна
    2: exit;
    6: Memo1.Lines.SaveToFile('ИмяФайла.txt');
    7: ;
  else exit;
  end;
finally
  Free;
end;
Application.Terminate;
end;




Исключительные ситуации           В начало урока          Указатели в Delphi  

Уроки Delphi начинающим



Вопросы и комментарии (2)      Решение задач в Delphi

Оставить комментарий:

Имя  

Текст комментария