Ввод и вывод информации в Delphi.
Программы, которые были ранее разработаны в системе Delphi, позволяли выводить информацию на экран компьютера или вводить информацию с клавиатуры с отображением ее на экране. Однако основными задачами, ради которых были разработаны компьютеры, являются задачи по обработке информации, в том числе задачи вычислительного характера. Поэтому дальнейший материал будет посвящен составлению программ для решения вычислительных задач.
Простейшими программами являются программы с линейной алгоритмической структурой, которая предполагает выполнение команд последовательно друг за другом. Программы линейной структуры с вычислениями обычно включают в себя следующие этапы:
1. ввод исходных данных;
2. вычисление требуемой величины;
3. вывод результата.
Соответствующая этим этапам блок-схема линейного алгоритма будет следующей:
|
Рис. 62 Блок-схема линейного алгоритма
Простейшим оператором ввода и вывода является рассмотренный нами оператор присваивания. В системе программирования Delphi ввести исходные данные и вывести результат позволяют различные компоненты.
Для ввода данных удобно использовать компонент TEdit. Для этого необходимо с помощью мыши установить в текстовом поле курсор и ввести с клавиатуры текст. Вводимая строка отображается в свойстве Text компонента TEdit и воспринимается программой как набор символов. Цифровые символы можно преобразовать в числа с помощью соответствующих типу числа функций преобразования.
Таблица 9. Функции преобразования
Функция | Значение функции |
IntToStr (x) | Преобразует целое число в строку символов. |
StrToInt (x) | Преобразует строку символов в целое число. |
FloatToStr (x) | Преобразует вещественное число в строку символов. |
StrToFloat (x) | Преобразует строку символов в вещественное число. |
FloatToStrF(x, f, k, m) | Преобразует вещественное число в строку символов в соответствии с указанными параметрами: f – формат (способ изображения); k – точность (нужное количество цифр); m – количество цифр после десятичной точки |
Chr (x) | Возвращает символ, соответствующий ASCII коду числа х. |
Для вывода информации можно использовать компонент TLabel. Чтобы увидеть результат работы программы, нужно присвоить свойству Caption компонента TLabel новое значение. Свойство Caption символьного типа. Поэтому выводимое число следует преобразовать в строку символов с помощью соответствующих типу числа функций преобразования.
Рассмотрим проект, в котором реализуется линейная алгоритмическая структура, и используются функции преобразования.
Пример.На рис. 62 приведен вид диалогового окна пересчета скорости из км/ч в м/с. Составить программу, которая по щелчку на кнопке выполняет этот перевод (исходная скорость выражается целым числом). |
Создадим графический интерфейс окна по образцу, изображенному на рис. 63. Для этого поместим на форму текстовое поле TEdit, кнопку TButton и 2 надписи TLabel. Удалим содержимое свойства Text у компонента Edit1. У надписи Label1 запишем в свойстве Caption сообщение «Введите скорость в км/ч». Для кнопки Button1 введем заголовок «Пересчет».
Рис. 63 Графический интерфейс окна
Исходные данные – скорость в км/ч – будем вводить в текстовое поле Edit1. Результат перевода выведем в надпись Label2.
В данном проекте можно выделить следующие этапы линейного алгоритма:
1. Ввести в поле Edit1 скорость в км/ч.
2. Перевести скорость из км/ч в м/с.
3. Вывести в надпись Label2 скорость в м/с.
Рассмотрим каждый этап линейного алгоритма.
1. Для обозначения исходной скорости в км/ч введем дополнительную переменную целого типа V1. Присвоим переменной V1 значение свойства Text компонента Edit1.
Однако такая запись является неверной, так как типы данных до и после знака присваивания не совпадают: переменная V1 целого типа, а свойство Text компонента Edit1 имеет строковый тип данных. Чтобы далее производить вычисления с вводимыми в поле Edit1 цифрами, которые пока воспринимаются программой как текст, необходимо преобразовать их в числовой формат. В данном случае необходимо использовать функцию StrToInt (преобразует строку в целое число). Таким образом, текст команды ввода будет иметь следующий вид:
V1:= StrToInt (Edit1.Text);
2. Чтобы перевести скорость из км/ч в м/с нужно умножить значение скорости на 1000 и разделить 3600 (в 1 километре – 1000 метров, в 1 часе – 3600 секунд). Введем еще одну переменную V2 для обозначения скорости в м/с. Таким образом, для расчета скорости в м/с используется следующий оператор:
Переменная V2 будет вещественного типа, так как в выражении для ее вычисления имеется операция деления.
3. Для вывода полученной скорости предназначен компонент Label2. Поэтому необходимо свойству Caption компонента Label2 присвоить значение переменной V2:
Данная запись опять нарушает соответствие типов данных, так как в свойстве Caption у надписи могут отображаться только данные символьного типа, а переменная V2 – это вещественное число. Поэтому необходимо преобразовать переменную V2 вещественного типа в строку функцией FloatToStr (преобразовать вещественное число в строку). Текст команды вывода будет выглядеть следующим образом:
При выводе результата часто к полученным значениям добавляют комментарии. Например, в данном проекте можно к значению скорости добавить запись её единиц измерения ‘м/с’. В программе эта запись указывается в одиночных кавычках (апострофах), т.к. является символьной константой. Таким образом, вывод результата может иметь следующий вид: Label2.Caption:= FloatToStr(V2)+ ‘м/с’;
Так как мы ввели дополнительные переменные V1 и V2, то нужно указать их тип в разделе описаний переменных. Все переменные, используемые в Delphi, подразделяются на два основных вида. Это глобальныепеременные, которые могут использоваться во всей программе, и локальныепеременные, которые можно использовать только внутри определенной процедуры.
В данном случае опишем переменные как локальные внутри процедуры TForm1.Button1Click. Для этого после заголовка процедуры введем раздел описания переменных, который открывается зарезервированным словом var. Описание переменных будет выглядеть так:
var V1: integer; V2: real;
Таким образом, текст обработчика события для кнопки Пересчет будет выглядеть следующим образом:
procedure TForm1.Button1Click(Sender: TObject); |
var V1: integer; V2: real; |
begin |
V1:= StrToInt (Edit1.Text); |
V2:= V1*1000/3600; |
Label2.Caption:= FloatToStr(V2) + ‘м/с’; |
end; |
Рис. 64 Работающее приложение
Можно было написать программу и без ввода дополнительных переменных:
procedure TForm1.Button1Click(Sender: TObject); |
begin |
Label2.Caption:= FloatToStr((StrToInt (Edit1.Text))*1000/3600) + ‘м/с’; |
end |
Чтобы программа была готова к вводу новых данных, нужно очистить текстовое поле и поместить в него курсор. В Delphi для этого применяются методы:
— Clear (Очистить)
— SetFocus (Передать фокус ввода)
Учитывая эти методы, текст программы изменится на следующий:
Источник
Сегодня:
— 0 — 0 — 0
Последние:
— 24.08, 10:44 / #6695
— 29.03, 23:32 / #6682
— 30 апреля 2012
Сейчас онлайн:
На сайте — 4
На IRC-канале — 2
Знаний, полученных в предыдущих уроках, достаточно, чтобы приступить к изучению механизмов ввода и вывода данных. Общая схема работы программы примерно такова: пользователь вводит данные, программа их считывает, производит с ними какие-то операции и выдаёт результат. Упрощённо: ввод, обработка, вывод. Что мы уже умеем? Для ввода данных нам понадобятся такие элементы как текстовое поле ввода (TEdit) или многострочное поле — TMemo, CheckBox или RadioButton для выбора параметров и др. Для вывода можно использовать текстовую метку (TLabel). Теперь разберём программную часть. Мы уже умеем описывать переменные, знаем, что такое тип данных и какие бывают типы (числа, строки и т.п.) Осталось лишь выяснить как связать визуальные элементы с программным кодом. В примерах, рассмотренных в предыдущих уроках, мы задавали значения переменным вручную (в коде), но это конечно же неприемлемо ни для одной программы. Программа должна быть универсальной и обрабатывать те данные, которые передал пользователь. Для ввода и вывода будут использоваться некоторые функции. Что такое функции, зачем они нужны, и как с ними работать, мы рассмотрели на прошлом уроке. Ну что, ближе к делу?
Ввод на примере TEdit
Текстовое поле ввода (TEdit) — простой и в то же время удобный элемент для ввода данных. В поле мы можем ввести и число и текст — никаких ограничений нет. Итак, наша первая задача — узнать, что введено в поле. Для этого мы должны обратиться к свойствам этого объекта. За текст, находящийся в поле, отвечает свойство Text. Именно им мы и воспользуемся. Попробуем считать число, которое будет введено. Расположим на форме само поле (TEdit) и кнопку (TButton). Создадим обработчик нажатия кнопки и сделаем следующее: объявим переменную целочисленного типа, а затем попробуем поместить в неё значение, которое введено в поле.
procedure TForm1.Button1Click(Sender: TObject);
var A: Integer;
begin
A := Edit1.Text;
end ;
Казалоось бы, всё верно — переменную мы объявили, и просто хотим узнать, что введено в поле. Попробуем запустить (F9) — всё не так просто! Компилятор сообщает об ошибке:
[Error] Unit1.pas: Incompatible types: ‘Integer’ and ‘TCaption’
Здесь сказано, что типы данных Integer и TCaption не соответствуют друг другу. TCaption — это тип данных свойства Text у TEdit. Этот тип «обозначает» текстовую строку, т.е. любые символы. Становится понятнее? В поле ввода мы можем ввести не только цифры, но и буквы и даже любые знаки, какие есть на клавиатуре (а на самом деле — вообще любые символы из кодовой таблицы). Однако наша переменная — число! Получается, что мы хотим в качестве числа записать символы. Непорядок! Да, вы скажете: но мы ведь будем вводить в поле цифры, а не буквы. Верно, но знает ли об этом компилятор? Конечно нет. А уговорить его не удастся 🙂
Несоответствие типов данных — частая ошибка. Преобразовывать одни типы данных в другие требуется очень часто. Наш пример — яркое тому подтверждение. Чтобы работать с числом, мы должны введённый текст (именно текст) преобразовать в число.
Преобразования могут выполняться разными способами. Основной из них — применение специальных функций. Функции принимают один из несколько параметров (аргументов), одним из которых является переменная или значение, подлежащее преобразованию. Функция выполняет какие-то операции и возвращает значение нужного нам типа.
Для преобразования текста (строки) в целое число служит функция StrToInt(). Название абсолютно точно отражает назначение функции. У функции единственный параметр — строка, а на выходе получается число. Поэтому, чтобы наш пример работал, мы должны написать так:
procedure TForm1.Button1Click(Sender: TObject);
var A: Integer;
begin
A := StrToInt(Edit1.Text);
end ;
Теперь программа запустится. Попробуем ввести число и нажать кнопку — никакой ответной реакции не наблюдается. Это верно, ведь мы кроме считывания введённого числа ничего не запрограммировали. А теперь попробуем ввести посторонние символы (т.е. не цифры) — программа «вылетит» с сообщением об ошибке:
В сообщении указана и причина возникновения ошибки: «‘abc’ — неверное целое число«. Как избегать подобных сообщений, а вместо этого выполнять свои действия, мы разберёмся позже.
Вывод данных на примере TLabel
Прежде чем делать вывод, давайте произведём с введённым числом какие-нибудь операции. К примеру, давайте возведём число в квадрат. Как это делается, вы уже знаете. Вывод осуществим в текстовую метку (TLabel). За текст метки отвечает свойство Caption. В данном случае наши действия должны быть обратными: при вводе мы заносили в переменную введённое в поле значение, а при выводе мы должны значение из переменной перенести в элемент. Caption у TLabel описывается тоже типом данных TCaption, т.е. это текст. А значит мы должны сделать обратное преобразование, т.е. преобразовать число в текстовую строку. Как называется функция для такого перевода, легко догадаться — IntToStr(). Финальный вариант обработчика кнопки:
procedure TForm1.Button1Click(Sender: TObject);
var A: Integer;
begin
A := StrToInt(Edit1.Text);
A := Sqr(A);
Label1.Caption := IntToStr(A)
end ;
Запускаем программу и пробуем:
Простейшая программа ввода-вывода готова.
Где узнать о типах данных свойств?
Очень логичный вопрос — где узнать, какой тип данных имеет свойство элемента, кроме как смотреть сообщения об ошибках? Ответ прост — нам снова поможет редактор кода. После того, как мы ввели имя объекта и поставили точку, появляется список всех доступных команд. Напротив свойств через двоеточие указывается и тип данных:
Обратите внимание, что редактор автоматически отслеживает, какие команды содержатся в коде и в этом списке всегда находятся только те пункты, которые применимы в данной ситуации. Так, если написать «A:=Edit1.«, то в списке будет отсутствовать свойство Text, ведь тип переменной A и тип этого свойства не совпадают:
При написании функции StrToInt() строка свойства Text конечно же появится.
Мы рассмотрели механизм ввода-вывода на примере обработки числа. Если обработке подлежит текст, то преобразовывать типы данных не придётся. Подобным образом осуществляется ввод и вывод практически любых данных, главное — выполнять преобразование одних типов в другие.
Для ввода целых чисел также есть удобный элемент — TSpinEdit. Расположен он на вкладке Samples. По внешнему виду похож на TEdit, только в поле ещё находятся две кнопки со стрелками — для изменения значения. Допустимые границы числа задаются свойствами MinValue и MaxValue, а само значение хранится в свойстве Value.
Работа с вещественными числами
Следует упомянуть и о дробных числах, ведь иногда без них не обойтись. В целом, их ввод и вывод практически такой же, как и целых чисел, только используются функции StrToFloat() и FloatToStr(). Всё просто. Однако с вещественными числами есть одна проблема — разделитель целой и дробной части. Дело в том, что нет определённости, какой символ считать разделителем — точку или запятую. Какой символ выбирается — зависит от настроек операционной системы (в Windows этот знак определяется в Панели управления в разделе Язык и региональные стандарты). Таким образом, если заточить программу под запятую, то на системах, где установлена точка, работать ничего не будет и будут возникать ошибки во время работы. В то же время, под точку тоже нельзя затачивать программу, ведь может стоять и запятая. К счастью, решение есть. Есть переменная, которую нигде не нужно объявлять, но значение которой можно менять — это переменная DecimalSeparator. Она объявлена в модуле SysUtils и хранит тот символ, который будет считаться разделителем. Установить нужное значение достаточно один раз — например при запуске программы. Вот так можно установить разделителем точку:
procedure TForm1.FormCreate(Sender: TObject);
begin
DecimalSeparator := ‘.’ ;
end ;
Другие способы вывода
Помимо вывода в объекты (например, в TLabel) иногда удобно выводить данные в виде маленьких отдельных окон. Для этой цели существуют стандартные команды. В предыдущих уроках мы с ними уже встречались, но не разбирали их подробно.
1. Простое окно с сообщением — ShowMessage()
Самое примитивное окно содержит указанный текст и кнопку OK для закрытия окна. Вызвать такое окно можно процедурой ShowMessage(), параметром которой является текст — он и будет отображён в окне. Модифицируем нашу мини-программу, убрав TLabel и заменив строку вывода:
procedure TForm1.Button1Click(Sender: TObject);
var A: Integer;
begin
A := StrToInt(Edit1.Text);
A := Sqr(A);
ShowMessage(IntToStr(A));
end ;
В этом случае мы увидим следующее:
Следует обратить внимание на то, что пока окно сообщения находится на экране, интерфейс программы блокируется, а также прекращается выполнение дальнейших команд. Только после нажатия на кнопку программа продолжит свою работу.
2. Диалоговое окно — MessageDlg()
Диалоговые окна — более сложный тип окон. Диалоговые окна часто используются для «общения» с пользователем. Однажды такое окно нами уже использовалось — при закрытии окна программы мы спрашивали у пользователя, действительно ли окно нужно закрыть. Теперь разберём работу с такими окнами подробно.
Создаются диалоговые окна функцией MessageDlg(). Это именно функция, а не процедура. Возвращаемым значением является кнопка, которую нажал пользователь. У функции 4 входных параметра:
- Текст сообщения (тип данных — String);
- Тип диалогового окна (специальный тип данных — TMsgDlgType) — указывает на значок, расположенный в окне и на заголовок окна. Этот параметр задаётся одной из следующих констант:
- mtInformation — информационное окно (значок в окне — буква «i»);
- mtConfirmation — окно с вопросом (значок — воспросительный знак);
- mtWarning — предупреждающее окно (значок — восклицательный знак);
- mtError — окно с сообщением об ошибке (значок — крест на красном фоне);
- mtCustom — окно без значка, а в заголовке — название исполняемого файла программы (все остальные типы в заголовок помещают соответствующее типу диалога название — Information, Warning и т.д.)
- Кнопки, которые будут показаны в окне. Каждой кнопке также соответствует определённая константа. Кнопки перечисляются через запятую, а весь этот «комплект» обрамляется квадратными скобками (что означают квадратные скобки — узнаем позже). Вот константы всех доступных кнопок: mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore, mbAll, mbNoToAll, mbYesToAll, mbHelp. Название константы говорит о названии самой кнопки.
- Четвёртый параметр указывает на индекс раздела в справочной системе, соответствующий данному диалогу. Как правило, не используется и задаётся просто 0.
В качестве возвращаемых функцией значений служат все те же константы кнопок, только с тем отличием, что вместо «mb» они начинаются на «mr» (сокращения от «modal button» и «modal result» соответственно).
Изменим нашу программу — пусть результат выдаётся в информационном окошке. Обратите внимание, насколько красивее выглядит такое окно:
procedure TForm1.Button1Click(Sender: TObject);
var A: Integer;
begin
A := StrToInt(Edit1.Text);
MessageDlg( ‘Квадрат числа ‘ +IntToStr(A)+ ‘ равен ‘ +IntToStr(Sqr(A)),mtInformation,[mbOK],0);
end ;
Примечание: Текстовые строки можно объединять, просто складывая их — знак «+» (см. фрагмент кода выше). Сами строки записываются в одиночных кавычках.
Ну и напоследок попробуем использовать диалог для уточнения у пользователя дополнительной информации. К примеру, если введено отрицательное число, будем спрашивать, нужно ли его возвести в квадрат. Код получится приблизительно таким:
procedure TForm1.Button1Click(Sender: TObject);
var A: Integer;
begin
A := StrToInt(Edit1.Text);
if A then
if MessageDlg( ‘Число отрицательное. Возвести его в квадрат?’ ,mtConfirmation,[mbYes,mbNo],0) = mrYes then
MessageDlg( ‘Квадрат числа ‘ +IntToStr(A)+ ‘ равен ‘ +IntToStr(Sqr(A)),mtInformation,[mbOK],0);
end ;
А результат будем таким:
Внешний вид окон всех типов:
3. Диалоговые окна MessageBox()
C помощью фунции MessageBox() можно также выводить диалоговые окна. По внешнему виду они практически ничем не отличаются от окон MessageDlg(), однако есть возможность указать и заголовок окна. Для формирования строки кода с использованием MessageBox() есть программа Master MessageBox. C помощью неё можно быстро создать нужное диалоговое окно. Проблема MessageBox() в том, что тип диалога и кнопки задаются немного необычным образом.
Ввод с помощью диалогового окна
Специальные окошки существуют не только для вывода на экран, но и для ввода. Примером такого окна является InputBox() . Функции передаётся 3 параметра: текст заголовка окна, текст пояснения и значение, находящееся в поле при показе окна на экран. Введённую в поле строку функция возвращает как значение-результат. Пример:
procedure TForm1.Button2Click(Sender: TObject);
begin
if InputBox( ‘Загадка’ , ‘Сидит дед, в сто шуб одет. Кто его раздевает — тот слёзы проливает. Кто это?’ , » ) = ‘лук’ then
MessageDlg( ‘Правильно!’ ,mtInformation,[mbOk],0)
else
MessageDlg( ‘Вы не угадали.’ ,mtWarning,[mbOk],0)
end ;
Мы рассмотрели способы ввода и вывода данных, а также познакомились с диалоговыми окнами. Приёмы ввода-вывода используются практически в любом приложении: в тех, которые имеют оконный интерфейс, это делается с использованием визуальных объектов, а для консольных приложений — в режиме командной строки.
Составить программу, запрашивающую у пользователя три числа — длины сторон треугольника. При нажатии кнопки программа должна вычислить площадь треугольника с указанными сторонами, а если такой треугольник не существует, то выдать соответствующее сообщение.
Автор: Ерёмин А.А.
Статья добавлена: 7 августа 2007
Зарегистрируйтесь/авторизируйтесь,
чтобы оценивать статьи.
Статьи, похожие по тематике
Для вставки ссылки на данную статью на другом сайте используйте следующий HTML-код:
Ссылка для форумов (BBCode):
Быстрая вставка ссылки на статью в сообщениях на сайте:
<
<<статья:113>> — полноценная HTML-ссылка на статью (текст ссылки — название статьи).
Поделитесь ссылкой в социальных сетях:
Комментарии читателей к данной статье
Репутация: нет | |
Репутация: +1 | |
Репутация: нет | Оставлять комментарии к статьям могут только зарегистрированные пользователи. Источник |