Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторные работы №6 Delphi

.pdf
Скачиваний:
44
Добавлен:
13.05.2015
Размер:
358.7 Кб
Скачать

ЛАБОРАТОРНАЯ РАБОТА 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