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

Лабник по СПО

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

Проверяем правильность работы функции Pr1 и, если всё правильно, создаём функцию Pr2 как не члена класса формы.

Создаём прототип функции Pr2 вне класса формы. void Pr1(AnsiString St);

AnsiString Ch1;

};

AnsiString Ch2 = " Ch2 не член класса "; void Pr2(AnsiString St);

После объявления функции составляем её описание и создаём обработчик события нажатия второй кнопки. Так как функция Pr2 объявлена вне класса формы, то при вызове метки Label2, являющейся членом класса формы, нужно указать имя объекта владельца метки, т.е. имя формы fmWork1.

void Pr2(AnsiString St)

{

fmWork1->Label2->Caption = St;

}

void __fastcall TfmWork1::Button2Click (TObject *Sender)

{

Pr2(Ch2+" + "+Edit2->Text);

}

В качестве фактического параметра в заголовок функции записываем строку, полученную в результате выполнения операции объединения переменной Ch2, символа "+" и текста редактора Edit2. Проверяем работу кнопки и добавляем операторы для вывода текста на поверхность формы.

Форма имеет свойство Font, позволяющее изменять параметры шрифта, но при этом изменятся параметры шрифтов всех объектов, размещённых на форме. Поэтому удобнее параметры шрифта формы изменять программно.

void __fastcall TfmWork1::Button2Click (TObject *Sender)

{

Canvas->Font->Color = clGreen; //Цвет шрифта.

Canvas->Brush->Color = clYellow;

//Цвет фона.

Canvas->Font->Size = 20;

//Размер шрифта.

Canvas->Font->Style =

//Стиль шрифта.

 

 

31

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

TFontStyles()<< fsBold<< fsItalic; Canvas->TextOut(10,10,Ch2+" + "+Edit2->Text); Pr2(Ch2+" + "+Edit2->Text);

}

Первые две константы функции TextOut задают координаты левого верхнего угла прямоугольника, охватывающего строку текста. Проверяем вывод текста на поверхность формы.

Создаём функцию Pr3 без прототипа. Так как функция Pr3 не является членом класса, то для обращения внутри функции к форме необходимо указать имя формы.

void Pr3(AnsiString St)

{

fmWork1->Caption=St+" без прототипа ";

}

В функцию Button3Click третьей кнопки вводим вызов функции Pr3. Проверяем вывод текста в заголовок формы. Проверяем, будет ли вызываться функция Pr3 кнопкой Button3, если описание функции Pr3 поместить после описания функции Button3Click. void __fastcall TfmWork1::Button3Click

(TObject *Sender)

{

Pr3(Edit2->Text+" + "+Ch2);

}

Возможны три способа программного вызова кнопки по изменению текста редактора Edit1.

Первый способ. Вызов функции Button1Click с именем кнопки. void __fastcall TfmWork1::Edit1Change(TObject *Sender)

{

Button1Click(Button1);

}

Второй способ. Вызов функции Button1Click с записью вместо имени служебного слова Sender, в котором хранится имя кнопки.

void __fastcall TfmWork1::Edit1Change(TObject *Sender)

{

Button1Click(Sender);

}

Третий способ. Это прямое обращение к функции Click() кнопки Button1.

32

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

void __fastcall TfmWork1::Edit1Change(TObject *Sender) { Button1->Click(); }

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

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

#include "UnWork1.h" #include "Un2Work1.h" //------------------

Аналогичную запись со ссылкой на заголовочный файл главной формы необходимо внести в модуль второй формы, если планируется обращение из второй формы к главной форме.

Делаем двойной щелчок по четвёртой кнопке и создаём оператор, записывающий текст на метку Label1 второй формы. Перед именем метки пишем имя второй формы. void __fastcall TfmWork1::Button4Click

(TObject *Sender)

{

fm2Work1->Label1->Caption =

" Вывод текста на метку формы 2 ";

}

Организуем вызов функций Pr1 и Pr2 кнопками, помещёнными на второй форме. Для того чтобы было видно, как работает вызов функции со второй формы, выведем на метки сумму текстов двух редакторов, находящихся на разных формах.

void __fastcall Tfm2Work1::Button1Click (TObject *Sender)

{

fmWork1->Pr1(Edit1->Text+"+"+fmWork1->Edit1->Text);

}

void __fastcall Tfm2Work1::Button2Click (TObject *Sender)

{ Pr2(fmWork1->Edit2->Text+" + "+Edit2->Text); }

33

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

Поставим ещё одну кнопку на вторую форму и попробуем со второй формы вызвать функцию Pr3. Убедимся, что это невозможно.

Создадим у первой и второй кнопок первой формы подсказки, поясняющие действия кнопок. Для этого в свойства Hint этих кнопок введём тексты Вызов функции Pr1 и Вызов функции Pr2. В свойства кнопок ShowHint введём значения True. При подведении курсора к кнопке должны появляться подсказки. По умолчанию подсказки появляются не сразу, а с задержкой в 50 мс, после подведения курсора к объекту и исчезают через 1,5 с. Цвет фона подсказки жёлтый, цвет шрифта чёрный.

Цвет фона, время показа подсказки и время между моментом подведения курсора к объекту и появлением подсказки можно задать операторами:

Application->HintColor = clWhite; Application->HintHidePause = 2500; Application->HintPause = 0;

Если задать значение HintHidePause равным –1, то подсказка не будет закрываться, пока курсор не уйдёт с объекта.

Подсказка может содержать две части, разделённые символом "|", например: Подсказка | Длинное сообщение

Первая часть подсказки выводится рядом с объектом при подведении мыши к объекту. Для того чтобы вывести вторую часть подсказки, необходимо в начале работы программы, например, в обработчике события OnCreate главной формы, указать программе метод обработки события OnHint. Для обработки события OnHint нужно написать свою функцию или использовать функцию компонента ApplicationEvents.

Создаём объект ApplicationEvents1 и вызываем обработчик события OnHint этого объекта.

Взаготовку функции запишем оператор вывода длинной части подсказки на метку. void __fastcall TfmWork1::ApplicationEvents1Hint

(TObject *Sender)

{

Label3->Caption = Application->Hint;

}

Можно вывести длинную часть подсказки, не используя компонент ApplicationEvents. Для этого создадим свою функцию, выводящую длинную часть подсказки.

Всекции public записываем прототип функции.

void __fastcall ShowLongHint(TObject *Sender);

Затем создаём описание функции.

34

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

void __fastcall TfmWork1::ShowLongHint(TObject *Sender)

{

Label3->Caption = Application->Hint;

}

В функцию FormCreate вводим оператор, присваивающий обработчику события

OnHint функцию ShowLongHint. Application->OnHint = ShowLongHint;

Создаём значки форм и икону для ярлыка программы так же, как это было описано для программы на языке Delphi.

При закрытии главной формы закрывается вся программа, т.е. все формы, имеющиеся в программе. При закрытии любой не главной формы по умолчанию закрывается только одна эта форма. Для того чтобы при закрытии второй формы закрывалась главная форма и соответственно программа, можно в обработчик FormCloseQuery события OnCloseQuery второй формы ввести команду на закрытие главной формы.

void __fastcall Tfm2Work1::FormCloseQuery (TObject *Sender, bool &CanClose)

{

fmWork1->Close();

}

Можно также установить на вторую форму кнопку Выход и ввести в неё команду на закрытие программы. В этом случае при закрытии второй формы кнопкой закроется только вторая форма, а при нажатии кнопки Выход - вся программа.

void __fastcall Tfm2Work1::ClosePrClick (TObject *Sender)

{

Close(); fmWork1->Close();

}

35

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

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

1.Приведите определения понятий: "проект", "модуль", "компонент", "объект".

2.Какой состав проекта в системах программирования C++ Builder 2007 и Delphi 2007?

3. Каковы понятие, назначение и свойства формы в системах программирования

C++ Builder 2007 и Delphi 2007?

4.Что и зачем можно настраивать в интегрированной среде разработки CodeGear RAD Studio 2007?

5.Как создать и ввести в проект значок формы и ярлык приложения?

6.Что такое динамическая библиотека? Каковы преимущества и недостатки динамических библиотек?

7.Во сколько раз изменяется объём исполняемого файла при статическом использовании библиотеки VCL?

8.Что представляет собой объект класса TApplication?

9.Как сделать длинную подсказку к объекту?

10.Как сформировать заголовок кнопки в три строки?

11.В каком свойстве объекта хранятся подсказки? Назовите виды и свойства подсказок.

12.В чём заключаются различия свойств переменных, функций и процедур, включённых и не включённых в описание класса?

13.Что необходимо предусмотреть для обеспечения возможности взаимного вызова процедур и функций, описанных в разных модулях?

14.Как программно задать значения массива Style свойства Font объекта?

36

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

Лабораторная работа № 2. Обработка численных значений

Задание

Цель работы:

1.Изучение функций для преобразования строк в числа и чисел в строки, средств для ввода и вывода чисел и форматов вывода чисел.

2.Изучение методов ввода, вывода и записи численных величин.

3.Исследование работы защищенного блока в режиме обработки ошибок преобразования строки в число.

4.Исследование особенностей принудительного и автоматического преобразования типов в арифметических операциях и операциях присваивания.

5.Освоение методов обеспечения немедленного отображения изменений в объектах.

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

Разработка приложения для расчёта параметров колебательного контура.

Технические требования к приложению:

Рассчитываемые параметры: индуктивность, электрическая ёмкость, собственная частота колебательного контура.

Выполняемые действия: расчёт третьего параметра при заданных значениях двух параметров; накопительная запись результатов расчёта.

Выполнение расчёта: по изменению исходных данных или единиц измерения. Выбор рассчитываемой величины: ручной.

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

Единицы ввода-вывода значений параметров: Гн, мГн, мкГн, мкФ, пФ, Гц, кГц, МГц. Выбор единиц измерения рассчитываемой величины: ручной.

Запись результата: по команде.

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

Электронная форма в папке с именем Work2 на диске Н:.

37

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

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

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

Ввод и вывод чисел

Операционная система Windows работает только в графическом режиме и не имеет специального текстового режима, который является основным в MS DOS. Непосредственный ввод чисел не предусмотрен и реализуется через ввод строки, с последующим преобразованием её в число. Непосредственный вывод чисел также не предусмотрен и реализуется через вывод строки, с предварительным преобразованием числа в строку. Текстовая информация, выводимая на экран в графическом режиме, может быть только строковой или символьной.

Для преобразования строк в числа предусмотрены специальные функции. Тип и вид функции зависят от типа вводимого числа.

Функция StrToInt(St) преобразует символы строки St в целое число. Наличие пробелов между символами внутри строки не допускается.

Функция StrToIntDef(St,Def) преобразует символы строки St в целое число. Если строка содержит символы, недопустимые для целого числа, то возвращается значение числа Def. Функция StrToFloat(St) преобразует символы строки St в вещественное число. Строка не должна содержать пробелов.

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

Функция TimeToStr(Time) преобразует системное время Time в строку символов. Функция IntToStr(Nm) преобразует значение целого числа Nm в строку символов. Функция FloatToStr(Nm) преобразует значение вещественного числа Nm в строку символов.

Функция FloatToStrF(Nm, Format, Precision, Digits) преобразует вещественное число Nm в

строку символов с учётом формата Format и параметров Digits и Precision. Параметр Format может принимать следующие значения:

ŸffExponent - научная форма представления с множителем еХХ (умножить на 10 в степени ХХ). Precision задаёт общее число символов в мантиссе. Digits - минимальное число цифр в десятичном порядке;

ŸffFixed - формат с фиксированным положением разделителя целой и дробной частей. Precision - задаёт число значащих цифр, определяющих

38

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

точность выводимого числа, Digits - число цифр после децимальной точки;

ŸffGeneral - универсальный формат, автоматически выбирающий значение формата ffFixed, если значение числа соответствует параметрам Precision и Digits, иначе выбирается значение формата ffExponent;

ŸffNumber - формат, отличающийся от формата ffFixed только использованием разделителя тысяч;

ŸffCurrency - денежный формат с использованием разделителя тысяч.

Преобразование типов

Каждый объект приложения может работать с переменными определённого типа. Если типы объектов или переменных не совпадают, то требуется произвести преобразование типов. Преобразование типов может быть принудительным или автоматическим. Часто встречающиеся принудительные преобразования типов - это преобразование строки в число и преобразование числа в строку. Автоматическое преобразование типов происходит не менее часто, если в выражении участвуют данные разных типов. Автоматическое преобразование происходит для тех типов данных, для которых оно имеет смысл.

Преобразование типов в языке C++ происходит по следующим правилам:

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

Ÿтипы int и char могут смешиваться, перед вычислением переменная char автоматически преобразуется в int;

Ÿпри выполнении операции присвоения тип операнда правой части преобразуется в тип переменной левой части, т.е.:

-если операнд, расположенный справа от знака присвоения, имеет тип float, а переменная, расположенная слева, - int, то произойдет преобразование в тип int, и дробная часть будет потеряна;

-если операнд, расположенный справа от знака присвоения, имеет тип long, а переменная, расположенная слева, - int, то произойдет преобразование в тип int, и у значения переменной справа будут отброшены старшие биты, а это может дать большую ошибку.

В языке C++ возможно автоматическое преобразование числа в строку при присваивании метке значения численного типа, например:

39

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

float Nm = 23,6; Label4->Caption = Nm;

Оператор такого вида является допустимым, на метке будет выведено значение числа Nm, но, если, кроме числа, на метку нужно вывести ещё и строку, то автоматическое преобразование недопустимо. Для одновременного вывода текста и числа можно повторить оператор вывода или использовать принудительное преобразование.

Label4->Caption = "Число = " + Label4->Caption;

Label4->Caption = "Число = " + FloatToStr(Nm);

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

Обработка ошибок преобразования

Строка, содержащая символы, не соответствующие цифрам, знакам "+", "–" или децимальному разделителю, не может быть корректно преобразована в число. Попытка преобразования такой строки в число порождает ошибку времени выполнения (Run Time Error), называемую исключительной ситуацией. Исключительная ситуация возникает и при попытке преобразовать строку с децимальным разделителем в целое число. Для обработки исключений предусмотрены механизмы защищенного блока.

На языке C++ обработчик исключения записывается следующим образом: try

{

//Операторы, выполнение которых может вызвать исключение;

}

catch(Тип &e)

{

//Операторы, обрабатывающие исключение;

}

Зарезервированное слово try (попытка) обозначает начало оператора или блока операторов, во время выполнения которых может возникнуть исключение. Если во время выполнения операторов блока try возникло исключение, то выполняются операторы блока catch (перехват). Если исключение не возникло, то операторы блока catch пропускаются.

40

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

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