Среда визуального программирования Delphi
Программирование как область деятельности бурно
развивается. Если несколько лет назад о создании своих собственных программ
под Windows рядовому программисту оставалось только мечтать, так
как практически единственным инструментом разработки ориентированных на работу
в Windows программ был Borland C++ for Windows,
явно предназначенный для профессионалов, то сейчас, благодаря появлению Delphi,
возможность создания программ под Windows стала реальностью.
Примечание: Справедливости ради следует
упомянуть о Microsoft Visual Basic,
как об удобном и достаточно мощном средстве разработки программ под Windows.
Однако для большинства программистов Basic остается языком для
начинающих и поэтому, как они считают, не заслуживающим внимания. Хотя с
последним можно поспорить и не согласиться
В основе идеологии Delphi
лежат технологии визуального проектирования и событийного программирования,
применение которых позволяет существенно сократить время разработки и облегчить
процесс создания приложений — программ, работающих в среде Windows.
Примечание: Дальнейшее изложение
предполагает, что читатель знаком с основными терминами и понятиями Windows и
имеет навыки пользовательской работы в Windows.
Запуск Delphi
Чтобы начать работу, надо
раскрыть группу Delphi и сделать двойной щелчок на пиктограмме Delphi,
означающей среду программирования.
Вид экрана после запуска Delphi
несколько необычен: вместо одного появляются три окна: главное окно, окно
формы и окно инспектора объектов (рис. 43).
Примечание: Чтобы окно Диспетчер программ не мешало работе,
сверните главное окно Delphi-окно с
заголовком Delphi-Project1, при этом свернутся все три окна Delphi, затем сверните окно Диспетчер программ и
восстановите окно Delphi.
В главном окне (рис. 44) находится меню команд Delphi, панель
инструментов и палитра компонентов.
Рис. 43. Вид экрана после запуска Delphi
Меню команд
Панель инструментов Палитра компонентов
Окно формы (его заголовок Form1) представляет собой заготовку — макет
одного из окон разрабатываемого
приложения.
Окно Инспектора объектов
(его заголовок Object Inspector) позволяет видеть и менять
характеристики (свойства) объектов проекта. После запуска Delphi в этом
окне находятся свойства формы Form1.
Первый проект
Для демонстрации возможностей Delphi и технологии визуального
проектирования займемся разработкой программы решения квадратного уравнения.
Работа над новым проектом — так
в Delphi называется разрабатываемое
приложение, начинается с создания стартовой
формы — окна, которое появляется при запуске приложения.
Форма
приложения
Стартовая форма создается путем изменения свойств (характеристик) формы Form 1. Свойства формы определяют ее внешний вид: размер, положение на экране,
текст заголовка, вид рамки. Они перечислены на вкладке (странице) Properties (Свойства) окна Object Inspector. В левой
колонке перечислены имена свойств, в правой — их значения.
Сначала надо изменить значение свойства Caption (Заголовок) —
заменить текст "Form1" на текст "Решение
квадратного уравнения". Для этого нужно щелкнуть на поле Caption. В результате этого в правой колонке, где находится текущее значение
свойства — текст "Form1", появляется курсор (рис. 45).
Рис. 45. Установка
свойства путем ввода значения
Используя клавишу <Backspace>, надо удалить текст
"Form1" и ввести текст "Решение квадратного уравнения".
Аналогичным образом можно
установить значения свойств Height (Высота) и Width (Ширина),
которые определяют высоту и ширину формы. Размер формы, а также ее положение на экране задается в пикселях.
При выборе некоторых свойств, например Color (Цвет),
которое определяет цвет фона формы, после значения свойства выводится кнопка
раскрывающегося списка. В результате щелчка на ней появляется список доступных
значений свойства, из которого можно выбрать нужное значение (рис. 46).
Помимо обычных свойств у объектов, в том числе и у формы, могут быть вложенные свойства. Перед именем
вложенного свойства стоит значок "плюс". При двойном щелчке на имени
вложенного свойства раскрывается список уточняющих
свойств (рис. 47), а значок "плюс" меняется на "минус".
В поле значения свойства Font (Шрифт) после значения расположена
кнопка с тремя точками, при нажатии которой появляется стандартное диалоговое
окно Windows выбора шрифта и его характеристик.
Большинство свойств определяют внешний вид формы. Свойство Name (Имя) определяет имя формы, оно
используется в программе для управления формой.
Рис. 46. Установка свойства путем выбора значения из списка
Рис. 47. Пример
раскрытого списка уточняющих свойств свойства Font
Ниже в
таблице приведены измененные свойства формы разрабатываемого приложения. Остальные
свойства формы оставлены без изменения и в таблице не приведены.
Свойство |
Обозначение |
Значение |
Имя формы |
Name |
Form1 |
Заголовок |
Caption |
Решение
квадратного уравнения |
Высота |
Height |
270 |
Ширина |
Width |
370 |
Цвет фона |
Color |
clWhite |
Шрифт |
Font Name |
Arial Cyr |
Размер
шрифта |
Font Size |
10 |
Таблица содержит значения
вложенных свойств свойства Font
(Шрифт):
Name (Имя) и Size (Размер). Перед именем
вложенного свойства указывается имя вмещающего его свойства с точкой (Font).
Компоненты
формы
Программа решения квадратного
уравнения должна получить от пользователя исходные данные — значения
коэффициентов уравнения. В Windows данные вводятся в поля редактирования с клавиатуры.
Поэтому в нашу форму надо добавить три компонента
— три поля редактирования.
В Delphi поля редактирования, командные кнопки, поля
статического текста и | прочие элементы управления, находящиеся в форме, называются
компонентами 1 (компоненты формы). В
программе форма и компоненты рассматриваются как объекты. Этим можно объяснить то, что окно, в котором находятся
свойства компонентов, называется Object Inspector
(Инспектор объектов). |
Чтобы добавить к форме
компонент, надо на палитре компонентов (рис. 48) щелкнуть на кнопке с нужной
пиктограммой, затем в той точке формы, где должен находиться правый верхний
угол компонента. В результате этого на форме появляется компонент стандартного
размера.
Метка Поле редактирования Командная кнопка
Рис.48. Кнопки
стандартной палитры компонентов с пиктограммами
Добавить к форме компонент нужного размера можно следующим образом. После
щелчка на палитре компонентов нужно поместить курсор мыши в ту точку формы, где
должен находиться левый верхний угол компонента, нажать кнопку мыши и,
удерживая ее нажатой, переместить курсор в точку, где должен быть правый нижний
угол компонента, затем отпустить кнопку мыши. В форме появится компонент
нужного размера.
На рис. 49 представлен вид формы после добавления к ней трех полей редактирования.
Один компонент формы окружен восемью маленькими квадратиками (маркерами
выделения). Он называется выделенным
(маркированным). Свойства маркированного компонента отображаются в окне Object Inspector. Ниже в таблице перечислены основные
свойства компонента "Поле редактирования".
Рис.49. Форма с тремя компонентами- полями редактирования.
Свойство |
Обозначение |
Имя поля. Используется в
программе для доступа к содержимому(тексту) поля |
Name |
Текст, находящийся в поле
ввода |
Text |
Расстояние от левой границы поля
до левой границы формы |
Left |
Расстояние от верхней
границы поля до верхней границы формы |
Top |
Высота поля |
Height |
Ширина поля |
Width |
Шрифт, используемый для
отображения вводимого текста |
Font |
Признак наследования характеристик
шрифта родительской формы |
ParentFont |
Так же, как свойства формы, свойства компонента можно изменить в окне Object Inspector. Чтобы
свойства нужного компонента появились в окне Object Inspector, надо выделить нужный компонент или
выбрать его имя из раскрывающегося списка объектов, кнопка раскрытия которого
находится в верхней части окна Object Inspector (рис. 50).
Рис.50. Окно Object Inspector с развернутым списком объектов
Ниже приведены свойства полей
редактирования нашего проекта.
Свойство |
Объект |
||
Поле для коэффициента А Поле для коэффициента B Поле для коэффициента B |
|||
Name |
Edit1 |
Edit2 |
Edit3 |
Text |
|
|
|
Top |
88 |
88 |
88 |
Left |
24 |
136 |
248 |
Height |
24 |
24 |
24 |
Width |
81 |
81 |
81 |
Помимо полей
редактирования окно формы должно содержать поясняющий текст: краткое
информационное сообщение и пояснение рядом с каждым полем редактирования— для ввода какого
коэффициента это поле предназначено.Текст, находящийся непосредственно в
форме, — это метка. Добавляется метка
к форме точно так же, как и поле редактирования. Кнопка с пиктограммой метки
(большой буквой А) находится в палитре компонентов перед кнопкой поля
редактирования. После того как метка добавлена, можно, используя Object Inspector, изменить свойства метки.
К форме разрабатываемого приложения надо добавить пять меток: одна (Label2) будет представлять собой информационное сообщение, три (Label3, Label4, Label5) — тексты, поясняющие назначение полей редактирования, и одна (Label1) будет использоваться для вывода значений корней уравнения. После
добавления меток форма разрабатываемого приложения приобретает вид,
представленный на рис. 51.
Рис. 51. Вид формы после добавления меток Ниже в
таблицах приведены свойства меток Label1 и Label2.
Name |
Label1 |
Label2 |
Caption |
True |
Управление
задается коэффициентами |
AutoSize |
136 |
True |
Top |
24 |
8 |
Left |
16 |
40 |
Height |
4 |
17 |
Width |
|
272 |
ParenFont |
|
False |
FontName |
|
Arial Cyr |
FontSize |
|
11 |
Свойство ParentFont метки Label2 имеет значение False, поэтому свойство Font этой метки не наследует значения
свойства Font "родителя", в данном случае — свойства основной формы. Это
дает возможность установить свойства шрифта метки иные, чем у формы. У других
меток значение свойства ParentFont оставлено без изменения.
Если свойство
AutoSize (автоматический подгон размера) имеет значение Тrue, то Delphi автоматически устанавливает размеры метки в зависимости от количества
символов текста метки, используемого шрифта и его размера. Если надо, чтобы
метка представляла собой текст из нескольких строк, то свойству AutoSize надо присвоить значение False и вручную установить значения
свойств, определяющих ее размер. Ниже приведены свойства меток Label3, Label4 и Label5.
Name |
Label3 |
Label4 |
Label5 |
Caption |
При 2-ой степени(a) |
При 1-ой степени(b) |
При нулевой степени(c) |
AutoSize |
False |
False |
False |
Top |
48 |
48 |
48 |
Left |
24 |
136 |
248 |
Height |
41 |
41 |
41 |
Width |
81 |
81 |
81 |
Рис. 52. Форма
приложения для решения квадратного уравнения
В заключение к
форме надо добавить командные кнопки. Кнопка добавляется в форму точно так же,
как и другие компоненты. Пиктограмма командной кнопки (на ней изображена кнопка ОК) находится на палитре стандартных
компонентов. После добавления кнопок с помощью Object Inspector надо установить требуемые значения свойств, которые представлены в
следующей таблице.
Name |
Button1 |
Button2 |
Button3 |
Caption |
Вычислить |
Новое |
Завершить |
Top |
208 |
208 |
208 |
Left |
24 |
130 |
220 |
Height |
25 |
25 |
25 |
Width |
81 |
81 |
81 |
Окончательный вид формы приложения для решения квадратного уравнения представлен на рис. 52.
Событие и
обработчик события
Вид созданной формы подсказывает, как работает приложение. Очевидно, что
пользователь должен ввести значения коэффициентов в поля редактирования, затем
щелкнуть на кнопке Вычислить. Щелчок
кнопки мыши это пример события.
Событие это то, что происходит во время работы приложения. В Delphi у каждого события есть имя, например щелчок кнопкой мыши это OnClick, двойной щелчок — OnDblClick.
Реакцией на событие должно быть какое-либо действие. Например реакцией на событие
OnClick, произошедшее на кнопке
Вычислить, должно быть вычисление корней уравнения. В Delphi реакция на событие реализуется как процедура его обработки, называемая обработчиком события. ,Таким образом,
задача программиста состоит в написании необходимых обработчиков событий.
Методику создания обработчика события (или просто обработчика) рассмотрим
на примере обработчика для кнопки
Вычислить.
Сначала надо выделить объект, для которого создается обработчик. Затем
щелкнуть на ярлычке вкладки Events (События) окна Object Inspector. В результате этих действий в окне
Object Inspector появится карточка со списком событий, которые способен воспринимать
маркированный компонент, в данном случае — командная кнопка (рис. 53).
В левой колонке вкладки перечислены имена событий, на которые может
реагировать маркированный объект. Если для него определен обработчик события,
то в правой колонке рядом с именем события выводится его имя.
Чтобы создать обработчик события, надо сделать двойной щелчок в поле
имени события. В результате открывается окно редактора кода (в Delphi кодом называется текст программы) с макетом процедуры-обработчика события
(рис. 54).
Рис. 53. Вкладка Events для командной кнопки
"Выполнить"
Рис. 54. Окно редактора кода с макетом
обработчика события
Ниже приведен текст
процедуры для события Click кнопки
Выполнить.
procedure
TForm1.Button1Click(Sender: TObject);
var
a,b,c:real; { коэффициенты уравнения }
d: real; { дискриминант }
x1,x2: real; { корни уравнения.}
s1,s2:string[7]
;
code:integer;
begin
{ввод исходных данных из полей редактирования }
val(edit1.text,a,code);
val (edit2.text,b,code);
val(edit3.text,c,code);
if a=0
then {вывод' сообщения об
ошибке }
label1.caption:='Ошибка!'+chr(13)
+'Коэффициент при второй степени' +chr(13)+'неизвестного равен нулю'
else begin
{ вычисление корней
уравнения } d:=b*b-4*a*c;
if
d<0 then begin label4.caption:='нет решений';
exit; end;
x1:=(-b+sqrt(d))/(2*a) ;
x2:=(b+sqrt(d))/(2*a) ;
{ вывод результата } str(x1:7:3,s1); str(x2:7:3,s2);
label4.caption:='Корни уравнения:'
+chr(13)+'xl='+s1
+chr(13)+'x2='+s2;
end;
end;
В приведенном тексте программы нет обычных для Turbo Pascal инструкций READ и WRITE. Исходные данные программа получает из полей редактирования, обращаясь
к свойству Text. Вспомните, что именно свойство Text определяет содержимое поля редактирования. Так как характеристика Text содержит текст — данные символьного
типа, то для преобразования изображения числа в число в программе используется
процедура VAL. Процедура STR помещает в переменные s1 и s1 строковое изображение корней
уравнения. Вывод значений вычисленных корней программа осуществляет присвоением
свойству Caption метки Label1 значения — текста сообщения.
Рис. 55. Выбор
шрифта для редактора кода
Примечание: Если при наборе текста
программы вместо русских букв появляются буквы европейских языков или символы,
то надо изменить шрифт, используемый редактором кода. Для этого надо в меню Options(Параметры)
выбрать команду Environment (Среда). В появившемся диалоговом окне Environment Options(Параметры среды) следует выбрать вкладку Editor display (окно
редактора кода)
Из раскрывающегося списка Editor font (Шрифт
редактора кода) надо выбрать шрифт, содержащий русские буквы, например, Courier New Cyr и
щелкнуть на кнопке ОК.
Сохранение
проекта
При сохранении проекта Delphi создает
несколько файлов. Некоторые из них содержат описание проекта в целом, некоторые
— описания программных модулей и форм. Если проект еще ни разу не был
сохранен, то в ответ на команду сохранения проекта Save Project (Сохранить проект), которая находится в меню File (Файл), Delphi сначала запрашивает имя программного модуля (рис. 56), затем имя
проекта (рис. 57), причем требует, чтобы эти имена были разными. Здесь следует
обратить внимание на то, что выполняемому файлу Delphi присваивает
имя проекта.
Рис. 56. Диалоговое окно сохранения модуля
Рис. 57. Диалоговое
окно сохранения проекта
После
сохранения проекта можно выполнить компиляцию программы.
Компиляция
После ввода текста обработчика события и сохранения проекта можно,
"выбрав команду Compile (Компилировать) меню Compile, откомпилировать приложение. Если в программе нет синтаксических ошибок,
то на экране появляется диалоговое окно, информирующее об успешном завершении
компиляции (рис. 58).
Следует обратить внимание, что после установки Delphi среда
программирования автоматически настроена таким образом, что окно с сообщением
об успешной компиляции на экране не появляется. Чтобы окно Compiling появлялось,
надо в меню Options (Параметры) выбрать команду Environment (Среда), в открывшемся диалоговом окне Environment Options (Параметры среды)" (рис. 59) установить флажок Show compiler progress (Показывать работу компилятора),
находящийся в группе Compiling, затем нажать кнопку ОК.
Рис. 58. Сообщение об успешной компиляции
Рис. 59. Диалоговое окно Environment Options
Если компилятор обнаружит в программе ошибку, то он выделяет строку с
неверной инструкцией и- в нижней части окна выводит сообщение об ошибке.
Если ошибок в программе нет, компилятор создает исполняемый файл
программы, который позже можно будет запустить непосредственно из Windows. Имя исполняемого файла такое же, как и у файла проекта, расширение — exe.
Запуск
приложения из среды программирования
Запустить приложение можно, не завершая работу с Delphi, для этого
надо выбрать команду Run (Выполнить) меню Run. После ввода коэффициентов и нажатия
кнопки Вычислить программа вычисляет
значения корней уравнения (рис. 60).
Рис. 60. Пример работы приложения "Решение квадратного
уравнения"
Окно приложения ведет себя, как обычное окно Windows, его можно
перемещать по экрану, развернуть на весь экран, свернуть в пиктограмму.
Структура
простой программы Delphi
Программа Delphi представляет собой набор
программных единиц — модулей. Один из модулей, главный модуль, содержит инструкции, с которых начинается выполнение
программы. Главный модуль приложения формируется средой Delphi.
Ниже
приведен текст главного модуля программы решения квадратного уравнения.
Примечание: Главный модуль
хранится в файле с расширением dpr.
Чтобы увидеть текст главного модуля приложения, надо в меню View(Вид) выбрать команду Project source(Исходный текст проекта).
program Root;
uses
Forms, Root_u in 'ROOT_U.PAS' {Form1} ;
{$R*.RES}
begin
Application.Title:='Квадратное уравнение';
Application.CreateForm(TForml,Form1);
Application.Run;
end.
Начинается главный модуль словом PROGRAM, за которым
следует имя программы, которое совпадает с именем проекта. Имя программы
задается программистом в момент сохранения проекта, и оно определяет имя создаваемого
компилятором исполняемого файла программы. Далее, за словом USES, следуют имена используемых модулей: библиотечного модуля Forms и модуля формы Root_u.
Директива {$R*.RES} указывает компилятору, что нужно использовать файл ресурсов, который
содержит описания ресурсов приложения, например, пиктограммы. Звездочка
показывает, что имя файла ресурсов такое же, как и у файла проекта, но с
расширением res.
Примечание: Файл ресурсов не является текстовым файлом, и просмотреть его с помощью
редактора текста нельзя. Для работы с файлами ресурсов используют специальные программы, например Resource Workshop. Можно использовать также входящую в состав Delphi утилиту ImageEditor, доступ к которой можно получить, выбрав команду Image Editor (Редактор образов) меню Tools (Сервис)
Исполняемая часть главного модуля находится между BEGIN и END. Инструкции выполняемой части обеспечивают инициализацию приложения и
вывод на экран стартового окна. Помимо главного модуля каждая программа
включает в себя как минимум один модуль формы, который содержит описание
стартовой формы приложения и поддерживающих ее работу- процедур. В Delphi каждой форме соответствует свой модуль.
Ниже
приведен текст модуля формы для программы решения квадратного уравнения.
unit gm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
Edit2: TEdit;
Label3: TLabel
Edit3: TEdit;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Label4: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject;
var Key: Char);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure
TForm1.Button1Click(Sender: TObject);
var
a,b,c:real; { коэффициенты уравнения }
d: real; { дискриминант }
x1,x2: real; { корни уравнения.}
s1,s2:string[7]
;
code:integer;
begin
{ввод исходных данных из полей редактирования }
val(edit1.text,a,code);
val (edit2.text,b,code);
val(edit3.text,c,code);
if a=0
then {вывод' сообщения об
ошибке }
label1.caption:='Ошибка!'+chr(13)
+'Коэффициент при второй степени' +chr(13)+'неизвестного равен нулю'
else begin
{ вычисление корней
уравнения } d:=b*b-4*a*c;
if
d<0 then begin label4.caption:='нет решений';
exit; end;
x1:=(-b+sqrt(d))/(2*a) ;
x2:=(b+sqrt(d))/(2*a) ;
{ вывод результата } str(x1:7:3,s1); str(x2:7:3,s2);
label4.caption:='Корни уравнения:'
+chr(13)+'xl='+s1
+chr(13)+'x2='+s2;
end;
end;
Начинается модуль словом UNIT, за которым следует имя модуля. Именно
это имя упоминается в списке используемых модулей в инструкции USES главного модуля приложения.
Состоит модуль из трех частей: раздела интерфейса, раздела реализации и
раздела инициализации.
- Раздел интерфейса (начинается словом INTERFACE) сообщает компилятору, какая часть модуля является доступной для других
модулей программы. Здесь перечислены используемые модулем другие библиотечные
модули, описание сформированного Delphi типа TForm1, описание
доступных другим модулям переменных.
- Раздел реализации (начинается словом IMPLEMENTATION) содержит локальные объявления и реализацию процедур и функций, поддерживающих
работу формы.
Начинается раздел директивой {$R *.DFM},
указывающей компилятору, что в раздел реализации надо вставить инструкции
установки значений свойств формы, которые находятся в файле с расширением dfm, имя которого совпадает с именем модуля. Файл *.dfm на основе
внешнего вида формы генерируется средой Delphi. Просмотреть
файл DFM можно при помощи редактора текста.
За директивой {$R *.DFM} следует
описание обработчиков событий формы. Сюда же программист может поместить
описание своих процедур и функций, которые могут вызываться из обработчиков
событий обычным образом.
-
Раздел инициализации позволяет
выполнить инициализацию переменных модуля. Инструкции раздела инициализации располагаются
после раздела реализации между BEGIN и END. Если раздел инициализации
не содержит инструкций (как в приведенном примере), то слово BEGIN не указывается.
Следует отметить, что значительное количество инструкций в модуль записывает
Delphi. Например, Delphi, анализируя действия программиста по созданию формы, формирует описание
класса формы. В приведенном примере инструкции, набранные программистом,
выделены серым фоном. Очевидно, что средой Delphi выполняется
значительная часть работы по составлению текста программы.
Усовершенствование
приложения
После пробных запусков разработанного приложения начинают просматриваться
направления его совершенствования. Было бы неплохо, например, чтобы при вводе
коэффициентов, программа допускала ввод только чисел, при нажатии клавиши <Enter> курсор сам переходил в поле ввода следующего коэффициента, после
ввода последнего коэффициента и нажатии <Enter>
программа сразу вычисляла значения корней.
Для того чтобы программа делала то, о чем было сказано выше, надо написать
процедуры обработки события OnKeyPress для каждого поля редактирования.
Событие OnKeyPress происходит при нажатии клавиши на клавиатуре. Заготовка
процедуры обработки события OnKeyPress для поля Editi,
генерируемая Delphi в результате щелчка на поле
OnKeyPress на вкладке Events окна Object Inspector, выглядит следующим образом:
procedure
StartForm.EditlKeyPress(Sender:Tobject var Key:Char);
begin
end;
Из заголовка процедуры видно, что она в качестве параметра получает символьную
переменную key. Эта переменная содержит символ, соответствующий нажатой клавише.
Обратите внимание, что параметр принимается по ссылке (перед именем переменной
стоит слово VAR), поэтому процедура может изменить значение переменной. Ниже
приведен текст обработчика события OnKeyPress для поля Edit1.
procedure
StartForm.EditlKeyPress(Sender:Tobject;
var key:Char) ;
begin
case key of
'0'..'9','-',chr(8):;
'.':if post'.',editl.text)<>0
then key:=chr(0);
chr(13):edit2.SetFocus;
else key:=chr(0);
end;
end;
Процедура
обработки события OnKeyPress проверяет, какая клавиша нажата.
Если допустимая (<цифра>, <-> или <Backspace>), то
процедура ничего не делает — символ появляется в поле редактирования. Если
нажата точка, то делается проверка: есть ли уже точка в поле редактирования
(свойство Text поля редактирования во время работы программы содержит введенный в поле
текст) и если есть, то переменной key присваивается символ с нулевым
кодом, тем самым блокируется его появление в поле редактирования. При нажатии
клавиши <Enter>, которой соответствует символ с кодом 13, к объекту Edit2 формы
применяется метод SetFocus (Установить фокус), который перемещает курсор из поля Edit1 в поле Edit2, предназначенное для ввода следующего коэффициента
уравнения.
Процедура обработки события OnKeyPress для объекта Edit2 отличается от
процедуры обработки события OnKeyPress для объекта Editi только тем, что
вместо. Edit2.SetFocus следует записать Edit3. SetFocus.
Примечание: Окно редактора кода содержит тексты всех
обработчиков событий. Поэтому чтобы не набирать заново текст, который уже
набирался для какой-то процедуры, можно найти нужный фрагмент в другой
процедуре и скопировать его обычным образом.
Предыдущая реализация программы вычисляла значения корней при нажатии
кнопки Вычислить. Теперь мы хотим,
чтобы корни вычислялись еще и при нажатии клавиши <Enter>, когда
курсор находится в поле Edit3. Очевидно, что вычисление корней уравнения
следует оформить как процедуру и вызывать ее как при нажатии клавиши <Enter> в поле Edit3, так и при нажатии кнопки Вычислить.
Ниже приведен текст процедуры SqRoot.
procedure
SqRoot(Edit1,Edit2,Edit3:tEdit;Label2:tLabel) ;
var
a,b,c:real;{коэффициенты уравнения}
d:real;{дискриминант}
xl,x2:real;
code:integer;
stl,st2:string[10] ;
begin
val(Edit1.text,a,code);
val(Edit2.text,b,code) ;
val(Edit3.text,c,code);
if a=0 then begin
Label2.font.color:=clRed;
Label2.caption:=
'Коэффициент при второй степени' +chr(13)+'неизвестного равен нулю!';
end
else begin { решение уравнения }
d:=b*b-4*a*c;
if d<0 then begin Label2.font.color:=clRed;
Label2.caption:=
'Дискриминант меньше нуля.'+chr(13)+ 'Уравнение не имеет корней.';
end else begin
xl:=(b+sqrt(d))/(2*a);
x2:=(-b+sqrt(d))/(2*a) ;
str(xl:10:5,stl) ;
str(x2:10:5,st2) ;
Label2.font.color:=clBlack;
Label2.caption:='Корни уравнения:' +chr(13)+'xl='+stl
+chr(13)+'x2='+st2;
end;
end;
end;
Текст процедуры SqRoot набирается в окне редактора кода. Его
следует поместить в раздел IMPLEMENTATION, сразу за строкой {$R *.DFM}, перед всеми обработчиками событий.
Необходимо
также изменить процедуру обработки события OnKeyPress для Edit3. Ниже приведен ее текст.
procedure
TFonnl.Edit3KeyPress(Sender: Tobject; yar Key: Char);
begin case key of
'О'..'9','-',chr(8):;
'.':if
pos('.',edit1.text)<>0 then key:=chr(0);
chr(13):SqRoot(edit1,edit2,edit3,label2)
;
else
key:=chr(0);
end;
end;
Последнее, что надо сделать — написать процедуры обработки события OnClick для кнопок Новое и Завершить.
Ниже приведены их тексты.
procedure TForm1.Button2Click(Sender: TObject);
begin
edit1.text:='' ;
edit2.text:='';
edit3.text:='' ;
label4.caption:='результат';
edit1.SetFocus;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
form1.close;
end;
Процедура TForml.Button2Click, которая выполняется при нажатии кнопки Новое, записывает пустые строки в поля редактирования и
устанавливает курсор в поле ввода коэффициента при второй степени неизвестного.
Процедура TFormI.Button3Click, которая выполняется при нажатии кнопки Завершить, закрывает форму Forml, а так
как это главное окно приложения, то в результате программа завершает работу.
Хотя
известно, что "лучшее — враг хорошего", внесем еще одно изменение в
программу. Обработчики событий полей ввода коэффициентов отличаются друг от
друга только реакцией на нажатие клавиши <Enter>. Поэтому
возникает желание иметь одну, универсальную, процедуру обработки события OnKeyPress, которая в случае нажатия <Enter> обеспечивала бы выбор нужного
действия в зависимости от того, ввод в какое поле редактирования происходит.
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
case key of
'0'..'9','-',chr(8):;
'.':if
pos('.',Edit1.text)<>0 then key:=chr(0);
chr(13):if
Sender=Edit1
then
Edit2.SetFocus else if Sender=Edit2
then
Edit3.SetFocus else begin
button1.SetFocus;
SqRoot(Edit1,Edit2,Edit3,Label1)
;
end;
else
key:=chr(0)
end;
end;
Параметр Sender содержит имя объекта, на котором произошло событие (в данном случае —
нажатие клавиши). В предыдущих версиях событийных процедур этот параметр не
использовался, так как для каждого поля редактирования использовался свой
обработчик события.
Текст
процедуры TFormI.EditKeyPress следует набрать в окне редактора кода. Кроме того, надо, используя Object Inspector, ввести имя этой процедуры (EditKeyPress) в поле
имени обработчика события OnKeyPress для всех трех полей ввода. После
этого можно удалить ненужные обработчики события. И последнее, что надо
сделать — из раздела TYPE удалить строки с описанием процедур
удаленных обработчиков событий (EditlKeyPress, Edit2Key Press и EditSKeyPress), а на их место поместить описание нового обработчика события:
procedure
EditKeyPress(Sender: TObject; var Key: Char) ;
Ниже приведен текст модуля Root_u.pas,
после внесения всех изменений.
unit Root u;
interface
uses
SysUtils, WinTypes, WinProcs,
Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TFormI = class(TForm) Edit1:TEdit;
Edit2:TEdit;
Edit3:TEdit;
Button1:TButton;
Label1:TLabel;
Label2:TLabel;
Label3:TLabel;
Label4:TLabel;
Label5:TLabel;
Button2:TButton;
Button3:TButton;
procedure EditKeyPress(Sender:TObject;var Key:Char);
procedure Button2Click(Sender:TObject) ;
procedure Button3Click(Sender:TObject) ;
procedure ButtonlClick(Sender:TObject) ;
private
( Private declarations ) public
( Public declarations )end;
var
Form1: TForm1;
implementation
($R *.DFM} procedure SqRoot
(Edit1,Edit2,Edit3:tEdit;Label2:tLabel) ;
var
a,b,с:real;{коэффициенты уравнения}
d:real;{дискриминант}
xl,x2:real;
code:integer;
stl,st2:string[10] ;
begin
val(Edit1.text,a,code);
val(Edit2.text,b,code) ;
val(Edit3.text,c,code);
if a=0 then begin
Label2.font.color:=clRed;
Label2.caption:= •
'Коэффициент при
второй степени' +chr(13)+'неизвестного
равен нулю!';
end
else begin { решение уравнения } d:=b*b-4*a*c;
if d<0 then begin Label2.font.color:=clRed;
Label2.caption:=
'Дискриминант
меньше нуля.'+chr(13)+ 'Уравнение
не имеет корней.';
end else begin
xl:=(b+sqrt(d))/(2*a);
x2:=(-b+sqrt(d))/(2*a) ;
str(xl:10:5,stl) ;
str(x2:10:5,st2) ;
Label2.font.color:=clBlack;
Label2.caption:='Корни уравнения:' +chr(13)+'xl='+stl +chr(13)+'x2='+st2;
end;
end;
end;
procedure TForm1.EditKeyPress(Sender:TObject;var
Key:Char);
begin
.case key of
'0' . . '9','-',chr(8):; ,
'.': if pos ('.',Editl.text)<>0 then
key:=chr(0);
chr(13):if Sender=Edit1 then
Edit2.SetFocus else if Sender = Edit2
then Edit3.SetFocus else begin
button1.SetFocus;
SqRoot(Edit1,Edit2,Edit3,Labell);
end;
else key:=chr(0);
end;
end;
procedure TForm1.Button2Click(Sender:TObject);
begin
Editl.text:='';
Edit2.text:='';
Edit3.text:='';
Labell.font.color:=clBlack;
Labell.caption:='';
Editl.SetFocus;
end;
procedure TForm1.Button3Click(Sender:TObject);
begin
Close;
end;
procedure TForm1.ButtonlClick(Sender:TObject);
begin
SqRoot(Edit1,Edit2,Edit3,Label1) ;
end;
end.