Лабораторные работы №6 Delphi
.pdfЛАБОРАТОРНАЯ РАБОТА 3-1. СОЗДАНИЕ ПРОСТЕЙШЕГО ПРОЕКТА
Целью работы является практическое освоение методологии и принципов создания базовых стандартных элементов интерфейса Windows-программы в среде визуального проектирования DELPHI.
Элементы интерфейса как заготовка программы
Основная причина бурного развития сред визуального проектирования – необходимость освободить разработчика программ от необходимости рутинной работы по созданию стандартизированных элементов интерфейса разрабатываемого проекта. Число таких элементов в настоящее время довольно велико и продолжает расти, причем внутренняя структура многих из этих элементов весьма сложная.
Однако базовые элементы интерфейса (кнопки, меню, строки ввода и тому подобное) уже вряд ли будут принципиально совершенствоваться. Их состав, свойства, принципы использования являются практически промышленным стандартом и одинаковы в любой среде разработки современных программ. Рассмотрим создание стандартных элементов интерфейса на примере работы с компонентами библиотеки VCL (Visual Component Library) в среде Delphi.
Базовые стандартные элементы расположены на странице Standart палитры компонент Delphi (рисунок 1). Все эти объекты такая же часть Windows, как мышь или окно.
Рисунок 1 Свойства, общие для внешнего оформления этих компонент, приведены в
приложении А, характеристики компонент – в приложении Б. При создании программы размещение компонент на форме и определение их свойств трудностей не представляет – среда визуального проектирования и создавалась для того, чтобы подобных трудностей не возникало. От разработчика требуется определить реакции на задействование введенных компонент – эта часть создания программного продукта автоматизации не подлежит и является сущностью работы программиста. Классические приемы "включения в работу" стандартных компонент приведены ниже.
Типовые приемы использования стандартных компонент VCL
В представленном ниже проекте используем следующий минимальный набор компонент.
Button – стандартная кнопка, обычно кнопка используется для запуска действия, при этом задействуют только метод OnEvent (реакция на нажатие). Свойство Default=True ассоциирует вводимый компонент с кнопкой Enter, Cancel=True – с кнопкой Esc. Свойства Color для оформления надписи (Caption) у кнопки нет. Амперсант, помещенный в тексте надписи, указывает быструю Alt-клавишу запуска, например, Caption=A&Ppend вызывает срабатывание кнопки при нажатии Alt-P. Свойство ModalResult=true определит
обязательность нажатия для закрытия дочернего окна.
Label – метка, используется как надпись или как область вывода информации для чтения. Как и для кнопки, для метки можно определить клавишу быстрого доступа, но она будет запускать связанный с меткой компонент (по FocusControl). Свойство AutoSize=True определит минимизацию размера метки под текст надписи, Aligment – центровку этого текста, WordWrap – возможность расположения текста в несколько строк,
Transparent – прозрачность при наложении на другие элементы.
Edit – строка ввода. Заголовка (Caption) у этого компонента нет, но есть свойство Text как содержимое строки. Это свойство можно как считывать, так и присваивать (при необходимости с ограничением длины назначением свойства MaxLength). При вводе конфиденциальной информации указывают отображаемые символы (обычно "*"), при этом нужно
переопределить свойство PasswordChar, задав его отличным от #0.
Составим проект для суммирования двух чисел, вводимых с клавиатуры.
При этом на форме нужно разместить |
|
|
|
|
|
четыре |
|||
Расчет суммы чисел |
|||||||||
надписи (с задаваемыми свойствами Caption) |
и |
||||||||
пятую надпись с пустой Caption – для |
первое: |
|
|
|
|
||||
|
|
|
|
||||||
отображения суммы. Определить две строки |
второе: |
|
|
|
ввода |
||||
|
|
|
|||||||
для суммируемых |
чисел (против |
меток |
сумма: |
|
|
|
|
||
|
|
|
|
||||||
"первое" и "второе") и одну кнопку "Расчет" |
|
|
|
|
|
для |
|||
запуска процедуры |
суммирования |
после |
|
Расчет |
|
ввода |
|||
чисел. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
После двойного щелчка на кнопке “РАСЧЕТ” можно заполнить шаблон |
|||||||||
процедуры реакции |
на нажатие этой кнопки (красным цветом |
выделен |
|||||||
вводимый программистом текст). |
|
|
|
|
|
|
|
Procedure TForm1.Button1Click(Sedner: TObject); var
a,b,c:real;
s:string;
code:integer; begin
{ ввод данных из полей редактирования } val(edit1.text,a,code); val(edit2.text,b,code);
c:=a+b;
str(c:10:4,s);
Label5.Caption:=s;
end;
Приведенный выше вариант программы вполне работоспособен. Но в подобных программах обязательное требование в части их оформления – предусмотреть реакции на ввод символов в полях редактирования, например, защиту от ввода букв или второй десятичной точки. При нажатии Enter естественно переносить курсор в следующее поле редактирования или выполнять другие действия, если ввод данных завершен. В обработчиках
2
событий (закладка Events инспектора событий Delphi) для полей ввода определим методы OnKeyPress, задав им имена, например, e1 и e2. Затем после двойного щелчка заполним шаблоны процедур.
procedure TForm1.e1(Sender: TObject; var Key: Char); begin
{защита поля редактирования на ввод числа } case key of '0'..'9',chr(8):;
'.': if pos('.',edit1.text)>0 then key:=chr(0); '–': if length( edit1.text)>0 then key:=chr(0); chr(13): edit2.SetFocus;
else key:=chr(0); end;
end;
Вторая процедура отличается от первой лишь реакцией на нажатие клавиши Enter
procedure TForm1.e2(Sender: TObject; var Key: Char); begin
... edit2.text ...
chr(13): edit2.font.color:=clRed;
...
end;
Введем кнопку очистки полей ввода и вывода результата для нового расчета. Заголовок кнопки определим как Caption="новое", зададим реакцию OnClick (двойным щелчком на кнопке).
procedure TForm1.Button2Click(Sender:TObject); begin
{очистка полей ввода} edit1.text:=' '; edit2.text:=' '; label5.caption:=' '; edit1.SetFocus
end;
Введем кнопку выхода
procedure TForm1.Button3Click(Sender: TObject); begin
form1.close { завершение приложения}
end;
После завершения построение проекта текст программы (Unit1.pas) будет выглядеть следующим образом.
unit Unit1;
interface
3
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids, OleCtrls, graphsv3, chartfx3, vcfi;
type
TForm1 = class(TForm) Edit1: TEdit;
Button1: TButton; Edit2: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Button2: TButton; Button3: TButton;
procedure Button1Click(Sender: TObject); procedure e1(Sender: TObject; var Key: Char); procedure e2(Sender: TObject; var Key: Char); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject);
private
{Private declarations } public
{Public declarations } end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject); var
s:string;
a,b,c:real;
code:integer; begin
val(edit1.text,a,code);
val(edit2.text,b,code);
c:=a+b;
str(c:10:4,s);
label5.Caption:=s;
4
end;
procedure TForm1.e1(Sender: TObject; var Key: Char); begin
case key of '0'..'9',chr(8):;
'.': if pos('.',edit1.text)>0 then key:=chr(0); '-': if length( edit1.text)>0 then key:=chr(0); chr(13): edit2.SetFocus;
else key:=chr(0); end;
end;
procedure TForm1.e2(Sender: TObject; var Key: Char); begin
case key of '0'..'9',chr(8):;
'.': if pos('.',edit2.text)>0 then key:=chr(0); '-': if length( edit2.text)>0 then key:=chr(0); chr(13):edit2.font.color:=clRed;
else key:=chr(0); end;
end;
procedure TForm1.Button2Click(Sender: TObject); begin
edit1.text:=' '; edit2.text:=' '; label4.caption:=' '; edit1.SetFocus;
end;
procedure TForm1.Button3Click(Sender: TObject); begin
form1.close;
end;
end.
Порядок выполнения работы.
Выполнить все действия указанные в описании работы. Продемонстрировать преподавателю работающую программу.
Составить, откомпилировать и проверить программу по индивидуальному заданию.
Написать отчет по работе в котором отразить:
-порядок построения проекта программы;
-прокомментировать предложения программы внесенные в текст исполнителем проекта;
5
- контрольные примеры и результаты их выполнения.
К отчету приложить дискету с исполняемым модулем программы (exe – файл).
Задание 1 Составить проект программы калькулятора, выполняющего четырех
арифметических операции (сложение, вычитание, умножение и деление). Предусмотреть блокировку деления на ноль с выводом соответствующего сообщения в окне результата.
Задание 2 Составить проект программы калькулятора, выполняющего вычисление
четырех тригонометрических функций (sin, cos, tg, ctg). Аргумент функций выражается в градусах. Предусмотреть блокировку некорректного аргумента с выводом соответствующего сообщения в окне результата.
Задание 3 Составить проект программы калькулятора, выполняющего вычисление
экспоненты, квадратного корня, десятичного и натурального логарифма. Предусмотреть блокировку вычислений логарифма и квадратного корня от отрицательного аргумента с выводом соответствующего сообщения в окне результата.
Задание 4 Составить проект программы калькулятора, выполняющего вычисление
гиперболических функций (sh, ch, th). Предусмотреть блокировку некорректного аргумента с выводом соответствующего сообщения в окне результата.
Задание 5 Составить проект программы калькулятора, выполняющего вычисление
четырех обратных тригонометрических функций (arcsin, arccos, arctg, arcctg). Значение функций выражается в градусах. Предусмотреть блокировку некорректного аргумента с выводом соответствующего сообщения в окне результата.
Задание 6 Составить проект программы калькулятора, выполняющего вычисление
среднего значения и величины среднеквадратического отклонения от среднего для N чисел (N <= 20). Величина N определяется автоматически в процессе ввода. Окончание ввода определяется при нажатии кнопки “Вычисление”. Предусмотреть блокировку ввода 21-го значения с выводом соответствующего сообщения.
Задание 7 Составить проект программы калькулятора, выполняющего вычисление
6
среднего значения логарифмов вводимых чисел (среднелогарифмического значения) и величины среднеквадратического отклонения от среднелогарифмического для N чисел (N <= 20). Величина N определяется автоматически в процессе ввода. Окончание ввода определяется при нажатии кнопки “Вычисление”. Предусмотреть блокировку ввода 21-го значения и ввода отрицательных чисел с выводом соответствующего сообщения.
7
ЛАБОРАТОРНАЯ РАБОТА 3-2 СОЗДАНИЕ ПРОЕКТА С ИСПОЛЬЗОВАНИЕМ МЕНЮ
Меню как интерфейсный элемент используется практически во всех серьезных приложениях. В Windows поддерживается два типа меню - строчное, которому соответствует компонент MainMenu, и всплывающее (или локальное) - ему соответствует компонент PopupMenu. Обычно эти типы используются в комбинации.
MainMenu позволяет поместить главное меню в программу. При размещении на форме этот компонент выглядит как иконка. Создание меню включает три шага:
-помещение MainMenu на форму;
-вызов дизайнера меню через свойство Items в инспекторе объектов;
-определение пунктов меню в дизайнере меню.
PopupMenu позволяет создавать всплывающие меню, которое появляется по щелчку правой кнопки мыши на объекте, к которому оно привязано. У всех видимых объектов имеется свойство PopupMenu, где и указывается нужное меню. Создается PopupMenu аналогично главному меню.
Разместим на форме две строки ввода с реакцией OnKeyPress (двойной щелчок мыши на соответствующем окне в разделе Events инспектора объектов).
case key of '0'..'9','-',chr(8):;
'.': if pos('.',edit1.text)<>0 then key:=chr(0); chr(13): edit2.SetFocus;
else key:=chr(0) end;
Здесь допускается ввод только цифр и одной десятичной точки. Для второй строки ввода смена фокуса при нажатии Enter не вводится.
Введем четыре метки в качестве заголовков "введи 2 числа", "а=", "b=", "результат", а также пятую метку без заголовка для вывода информации.
Поместим на форме меню и введем три пункта по горизонтали: "расчет", "новое", "выход". В пункт расчета добавим выпадающее меню из четырех пунктов - для суммы, разности, произведения и частного.
Введем в окне редактора две универсальных процедуры - по считыванию информации из строк ввода и по выводу результата в пятую метку (с именем label5):
procedure input(edit1,edit2: tEdit); var code: integer;
begin { ввод данных из полей редактирования } val(edit1.text,a,code); val(edit2.text,b,code);
end;
procedure output(label5: TLabel); var s: string;
begin { вывод результата }
str(c:-10:4,s); { перевод числа в строку } label5.Caption:=s;
end;
При этом в описание глобальных переменных необходимо добавить три числа (var a,b,c: real).
Реакции расчетных пунктов меню будут однотипными, различающимися лишь видом арифметической операции. Заполнение этих форм в программе производится после двойного щелчка мыши на соответствующем пункте меню. Пример для пункта "деление":
input(edit1,edit2); if b<>0 then begin
c:=a/b;
output(label5);
end
else label5.Caption:='некорректно!';
Пункт "новое" аналогичен ранее описанному в работе 3-1: edit1.text:='';
edit2.text:='';
label5.caption:=''; edit1.SetFocus;
Самый простой пункт меню - это закрытие формы: form1.close.
После завершения работы над проектом текст программы будет выглядеть следующим образом.
8
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Menus;
type
TForm1 = class(TForm) Label1: TLabel; Edit1: TEdit;
Edit2: TEdit; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel;
MainMenu1: TMainMenu; N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
procedure N4Click(Sender: TObject); procedure N5Click(Sender: TObject); procedure N6Click(Sender: TObject); procedure N7Click(Sender: TObject); procedure N2Click(Sender: TObject); procedure N3Click(Sender: TObject); procedure input(edit1,edit2: tEdit); procedure output(Label5: tLabel);
procedure Edit1KeyPress(Sender: TObject; var Key: Char); procedure Edit2KeyPress(Sender: TObject; var Key: Char);
private
{Private declarations } public
{Public declarations } end;
var
Form1: TForm1; a,b,c:real;
implementation
{$R *.DFM}
procedure TForm1.N4Click(Sender: TObject); begin
input(edit1,edit2);
c:=a+b;
output(label5);
end;
procedure TForm1.N5Click(Sender: TObject); begin
input(edit1,edit2); c:=a-b; output(label5);
end;
procedure TForm1.N6Click(Sender: TObject); begin
input(edit1,edit2);
c:=a*b;
9
output(label5);
end;
procedure TForm1.N7Click(Sender: TObject); begin
input(edit1,edit2); if b<>0 then
begin
c:=a/b;
output(label5)
end
else label5.Caption:='Div. by zero';
end;
procedure TForm1.N2Click(Sender: TObject); begin
edit1.text:='';
edit2.text:='';
label5.caption:='';
edit1.SetFocus;
end;
procedure TForm1.N3Click(Sender: TObject); begin
form1.close;
end;
procedure TForm1.input(edit1,edit2: tEdit); var code: integer;
begin
val(edit1.text,a,code);
val(edit2.text,b,code);
end;
procedure TForm1.output(label5: TLabel); var s: string;
begin
str(c:-10:4,s); label5.Caption:=s;
end;
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): edit2.SetFocus;
else key:=chr(0) end;
end;
procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char); begin
case key of '0'..'9','-',chr(8):;
'.': if pos('.',edit2.text)<>0 then key:=chr(0); chr(13): edit2.SetFocus;
else key:=chr(0) end;
end;
end.
Порядок выполнения работы.
Выполнить все действия указанные в описании работы. Продемонстрировать преподавателю работающую программу. Составить, откомпилировать и проверить программу по индивидуальному заданию работы 3-1.
Написать отчет по работе в котором отразить:
-порядок построения проекта программы;
-прокомментировать предложения программы внесенные в текст исполнителем проекта;
-контрольные примеры и результаты их выполнения.
Котчету приложить дискету с исполняемым модулем программы (exe - файл).
10