Взаимодействие приложения с пользователем присутствует в каждой программе. Приложение должно иметь возможность сообщить пользователю о том или ином развитии событий, предоставить возможность принять решение и сообщить его программе. Для этого Delphi предоставляет программисту несколько способов, в зависимости от необходимого уровня взаимодействия приложения с пользователем в каждом конкретном случае.
Функция ShowMessage
Простейший случай такого взаимодействия — просто проинформировать пользователя. Ну хотя бы о том, что в процессе вычисления произошло деление на нуль. Простое информационное сообщение укажет пользователю на необходимость внести изменение в данные расчёта. Для создания простого информационного сообщения служит встроенная функция ShowMessage:
ShowMessage(‘На нуль делить нельзя!’);
Функция ShowMesage допускает выведение сообщения в несколько строк. Для этого нужно воспользоваться стандартными символами перехода на другую строку: #10#13:
ShowMessage(‘возникла ошибка деления на нуль.’+#10#13+’Исправьте введённые данные.’);
Delphi создание приложения
Пример.
Вот как может выглядеть программа, вычисляющая результат деления двух чисел, с организацией выдачи информации пользователю о неправильном вводе данных:
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:
Программирование в Delphi / Урок 1. Знакомство со средой разработки. Приложение «Привет, мир!»
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.
Однако, что-то менять в стандартных модулях 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-manual.ru
Добавление к проекту диалогового окна «о программе»
Прежде чем создавать обработчик нажатия кнопки «О программе», необходимо создать само диалоговое окно «О программе». Для этого можно разработать новую форму «с нуля», но проще воспользоваться имеющимся в Delphi шаблоном.
- Добавим в наше приложение диалоговое окно «О программе»:
- Выберите из меню команду File | New | Other…, в открывшемся диалоговом окне перейдите на вкладкуForms, выберите элементAboutBoxи нажмитеOK. В результате к нашему проекту добавляется новая форма с именемAboutBox и соответствующей ей модуль с именемUnit2.
- Установим нужные свойства у элементов формы:
- Выберите форму, найдите в Инспекторе объектов свойствоCaption и введите“Опрограмме” вместоAbout.
- Выберите картинку (объект ProgramIcon), найдите свойствоPicture, нажмите на кнопку[…], в появившемся диалоговом окне Picture Editor нажмите кнопкуLoad и выберите какое-нибудь подходящее графическое изображение для вашей программы (например, можно воспользоваться стандартными картинками, поставляемыми сDelphi, которые по умолчанию находятся в папкеC:Program FilesCommon FilesBorland SharedImagesSplash256Color) и нажмите кнопкуOK.
- Измените названия всех меток так, чтобы они содержали осмысленные надписи на русском языке. Используйте различные шрифты(свойствоFont) для придания тексту большей выразительности. В результате у вас должно получиться форма примерно следующего вида:
- Сохраним сделанные изменения в проекте:
- Нажмите кнопку Save All и сохраните модульUnit2 в папке, где находятся другие файлы вашего проекта.
Создание обработчика для кнопки «о программе»
- Переключитесь на главную форму приложения. Если она видна, вы можете щелкнуть мышью по главной форме или же нажать кнопку View Forms (Shift + F12) и выбрать из списка формуForm1.
- Выберите из меню команду File | Use Unit…,в появившемся окне выберитеUnit2 и нажмитеOK. Это делается для того, чтобы добавить к исходному тексту модуляUnit1 строчку“uses Unit2”, которая говорит компилятору, что все переменные, объявленные в секцииinterface модуляUnit2 (в частности, переменная формыAboutBox), видны и доступны из модуляUnit1.
- Создайте обработчик для кнопки «О программе», дважды щелкнув по этой кнопке на форме. Delphi сгенерирует заготовку для обработчика события с именемButton4Click.
- Напишите единственную строчку, которая осуществляет вызов диалогового окна «О программе»:
- Запустите программу на выполнение и убедитесь, что обработчик кнопки «О программе» работает правильно.
Источник: studfile.net
Урок 11 — Знакомство с компонентами (часть 2/12)
Продолжаем знакомство с компонентами. Открываем наш предыдущий проект и начинаем модернизировать калькулятор, как я и обещал.
Кидаем на форму компонент ListBox. Он находится на вкладке Standard правее компонента RadioButton. У компонента ListBox есть свойство Items, если его открыть, то появляется окошко для редактирования строк. Например если написать 1 в первой строке и 2 во второй, то в ListBox сразу появятся эти строки.
Теперь откройте свойство Items еще раз и сотрите всё, что написали в окошке редактирования строк.
После краткого знакомства с компонентом ListBox, нужно его задействовать в нашем калькуляторе. ListBox будет выполнять функцию лога (журнала), он будет записывать результат в новую строку каждый раз, когда будет нажата кнопка «Посчитать».
Чтобы это осуществить, переходим в процедуру Button1Click и пишем код в самом конце:
ListBox1.Items.Add(Label1.Caption);
То есть, когда пользователь нажмет на кнопку, после всех вычеслений добавляется новая строка с содержимым лейбла в самый конец компонента ListBox.
Теперь добавим возможность пользователю отключить ведение лога. Для этого добавьте на форму компонент CheckBox. Он находится на вкладке Standard левее компонента RadioButton. CheckBox схож с компонентом RadioButton, только при выделении ставится галочка, а не кружок.
Если мы поместим на форме четыре компонента CheckBox, то поставить галочку можно на всех, что нельзя сделать с RadioButton. В этом и есть вся разница этих компонентов.
Изменим свойство Caption у CheckBox на Вести лог и теперь научим его управлять логом. Для этого нужно написать условие: если галочка стоит, то записывать результат в лог, если галочка не стоит, то соответственно не записывать.
if (CheckBox1.Checked = True) Then ListBox1.Items.Add(Label1.Caption);
Вот и готово, скомпилируйте и проверьте!
Нашей программе еще не хватает главного меню, которое вы можете наблюдать во многих программах и даже в самом Delphi.
Кидаем на форму компонент MainMenu (он находится на вкладке Standard) и кликаем по нему 2 раза. Должно появится окошко редактирования меню.
Теперь переходим в Object Inspector, меняем свойство Caption на Файл и нажимаем клавишу Enter. Мы сразу можем видеть, как появилось меню в нашей программе.
Теперь нажимаем на Файл в редакторе меню и выделяем прямоугольник ниже.
Сейчас опять переходим в свойство Caption, изменяем его на Посчитать и кликаем Enter. Снова кликаем на прямоугольник ниже и переименовываем его на Выход. Далее кликаем на прямоугольник правее от Файл и изменяем у него Caption на Помощь. Теперь нажимаем на Помощь в редакторе меню, выделяем прямоугольник ниже и меняем свойство Caption на О программе.
Таким образом, мы создали простейшее меню, но оно пока не работает.
- Создать процедуру N2Click (N2 — это имя кнопки в меню) и скопировать в нее весь код, который мы написали в процедуре Button1Click
- Поступить по умному и ничего не копировать, а просто указать Delphi, что нужно выполнить процедуру Button1Click по клику на кнопке в меню N2
Компилируем и проверяем работу меню. У меня всё отлично, все работает и компилируется без ошибок.
Кнопку Выход (в меню) я думаю вы «оживите» сами. По этому сразу переходим к кнопке О программе. Когда мы нажмем на эту кнопку, у нас вылезет окошко с информацией о программе и его авторе. Для этого создадим вторую форму. Создается она очень легко, нажатием на кнопку New Form в главном окне Delphi.
Далее кидаем на вторую форму компонент Label и пишем в него информацию о программе. Кстати, у лейбла есть очень хорошее свойство WordWrap, которое позволяет переносить слова на новую строку, если они не влезают в ширину.
После того, как мы оформили вторую форму, ее надо показать пользователю, когда он нажмет на кнопку О программе в главном меню.
Переходим к первой форме, нажатием на закладку соответствующего юнита в окне редактора кода (Unit1 — первая форма, Unit2 — вторая форма).
-
Первый способ — это когда можно спокойно перемещаться между формами, то есть, если мы открыли вторую форму, то мы можем переключится на первую и поработать в ней.
Form2.Show;
Form2.ShowModal;
Это окно предлагает добавить вторую форму в юнит первой. Нажмите кнопку «Yes». Добавить можно было вручную, дописав в Uses слово Unit2, но зачем, если delphi это может сделать за нас? 🙂
Идем далее и теперь мы сделаем контекстное меню, оно будет появляться, когда мы нажмем на форму правой кнопкой мыши. Кидаем на форму компонент PopupMenu (он находится на вкладке Standard), кликаем по нему 2 раза и настраиваем его вот так:
Теперь выделяем первую форму и в свойстве PopupMenu выбираем наш компонент PopupMenu1. Сейчас осталось «оживить» кнопки в контекстном меню. Я надеюсь, что вы с этим справитесь сами. На этом я завершаю этот урок и прошу вас сохранить проект. Если что-то не понятно, пишите в комментарии, обязательно постараюсь помочь!
Ну вот и всё! Удачи!
Встретимся в следующем уроке!
Источник: thedelphi.ru