Пиши Дома Нужные Работы

Обратная связь

Ввод – вывод массивов данных

К.т.н., доц. Троицкий Д.И.

 

Рассмотрено на заседании кафедры

"3" сентября 2007, протокол №1

 

Зав. кафедрой АСС д.т.н., проф.

 

_______________

Иноземцев А.Н.

 


Содержание

 

 

1. Что такое Delphi?. 3

2. Первое знакомство. 3

3. Наша первая программа. 5

3.1 Свойства формы и программы.. 5

3.2 Ввод и вывод данных. 6

4. События. 7

5. Обработка ошибок. 8

6. Ввод – вывод массивов данных. 9

7. Пример: расчет синуса. 9

8. Запись в файл. 11

9. Деактивация элементов интерфейса. 13

10. Использование клавиши Tab. 13

11. Всплывающие подсказки. 14

 


Что такое Delphi?

 

Новые системы плодят новые проблемы.

Из законов Мэрфи

 

Delphi (произносится "Делфàй") – среда программирования для Windows, разработанная компанией Borland International. Название происходит от древнегреческого города Дельфы – того самого, где жил дельфийский оракул. Поэтому на значке системы Delphi изображена греческая колонна. Delphi соединяет в себе компилятор языка программирования Object Pascal, интегрированную среду разработки (IDE), библиотеку визуальных компонентов VCL, средства для работы с базами данных (BDE) и многое другое. При помощи Delphi можно решить практически любую программистскую задачу, включая работу с базами данных, написание приложений для Интернета, экранных заставок, системных утилит и пр.

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

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



Официально бесплатной версией Delphi является Lazarus, примерно соответствующий Delphi 5.0.

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

 

Первое знакомство

 

Что бы с вами ни случилось, все это уже случалось

с кем-то из ваших знакомых, только было еще хуже.

Из законов Мэрфи

 

Итак, запускаем Delphi. Запуск занимает некоторое время, причем даже на самых быстрых машинах. Картина, которую вы увидите, показана на рис. 1. Вполне возможно, что Delphi запомнил проект, который в него загружали в прошлый раз, и автоматически открыл его. Чтобы не трогать чужое, в этом случае закройте все файлы (меню File à Close All) и создайте новый проект (File à New à Application).

В отличие от обычного Pascal, программа на Delphi (она называется "проект") "рассыпана" по многим файлам с расширениями pas, dcu, dpr, dfm, res и другими. Поэтому необходимо неукоснительно соблюдать простое правило:

 

КАЖДЫЙ НОВЫЙ ПРОЕКТ – В ОТДЕЛЬНОМ КАТАЛОГЕ НА ДИСКЕ!

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

При открытии ранее сохраненного проекта открывать надо только файл с расширением dpr.Если открыть какой-либо другой файл, проект загрузится не полностью и работать не будет.

Сохранение проекта (лучше всего это сделать сразу же) выполняется в два этапа. В меню File выберите пункт Save Project As. Перейдите в каталог, где будет храниться проект. Сначала надо ввести имя главного программного файла (стандартно – main.pas), а потом – имя самого проекта (расширение dpr). Полученный после компиляции exe-файл будет иметь такое же имя, как и проект. При дальнейшей работе желательно включить функцию автосохранения. При этом все файлы автоматически сохраняются перед каждым запуском программы, что гарантирует их сохранность даже в случае зависания машины. Для включения автосохранения войдите в меню ToolsàEnvironment Options и установите флажки Editor Files и Project Desktop.

 

 

       
 
   
 


 

 


Рис. 1 – Экран системы Delphi.

 

Итак, что же мы видим на экране? Во-первых, так называемую форму. Форма – это будущее окно нашей программы. На форме размещаются компоненты, которые берутся из палитры компонентов. Компоненты бывают визуальные (кнопки, меню, поля ввода, изображения) и невизуальные (диалоги, таймер, базы данных). Визуальные компоненты отображаются в окне программы при ее работе.

Текст программы по большей части пишется автоматически в виде модуля (unit). Модуль делится на две секции: Interface и Implementation. Секцию Interface лучше пока не трогать и ничего там не добавлять и тем более не удалять.

И сама форма, и все компоненты являются объектами.У каждого объекта есть свойства, методы и события. Например, у объекта "Кнопка" есть свойство "Текст на кнопке" и событие "Нажатие на кнопку". Свойства и события отображаются в инспекторе объектов. Важно следить за тем, какой объект в данный момент выделен на форме (его название отображается в верхней части окна инспектора объектов), так как все отображаемые свойства и события относятся именно к выделенному объекту.

Запомните следующие горячие клавиши, необходимые для работы с Delphi:

F12 – переключение между формой и текстом программы;

F11 – вызов инспектора объектов;

F9 – запуск программы на выполнение;

Ctrl+F2– прерывание работы запущенной программы.

 

Наша первая программа

 

Если эксперимент удался, что-то здесь не так...

Из законов Мэрфи

 

Большинство компьютерных программ должны получать какую-то информацию от пользователя, обрабатывать ее и выводить на экран результат. Давайте напишем простейшую программу, которая будет вводить с клавиатуры два числа a и b и выводить результат вычисления формулы . Собственно расчет не будет ничем отличаться от аналогичного расчета на Pascal. А вот ввод и вывод данных делаются совершенно по-другому. В Delphi нет операторов Read/Write. Весь ввод-вывод обеспечивают визуальные компоненты, размещаемые на форме.

 

Свойства формы и программы

 

Прежде всего разберемся с самой формой. Каждому компоненту, и форме в том числе, автоматически присваивается уникальное имя, заносимое в свойство Name.

 

СВОЙСТВО NAME НЕ ТРОГАТЬ!!!

Свойство Name предназначено для обращения к компонентам из текста программы. У вашей формы имя по умолчанию будет Form1. Остальные ее свойства отображаются в инспекторе объектов. Обязательно проверьте, что именно форма является текущим объектом (в заголовке окна инспектора объектов написано Form1), иначе вы будете менять свойства не того компонента. Если в инспекторе рядом со свойством стоит символ + , это означает, что при щелчке по нему это свойство "раскроется" на несколько подпунктов.

Ниже приведен список основных свойств формы.

Табл. 1. Свойства формы

Свойство Смысл Рекомендуемое значение
Caption Текст, отображаемый в заголовке формы Название программы
Position Где форма будет размещаться на экране при запуске программы PoDesktopCenter – в центре экрана
Color Цвет формы Без разницы
BorderStyle Можно ли менять размер формы во время выполнения программы BsSizeable – можно BsSingle – нельзя
Icon Значок, отображаемый в заголовке формы Без разницы. Значки загружаются из файлов с расширением .ico
Height Высота формы в пикселах Лучше не более 639
Width Ширина формы в пикселах Лучше не более 479
BorderIcons Кнопки, отображаемые на заголовке формы Если форма постоянного размера (BorderStyle=bsSinlge), эти кнопки надо убрать
BiMinimize Кнопка сворачивания формы
BiMaximize Кнопка разворачивания формы

 

Помимо задания свойств формы, нужно еще задать свойства всего проекта. Зайдите в меню Project à Options и перейдите на закладку Application. В поле Title введите название программы, которое будет отображаться на панели задач Windows. Оно может не совпадать с текстом в заголовке формы. Здесь же при помощи кнопки LoadIcon можно загрузить значок для вашей программы из файла с расширением . ico.

 

Ввод и вывод данных

 

Удобнее всего вводить данные при помощи поля ввода. Компонент "поле ввода" в Delphi называется LabeledEdit и находится на закладке Additional палитры компонентов Его значок - . Выделите компонент и щелкните мышью на форме – компонент перенесется на нее. Передвиньте его в желаемое место. Точно также поместите на форму второй такой же компонент. По умолчанию они будут иметь имена LabeledEdit1 и LabeledEdit2 соответственно. Теперь нужно задать свойства полей ввода. Прежде всего обратите внимание на свойство Text. В нем хранится текст (тип данных STRING), вводимый пользователем в поле. Пока там ничего нет. В Text можно записать значения по умолчанию, чтобы при запуске программы поля не были пустыми. Занесите в свойства Text значение "0" (разумеется, без кавычек!) Далее следует задать подпись над полем ввода (кстати, подпись может располагаться и сбоку, и снизу – см. свойство LabelPosition). Разверните свойство EditLabel, щелкнув по плюсику, и найдите свойство Caption – оно написано зелеными буквами. Напишите в свойстве Caption название поля ввода, например, "А" и "В". Эти названия просто выводятся на экран и никак не влияют на работу программы.

Для вывода результатов расчета на закладке Standard найдите компонент Label со значком . Label – это просто текст, выводимый на экран. Поместите его на форму. Выводимый текст хранится в свойстве Caption. Для начала это свойство надо очистить, чтобы на экране не маячили надписи типа "Label1". Еще раз обратите внимание на то, что содержимое свойств Text и Caption никак не связано с именем компонента (свойство Name).

Наконец, на форму нужно поместить кнопку, при нажатии на которую будет выполняться расчет. Это общее правило Delphi: для выполнения той или иной процедуры должно произойти какое-то событие – щелчок по кнопке, выбор пункта меню, истечение заданного промежутка времени и т.д. Компонент "Кнопка" называется Button ( ) и находится на закладке Standard. У кнопки нужно задать свойство Caption – это надпись на ней. Чтобы одна из букв на кнопке работала как горячая клавиша, перед ней надо поставить символ &. Например, если в Caption записано "&Расчет", буква "Р" станет подчеркнутой и на кнопку можно будет нажать комбинацией клавиш Alt+Р. Цвет кнопки поменять нельзя, он устанавливается в Windows.

В результате ваша форма должна принять вид, показанный на рис. 2.

 

 

Рис. 2 – Вид формы.


 

События

 

Предоставленные сами себе, события имеют

тенденцию развиваться от плохого к худшему

Из законов Мэрфи

 

Итак, нам нужно, чтобы при нажатии на кнопку выполнялась процедура расчета. Для этого нужно в инспекторе объектов перейти на закладку Events (События) и найти событие OnCLick (по щелчку). Очень важно: проверьте, что текущим компонентом является именно кнопка, иначе вы "повесите" событие на щелчок по форме или полю ввода, что, конечно, неправильно. Пока в OnClick ничего не написано. Дважды щелкните мышкой в этом пустом поле. Delphi автоматически создаст заготовку процедуры расчета: заголовок и BEGIN… END. Остальное надо будет писать самим. Заготовка должна выглядеть следующим образом:

 

procedureTForm1.Button1Click(Sender: TObject);

Begin

 

end;

 

Если процедура называется не Button1Click, вы все же повесили событие не на тот компонент и ничего работать не будет.

Собственно расчет ничем не отличается от обычного Pascal:

 

VAR a,b,c:REAL;

c:=SQR(a+b);

 

Весь вопрос в том, как введенные пользователем в поля ввода числа попадут в переменные a и b и каким образом отобразить на экране значение переменной с. Делается это так:

 

a:=StrToFloat(LabeledEdit1.Text);

b:=StrToFloat(LabeledEdit2.Text);

c:=SQR(a+b);

Label1.Caption:=FoatToStr(c);

 

Что же здесь написано? Во-первых, из программы можно обратиться к любому компоненту по имени. Во-вторых, чтобы получить доступ к свойству компонента, достаточно написать название этого свойства через точку после имени самого компонента. Следовательно, запись LabeledEdit1.Text означает обращение к содержимому поля ввода LabeledEdit1, то есть к тому самому введенному пользователем тексту. Наконец, чтобы преобразовать текстовую строку (ведь свойство Text, как мы знаем, имеет тип STRING) в вещественное число, используется встроенная функция StrToFloat. Таким образом, в переменные a и b занесутся числа, введенные в поля ввода на форме. Результат расчета преобразуется из вещественного числа в текст (функция FloatToStr) и этот текст записывается в свойство Caption объекта Label1. Окончательный вид нашей процедуры таков:

 

procedureTForm1.Button1Click(Sender: TObject);

 

vara,b,c:real;

 

Begin

a:=StrToFloat(LabeledEdit1.Text);

b:=StrToFloat(LabeledEdit2.Text);

c:=SQR(a+b);

Label1.Caption:=FoatToStr(c)

end;

 

Все, программу можно запускать. Жмите F9 и проверяйте ее работу. Ваша программа будет запущена как отдельное приложение, ее значок появится в панели задач. В отличие от Pascal программа автоматически не закрывается, вы сами должны завершить ее работу (закрыть ее окно). Вы не сможете редактировать исходный текст программы, если она запущена, поэтому не забывайте прекращать работу программы. Если ваше творение зависло, переключитесь в Delphi и снимите задачу комбинацией клавиш Ctrl+F2.

Кстати, вы сможете запускать программу и без Delphi – при компиляции на диске создается независимый exe-файл.

 

Обработка ошибок

 

Если за ошибку в расчете отвечает больше

одного человека, виноватых не найти.

Из законов Мерфи

 

Наша программа страдает существенным недостатком: если в поле ввода вместо числа ввести, скажем, "Вася", программа "свалится" с выдачей сообщения об ошибке (проверьте!) Оно и понятно – функция FloatToStr не может преобразовать "Васю" в вещественное число. В Delphi реализован очень элегантный механизм реакции на ошибки в программе при помощи оператора TRY..EXCEPT..END. Вот его общий вид:

 

TRY

здесь может произойти ошибка

EXCEPT

эти команды выполняются, если ошибка произошла

END;

 

Применим данный оператор в нашей процедуре:

 

procedureTForm1.Button1Click(Sender: TObject);

 

vara,b,c:real;

 

Begin

Try

a:=StrToFloat(LabeledEdit1.Text);

b:=StrToFloat(LabeledEdit2.Text);

c:=SQR(a+b)

Except

Label1.Caption:='Неверные данные';

Exit

end;

Label1.Caption:=FoatToStr(c)

end;

 

Оператор Exit вызывает досрочный выход из всей процедуры. Если бы его не было, оператор Label1.Caption:=FoatToStr(c) выполнятся бы в любом случае, так как он никак не связан с оператором try.

 

 

Ввод – вывод массивов данных

 

Не позволяйте фактам вводить вас в заблуждение.

Из законов Мэрфи

 

Как быть, если результатом работы вашей программы является не один ответ, а целый массив данных? Например, нужно рассчитать значения функции f(x) при х, меняющемся от 0 до 1 с шагом 0.1 или вычислить сумму нескольких чисел, причем заранее неизвестно, сколько их будет.

Для ввода и вывода переменного числа данных удобно использовать компонент Memo, который находится на закладке Standard ( ). Главное его свойство – динамический массив текстовых строк Lines. По умолчанию в нем записана одна строчка – "Memo1". При помощи инспектора объектов уберите весь текст из свойства Lines, чтобы "Memo1" не маячило на экране. Для этого щелкните мышью по кнопке с троеточием рядом с Lines – (TStrings) для открытия окна текстового редактора.

Свойство Lines доступно из программы. С ним можно выполнять следующие основные операции:

 

Memo1.Lines.Clear – полностью очистить все строки;

Memo1.Lines.Add(s) – добавить текстовую строку s в список, отображаемый на экране.

 

Для обращения к строке с номером I нужно использовать запись Memo1.Lines[i].

 

Пример: расчет синуса

 

В военное время значение синуса может достигать четырех.

Армейская мудрость.

 

Решим задачу вычисления значений функции sin(x) при х, меняющемся от a до b с шагом h. Для ввода трех исходных данных (a,b и h) будем использовать привычные компоненты LabeledEdit, а для вывода результата – компонент Memo. Форма должна выглядеть так, как показано на Рис. 3. Чтобы у компонента Memo отображалась вертикальная полоса прокрутки, установите его свойство ScrollBars в значение ssVertical. Свойство ReadOnly этого же компонента надо установить в True, чтобы защитить информацию в нем от изменения пользователем (из программы ее все равно можно будет менять).

 

 

Рис. 3 - Вид формы для вычисления функции.

 

Теперь напишем процедуру, выполняющуюся при щелчке по кнопке "Расчет". Выделяем кнопку на форме, в инспекторе объектов переходим на закладку Events и дважды щелкаем мышкой в поле OnClick. На экране отобразится заготовка процедуры.

Прежде всего надо считать введенные в поля ввода данные и проверить их на корректность. Заведем три переменные Xmin, Xmax и h типа REAL для хранения введенных данных. Следует ясно понимать, что сами по себе переменные с компонентами на форме никак не связаны и значения, введенные пользователем, в переменных автоматически никак оказаться не могут. Поэтому нужно написать (подчеркнуты строки, которые пишет сам Delphi):

 

procedure TForm1.Button1Click(Sender: TObject);

 

VARXmin, Xmax, h : REAL;

 

Begin

TRY

Xmin:=StrToFLoat(LabeledEdit1.Text);

Xmax:=StrToFLoat(LabeledEdit2.Text);

h:=StrToFLoat(LabeledEdit3.Text)

EXCEPT

MessageDlg('Неверные данные', mtError, [mbOK],0);

Exit

END;

IF Xmax<=Xmin THEN

BEGIN

MessageDlg('Xmin>Xmax!', mtError, [mbOK],0);

Exit

END

end;

Здесь применен новый способ отображения сообщений об ошибках – функция MessageDlg. Она отображает на экране стандартное окно сообщения об ошибке, как показано на Рис. 4.

 

 

Рис. 4 – Результат работы функции MessageDlg.

 

Параметр mtError отвечает за картинку, отображаемую. в левом верхнем углу сообщения (в данном случае это белый крест в красном круге; возможны также варианты mtInformation, mtConfirmation, mtWarning). Параметр [mbOK] указывает, что на окне будет одна-единственная кнопка OK. Квадратные скобки указывают на то, что это массив. апример, можно отобразить кнопки ОК и Отмена при помощи параметра [mbOK, mbCancel]. Наконец, последний ноль представляет собой номер темы в файле помощи, если бы таковой у нашей программы имелся.

Оператор Exit завершает выполнение процедуры в случае ошибки в исходных данных.

Собственно расчет весьма прост:

Memo1.Lines.Clear;

WHILE Xmin<=Xmax DO

BEGIN

Memo1.Lines.Add('sin('+FloatToStrF(Xmin,ffFixed,10,4)+')='+

FloatToStrF(sin(Xmin),ffFixed,10,4));

Xmin:=Xmin+h

END

Здесь прежде всего очищается список текстовых строк в компоненте Memo, иначе при неоднократных расчетах он будет расти и расти. В качестве переменной, меняющейся от Xmin до Xmax с шагом h, используется сама переменная Xmin. Строка Memo1.Lines.Add добавляет рассчитанный результат в компонент Memo. Для "красивого" преобразования типа данных Real в текстовую строку применена новая функция FloatToStrF(число, режим, всего, после_запятой). Режим ffFixed означает, что в числе будет именно столько знаков после запятой, сколько указано. В нашем случае мы отводим под все число 10 позиций, из них 4 – под дробную часть.

Результат работы программы показан на Рис. 5.

 

 

Рис. 5 – Результат работы программы.

 

Запись в файл

 

Все приказы отдавайте устно. Не оставляйте записей и

документов, которые могут обернуться против вас.

Из законов Мэрфи

 

Сохранение результатов работы программы в текстовый файл делается в Delphi гораздо проще, чем в обычном Pascal. Можно обойтись без использования процедур Assign, ReWrite, Writeln, Close, хотя они по-прежнему существуют. Чтобы наша программа выглядела прилично, надо применить стандартный диалог сохранения файла – такой же, как в самом Delphi, в Word'е и пр. На закладке Dialogs найдите компонент SaveDialog ( ) и поместите в любое место его на форму. Этот компонент – невизуальный: при запуске программы на форме его не будет. Он появится только при явном вызове диалога сохранения файла из программы. Соответственно на форме должна появиться кнопка "Сохранить".

Зададим свойства нашего диалога. Во-первых, в свойстве Title надо написать заголовок окна диалога, например, "Введите имя файла для сохранения результатов". Во-вторых, в свойство DefaultExt записывается расширение, автоматически присоединяемое к введенному пользователем имени файла. Очевидно, оно должно быть txt, ведь мы сохраняем текстовый файл. Свойство Filter позволяет выбирать отображаемые в диалоге файлы по маске. Например, можно задать маски "Текстовые файлы (*.txt)" и "Все файлы (*.*)". Для этого окно редактирования фильтра нужно заполнить так, как показано на Рис. 6. Текст в левой колонке – подсказка для пользователя, в правой – собственно маска файла.

Диалог имеет свойство Options, "раскрывающееся" в длинный список параметров. Из них нам нужны следующие (их надо установить в True):

foPathMustExist – введенный путь к файлу доложен существовать;

 

 

Рис. 6 Окно редактирования фильтров файлового диалога.

 

foNoChangeDir – смена директории в файловом диалоге не будет приводить к смене текущей директории всей программы.

 

Остается написать очень простую процедуру сохранения результатов, вызывающуюся при щелчке по кнопке "Сохранить":

 

procedure TForm1.Button2Click(Sender: TObject);

 

Begin

WITHSaveDialog1 DO

IF Execute THEN

Memo1.Lines.SaveToFile(filename)

end;

 

Оператор WITH "выносит за скобки" название компонента SaveDialog1, чтобы не писать одно и то же несколько раз. Без оператора WITH тот же фрагмент программы выглядел бы так:

 

Begin

IF SaveDialog1.Execute THEN

Memo1.Lines.SaveToFile(SaveDialog1.filename)

end;

Здесь Execute – метод объекта SaveDialog, вызывающий отображение диалога на экране. Этот метод возвращает логическое значение в зависимости от того, ввел пользователь правильное имя файла или закрыл диалог, нажав Esc. Если имя было введено, то выполняется метод сохранения в файл SaveToFile, предусмотренный у свойства Lines компонента Memo. На вход метода подается имя файла, а оно хранится в свойстве FileName диалога SaveDialog.


 






ТОП 5 статей:
Экономическая сущность инвестиций - Экономическая сущность инвестиций – долгосрочные вложения экономических ресурсов сроком более 1 года для получения прибыли путем...
Тема: Федеральный закон от 26.07.2006 N 135-ФЗ - На основании изучения ФЗ № 135, дайте максимально короткое определение следующих понятий с указанием статей и пунктов закона...
Сущность, функции и виды управления в телекоммуникациях - Цели достигаются с помощью различных принципов, функций и методов социально-экономического менеджмента...
Схема построения базисных индексов - Индекс (лат. INDEX – указатель, показатель) - относительная величина, показывающая, во сколько раз уровень изучаемого явления...
Тема 11. Международное космическое право - Правовой режим космического пространства и небесных тел. Принципы деятельности государств по исследованию...



©2015- 2018 pdnr.ru Все права принадлежат авторам размещенных материалов.