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

Лабник по СПО

.pdf
Скачиваний:
9
Добавлен:
05.06.2015
Размер:
1.59 Mб
Скачать

заголовок метки сообщение об ошибке. При корректном вводе исходных данных записываем в метку один пробел. Пользователи иногда перед вводом числа удаляют весь текст из редактора. Для того чтобы при этом не возникало сообщение об ошибке необходимо присвоить вводимой переменной нулевое значение. Получаем текст функции Vvod. Прототип функции записываем в секцию Public.

Function TfmLCF.Vvod(Str: String): Double;

Begin

Try

Vvod:=StrToFloat(Str); LabErr.Caption:=' ';

Except

Vvod:=0;

If ((Str <> '')And(Str <> ' '))

Then LabErr.Caption:=' Ошибка ввода '

End

End;

В обработчики события OnChange всех редакторов записываем функцию ввода данных. Для определения рассчитываемого параметра, значение которого не должно считываться, воспользуемся условным оператором If и номером индекса объекта Param.

Procedure TfmLCF.EdfChange(Sender: TObject);

Begin

If Param.ItemIndex <> 0

Then Begin

f := Vvod(Edf.Text); LabErr.Caption:=FloatToStr(f)

End End;

Procedure TfmLCF.EdLChange(Sender: TObject);

Begin

If Param.ItemIndex <> 1

Then Begin

L := Vvod(EdL.Text); LabErr.Caption:=FloatToStr(L)

End End;

61

PDF created with pdfFactory Pro trial version www.pdffactory.com

Procedure TfmLCF.EdCChange(Sender: TObject);

Begin

If Param.ItemIndex <> 2

Then Begin

C := Vvod(EdC.Text); LabErr.Caption:=FloatToStr(С)

End End;

Оператор, выводящий на метку LabErr результат работы функции Vvod, записываем для проверки работы процедур обработки событий OnChange. Проверяем работу процедур и удаляем оператор, выводящий результат на метку. Редактор, на который выводится рассчитываемый параметр, не должен считывать записанные в него данные.

В обработчик события OnChange списка Param записываем переключатель Case, изменяющий значения свойства ReadOnly редакторов для ввода данных. Редактор, на который выводится рассчитываемый параметр, не должен быть доступным для изменения данных пользователем. Для устранения некорректных результатов, возникающих при ошибочном вводе данных, введём операторы, восстанавливающие исходные данные при изменении рассчитываемого параметра.

Procedure TfmLCF.ParamChange(Sender: TObject);

Begin

Case Param.ItemIndex Of

0:Begin

Edf.ReadOnly:=True;

EdL.ReadOnly:=False;

EdC.ReadOnly:=False;

EdL.Text:=FloatToStrF(L,ffGeneral,5,2);

EdC.Text:=FloatToStrF(C,ffGeneral,5,2)

End;

1:Begin

Edf.ReadOnly:=False;

EdL.ReadOnly:=True;

EdC.ReadOnly:=False;

Edf.Text:=FloatToStrF(f,ffGeneral,5,2);

EdC.Text:=FloatToStrF(C,ffGeneral,5,2)

62

PDF created with pdfFactory Pro trial version www.pdffactory.com

End;

2:Begin

Edf.ReadOnly:=False;

EdL.ReadOnly:=False;

EdC.ReadOnly:=True;

Edf.Text:=FloatToStrF(f,ffGeneral,5,2);

EdC.Text:=FloatToStrF(L,ffGeneral,5,2)

End End End;

Создаём заготовку процедуры расчёта параметров с именем CalcLCF.

Procedure TfmLCF.CalcLCF;

Begin

End;

Прототип процедуры записываем в секцию Public.

Procedure CalcLCF;

Записываем текст процедуры расчёта. После считывания исходных данных необходимо привести их значения к основным единицам измерения (генри, герцы и фарады), т.е. реализовать схему подпрограммы, показанную на рис.2.3. Для этого вводим в процедуру CalcLCF переключатели Case (блоки 2, 6 и 10 на рис.2.3), выбирающие

коэффициенты перевода значений параметров из значений в задаваемых единицах измерения в значения в основных единицах измерения параметров. Проверяем работу программы.

Case IzmL.ItemIndex Of

0:Lr := L ;

1:Lr := L/1000;

2:Lr := L/1000000

End;

Case Izmf.ItemIndex Of

0:fr := f ;

1:fr := f*1000;

2:fr := f*1E6

End;

Case IzmC.ItemIndex Of

0:Cr := C*1E-6;

63

PDF created with pdfFactory Pro trial version www.pdffactory.com

1: Cr := C*1E-12

End;

Затем необходимо вычислить значение рассчитываемого параметра и привести его значение к заданной единице измерения (распечатка 2.8). Для ввода числа π на языке Delphi можно использовать функцию Pi.

Распечатка 2.8

Case Param.ItemIndex Of

0: If L*C>0 Then Begin

fr := 0.5/sqrt(Lr*Cr)/Pi; Case Izmf.ItemIndex Of

0:f := fr;

1:fr := fr/1000;

2:fr := fr*1E-6

End;

Edf.Text:=FloatToStrF(f,ffGeneral,5,2)

End

Else Edf.Text := ' ???';

1: If f*C>0 Then Begin

Lr := 0.25/fr/fr/Cr/Pi/Pi; Case IzmL.ItemIndex Of

0:L := Lr;

1:Lr := Lr*1000;

2:Lr := Lr*1E6

End;

EdL.Text:=FloatToStrF(L,ffGeneral,5,2)

End

Else EdL.Text := ' ???';

2: If f*L>0 Then Begin

Cr := 0.25/fr/fr/Lr/Pi/Pi; Case IzmC.ItemIndex Of

0:Cr := Cr*1E6;

1:Cr := Cr*1E12

End;

EdC.Text:=FloatToStrF(C,ffGeneral,5,2)

End

64

PDF created with pdfFactory Pro trial version www.pdffactory.com

Else EdC.Text := ' ???'

End;

Потом вводим вызов процедуры CalcLCF в обработчики события OnChange всех объектов, через которые могут вноситься изменения исходных данных или единиц измерения.

Ниже показан пример записи процедуры расчёта в обработчики событий OnChange двух объектов: EdL и IzmL.

Procedure TfmLCF.EdLChange(Sender: TObject);

Begin

If Param.ItemIndex<>1 Then Begin

L := Vvod(EdL.Text); CalcLCF

End

End;

Procedure TfmLCF.IzmLChange(Sender: TObject);

Begin

CalcLCF

End;

Запись результатов желательно сформировать столбцами одинаковой ширины, независимо от введённых или полученных значений величин. Для этого в объекте RezOut выбираем шрифт Courier и создаём функцию WrRez, делающую строки результатов расчёта одинаковой длины по 16 символов. Если длина строки, содержащей результат, получится меньше 16 символов, то функция добавит пробелы в конец строки. Текст функции приведён в распечатке 2.9.

Распечатка 2.9

Function TfmLCF.WrRez(Num:String; UnV:String):String;

Begin

Result:=Num+UnV;

While Length(Result)<16 Do Result:=Result+' '

End;

Прототип функции записываем в секции Public класса формы.

Для записи результата в обработчик события OnClick кнопки Записать вводим операторы, формирующие результаты расчёта в зависимости от рассчитываемого параметра (распечатка 2.10). Убедимся, что ширина столбцов, содержащих результаты, не зависит от значений результатов и исходных данных.

65

PDF created with pdfFactory Pro trial version www.pdffactory.com

Распечатка 2.10

Procedure TfmLCF.WrButClick(Sender: TObject);

Begin

If IndWr=0 Then RezOut.Lines.Add ('Результаты расчёта параметров LC контура'); IndWr:=1;

If Param.ItemIndex=0 Then

RezOut.Lines.Add('L = '+WrRez(EdL.Text,IzmL.Text)+

'C = '+WrRez(EdC.Text,IzmC.Text)+

'f = '+Edf.Text+Izmf.Text);

If Param.ItemIndex=1 Then

RezOut.Lines.Add('f = '+WrRez(Edf.Text,Izmf.Text)+

'C = '+WrRez(EdC.Text,IzmC.Text)+

'L = '+EdL.Text+IzmL.Text);

If Param.ItemIndex=2 Then

RezOut.Lines.Add('f = '+WrRez(Edf.Text,Izmf.Text)+

'L = '+WrRez(EdL.Text,IzmL.Text)+

'C = '+EdC.Text+IzmC.Text)

End;

Если в программе нет ошибок и всё нормально работает, то нужно задать последовательность перехода фокуса по клавише Tab. Для задания последовательности перехода фокуса щёлкаем правой кнопкой мыши по форме, в контекстном меню выбираем команду Tab Order..., открываем диалоговое окно Edit Tab Order и устанавливаем последовательность перехода фокуса в соответствии с рис.2.6.

66

PDF created with pdfFactory Pro trial version www.pdffactory.com

Контрольные вопросы

1.Какие символы могут быть корректно переведены в числа?

2.Что появится на метках после выполнения операторов, приведённых ниже? float Nmf = 5.28;

Label1->Caption = Nmf; short x = 32767;

x = x*2; x = x/2;

Label2->Caption = x; Label3->Caption = 60/180*10;

Var

Nm1: Shortint; NmR: Single;

...

Nm1 := 127; Nm1 := Nm1*2;

Nm1 := Nm1 Div 2; Label3.Caption:=IntToStr(Nm1) // ? NmR:=5.28;

Label4.Caption := FloatToStr(NmR); Label5.Caption := 60/180*10;

3.Какие вам известны форматы вывода численных значений?

4.Что задают параметры Digits и Precision?

5.Что такое исключительная ситуация? В каких случаях она может возникать?

6.Какую команду необходимо использовать для немедленного отображения изменений на экране?

7.Какие вы знаете способы защиты программы от ошибок времени исполнения? Приведите типичные ошибки времени исполнения.

8.Как при работе программы определить, в каком из имеющихся редакторов произошли изменения?

9.Как изменить последовательность перехода фокуса по объектам при проектировании приложения?

10.Какие объекты могут иметь фокус и что означает наличие фокуса у объекта?

11.Что такое преобразование типов и для чего оно необходимо?

12.В каких случаях в приложении могут не выполняться операторы вывода значений параметров на экран?

67

PDF created with pdfFactory Pro trial version www.pdffactory.com

Лабораторная работа № 3. Создание и использование меню

Задание

Цель работы:

1.Изучение методов создания меню различного вида: главного меню, контекстного меню, пиктографического меню.

2.Освоение приёмов выдачи сообщений о возникновении исключительных ситуаций.

Содержание работы:

Разработка калькулятора на четыре действия.

Технические требования к программе:

Выполняемые действия: сложение, вычитание, умножение, деление.

Число одновременно отображаемых операндов: 3, два введённых числа и результат расчёта.

Типы чисел: действительные числа с плавающей запятой. Число значащих цифр в выводе результатов расчёта: 5 не менее.

Выполнение расчёта: по нажатию клавиши Enter, по выбору пункта меню Расчёт или по нажатию кнопки Расчёт.

Виды сообщений:

Ÿо выполняемом действии;

Ÿо корректности вводимых символов;

Ÿо делении на ноль;

Наличие подсказок: у каждой кнопки пиктографического меню. Дополнительные функции:

Ÿвозможность перестановки операндов местами;

Ÿвозможность накопительной записи результатов;

Ÿвозможность повторения действия с использованием в качестве первого операнда результата расчёта;

Ÿвозможность выбора в накопительном режиме в качестве второго операнда первого или второго числа;

Ÿвозможность просмотра записанных результатов;

Ÿвозможность сохранения результатов во внешнем файле.

68

PDF created with pdfFactory Pro trial version www.pdffactory.com

Форма отчёта:

Текст проекта в папке с именем Work3 на диске Н:.

Содержание отчёта:

Файлы проекта и исполняемый файл.

Визуальные компоненты для создания меню

Под термином "меню" в программировании понимают набор команд, из которого пользователь может выбрать нужную команду. Меню может выполняться в виде

раскрывающегося списка команд или в виде набора кнопок с надписями или условными обозначениями команд. Контекстным называется меню, содержание которого зависит от объекта, содержащего меню. Меню, выполненное в виде набора рисунков, называют пиктографическим или инструментальным.

Компонент MainMenu (главное меню) находится на вкладке Standard и предназначен для создания главного меню формы. На форму можно установить сколько угодно объектов этого класса, но отображаться в полосе меню в верхней части формы будет только тот из них, который указан в свойстве Menu формы.

После установки объекта меню на форму необходимо создать его содержание.

Сделайте двойной щелчок левой кнопкой по объекту меню или по правой части пункта Items инспектора объектов, или щелчок правой кнопкой по объекту меню и выберите пункт Menu Designer. Появится окно конструктора меню (рис.3.1).

Рис.3.1. Окно конструктора меню

Перейдите в окно Инспектора объектов, введите имя пункта меню в свойство Name, а заголовок - в свойство Caption и нажмите клавишу Enter. Не используйте предлагаемые системой имена.

Каждый раздел главного меню может раскрываться в список подразделов и содержать команду. Для создания подразделов щёлкните по строке ниже введённого

69

PDF created with pdfFactory Pro trial version www.pdffactory.com

раздела и введите первый подраздел и т.д. Затем щёлкните по пустому прямоугольнику справа и введите второй раздел меню (рис.3.2).

Рис.3.2. Схема создания разделов меню

Для создания разветвлённых меню нажмите комбинацию клавиш Ctrl+è или сделайте щелчок правой кнопкой, в раскрывшемся меню выберите пункт Create SubMenu и введите новые списки (рис.3.3).

Рис.3.3. Схема создания подразделов меню

Каждый пункт меню является объектом класса TMenuItem и обладает всеми свойствами этого класса. Быструю клавишу вызова пункта меню можно указать в свойстве ShortCut пункта меню. Быстрые клавиши различают язык и регистр символов.

Свойство Break позволяет создавать многоколончатый список пунктов. Значения mbBarBreak, содержащиеся в соседних колонках, приводят к размещению списка пунктов меню в несколько колонок. Число колонок определяется числом соседних пунктов, имеющих значения свойства Break: mbBreak или mbBarBreak. Значения mbBarBreak и mbBreak отличаются только наличием или отсутствием разделительной черты между пунктами. Значения этого свойства игнорируются в пунктах самого первого уровня.

Если в свойстве пункта Default указать значение True , то пункт выделяется цветом и может выбираться двойным щелчком мыши по родительскому пункту меню.

70

PDF created with pdfFactory Pro trial version www.pdffactory.com

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]