Пользовательские процедуры и функции
Пользовательские процедуры и функции могут быть записаны в процедуре обработчика какого-либо события. В этом случае эти подпрограммы могут быть вызваны только из этого обработчика события. Если необходимо, чтобы пользовательская процедура или функция была доступна из любой процедуры модуля, то надо в интерфейсной части модуля в секции Public класса TForm1 объявить прототип подпрограммы, а в секции реализации записать тело подпрограммы. Например, для создания функции вычисления факториала, надо выполнить следующие действия:
· в секции Public класса TForm1 записываем заголовок функции:
Function Factorial(N:Integer):int64;
· далее надо поставить курсор в любое место заголовка и нажать три клавиши: Ctrl+Shift+C;
· в разделе Implementation появится пустая заготовка описания функции:
function TForm1.Factorial(N:Integer):Int64;
begin
….
end;
· в пустую заготовку надо добавить операторы, вычисляющие n!:
Function Tform1.Factorial(N:Integer):Int64;
Var I:Integer;
Begin
Result:=1;
For I:=2 to N do
Result:=Result*I
end;
В данном случае функция Factorial принадлежит TForm1 и, следовательно, является методом данного класса.
Процедура ShowMessage
Сообщения, появляющиеся при работе программы, можно разделить на те, которые программист предусмотрел, и системные сообщения, например, при попытке закрыть не сохраненный проект. Второй тип сообщений, особенно при указании ошибок, часто имеет непонятный для обычного пользователя вид. Желательно самостоятельно просчитывать все возможные случаи и самостоятельно обрабатывать эти ситуации.
Можно разделить все программные сообщения на: информационные сообщения ("Загрузка данных завершена"), предупреждающие сообщения ("Файл модифицирован. Сохранить?"), сообщения об ошибке ("Файл данных не найден").
Сообщение можно вывести с помощью процедуры ShowMessage (const Msg: String). Эта процедура выводит окно с сообщением и кнопкой OK. В заголовке окна содержится название исполняемого файла. Изначально это Project1, в дальнейшем его можно изменить. Строка Msg будет выводиться как текст сообщения.
Например,
ShowMessage('Привет!');
Результат представлен на рис.20.
Рис. 20
На этой команде работа процедуры (не всей программы!) приостанавливается. Пока пользователь не нажмет на кнопку Ok, работа с приложением становится невозможным, т.е. нельзя «добраться» до окна, расположенного позади, т.е. это сообщение открывается модально.
Функция MessageDlg
MessageDlg (Msg, AType, Abuttons, HelpCtx) - функция, типа Integer, показывающая в центре экрана диалоговое окно сообщения и дающая возможность пользователю ответить на сообщение.
Msg - параметр типа String, отвечающий за выводимый текст сообщения.
Параметр AType может принимать одно из несколько значений. От этих значений зависит содержимое заголовка и иконка в левом верхнем углу окна (табл. 19).
Таблица 19
Тип сообщения | Описание | Вид окна |
mtWarning | Можно использовать в предупреждающих сообщениях. Например, "Вы действительно желаете удалить данные?" | |
mtError | Обычное окошко вывода сообщения об ошибки. | |
mtInformation | Какая-нибудь информация. | |
mtConfirmation | Это запрос. Например, запрос на сохранение перед выходом. | |
mtCustom | Это сообщение полностью аналогично ShowMessage |
AButtons - параметр, который задает набор кнопок в окне и может принимать произвольные комбинации из значений:
§ кнопка Yes - mbYes,
§ кнопка Ok - mbOk,
§ кнопка No - mbNo,
§ кнопка Cancel - mbCancel,
§ кнопка Abort - mbAbort,
§ кнопка Retry - mbRetry,
§ кнопка Ignore - mbIgnore,
§ кнопка All - mbAll,
§ кнопка Help - mbHelp.
Список из необходимых перечисленных кнопок должен быть заключен в квадратные скобки.
MessageDlg('Большое значение', mtConfirmation, [mbYes, mbNo],0 );
Кроме перечисления отдельных кнопок, есть возможность задать часто используемым сочетаниям кнопок значения специальных констант:
§ кнопки OK и Cancel - mbOkCancel,
§ кнопки Yes, No и Cancel - mbYesNoCancel,
§ кнопки Abort, Retry и Ignore - mbAbortRetryIgnore.
Эти константы не надо брать в скобки, так как они являются предопределенными множествами.
Поскольку кнопки в сообщении могут быть разные, то MessageDlg является функцией, возвращающей результат нажатой кнопки. Соответственно указанным выше кнопкам результат может принимать следующие значения:
mrYes = 6
mrNo = 7
mrOK = 1
mrCancel = 2
mrAbort = 3
mrRetry = 4
mrIgnore = 5
mrAll = 8
Кнопка Help не имеет никакого эквивалентного возвращаемого значения, потому что она не заканчивает диалог. Параметр HelpCtx задает тему справки. Ее можно вызвать во время показа диалогового окна клавишей F1. Обычно этот параметр устанавливается равным нулю и справка не выводится.
Пример 6.1. Необходимо спросить у пользователя о дальнейших действиях перед выходом из программы:
· Сохранить файл;
· Не сохранять файл;
· Продолжить редактирование (рис. 21)
………………….
Var R:Integer; // переменная, в которой хранится результат
R:=MessageDLG('Сохранить файл?', mtConfirmation, [mbYes,mbNo,mbCancel],0);
If R=mrYes Then // если нажата кнопка Yes
Begin
… // сохраняем файл и завершаем программу
End;
If R=mrNo Then // если нажата кнопка No
Begin
… // завершаем работу программы без сохранения
End;
If R=mrCancel Then // если нажата кнопка Cancel
Begin
… // продолжаем работу без сохранения
End;
или
Var R:Integer; // переменная, в которой хранится результат
R:=MessageDLG('Сохранить файл?', mtConfirmation, [mbYes,mbNo,mbCancel],0);
Case R of
6: Begin // если нажата кнопка Yes
… // сохраняем файл и завершаем программу
End;
7: Begin // если нажата кнопка No
… // завершаем работу программы без сохранения
End;
2: Begin // если нажата кнопка Cancel
… // продолжаем работу без сохранения
End;
End;
Рис. 21
Функция InputBox
InputBox(ACaption, APrompt, ADefault) – функция типа String, выводящая на экран диалоговое окно для ввода строки пользователем.
Параметр ACaption определяет заголовок диалогового окна.
APrompt – текст, который будет отображен над полем редактирования (подсказка пользователю о том, что конкретно необходимо ввести в поле редактирования).
В параметре ADefault указывается строка, которая по умолчанию будет отображаться при вызове диалогового окна в поле редактирования текста.
Если пользователь нажимает кнопку OK, то функция возвращает строку, введенную в поле редактирования. Если пользователь нажимает кнопку Cancel или клавишу клавиатуры Esc, то функция возвращает строку, определенную по умолчанию (ADefault). Если в программе необходимо определить, какую конкретно из кнопок (OK или Cancel) нажал пользователь, то в таком случае надо использовать функцию InputQuery.
Например:
var fio : string; age: integer;… fio := InputBox('ФИО', 'Как Вас зовут', 'Не задано'); age := StrToInt(InputBox('Возраст', 'Сколько Вам лет',' '));…Вид диалоговых окон показан на рис.22 (а, б). а бРис. 22
Классы общего назначения