Среда визуального программирования Delphi

Программирование как область деятельности бурно развивается. Если не­сколько лет назад о создании своих собственных программ под Windows ря­довому программисту оставалось только мечтать, так как практически един­ственным инструментом разработки ориентированных на работу в Windows программ был Borland C++ for Windows, явно предназначенный для про­фессионалов, то сейчас, благодаря появлению Delphi, возможность создания программ под Windows стала реальностью.

Примечание: Справедливости ради следует упомянуть о Microsoft Visual Basic, как об удобном и достаточно мощном средстве разработки программ под Windows. Однако для большинства программистов Basic остается языком для начинающих и поэтому, как они считают, не заслуживающим внимания. Хотя с последним можно поспорить и не согласиться

Delphi — это среда разработки программ, ориентированных на работу в Windows. В качестве языка программирования в Delphi используется объ­ектно-ориентированный язык Object Pascal, который можно рассматривать как дальнейшее развитие Turbo Pascal 7.0.

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

 

Примечание: Дальнейшее изложение предполагает, что читатель знаком с основными терминами и понятиями Windows и имеет навыки пользовательской работы в Windows.

 

Запуск Delphi

Чтобы начать работу, надо раскрыть группу Delphi и сделать двойной щел­чок на пиктограмме Delphi, означающей среду программирования.

Вид экрана после запуска Delphi несколько необычен: вместо одного появляют­ся три окна: главное окно, окно формы и окно инспектора объектов (рис. 43).

 

Примечание: Чтобы окно Диспетчер программ не мешало работе, сверните главное окно Delphi-окно с заголовком Delphi-Project1, при этом свернутся все три окна Delphi, затем сверните окно Диспетчер программ и восстановите окно Delphi.

 

В главном окне (рис. 44) находится меню команд Delphi, панель инструмен­тов и палитра компонентов.

image001

 

Рис. 43. Вид экрана после запуска Delphi

Меню команд

image007

 


Панель инструментов                                                      Палитра компонентов

 

Окно формы (его заголовок Form1) представляет собой заготовку — макет одного из окон разрабатываемого

приложения.

Окно Инспектора объектов (его заголовок Object Inspector) позволяет видеть и менять характеристики (свойства) объектов проекта. После запуска Delphi в этом окне находятся свойства формы Form1.

Первый проект

Для демонстрации возможностей Delphi и технологии визуального проекти­рования займемся разработкой программы решения квадратного уравнения.

Работа над новым проектом — так в Delphi называется разрабатываемое приложение, начинается с создания стартовой формы — окна, которое по­является при запуске приложения.

Форма приложения

Стартовая форма создается путем изменения свойств (характеристик) фор­мы Form 1. Свойства формы определяют ее внешний вид: размер, положение на экране, текст заголовка, вид рамки. Они перечислены на вкладке (странице) Properties (Свойства) окна Object Inspector. В левой колонке пе­речислены имена свойств, в правой — их значения.

Сначала надо изменить значение свойства Caption (Заголовок) — заменить текст "Form1" на текст "Решение квадратного уравнения". Для этого нужно щелкнуть на поле Caption. В результате этого в правой колонке, где находится текущее значение свойства — текст "Form1", появляется курсор (рис. 45).

image010

               

 

Рис. 45. Установка свойства путем ввода значения

Используя клавишу <Backspace>, надо удалить текст "Form1" и ввести текст "Решение квадратного уравнения".

Аналогичным образом можно установить значения свойств Height (Высота) и Width (Ширина), которые определяют высоту и ширину формы. Размер формы, а также ее положение на экране задается в пикселях.

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

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

В поле значения свойства Font (Шрифт) после значения расположена кноп­ка с тремя точками, при нажатии которой появляется стандартное диалого­вое окно Windows выбора шрифта и его характеристик.

Большинство свойств определяют внешний вид формы. Свойство Name (Имя) определяет имя формы, оно используется в программе для управле­ния формой.

image012

                     

 

Рис. 46. Установка свойства путем выбора значения из списка

image014

 

                     

 

Рис. 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) щелкнуть на кнопке с нужной пиктограммой, затем в той точке формы, где должен находиться правый верхний угол компонента. В результате этого на форме появляется компонент стандартного размера.

image018

 

                                  Метка    Поле редактирования    Командная кнопка

Рис.48. Кнопки стандартной палитры компонентов с пиктограммами

 

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

На рис. 49 представлен вид формы после добавления к ней трех полей ре­дактирования.

Один компонент формы окружен восемью маленькими квадратиками (марке­рами выделения). Он называется выделенным (маркированным). Свойства мар­кированного компонента отображаются в окне Object Inspector. Ниже в таблице перечислены основные свойства компонента "Поле редактирования".

image021

 

Рис.49. Форма с тремя компонентами- полями редактирования.

 

Свойство

Обозначение

Имя поля. Используется в программе для доступа к содержимому(тексту) поля

Name

 

 

Текст, находящийся в поле ввода

Text

Расстояние от левой границы поля до левой границы формы

Left

Расстояние от верхней границы поля до верхней границы формы

Top

Высота поля

Height

Ширина поля

Width

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

Font

Признак наследования характеристик шрифта родительской формы

ParentFont

 

Delphi позволяет легко изменить положение и размер компонента. Чтобы изменить положение компонента, надо установить курсор мыши на изобра­жение компонента, нажать левую кнопку мыши и, удерживая ее нажатой, переместить изображение границы компонента в нужную точку формы; за­тем отпустить кнопку мыши.Чтобы изменить размер компонента, надо его выделить (щелкнуть на изо­бражении компонента), спозиционировать курсор мыши на одном из мар­керов компонента, нажать левую кнопку мыши и, удерживая ее нажатой, изменить положение границы компонента; затем отпустить кнопку мыши.

Так же, как свойства формы, свойства компонента можно изменить в окне Object Inspector. Чтобы свойства нужного компонента появились в окне Object Inspector, надо выделить нужный компонент или выбрать его имя из раскрывающегося списка объектов, кнопка раскрытия которого находится в верхней части окна Object Inspector (рис. 50).

image023

            

 

Рис.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.

image025

              

 

Рис. 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

                

 

image027

Рис. 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).

image029

 

             

 

Рис. 53. Вкладка Events для командной кнопки "Выполнить"

image031

 

 

               

Рис. 54. Окно редактора кода с макетом обработчика события

Delphi автоматически присваивает обработчику имя, состоящее из двух частей. Первая идентифицирует форму, содержащую объект, для которого создается обработчик события. Вторая часть имени идентифицирует сам объект и событие. В нашем         я формы — Form1, имя командной кнопки ВычислитьButton1, а имя события — Click. Теперь между BEGIN и END можно печатать  инструкции языка Pascal, реализующие обработчик события.

Ниже приведен текст процедуры   для   события 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 значения — текста сообщения.

image033

 

 

Рис. 55. Выбор шрифта для редактора кода

image035

 

Примечание: Если при наборе текста программы вместо русских букв появляются буквы европейских языков или символы, то надо изменить шрифт, используемый редактором кода. Для этого надо в меню Options(Параметры) выбрать команду Environment (Среда). В появившемся диалоговом окне Environment Options(Параметры среды) следует выбрать вкладку Editor display (окно редактора кода)

 

          

 

Из раскрывающегося списка Editor font (Шрифт редактора кода) надо вы­брать шрифт, содержащий русские буквы, например, Courier New Cyr и щелкнуть на кнопке ОК.

Сохранение проекта

При сохранении проекта Delphi создает несколько файлов. Некоторые из них содержат описание проекта в целом, некоторые — описания программ­ных модулей и форм. Если проект еще ни разу не был сохранен, то в ответ на команду сохранения проекта Save Project (Сохранить проект), которая находится в меню File (Файл), Delphi сначала запрашивает имя программ­ного модуля (рис. 56), затем имя проекта (рис. 57), причем требует, чтобы эти имена были разными. Здесь следует обратить внимание на то, что вы­полняемому файлу Delphi присваивает имя проекта.

image037

              

 

Рис. 56. Диалоговое окно сохранения модуля

image039

 

            

 

Рис. 57. Диалоговое окно сохранения проекта

После сохранения проекта можно выполнить компиляцию программы.

 

Компиляция

После ввода текста обработчика события и сохранения проекта можно, "вы­брав команду Compile (Компилировать) меню Compile, откомпилировать приложение. Если в программе нет синтаксических ошибок, то на экране появляется диалоговое окно, информирующее об успешном завершении компиляции (рис. 58).

Следует обратить внимание, что после установки Delphi среда программиро­вания автоматически настроена таким образом, что окно с сообщением об успешной компиляции на экране не появляется. Чтобы окно Compiling появ­лялось, надо в меню Options (Параметры) выбрать команду Environment (Среда), в открывшемся диалоговом окне Environment Options (Параметры среды)" (рис. 59) установить флажок Show compiler progress (Показывать работу компилятора), находящийся в группе Compiling, затем нажать кнопку ОК.

image041

                 

Рис. 58. Сообщение об успешной компиляции

image043

 

             

Рис. 59. Диалоговое окно Environment Options

 

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

Если ошибок в программе нет, компилятор создает исполняемый файл программы, который позже можно будет запустить непосредственно из Windows. Имя исполняемого файла такое же, как и у файла проекта, расши­рение — exe. Delphi помещает исполняемый файл в тот каталог, где нахо­дится файл проекта.

Запуск приложения из среды программирования

Запустить приложение можно, не завершая работу с Delphi, для этого надо выбрать команду Run (Выполнить) меню Run. После ввода коэффициентов и нажатия кнопки Вычислить программа вычисляет значения корней урав­нения (рис. 60).

image046

 

 


Рис. 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> обеспечивала бы выбор нуж­ного действия в зависимости от того, ввод в какое поле редактирования происходит. Delphi позволяет это сделать посредством создания для не­скольких объектов общего обработчика события. Ниже приведен текст обра­ботчика события, решающего поставленную задачу.

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.

 

 

 

содержание

Hosted by uCoz