LabelSum: TLabel

Таблица 1. Значения основных устанавливаемых свойств
Свойство Значение Комментарий
MainForm: TMainForm
Name MainForm Имя переменной для ссылки на форму
Caption Калькулятор Заголовок формы
BorderStyle bsDialog Запрещается растяжение формы
Edit1, Edit2: TEdit
Text Вводимые значения по умолчанию
ButtonCalc: TButton
Caption Вычислить Текст на кнопке
Default True Указывается, что нажатие клавиши Enter в любом месте формы, кроме кнопок, трактовалось как нажатие на эту кнопку
ButtonExit: TButton
Caption Выход Текст на кнопке
Cancel True Указывается, что нажатие клавиши Esc в любом месте формы трактуется как нажатие на эту кнопку
Label1: Tlabel
Caption Введите два числа: Текст приглашения для ввода чисел
Label2: TLabel
Caption Сумма: Комментарий к выводимому значению
Label3: TLabel
Caption Произведение: Комментарий к выводимому значению
     
Caption Значение суммы по умолчанию
LabelProduct: TLabel
Caption Значение произведения по умолчанию

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

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

Для создания обработчика какого-либо события необходимо выбрать мышкой нужный компонент, выбрать в инспекторе объектов закладку Events, найти требуемое событие и дважды щелкнуть на нем мышкой.

Замечание

Не пишите пустые заготовки сами - они не будут вызываться при выполнении программы!

При создании нового обработчика Delphi создает в программном модуле, соответствующем данной форме, пустую заготовку процедуры обработки события примерно в таком виде:
procedure Т<Имя_формы>.<Имя_компонента><Имя_события>(Sender: TObject);
begin

end;

Пока эта процедура пустая, но в дальнейшем она должна быть заполнена программистом необходимым кодом, который будет вызываться в ответ на указанное событие. При этом в форме в качестве специального свойства компонента будет установлено соответствие между выбранным событием и именем созданной процедуры. Поэтому, если самостоятельно написать в тексте кода соответствующие процедуры-обработчики без инспектора объектов, они никогда не будут вызваны. Однако, если у вас уже написаны нужные процедуры, то вы можете в инспекторе объектов указать это имя для нужного события с помощью выпадающего списка, появляющегося при нажатии кнопки справа от имени события (рис. 4).

В нашем приложении необходимо создать два обработчика события в ответ на нажатия кнопок ButtonCalc («Вычислить») и ButtonExit («Выход»). Такое событие для компонента типа TButton называется OnClick. В ответ на двойной щелчок в инспекторе объектов на месте значения обработчика этого события Delphi сформирует следующие заготовки:
procedure TMainForm.ButtonCalcClick(Sender: TObject);

begin

end;

procedure TMainForm.ButtonExitClick(Sender: TObject);

begin

end;

Замечание

Не создавайте все пустые заготовки сразу. При сохранении формы Delphi найдет все пустые обработчики событий, удалит их, и вам придется их создавать заново.

Формальный параметр Sender является указателем на породивший событие компонент. Он может использоваться в случае, если один обработчик событий назначен для нескольких разных компонентов. В данной работе он нам не понадобится, но будет использоваться в последующих.

Итак, теперь осталось заполнить полученные заготовки обработчиков необходимым кодом. В листинге 1 приведен полный текст программного модуля вместе с обработчиками событий.

В первом обработчике - процедуре ButtonCalcClick - выполняется извлечение чисел из строк ввода Editl и Edit2, которые затем складываются и перемножаются и выводятся в метках LabelSum и LabelProduct. Обратите внимание, что строки ввода типа TEdit предназначены для ввода текстовых значений, поэтому эти значения необходимо преобразовать в числа. Это выполняется с помощью функции StrToFloat. Так как не любая строка может быть преобразована в число, то при вызове данной функции возможно возникновение ошибок, называемых в Delphi исключениями (exception). Примерами исключений могут служить арифметические ошибки (переполнение, деление на ноль, извлечение квадратного корня из отрицательного числа), файловые ошибки (попытка открытия несуществующего файла, попытка записи в защищенный от записи файл), системные ошибки (обращение в памяти по несуществующему адресу, переполнение системного стека, нехватка памяти) и т.д. В нашем случае функция StrToFloat может вызвать ошибку преобразования строки в число, если в строке присутствуют недопустимые символы (например, недопустимы следующие строки: «0,12,1», «1-2», «ABC», «»).

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

Для отлавливания исключений в языке Object Pascal служит конструкция try...except...end. Она гарантирует, что если в блоке кода между try и except возникнет исключение, то управление будет передано обработчику исключений между except и end. Если же исключений не возникнет, то обработчик не будет вызван.

Другой вид конструкции для работы с исключениями - конструкция try...finally...end. Она гарантирует, что код между finally и end будет выполнен вне зависимости от того, возникали ли какие-либо ошибки в участке кода между try и finally.

В нашем случае в качестве обработчика ошибок преобразования строки в число имеет смысл указать действие о необходимости переключиться на строку ввода, содержащую ошибочное число (команда Editl.SetFocus), выдать сообщение об ошибке (команда ShowMessage ('Ошибка в первом числе');) и прекратить дальнейшее выполнение обработчика события (команда exit;).

Если оба преобразования строк в числа пройдут успешно, то далее можно выполнить сложение и умножение полученных чисел, а затем вывести их в текстовые метки LabelSum и LabelProduct. Эти метки имеют свойство Caption строкового типа, выводимое на экран. Поэтому после выполнения арифметических операций необходимо преобразовать полученные числа в строковое представление с помощью функции FloatToStr.

Второй обработчик - процедура ButtonExitClick - предназначен для закрытия формы и завершения работы. Для этого достаточно вызвать метод Close формы.

После написания обработчиков событий программа готова к выполнению. Это можно сделать с помощью команды меню Run|Run или с помощью клавиши F9. На рис. 5 приведен внешний вид готового приложения. Как и в любом приложении Windows, для перехода по элементам можно использовать клавишу Tab. для вычисления суммы можно воспользоваться клавишей Enter, а для выхода из калькулятора - Esc.

В заключение кратко рассмотрим текст всего сформированного программного модуля в целом.

Любой модуль (unit) на языке Object Pascal состоит из двух секций: интерфейсной и реализации. Их начала соответственно определяются ключевыми словами interface и implementation. Ключевое слово uses определяет список других используемых модулей. Для удобства программиста Delphi включает в код программы небольшой список основных наиболее используемых при разработке модулей, таких как Windows (процедуры для работы с Windows на нижнем уровне), SysUtils (базовые процедуры Delphi), Classes (определения основных классов), Graphics (работа с графикой), Controls (базовые определения визуальных компонент), Forms (работа с формами), Dialogs (процедуры для вывода простейших диалоговых форм).

Любая форма с точки зрения Delphi является классом языка Object Pascal, поэтому после ключевого слова type идёт описание класса, соответствующего форме, а после слова var следует объявление переменной, ссылающейся на форму. Так как форма является классом, то нам ничто не мешает создавать по мере необходимости любое количество реальных экземпляров форм и выводить на экран одновременно множество одинаковых окон.

В начале секции implementation присутствует директива {$R *.DFM}, которая говорит компилятору о необходимости связать в конечном выполняемом файле Windows (с расширением .ехе) модуль кода (файл с расширением .pas) и файл описания формы (расширение .dfm).



r.php"; ?>