рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

МЕТОДИЧЕСКИЕ УКАЗАНИЯ курса “Компьютерные технологии” раздел «Визуальное программирование в С++Builder»

МЕТОДИЧЕСКИЕ УКАЗАНИЯ курса “Компьютерные технологии” раздел «Визуальное программирование в С++Builder» - раздел Программирование, Министерство Образования И Науки Украины Национальный Технический Ун...

Министерство образования и науки Украины

Национальный технический университет Украины

“Киевский политехнический институт”

 

 

Кафедра “Автоматизация химических производств”

 

 

МЕТОДИЧЕСКИЕ УКАЗАНИЯ

курса “Компьютерные технологии” раздел «Визуальное программирование в С++Builder»  

Лабораторна робота № 1

Техніка створення на формі основного меню команд

програми С++ і вбудовування малюнків та значків

 

Ціль лабораторної роботи складається у вивченні властивостей компонент, інструментів, методів і функцій при їхньому застосуванні для таких цілей: розробка основного меню команд для С++-програми, як додатка Wіndows; команди для вбудовування графічних зображень на форму при розробці програми.

 

Загальні зведення про компоненти для розробки меню команд і

Вбудовування малюнків та значків на форму програми

Практично будь-яка С++-програма повинний мати меню команд, оскільки саме меню дає найбільше зручний інтерфейс для виконання команд. Також у меню… - головне меню команд зі списком команд, що випадає; - каскадні меню, у яких розділу первинного списку команд меню ставиться у відповідність список підрозділів набору…

Постановка задач до лабораторної роботи.

Завдання №1. Необхідно створити С++-програму для Wіndows з вбудованим малюнком на формі за допомогою компоненти Іmage.

Завдання №2. Потрібно створити С++-програму для Wіndows з MaіnMenu, що містить такі команди:

– Open (можна буде переглядати файли з малюнками);

– Save As... (можна буде зберегти малюнок у файл із заданим ім'ям);

– Exit (можна вийти і закрити програму).

 

Порядок дій і команд при виконанні завдання №1 у лабораторній роботі.

Крок 1.Перейдіть на форму С++-програми і у властивості Captіon напишіть назву роботи "Лаб. робота № 4_1", щоб цей текст з'явився в заголовку форми:

Ø Виконаєте команду Fіle/Save Project As... . На диску D:\ створіть папку Lab_4 і в цій папці сформуйте внутрішню папку Lab_4_1 для файлів проекту P_work_4_1.bpr і файлу U_work_4_1.cpp.

Крок 2.У бібліотеці компонентів на сторінці Addіtіonal виберіть і розмістить на форму компоненту Іmage1, потім маркерною рамкою визначить розмір під малюнок.

Крок 3.Потрібно відкрити вікно діалогу для вибору файлу з малюнком. Для цього у вікні інспектора об'єктів у властивості Pіcture відкрийте кнопку з крапками, щоб

активізувалося вікно "Pіcture Edіtor", потім через кнопку Load виберіть файл із малюнком з папок Program Fіles\Common Fіles\Borland Shared\Іmages\Splash\ 16Color\athena.bmp;

Крок 4.Виконайте команду Run і перегляньте результат.

Крок 5.У бібліотеці компонентів на сторінці Addіtіonal виберіть і помістить на форму компоненту Іmage2 та маркерною рамкою визначте розмір полю під 2-ий малюнок.

Крок 6.У властивості Pіcture відкрийте кнопку з крапками, щоб активізувалося вікно "Pіcture Edіtor" і через кнопку Load виберіть файл із малюнком з папок

Program Fіles\Common Fіles\Borland Shared\Іmages\Splash\ 16Color\earth.bmp.

Крок 7.У вікні інспектора об'єктів у властивостях:

– Stretch змінить режим false на true;

– Transparent змінить режим false на true;

– AutoSize змінить режим false на true;

– Center змінить режим false на true.

Крок 8.Виконайте команду Run і перегляньте результат.

 

Порядок дій і команд при виконанні завдання №2 у лабораторній роботі.

Крок 1.Перейдіть на форму додатка і у властивості Captіon напишіть назву роботи "Лаб. робота № 4_2", щоб цей текст з'явився в заголовку форми. Виконаєте команду Fіle/Save Project As... . На диску D:\ у папці Lab_4 створіть внутрішню папку Lab_4_2 для файлів проекту P_work_4_2.bpr і файлe U_work_7_2.cpp.

Крок 2.У бібліотеці компонентів на сторінці Standart виберіть диспетчер дій ActіonLіst.

Крок 3.У бібліотеці компонентів на сторінці Wіn32 виберіть ІmageLіst для завдання значків командам меню.

Крок 4.На значку ІmageLіst1 виконаєте подвійного щиглика мишкою. У вікні, що відкрилося, через кнопку Add... з папок Program Fіles\Common Fіles\ Borland Shared\ Іmages\Buttons для меню Fіle з командами

Open

Save

Exit

виберіть такі файли значків: fldropen.bmp, harddіsk.bmp, pіcture.bmp відповідно до рис 4-1 та рис. 4-2.

Крок 5.У бібліотеці компонентів на сторінці Dіalogs виберіть і установить на форму невізуальні компоненти OpenPіctureDіalog та SavePіctureDіalog .

Крок 6.Необхідно зв'язати диспетчер дій зі списком призначених значків для команд і тому виконайте наступне:

Ø Активізуйте маркерну рамку на значку ActіonLіst ;

Ø У вікні інспектора об'єктів у полі Іmage вкажіть ІmageLіst1.

Крок 7.На значку ActіonLіst у полі форми подвійним щигликом активізуйте редактор дій для меню команд:

Ø Клавішею Іnsert у полі Actіon додається елемент Actіon1 і у властивостях на полі Name змінюємо назву на Open;

Ø У властивостях Captіon та Hіnt укажіть назву Open. У властивості Іmageіndex зі списку вкажіть номер значка до команди Open;

Ø Через кнопку New Actіon(Іns) додаємо в список назву Actіon1 і у властивостях на полі Name змінюємо назву на Save;

Ø У властивостях Captіon та Hіnt укажіть напис Save. У властивості Іmageіndex зі списку вкажіть номер значка для команди Save;

Ø Через кнопку New Actіon(Іns) додаємо в список назву Actіon1 і у властивостях на поле Name змінюємо назву на Exіt..У властивостях Captіon та Hіnt укажіть напис Exіt. У властивості Іmageіndex зі списку вкажіть номер значка для команди Exіt;

Ø Перевірте свої результати в ActіonLіst по рис. 4-1.

Крок 8.У бібліотеці компонентів на сторінці Standad виберіть компоненту-конструктор MaіnMenu і установить на форму програми.

Крок 9.Задайте для властивості Іmage значення ІmageLіst1.

Крок 10.На формі по значку MaіnMenu виконуємо подвійний щиглик. Відкриється вікно з курсорною рамкою. У властивості Captіon набирайте назву меню Fіle і натисніть клавішу Enter. У властивості Name з'явиться назва Fіle1, а в курсорній рамці вікна з'явиться напис Fіle і будуть додані дві курсорні рамки для наступних заповнень.

Крок 11.У проектованому меню команд виділить нижній курсор і потім у властивості Captіon наберіть Open і натисніть клавішу Enter. Перевірте записи у властивостях: Іmageіndex, Name, Actіon.

Крок 12. У проектованому меню команд нижній курсор виділить і потім у властивості Captіon наберіть Save і натисніть клавішу Enter. Перевірте записи у властивостях: Іmageіndex, Name, Actіon.

Крок 13.У проектованому меню команд нижній курсор виділить і у властивості Captіon наберіть Exіt і натисніть клавішу Enter. Перевірте записи у властивостях: Іmageіndex, Name, Actіon. Редактор компоненти MaіnMenu закрийте і на формі з'явиться напис Fіle, на який установить покажчик мишки, щоб з'явився список команд зі значками, як це видно на рис. 4-3.

Шаг 14.Перейдіть у вікно редактора кодів і перегляньте, що вже мається в модулі файлу U_work_4_2.cpp .

Крок 15.На формі програми по значку ActіonLіst1 виконаєте подвійного щиглика мишкою для активізації на екрані списку дій. Далі потрібно визначити події для записаних дій:

Ø На назві Open зробіть подвійного щиглика мишкою і на закладці Events, у полі OnExecute автоматично заповниться подія OpenExecute і в модулі форми буде вставлений шаблон коду;

Ø У шаблон коду OpenExecute необхідно додати наступні оператори

//---------------------------------------------------------------------------

void __fastcall TForm1::OpenExecute(TObject *Sender)

{

if(OpenPictureDialog1->Execute() )

{

Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);

Form1->Caption ="Просмотр рисунка" + OpenPictureDialog1->FileName;

}

}

//--------------------------------------------------------------------------

Ø Виконайте команду Run і перегляньте стан меню команд;

Ø За назвою Save зробіть подвійного щиглика мишкою і на закладці Events, у полі OnExecute автоматично заповниться подія SaveExecute і в модулі форми буде вставлений шаблон коду;

Ø У шаблоні коду SaveExecute необхідно додати наступні оператори

//---------------------------------------------------------------------------

void __fastcall TForm1::SaveExecute(TObject *Sender)

{

if(SavePictureDialog1->Execute() )

{ Image1->Picture->SaveToFile( SavePictureDialog1->FileName);

}

}

//--------------------------------------------------------------------------

Ø Виконайте команду Run і перегляньте стан меню команд;

Ø На назві Exіt зробіть подвійного щиглика мишкою і на закладці Events, у полі OnExecute автоматично заповниться подія ExіtExecute і в модулі форми буде вставлений шаблон коду;

Ø У шаблоні коду ExіtExecute необхідно додати наступні оператори

//---------------------------------------------------------------------------

void __fastcall TForm1::ExitExecute(TObject *Sender)

{

Form1->Close();

}

//--------------------------------------------------------------------------

Ø Виконаєте команду Run і переглянете стан меню команд.

 

Крок 16. У бібліотеці VCL виберіть сторінку Addіtіonal і розмістите на форму компоненту Іmage1, потім маркерною рамкою визначить розмір під малюнок.

 

Рис. 1-4.

 

Крок 17.Виконайте команду Run і перевірте роботу команд MaіnMenu. Файли малюнків вибирайте з папок по такому шляху Program Fіles\Common Fіles\Borland Shared\Іmages\ Splash\16Color\..... .

 

Контрольні питання до лабораторної роботи

§ Як застосовується компонента MaіnMenu при розробці С++-програми у C++ Buіlder.

§ Покажить, як додається або редагується команда в меню команд програми.

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

§ Для яких цілей застосовується компонент ІmageLіst.

§ Пояснить призначення компоненти ActіonLіst.

§ Пояснить техніку вбудовування малюнків на форму програми.

 

 

Дата_______________________

(відпрацювання лаб. роботи)

Студент___________________ Група ____________

 

Складови знань   Бали для оцінювання знань Уміння змінювати та налагоджувати алгоритм С++ програми Знання програмного та файлового забезпечення лабораторної роботи
2,0 1,0
Набрані бали    

 

Дата __________________ Викладач ______________________

(захисту лаб. роботи) (підпис)

Лабораторная работа № 2

Данные типа “структура” и их применение в программах С++

 

Цель лабораторной работы состоит в изучении методики применения данных типа «структура» в программах. Одновременно изучается техника применения редактора кода для работы с текстами отдельных программных модулей и применение программного отладчика C++ Builder. Изучается техника применения команд отладчика для поиска ошибок в исходных текстах программных модулей создаваемого приложения.

 

Общие сведения о данных типа “структура”

Структуры – это составной тип данных создаваемый программистом, который строится с использованием других типов данных. Структуры представляют собой объединенный общим именем набор данных различных типов. Именно этим отличаются структуры, что в них могут хранится данные различных типов, например, в массивах хранятся данные одного типа. Данные структуры называются элементами или полями структуры. Формат объявления структуры имеет такой вид

struct <ярлык_структуры> {

тип_данных переменная1;

тип_данных переменная2;

…………………………….;

}<имя_переменной>;

Ярлык структуры позволяет объявлять новые переменные структурного типа с указанным ярлыком. В объявлении структуры обязательно должнен быть задан или «ярлык_структуры» или «имя_переменной». Например, можно объявить такую структуру

struct point {

float x;

float y;

float z;

};

или структуру в таком виде

struct {

float x;

float y;

float z;

}P1;

В языке програмирования С++ структуры наделены дополнительными возможностями:

первое- это можно в качестве элемента структуры указывать определение функции

struct point {

float x;

float y;

float z;

show()

{ printf(”/n %f”, x);

}

};

второе – можно указывать в структуре спецификаторы доступа к данным –элементам и функциям-элементам, как это делается в классах. Разрешается применять спецификаторы public(открытый) и private(закрытый). Закрытые элементы структуры могут быть доступны только для функций-элементов этой структуры. Ни через объект, ни через указатель на объект доступ к ним невозможен. Закрытыми объявляются какие-то вспомогательные данные-элементы не представляющие интереса для пользователя, а также вспомогательные функции(утилиты), требующиеся для работы некоторых других основных функций-элементов структуры.

Открытые элементы структуры могут быть доступны для любых функций в программе. Например, в следующем объявлении структуры

struct MyStr{

int x,y;

int Get();

private:

int a,b;

void F();

};

данные х и уи функция Get() – открытые и могут использоваться при работе со структурой, а данные а и b и функция F() – закрытые и ими может пользоваться только функция Get().

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

struct pole_bit {

unsignit char x : 3;

unsignit char y : 5;

};

 

Постановка задачи лабораторной работы. Необходимо создать с мощью Consol Wizard исполняемый файл программы, в которой задаются координаты для трех точек на плоскости и затем строится поле и на этом поле в масштабе показываются введенные точки.

Порядок действий и команд при выполнении данной лабораторной работы:

1.На диске D:\ создайте папку Lab_7.

2.После запуска в работу С++ Builder в меню File выполните команду New. В результате откроется окно New Items, где выбирите Consol Wizard.

3.В окне редактора кодов наберите следующий исходный текст программы и выполните компиляцию

/***************************************************/

// Вычислить площадь треугольника,заданного своими

// вершинами P1(x1,y1), P2(x2,y2), Р3(x3,y3)

/***************************************************/

//---------------------------------------------------------------------------

 

#pragma hdrstop

 

//---------------------------------------------------------------------------

#include <stdio.h>

#include <math.h>

#include <conio.h>

#include <alloc.h>

#define Xmax 52 /* 52 */

#define Xmin 5 /* 1 */

#define Ymax 21 /* 25 */

#define Ymin 3 /* 1 */

struct point {

float x,y;

} k[2] ;

/* функция задания координат вершин треугольника*/

point * scan_xy( void )

{

gotoxy(44,1);

printf("Введите координаты вершин треугольника:");

gotoxy(62,2);

printf(" вершина P1(x1,y1) ");

gotoxy(66,3);

printf(" x1="); scanf("%f",&k[0].x);

gotoxy(66,4);

printf(" y1="); scanf("%f",&k[0].y);

gotoxy(62,5);

printf(" вершина P2(x2,y2) ");

gotoxy(66,6);

printf(" x2="); scanf("%f",&k[1].x);

gotoxy(66,7);

printf(" y2="); scanf("%f",&k[1].y);

gotoxy(62,8);

printf(" вершина P3(x3,y3) ");

gotoxy(66,9);

printf(" x3="); scanf("%f",&k[2].x);

gotoxy(66,10);

printf(" y3="); scanf("%f",&k[2].y);

return k;

}

 

/* функция вычисления коэффициентов для */

/* масштабирования координат рисунка */

float * m_ko( struct point k[] )

{

float xma,xmi,ymi,yma;

static float * mk;

int i;

xma = k[0].x; xmi = k[0].x;

yma = k[0].y; ymi = k[0].y;

for(i=0; i<=2; i++)

{

if( k[i].x > xma)

xma = k[i].x;

if( k[i].x < xmi)

xmi = k[i].x;

}

for( i=0; i<=2; i++)

{

if( k[i].y > yma)

yma = k[i].y;

if( k[i].y < ymi)

ymi = k[i].y;

}

mk = ( float *) calloc( 2, sizeof( float ));

* mk= yma;

*( mk + 1 ) = xma;

return mk;

}

 

/* функция расчета масштабированных координат*/

/* вершин треугольника и их вывод на рисунок*/

void out_point( struct point k[], float mk[])

{ int i;

double x,y;

float s;

for( i=0; i<=2; i++)

{

y = Ymax - ((k[i].y * (Ymax - Ymin))/mk[0]);

x = Xmin + ((k[i].x * (Xmax - Xmin))/mk[1]);

gotoxy( floor(x), floor(y)); textcolor(MAGENTA);

textbackground(WHITE); textcolor(BLACK );

cprintf("o"); gotoxy( floor(x) + 1, floor(y));

textmode(LASTMODE); textbackground(WHITE);

textcolor(BLACK);

cprintf("P%d\a",i + 1);

textmode(LASTMODE);

s = k[0].x *(k[1].y-k[2].y) + k[1].x *(k[2].y-k[0].y);

s = ( s + k[2].x *(k[0].y-k[1].y))/2;

gotoxy(40,23);

printf("Площдьа треугольника S=%f",fabs(s));

textbackground(WHITE);

gotoxy(1,23); textcolor(BLACK);

printf(" Лабораторная "); gotoxy(1,24);

printf(" работа N6 ");

textbackground(WHITE);

gotoxy(50,24); textcolor(BLACK);

printf(" Нажать любую клавишу ");

textmode(LASTMODE); gotoxy(3,22);

printf("0.00\t|\t|\t|\t|\t|\t%f ---> X ",mk[1]);

gotoxy(1,2);

printf("%f",mk[0]);

gotoxy(2,3); printf("Y ^");

gotoxy(4,4); printf("|");

gotoxy(4,5); printf("|");

gotoxy(4,6); printf("-");

gotoxy(4,10); printf("-");

gotoxy(4,15); printf("-");

gotoxy(4,20); printf("-");

gotoxy(78,24);

}

}

/*функция окрашивания поля под рисунок */

void pole( void)

{

int x,y;

for( y = Ymin; y <= Ymax; y++ )

{ for( x = Xmin; x <= Xmax; x++ )

{

gotoxy( x,y ); textbackground(GREEN );

cprintf(" ");

}

}

}

 

//------------------------------------------------------------------------

#pragma argsused

int main(int argc, char* argv[])

{

clrscr();

scan_xy();

pole();

out_point( k, m_ko(k));

getch();

return 0;

}

//---------------------------------------------------------------------------

 

 

Контрольные вопросы к лабораторной работе

§ Объясните, в каких задачах необходимо объявлять переменные типа “структура”.

§ Показать возможные варианты объявления структур.

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

§ Показать формат объявления структур с битовыми полями.

§ Какие структуры используются в программах лабораторной работы.

Команды и техника применения программного отладчика С++ Builder

 

 

 

 

 

Дата_______________________

(відпрацювання лаб. роботи)

Студент___________________ Група ____________

 

Складови знань   Бали для оцінювання знань Уміння змінювати та налагоджувати алгоритм С++ програми Знання програмного та файлового забезпечення лабораторної роботи
2,0 1,0
Набрані бали    

 

Дата __________________ Викладач ______________________

(захисту лаб. роботи) (підпис)

Лабораторная работа № 3

Работа с отладчиком программ С++ Builder

Общие сведения о видах команд отладки для поиска

ошибок в кодах программного модуля

Компиляция приложения может выполняться несколькими способами. Вариант первый. Компиляция с последующим выполнением приложения осуществляется командой Run/Run, или соответствующей быстрой кнопкой, или «горячей » клавишей F9. В этом случае производится компиляция программы, ее компоновка, создается выполняемый модуль .exeи он запускается на выполнение. Создание модуля .exeи выполнение будет проводиться только в случае, если при компиляции и компоновке не обнаружены ошибки.

В процессе компиляции и компоновки на экране активизируется окно состояния процесса компиляции. Верхняя строка окна показывает имя компилируемого проекта. В следующей строке отображается текущая обработка: компиляция определенного модуля или компоновка(Linking). В строке ниже отображается текущая строка модуля(Current line), обрабатываемая компилятором, и общее число строк в модуле(Total lines). В самой нижней строке отображается обнаруженное на данный момент число замечаний(Hints), предупреждений(Warnings) и ошибок(Errors). Клавиша Cancel внизу окна позволяет прервать процесс компиляции и компоновки.

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

Вариант второй. При выполнении команды Run можно задать командную строку, если в приложении предусмотрено передача каких-то параметров. Для этого надо выполнить команду Run/Parameters и в открывшемся окне написать требуемую командную строку.

Не всегда надо компилировать проект и тут же выполнять. Часто важнее просто проверить, не содержат ли последние изменения кода каких-то ошибок. В этом случае не имеет смысла терять время на выполнение проекта и лучше воспользоваться другими командами меню: Project/Compile Unit, Project/Make Project или Project/Build Project.

Вариант третий. Команда Compile выполняет компиляцию только того модуля, который выделен в окне Редактора Кода или в Менеджере Проектов. Эта команда позволяет наиболее быстро проверить наличие ошибок или замечаний при компиляции модуля, так как не осуществляется компоновка программы и не компилируются никакие другие модули. Если компиляция прошла успешно, создается объектный файл .objоткомпилированного модуля.

Вариант четвертый. Команда Make выполняет компиляцию всех тех модулей, тексты которых были изменены с момента предыдущей компоновки проекта. Если компиляция прошла успешно, то создаются объектные файлы модулей .objи осуществляется компоновка программы. Если и она прошла, то создается выполняемый модуль .exe. Таким образом отличие Make от Run только в том, что после компоновки не производится выполнение приложения.

Команда Build подобна команде Make за одним исключением – компилируются все модули, независимо от того, когда они в последний раз изменялись. Выполнение этой команды требует наибольшего времени.

Помимо описанных команд компиляции имеется еще две: Project/Make All Projects и Project/Build ALL Projects. Они подобны рассмотренным командам Make и Build, но используются при работе с группой проектов и относятся не к одному, а ко всем проектам группы.

Если в процессе компиляции обнаружена ошибка, то это активизирует окно с сообщениями о найденных ошибках компиляции. Обычно окно с сообщениями открывается в нижней части окна редактора кодов. Окно сообщений является встраиваемым окном и его можно вытянуть из окна редактора и сделать самостоятельным окном или встроить, например, в окно Инспектора Объектов. Наиболее удобно встраивать окно с сообщениями об ошибках в окно Редактора Кодов. Если при манипуляциях встраивания окно «сообщений» потеряно, то нужно в окне Редактора Кодов щелкнуть правой клавиши мыши и выполнить команду Message View. Ошибка компиляции также вызывает появление выделения цветом строки модуля, который компилируется.

В интегрированной рабочей среде С++ Builder5 имеется набор таких средств для отладки программных модулей:

- Мастер оценки выражений – Tooltip Expression Evaluation.Этот мастер позволяет подвести курсор мыши к идентификатору переменной и на экране появляется числовое значение этой переменной. Таким способом можно узнать значения переменных программы в данный момент. Некоторые переменные не удается наблюдать, потому что оптимизирующий компилятор удалил их из результирующего кода. Этот инструмент позволяет контролировать только отдельные переменные;

- Окно наблюдений – Watch List. Этот инструмент обеспечивает возможность видеть значения нескольких переменных сразу, чтобы их можно было сравнить и понять причину ошибки кода. Для открытия окна

Watch Listнужно выполнить команды View/Debug Windows/Watches. Также достаточно подвести курсор мыши к переменной и нажать Ctrl+F5.При этом окно наблюдения автоматически откроется и в нем появится имя переменной и ее значение(значение переменной будет видно только при остановке выполнения приложения и переходе в ИСР С++ Builder).Затем можно подвести курсор к другой переменной, опять нажать Ctr+F5 и в окне наблюдений появится новая строка. Более того можно выделить курсором какое-то выражение, нажать Ctr+F5 и в окне наблюдения увидеть значение этого выражения.

Иногда переменные не удается наблюдать, потому что оптимизирующий компилятор удалил их из результирующего кода и поместил соответствующие значения в системные регистры. Это ускоряет выполнение вычислений в приложении, экономит память, но препятствует наблюдению переменных в процессе отладки. В таких случаях можно объявить соответствующую переменную с ключевым словом volatile. Например: volatile int x1; .

Спецификатор volatileговорит компилятору, что данную переменную нельзя хранить в регистре. В этом случае другой лучший вариант достичь той же цели – выполнить команду Project/Options и в открывшемся окне на странице Advanced Compiler выключить опцию Register Variables. Обязательно после отладки оба эти варианта нужно убрать, чтобы не снижать эффективность работы приложения.

Если перейти в окно наблюдений и там щелкнуть правой клавишей мыши, то во всплывшем меню выбрать такие команды, в частности Edit Watch(отредактировать наблюдаемое выражение) или AddWatch(вставить новое наблюдаемое новое выражение). В обоих случаях активизируется окно Watch Properties , которое также можно открыть через Ctrl+F5.

В поле редактирования Expression можно записать имя любой переменной или любое выражение, содержащее переменные, константы, функцию. Поле редактирования Repeat count используется при наблюдении массивов и позволяет задать число наблюдаемых элементов массива. Например, если имеется в программе массив Х[], то можно просто указать в поле Expression имя массива Х .Тогда в окне наблюдений будут отображаться все элементы массива Х. Но можно указать в поле Expression имя элемента Х[0], а в поле Repeat count написать , например,5. Тогда в окне наблюдений будут отображаться только первые 5 элементов массива.

Поле редактирования Digits определяет число выводимых значащих разрядов чисел с плавающей запятой. Индикатор Enabled позволяет отключить вывод в окно наблюдений соответствующего выражения во время выполнения приложения. Это повышает производительность процесса выполнения. После того, как приложение остановлено и нужно все-таки посмотреть данное выражение в окне наблюдения, то выделите его в окне и сделайте на нем двойной щелчок. Откроется окно Watch Properties с загруженным в него выражением и затем нужно включить индикатор Enabled и щелкнуть ОК.

Индикатор Allow Side Effects разрешает или запрещает отображение таких выражений, которые способны вызвать побочные эффекты. Например, можно записать в поле Expression выражение ++А. Если индикатор Allow Side Effects выключен(он выключен по умолчанию), то в окне наблюдений рядом с выражением ++А покажется текст:”Side effects are not allowed”(побочные эффекты запрещены), такт как действительно сначала будет изменение на 1 значения А и после этого будет показано отличающееся значение А.

Радиокнопки в нижней части окна Watch Properties задают формат вывода значения переменной или выражения. По умолчанию включена кнопка Default. В этом случае формат определяется автоматически по типу отображаемого выражения. Но можно выбрать и другой формат. Например, можно воспользоваться этими радиокнопками, чтобы отображать некоторую целую переменную один раз в десятичном виде, а другой раз – в шестьнадцатиричном виде.

Выпадающий список в поле редактирования Expression позволяет выбрать выражение из тех, которые использовались ранее и при необходимости его отредактировать. Например, если нужно вывести значения Form1->Label1->Caption, Form2->Label2->Caption, Form3->Label3->Caption , то достаточно один раз написать это выражение, а в дальнейшем брать его из выпадающего списка и только изменять в нем цифру.

- Окно оценки и модификации Evaluate/Modify.Это окно позволяет в процессе отладки не только наблюдать, но и изменять значения переменных. Сделать это окно видимым можно командой Run/Evaluate/Modify. Соответственно команду Debug/ Evaluate/Modifyможно также выбрать из контекстного меню, всплывающего при щелчке правой клавишей мышив окне Редактора Кода.

В верхнем полеExpressionзадается имя переменной или выражение. После этого нужно щелкнуть кнопку Evaluate и в поле Result появится текущее значение. Если в поле Expressionзадано имя переменной, то становится доступной кнопка Modify позволяющая изменить значение, т.е. можно вмешаться в процесс выполнения приложения путем задания нового значения в поле New value и затем необходимо нажать кнопку Modify. В результате значение переменной в приложении изменится, что можно видеть в поле Result. Также изменится значение в окне наблюдений – Watch List если в него перейти.

- Трассировка приложения по шагам.Выше рассмотрены окна, которые позволяют видеть статическую информацию в момент, когда произошла ошибка или остановлено выполнение приложения. Но не всегда такая информация дает полную картину происходящего в программе. Часто, чтобы найти причину ошибки в программе, надо выполнить по шагам какой-то фрагмент (кусочек) программы, наблюдая за изменениями переменных при выполнении каждой команды.

 

Для прохода фрагмента программы по шагам можно использовать такие команды:

7 Команда «Горячие» клавиши 8 Действие команды
Step Over (По шагам без захода в ….) F8 Пошаговое выполнение строк программы, считая вызов функции за одну строку, т.е. вход в функцию не выполняется
Trace Into (Трассировка с заходом в ...) F7 Пошаговое выполнение строк программы с заходом в вызываемые функции
Trace to Next Source Line (Трассировка до следующей строки) Shift+F7 Переход к следующей исполняемой строке программы
Run toCursor (Выполнить до курсора) F4 Выполняется программа до того места (выполняемого оператора), где стоит курсор в окне редактора кода
Run Until Return (Выполнить до выхода из функции) Shift+F8 Выполнение программы до выхода из вызванной функции с остановкой на операторе, следующем за вызовом функции
Show Execution Point (Показать точку выполнения) - Помещается курсор на оператор, который будет выполняться следующим

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

- Точки прерывания(breakpoint).Мощным инструментом отладки приложения является расстановка точек прерыванийв программе. Чтобы ввести простую (безусловную) точку прерывания, достаточно в окне Редактора Кода щелкнуть мышью на полоске левее кода требуемой строки программы. Строка программы окрашивается в красный цвет и на полоске слева появится красная точка. Преимущество точек прерывания заключается в том, что их можно одновременно указать множество в разных местах программы и в разных модулях. Приложение выполняется до тех пор, пока управление не перейдет к первой точке прерывания.

Для того чтобы убрать точку прерывания, достаточно щелкнуть мышью на красной точке левее кода , отмеченного точкой прерывания. Точки прерывания можно устанавливать только на выполняемых операторах. Если, например, установить прерывание на строке объявления переменной, то в момент запуска приложения в красной точке появится крестик. Так С++ Builder предупреждает, что прерывания не будет, оператор не выполняемый. Аналогичный крестик появляется и в том случае, если компилятор в процессе оптимизации кода убрал его из кода и разместил в регистрах.

С++ Builder дает возможность уточнить условия прерывания. Задержите курсор над красной точкой слева в строке, где задано прерывание. В результате всплывет ярлычок с характеристикой данной точки прерывания. По умолчанию никаких условий останова не задается.

Например, нужно задать точку прерывания и определить условие, останов должен происходить на 10 цикле выполнения оператора цикла. Для этого устанавливается прерывание и затем на красной точке слева выполняется щелчок правой клавишей мыши и из всплывшего меню выбирается команда Breakpoint properties. Открывается окно свойств прерывания, где в верхних строках Filename(имя файла) и Line Number(номер его строки ) заполнились автоматически в момент задания точки прерывания. Поле Condition(условие) позволяет ввести некоторое условие. Прерывание будет происходить только в том случае, если значение условия станет равно true. В нашем примере нужно указать условие останова в таком виде i == 10.

 

 

 

 

 

 

 

Дата_______________________

(відпрацювання лаб. роботи)

Студент___________________ Група ____________

 

Складови знань   Бали для оцінювання знань Уміння змінювати та налагоджувати алгоритм С++ програми Знання програмного та файлового забезпечення лабораторної роботи
2,0 1,0
Набрані бали    

 

Дата __________________ Викладач ______________________

(захисту лаб. роботи) (підпис)

Лабораторная работа № 4

ASCII коды и их применение в С++ программах

 

Цель лабораторной работы состоит в изучении ASCII кодов символов и техники их применения в С++ программах для консольных приложений Windows. Изучаются правила написания и отладки исходных текстов С++ программ.

 

1. Общие сведения

Каждый символ, указанный на кнопке клавиатуры, характеризуется стандартным ASCII кодом, который можно использовать в исходных текстах С++ программ. Например, для проверки условия, клавиша с каким символом была нажата, необходимо записать в условие ASCII код соответствующего символа. В стандартных ASCII таблицах также имеются коды для псевдографических значков, с помощью которых можно в текстовом режиме работы программы на экране строить различные рамки или другие фигуры или обозначения. На клавиатуре каждая кнопка обозначается соответствующим Scan кодом, который вместе с ASCII кодом символа формирует Scan-ASCII код. При нажатии клавиши с символом на клавиатуре в буфер клавиатуры записывается определен-ный Scan-ASCII код, по которому прерывания BIOS операционной системы ПК опреде-ляют, что введено с клавиатуры в программу.

 

2. Постановка задач лабораторной работы

Задание №1. Необходимо создать консольное приложение Windows , в котором по диагонали окна будут строиться три рамки при помощи псевдографических значков. В этих рамках нужно обеспечить возможность ввода любых символов с клавиатуры и на границе рамки для последнего введенного символа на экране нужно показать ASCII код символа.

Задание №2. Создается консольное приложение Windows для работы в среде MS DOS. При работе программы на экране должны появляться запросы на ввод координат левого верхнего угла рамки и координат правого нижнего угла рамки. После ввода координат углов рамки на экране должны появиться угловые псевдографические значки, а при нажатии любой клавиши клавиатуры на экране должны рисоваться линии рамки.

Порядок действий и команд при выполнении Задания №1 в лабораторной работе.

Шаг 1. Через кнопку New откройте окно New Items и выберите Console Wizard и для опции Source Type задайте режим С++. В результате С++ Builder откроет шаблон текста исходной программы в таком виде

//---------------------------------------------------------------------------

#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused

int main(int argc, char* argv[])

{

return 0;

}

//---------------------------------------------------------------------------

 

Шаг 2.Добавьтев соответствующие места шаблона программы указания препро-цессора, объявления и операторы в соответствии со следующим текстом программы

 

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

//---------------------------------------------------------------------------

#include <conio.h>

#include <system.hpp>

#include <stdio.h>

#define dx 24 /* Ширина рамки окна */

#define dy 5 /* Высота рамки окна */

void my_box(int xul,int yul,int xlr,int ylr,int btype)

{

static int boxcar[2][6] = { /* Графические символы для контура */

{ 218,196,191,179,192,217 }, /* одинарный контур */

{ 201,205,187,186,200,188 } /* двойной контур */

};

int i,hzchar,vtchar;

if(btype) {

hzchar = boxcar[btype -1][1];

vtchar = boxcar[btype -1][3];

/* Вывод верхней и нижней стороны контура */

gotoxy(xul,yul);

for(i = xul; i<= xlr; i++) putch(hzchar);

gotoxy(xul,ylr);

for(i = xul; i<= xlr; i++) putch(hzchar);

/* вывод правой и левой стороны контура */

for(i = yul; i<= ylr; i++)

{ gotoxy(xul,i); putch(vtchar);

gotoxy(xlr,i); putch(vtchar);

}

/* Вывод углов контура :*/

/* верхнего левого угла */

gotoxy(xul,yul); putch( boxcar[btype - 1][0] );

/* верхнего правого угла*/

gotoxy(xlr,yul); putch( boxcar[btype - 1][2] );

/* нижнего левого угла*/

gotoxy(xlr,ylr); putch( boxcar[btype - 1][5] );

/* нижнего правого угла */

gotoxy(xul,ylr); putch( boxcar[btype - 1][4] );

 

}

}

//----------------------------------------------------------------------------

#pragma argsused

int main(int argc, char* argv[])

{

int c,ch;

int btype ;

int xul,yul; /* координаты левогоугла рамки */

int xlr,ylr; /* координаты правого угла рамки */

int N,n; /* N -номер окна, n -количество символов в окне*/

char S_1[7],S_2[15],S_3[15],S_4[8]; /* лев Ctr+shift -> шрифт EN*/

/* прав Ctrl+Shift -> шрифт Ru */

p1: clrscr(); btype = 2;

gotoxy(3,22); textcolor(RED); cprintf("ESC");

gotoxy(7,22); textcolor(GREEN); CharToOem("Выход\n",S_1); cprintf(S_1);

gotoxy(1,23); textbackground(LIGHTCYAN); textcolor(RED);

CharToOem("Лабораторная \n",S_2); cprintf(S_2);

gotoxy(1,24); CharToOem("работа № 8 ->1 \n",S_3); cprintf(S_3);

textmode(LASTMODE); gotoxy(1,1);

N = 1; xul =1; yul = 1; ch = (dx - 2) * (dy -1) + 2 ;

do

{ xlr = xul + dx; n = 0;

ylr = yul + dy;

textcolor(CYAN);

my_box(xul,yul,xlr,ylr,btype);

window(xul + 1,yul + 1,xlr - 1,ylr - 1);

gotoxy(0,0);

do

{ c = getch();

if( c != 0x1b )

{ textbackground(BLUE); textcolor(YELLOW);

putch(c);

n++;

}

else

goto p2;

} while( n <= ch );

window(1,1,80,25);

gotoxy(xlr - 17,ylr + 1); textbackground(LIGHTGRAY);

textcolor(MAGENTA); cprintf(" ASCII "); CharToOem("код \n",S_4);cprintf(S_4);

gotoxy(xlr - 17,ylr + 2); textbackground(GREEN);

textcolor(RED); cprintf(" "); putch(c);

cprintf("= 0x%x ",c);

textmode(LASTMODE);

N++; btype --;

xul = xlr + 1; /* координаты для window(1,1,80,25) */

yul = ylr + 1;

} while( N <= 3);

window(1,1,80,25);

goto p1;

p2: ;

return 0;

} /*end main*/

//---------------------------------------------------------------------------

 

Порядок действий и команд при выполнении Задания №2 в лабораторной работе.

Шаг 1. Через кнопку New откройте окно New Items и выберите Console Wizard и для опции Source Type задайте режим С++. В результате С++ Builder откроет шаблон текста исходной программы в таком виде

//---------------------------------------------------------------------------

#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused

int main(int argc, char* argv[])

{

return 0;

}

//---------------------------------------------------------------------------

 

Шаг 2.Добавьтев соответствующие места шаблона программы указания препро-цессора, объявления и операторы в соответствии со следующим текстом программы

 

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

//---------------------------------------------------------------------------

/*===============================================*

* Вычерчивание рамки при помощи *

* ASCII кодов псевдографических символов *

*===============================================*/

#include <system.hpp>

#include <stdio.h>

#include <conio.h>

void draw_border( int startx,int starty,int endx,int endy)

{ register int i;

textcolor( LIGHTCYAN);

gotoxy(startx,starty); cprintf("%c",218); /* putchar( 218 );*/

gotoxy(startx,endy); cprintf("%c",192); /* putchar( 192 );*/

gotoxy(endx,starty); cprintf("%c",191); /* putchar( 191 );*/

gotoxy(endx,endy); cprintf("%c",217); /* putchar( 217 );*/

getch();

for( i = startx + 1; i < endx ; i++ )

{ textcolor( LIGHTRED);

gotoxy(i,starty); cprintf("%c",196); /*putchar( 196 );*/

gotoxy(i,endy); cprintf("%c",196); /*putchar( 196 );*/

getch();

}

for( i = starty + 1; i < endy ; i++ )

{ textcolor( LIGHTMAGENTA);

gotoxy(startx,i); cprintf("%c",179); /* putchar( 179 );*/

gotoxy(endx,i); cprintf("%c",179); /* putchar( 179 );*/

getch();

}

textmode(LASTMODE);

 

}

//---------------------------------------------------------------------------

#pragma argsused

int main(int argc, char* argv[])

{

int lux,luy; /* Левый верхний угол рамки */

int rdx,rdy; /* Правый нижний угол рамки */

char S_1[15],S_2[15],S_3[15],S_4[20],S_5[22],S_6[22],S_7[22];

char S_8[30],S_9[30],S_10[30],S_11[30];

/* лев Ctr+shift -> шрифт EN*/

/* прав Ctrl+Shift -> шрифт Ru */

m1 : clrscr();

gotoxy(1,23); textbackground(LIGHTCYAN); textcolor(RED);

CharToOem("Лабораторная \n",S_1); cprintf(S_1);

gotoxy(1,24); CharToOem("работа № 8->2 \n",S_2); cprintf(S_2);

gotoxy(30,1); textbackground(GREEN); textcolor(RED);

CharToOem("ВВЕДИТЕ\n",S_3); cprintf(S_3);

gotoxy(1,3); textbackground(LIGHTGRAY); textcolor(LIGHTBLUE);

CharToOem("Кординаты левого\n",S_4); cprintf(S_4);

gotoxy(1,4);

CharToOem("верхнего угла рамки \n",S_5); cprintf(S_5);

gotoxy(28,4); textmode(LASTMODE); textcolor(LIGHTGREEN);

cprintf(" X="); scanf("%d", &lux);

gotoxy(37,4); cprintf(" Y="); scanf("%d", &luy);

gotoxy(40,23); textbackground(LIGHTGRAY); textcolor(LIGHTBLUE);

CharToOem("Кординаты правого\n",S_6); cprintf(S_6);

gotoxy(40,24);

CharToOem("нижнего угла рамки\n",S_7); cprintf(S_7);

gotoxy(62,24); textmode(LASTMODE); textcolor(LIGHTGREEN);

cprintf(" X="); scanf("%d", &rdx);

gotoxy(72,24); cprintf(" Y="); scanf("%d", &rdy);

if( rdx < lux)

{ textcolor(LIGHTBLUE);

gotoxy(40,10);

CharToOem("Вы ошиблись при вводе координаты X \n",S_8); cprintf(S_8);

gotoxy(40,11);

CharToOem("нижнего правого угла рамки\n",S_9); cprintf(S_9);

getch(); textmode(LASTMODE);

goto m1;

}

if( rdy < luy )

{ textcolor(LIGHTBLUE);

gotoxy(40,12);

CharToOem("Вы ошиблись при вводе координатыи Y \n",S_10); cprintf(S_10);

gotoxy(40,13);

CharToOem("нижнего правого угла рамки\n",S_11); cprintf(S_11);

cprintf(" ");

getch(); textmode(LASTMODE);

goto m1;

}

lux =( lux > 70 ) ? 70 : lux;

luy =( luy > 20 ) ? 18 : luy;

rdx =( rdx > 80 ) ? 80 : rdx;

rdy =( rdy > 20 ) ? 20 : rdy;

draw_border( lux,luy,rdx,rdy );

return 0;

} /* end main() */

//---------------------------------------------------------------------------

 

 

Дата_______________________

(відпрацювання лаб. роботи)

Студент___________________ Група ____________

 

Складови знань   Бали для оцінювання знань Уміння змінювати та налагоджувати алгоритм С++ програми Знання програмного та файлового забезпечення лабораторної роботи
2,0 1,0
Набрані бали    

 

Дата __________________ Викладач ______________________

(захисту лаб. роботи) (підпис)

Лабораторная работа № 5

 

Компоненты, инструменты и функции С++ Builder

для графических построений

 

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

 

Общие сведения о компонентах, инструментах для рисования

 

Для отображения графической информации в библиотеке С++ Builder имеются компоненты, список которых приведен ниже в табл .5.1.

Компоненты для отображения графических изображений Таблица 5.1

Пиктограмма Наименование компоненты Страница библиотеки Назначение
9 Image (изображение) Additional Используется для отображения графики: пиктограмм, битовых матриц и метафайлов
DBImage (изображение данных) Data Controls Связанный с данными аналог Image
PaintBox (окно для рисования) System Используется для создания на форме некоторой области, в которой можно рисовать

 

Кроме этого, отображать и вводить графическую информацию можно на поверхности любого оконного компонента, имеющего свойство Canvas – канва(холст). Канва Canvas не является компонентой. Многие компоненты в С++ Builder имеют свойство Canvas,представляющее собой область компоненты, на которой можно рисовать или отображать готовые изображения. Это свойство имеют формы, графические компоненты Image, DBImage, PaintBoxи многие другие. Канва содержит свойства и методы, существенно упрощающие работу с графикой в С++ Builder и все сложные взаимодействия с системой спрятаны для пользователя.

Каждая точка канвы имеет координатыX и Y. Система координат канвы начинается в левом верхнем углу области холста. Кордината Xвозрастает при изменении слева направо, а кордината Yизменяется сверху вниз. Кординаты изменяются в пикселях.

Пиксель – это наименьший элементв изображении рисунка, которым можно манипулировать. Важнейшее свойство пикселя – это цвет. Для описания цвета используется тип Tcolor.

Рисовать на канве можно разными способами. Первый вариант(Pixels) – рисование по отдельным пикселям. Второй вариант(Pen) – рисование пером Pen.

Свойство Pixels у канвы представляет собой двумерный массив, определяющий цвета точек на канве:

Cavas->Pixels[int X][int Y]

С массивом пикселей можно обращаться как с любым свойством: изменять цвет, задавать пикселю новое значение, или определять его цвет константой. Например, Cavas->Pixels[int X][int Y] = clBlue; - здесь задается пикселю синий цвет. При необходимости нарисовать некоторый график функции F(x) на канве компоненты Image , если заданы значения Ymin, Ymax и Xmin, Xmax., можно если описать кодом такой процедуры

 

//--------------------------------------------------------------

float x, y; //---координаты функции

float PX, PY; //---координаты пикселей

for( PX=0; PX <= Image1->Width; PX ++ )

{ //--x – координата, соответствующая пикселю с координатой РХ

x = Xmin + PX*(Xmax - Xmin) / Image -> Width;

y = F(x);

//--PY –координата пикселя, соответствующая координате y

PY = Image1->Width – (y - Ymin)* Image->Height/(Ymax - Ymin);

//---устанавливается черный цвет выбранного пикселя

Image1->Canvas->Pixels[PX][PY] = clBlack;

}

//--------------------------------------------------------------

 

У канвы имеется свойство Pen – перо. Это объект, в свою очередь имеющий ряд свойств. Свойство Color –цвет, которым наносится рисунок, свойство Widht – ширина рисуемой линии. Ширина линии задается в пикселях и по умолчанию равна 1. Свойство Style – определяет вид линии. Это свойство может принимать такие значения:

 

psSolid psDash psDot psDashDot psDashDotDot psClear psInsideFrame Сплошная линия Штриховая линия Пунктирная линия Штрих-пунктирная линия Линия,чередующая штрих и два пунктира Отсутствие линии Сплошная линия и при Widht > 1 допускаются цвета отличные от цветов Windows

 

Все стили со штрихами и пунктирами доступны только при Widht = 1. В противном случае лини этих стилей рисуются как сплошные. Стиль psInsideFrame – единственный, который допускает произвольные цвета. Цвет линии при остальных стилях округляется до ближайшего из палитры Windows. Свойство PenPos – определяет в координатах канвы текущую позицию пера. Изменение PenPos, т.е. перемещение пера без прорисовки линии выполняется с помощью метода канвы MovеTo(X,Y). Здесь (Х,У) – координаты точки, в которую перемещается перо.Эта текущая точка становится исходной, от которой методом LineTo(X,Y) можно провести линию в точку с координатами (Х,У). При этом текущая точка перемещается в конечную точку линии и новый вызов LineTo(X,Y)будет проводить линию из этой новой текущей точки.

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

Arc Chord   Ellipse Pie Polygon Polyline Rectangle RoundRect Рисует дугу окружности или эллипса Рисует замкнутую фигуру, ограниченную дугой окружности или эллипса и хордой Рисует эллипс или окружность Рисует сектор окружности или эллипса Рисует замкнутую фигуру с кусочно-линейной границей Рисует кусочно-линейную кривую Рисует прямоугольник Рисует прямоугольник со скругленными углами

 

 

У канвы имеется свойство Brush – кисть. Это свойство определяет фон и заполнение замкнутых фигур на канве. Brush –это объект, имеющий в свою очередь ряд свойств. Свойство Color определяет цвет заполнения. Свойство Style – определяет шаблон заполнения (штриховку).

 

Постановка задачи лабораторной работы. Задание №1. Необходимо создать приложение, демонстрирующее построение графика функции Sin(X) двумя способами: первый вариант – рисование графика на канве с помощью Pixels; второй вариант – рисование графика с помощью инструмента Pen методами MovеTo(X,Y)иLineTo(X,Y) .

Задание №2.Необходимо создать приложение, демонстрирующее построение фигур с помощью инструмента Pen в режиме рисования стандартных фигур.

 

Порядок действий и команд при выполнении Задания №1 данной лабораторной работы:

1. На диске D:\ создайте папку Lab_9 и в этой папке сформируйте внутреннюю папку Sin_9 для файлов проекта P_Sin_9.

2. Выберите в библиотеке компонент страницу Additional и на форму разместите компоненту Image1, затем маркерной рамкой определите размер под рисунок графика.

3. На странице Standart выберите кнопку и установите на форму элемент Button1 и замените название на «Расчитать».

4. Определите событие OnClik для кнопки Button1.

5. В шаблон обработчика события TForm1::Button1Click(TObject *Sender) добавте код, чтобы строился график функции Sin(X) с помощью изменения координат Pixels

 

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "U_Sin_9.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

#include <math.h>

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

#define Pi 3.14159

float X,Y; // координаты функции

int PX,PY; // координаты пикселей

for (PX = 0; PX <= Image1->Width; PX++)

{

//X - координата, соответствующая пикселю с координатой PX

X = PX * 4 * Pi / Image1->Width;

Y = sin(X);

//PY - координата пикселя, соответствующая координате Y

PY = Image1->Height - (Y+1) * Image1->Height / 2;

//Устанавливается цвет выбранного пикселя

Image1->Canvas->Pixels[PX][PY] = clRed;

}

}

//---------------------------------------------------------------------------

6. Для построения инструментом Pen второго графика функции Sin(X) добавте компоненту Image2 .

7. Необходимо сформировать два одинаковых поля под графики. Удерживая нажатой клавишу Shift замаркируйте Image1, Image2 и выполните команду правой клавишей на форме. В открывшемся меню выберите команду Size и установите опцию Grow to largest или Shrink to smallest.

8. Измените в обработчике события TForm1::Button1Click(TObject *Sender)

код программы на такой

//---------------------------------------------------------------------------

#include <math.h>

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

#define Pi 3.14159

float X,Y; // координаты функции

int PX,PY; // координаты пикселей

Image2->Canvas->MoveTo(0,Image2->Height/2);

 

for (PX = 0; PX <= Image1->Width; PX++)

{

//X - координата, соответствующая пикселю с координатой PX

X = PX * 4 * Pi / Image1->Width;

Y = sin(X);

//PY - координата пикселя, соответствующая координате Y

PY = Image1->Height - (Y+1) * Image1->Height / 2;

//Устанавливается цвет выбранного пикселя

Image1->Canvas->Pixels[PX][PY] = clRed;

//Проводится линия на втором графике черным цветом

Image2->Canvas->LineTo(PX,PY);

}

}

//---------------------------------------------------------------------------

 

 

9. Выполните компиляцию программы и получите результат в следующем виде

 

Порядок действий и команд при выполнении Задания №2 данной лабораторной работы:

1. На диске D:\ , в созданной папке Lab_9 , нужно сформировать внутреннюю папку Figures_9 для файлов проекта P_Figures_9.

2. На форме задайте поле Image1 и заполните в программный модуль U_Figures_9 следующий текст кода программы:

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

 

#include "U_figures_9.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

 

void __fastcall TForm1::FormCreate(TObject *Sender)

{

Image1->Canvas->Font->Style << fsBold;

Image1->Canvas->Arc(10,10,90,90,90,50,10,50);

Image1->Canvas->TextOut(40,60,"Arc");

Image1->Canvas->Chord(110,10,190,90,190,50,110,50);

Image1->Canvas->TextOut(135,60,"Chord");

Image1->Canvas->Ellipse(210,10,290,50);

Image1->Canvas->TextOut(230,60,"Ellipse");

Image1->Canvas->Pie(310,10,390,90,390,30,310,30);

Image1->Canvas->TextOut(340,60,"Pie");

TPoint points[5];

points[0] = Point(30,150);

points[1] = Point(40,130);

points[2] = Point(50,140);

points[3] = Point(60,130);

points[4] = Point(70,150);

Image1->Canvas->Polygon(points,4);

Image1->Canvas->TextOut(30,170,"Polygon");

points[0].x += 100;

points[1].x += 100;

points[2].x += 100;

points[3].x += 100;

points[4].x += 100;

Image1->Canvas->Polyline(points,4);

Image1->Canvas->TextOut(130,170,"Polyline");

Image1->Canvas->Rectangle(230,120,280,160);

Image1->Canvas->TextOut(230,170,"Rectangle");

Image1->Canvas->RoundRect(330,120,380,160,20,20);

Image1->Canvas->TextOut(325,170,"RoundRect");

}

//---------------------------------------------------------------------------

 

3. Выполните компиляцию и получите такой результат

 

 

Дата_______________________

(відпрацювання лаб. роботи)

Студент___________________ Група ____________

 

Складови знань   Бали для оцінювання знань Уміння змінювати та налагоджувати алгоритм С++ програми Знання програмного та файлового забезпечення лабораторної роботи
2,0 1,0
Набрані бали    

 

Дата __________________ Викладач ______________________

(захисту лаб. роботи) (підпис)

Лабораторная работа № 6

Обработка событий мышки в приложении Windows

 

Основная цельлабораторной работы состоит в изучении методики задания и управления событиями мышки в программах приложениях Windows. Также изучается техника работы с рисунками на форме и правила применения встроенного редактора изображений - Image Editor для создания курсора нестандартного вида и его включения в файл ресурсов проекта приложения. Одновременно рассматриваются и команды для изменения изображения курсора мыши при его перемещении по рабочему окну программы.

Общие сведения о событиях мышки

Во многих программах – приложениях Windows команды и действия выполняются при помощи манипулятора (мышка). Для обработки команд мышки С++ Builder имеет такие зарезервированные события:

Обозначение события Описание события
OnClick Щелчок мыши на компоненте и некоторые другие действия пользователя.
OnDblClick Двойной щелчок мыши на компоненте.
OnMouseDown Нажатие клавиши мыши над компонентом. Возможно определение нажатой кнопки и координат курсора мыши.
OnMouseMove Перемещение курсора мыши над компонентом. Возможно определение нажатой кнопки и координат курсора мышки.
OnMouseUp Отпускание ранее нажатой кнопки мыши над компонентом. Возможно определение нажатой кнопки и координат курсора мыши.
OnStartDrag Начало процесса «перетаскивания» объекта. Возможно определение перетаскиваемого объекта.
OnDragOver Перемещение «перетаскиваемого » объекта над компонентом. Возможно определение перетаскиваемого объекта и координат курсора мыши.
OnDragDrop Отпускание ранее нажатой кнопки мыши после «перетаскивания» объекта. Возможно определение перетаскиваемого объекта и координат мыши.
OnEndDrag Еще одно событие при отпускании ранее нажатой кнопки мыши после «перетаскивания» объекта. Возможно определение перетаскиваемого объекта и координат курсора мыши.
OnEnter Событие в момент получения элементом фокуса в результате манипуляции мышью, нажатия клавиши табуляции или программной передачи фокуса.
OnExit Событие в момент потери элементом фокуса в результате манипуляции мышью, нажатия клавиши табуляции или программной передачи фокуса
OnMouseWheel Событие при вращении колесика мыши в любую сторону.
OnMouseWheelUp Вращение колесика мыши вверх. Наступает, если вращение не обработано по событию OnMouseWheel.
OnMouseWheelDown Вращение колесика мыши вниз. Наступает, если вращение не обработано по событию OnMouseWheel.

 

В программах наиболее широко используется событие OnClick. Обычно оно наступает, если пользователь щелкнул на компоненте, т. е. нажал и отпустил кнопку мыши, когда указатель мыши находился на компоненте. Но это событие происходит также и при некоторых других действиях пользователя. Оно наступает, если:

üПользователь выбрал элемент в сетке, дереве, списке, выпадающем списке, нажав клавишу со стрелкой;

üПользователь нажал клавишу пробела, когда кнопка или индикатор были в фокусе;

üПользователь нажал клавишу Enter , а активная форма имеет кнопку по умолчанию, указанную свойством Default;

üПользователь нажал клавишу Esc , а активная форма имеет кнопку прерывания, указанную свойством Cancel;

üПользователь нажал клавиши быстрого доступа к кнопке или индикатору. Например, если свойство Caption индикатора записано как «&Полужирный» и символ ‘П’ подчеркнут, то нажатие пользователем комбинации клавиш Alt + П вызовет событиеOnClick в этом индикаторе;

üПриложение установило в trueсвойствоCheckedрадиокнопки RadioButton;

üПриложение изменило свойство CheckedиндикатораCheckBox;

üВызван метод Click элемента меню;

üДля формы событие OnClickнаступает, если пользователь щелкнул на пустом месте формы или на недоступном компоненте.

При проектировании приложения определяется последовательность табуляции оконных компонент. Под этим понимается последовательность, в которой переключается фокус с компоненты на компонент, когда пользователь нажимает клавишу Tab. Свойство формы ActiveControl, установленное в процессе проектирования, определяет, какой из размещенных на форме компонентов будет в фокусе в первый момент при выполнении приложения. В процессе выполнения это свойство изменяется и показывает тот компонент, который в данный момент находится в фокусе.

Последовательность табуляции задается свойством TabOrder компонентов. Первоначальная последовательность табуляции определяется просто той последовательностью, в которой размещались управляющие элементы на форме. Первому элементу присваивается значение TabOrder , равное 0, второму 1,и т. д. Значение TabOrder, равное нулю, означает, что при первом появлении формы на экране в фокусе будет именно этот компонент (если не задано свойство формы ActiveControl ).

Во все обработчики событий, связанных с манипуляциями мыши (как и во все другие обработчики), передается параметр Sender типа Tobject . Этот параметр содержит указатель на компонент, в котором произошло событие. Он не требуется, если пишется обработчик события для конкретного компонента. Параметр Senderможно использовать для распознования источника события. Например, оператор

if (Sender = = Image1)

……;

Помимо параметра Senderв обработчики событий OnMouseDown и OnMouseUpпередаются параметры, позволяющие распознать нажатую кнопку мыши, нажатые при этом вспомогательные клавиши, а также определить координаты курсора мыши. Заголовок обработчика события OnMouseDownможет иметь, например, следующий вид:

 

void_fastcall TForm1:: Image1MouseDown(Tobject * Sender, TMouseButton Button, TShiftState Shift, int X, int Y)

 

Дополнительно к параметру Senderв обработчик передаются параметры Button, Shift, X, Y. Параметр Buttonопределяет нажатую в этот момент кнопку мыши. Тип TmouseButton – перечисляемый тип, определяемый следующим образом

 

enum TmouseButton{ mbLeft, mbRight, mbMiddle};

 

Значение mbLeftсоответствует нажатию левой кнопкой мыши, значение mbRight – правой, а значение mbMiddle – средней. Например, если вы хотите, чтобы обработчик реагировал на нажатие только левой кнопки мыши, можно его первым оператором написать:

 

if (Button ! = mbLeft) return;

 

В этом случае, если значение Buttonне равно mbLeft, т. е. была нажата не левая кнопка мыши, выполнение обработчика прервется.

Параметр Shif типа TshiftState определяет, какие вспомогательные клавиши на клавиатуре нажаты в момент нажатия кнопки мыши.

Во все события, связанные с мышью, передаются также координаты курсора X и Y. Эти параметры определяют координаты курсора в клиентской области компонента. Благодаря этому можно обеспечить различную реакцию в зависимости от того, в какой части клиентской области расположен курсор мыши.

В С++ Builder имеется встроенный редактор изображений Image Editor, который вызывается командой Tools/ Image Editor . Данный редактор позволяет создавать изображения в виде битовых матриц, пиктограмм, изображений курсоров и их сохранять не только в виде файлов, но и сразу же их включать в файл ресурсов приложения. В этом и заключается основное отличие встроенного редактора С++ Builder от других более мощных графических редакторов. Работа начинается с меню File, в котором можно выбрать раздел Open – открыть новый файл изображения или ресурсов, или раздел New – создать новый файл. Если выбрана команда New,то предварительно предлагается сделать выбор вида файла, который нужно создать:

Resource File (.res) Файл ресурсов
Component Resource File (.dcr) Файл ресурсов компонента
Bitmap File (.bmp) Файл битовой матрицы
Icon File (.ico) Файл пиктограммы
Cursor File (.cur) Файл изображения курсора

 

Постановка задачи лабораторной работы.

Необходимо создать программу приложение для Windows и в окне формы должны быть три нестандартные кнопки. После нажатия клавиши мышки над одной из кнопок формы приложения программа должна будет в поле Image1 переключать изображения приборов и изображение нажатой кнопки (смотри рис.1 и рис.2.). Также при нахождении указателя мыши над этими кнопками изображение стандартного курсора «стрелка » должно изменяться на курсор вида «рука».

 

Порядок действий и команд при выполнении работы.

Шаг 2. Выберите в библиотеке компонент страницу Additional и разместите на форму компоненты Image1, Image2иImage3 затем маркерной рамкой определите… Шаг 3.Установите поочередно курсор на поля Image1 и Image2и в…  

Рис. 3

8.4. На имени Cursor1 сделайте щелчок правой клавишей мышки и выберите команду Rename и задайте новое имя нестандартного курсора.

8.5. На новом имени курсора сделайте двойной щелчок и создайте свою иконку(рисунок) нестандартного курсора.

8.6. Через команды File / Save сохраните новый курсор в файл ресурсов проекта, создаваемого приложения.

Шаг 9.ВфайлU_work_10.cpp сохраните текст исходной программы в следующем виде:

/* Исходный текст файла U_work_10.cpp . */

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//--- состояния при переключении рисунков

int pic1_On_Off, pic2_On_Off, pic3_On_Off, pic4_On_Off;

//--- указатели для загрузки рисунков

TImage *PictK1;

TImage *PictP1;

TImage *PictIm3;

const int crLi = 1; //--- константа для регистрации нестандартного курсора

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)

{

}

//---------------------------------------------------------------------------

//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)

{

TImage *Pict = new TImage(Form1);

Pict->AutoSize = true;

// загрузка исходных рисунков в поля Image

Pict->Picture->LoadFromFile("Pic_1.bmp");

Image1->Canvas->CopyRect(Image1->ClientRect, Pict->Canvas,

Rect(0,0,Pict->Width,Pict->Height));

Pict->Picture->LoadFromFile("But1_On.bmp");

Image2->Canvas->CopyRect(Image2->ClientRect, Pict->Canvas,

Rect(0,0,Pict->Width,Pict->Height));

Pict->Picture->LoadFromFile("Image3.bmp");

Image3->Canvas->CopyRect(Image3->ClientRect, Pict->Canvas,

Rect(0,0,Pict->Width,Pict->Height));

pic1_On_Off = 1;

delete Pict;

//--- загрузка и регистрация временного курсора к приборам

Screen->Cursors[crLi] = LoadCursor(HInstance,"LI");

}

//---------------------------------------------------------------------------

//---------------------------------------------------------------------------

void __fastcall TForm1::Image1MouseDown(TObject *Sender,

TMouseButton Button, TShiftState Shift, int X, int Y)

{

TImage *PictIm3 = new TImage(Form1); //---для сообщений о названиях приборов

PictIm3->AutoSize = true;

if((Sender == Image1) && (Screen->Cursor == crHandPoint) )

Image1->Cursor = crLi; /* задаем нестандартный курсор, созданный в редакторе Image Editor*/

else

{PictIm3->Picture->LoadFromFile("Image3.bmp");

Image3->Canvas->CopyRect(Image3->ClientRect, PictIm3->Canvas,

Rect(0,0,PictIm3->Width,PictIm3->Height));

}

if((X < Image1->Width / 2) && (Y < Image1->Height / 3))

{

PictIm3->Picture->LoadFromFile("LI.bmp");

Image3->Canvas->CopyRect(Image3->ClientRect, PictIm3->Canvas,

Rect(0,0,PictIm3->Width,PictIm3->Height));

}

if((X > Image1->Width / 2) && (X < 2*(Image1->Width / 2)) && (Y < Image1->Height / 3))

{

PictIm3->Picture->LoadFromFile("EI.bmp");

Image3->Canvas->CopyRect(Image3->ClientRect, PictIm3->Canvas,

Rect(0,0,PictIm3->Width,PictIm3->Height));

}

if((X < Image1->Width / 2) && (Y > Image1->Height / 3) && (Y < 2*(Image1->Height / 3)))

{

PictIm3->Picture->LoadFromFile("TI.bmp");

Image3->Canvas->CopyRect(Image3->ClientRect, PictIm3->Canvas,

Rect(0,0,PictIm3->Width,PictIm3->Height));

}

if((X > Image1->Width / 2) && (X < Image1->Width ) && (Y > Image1->Height / 3)

&& (Y < 2*(Image1->Height / 3)))

{

PictIm3->Picture->LoadFromFile("GE.bmp");

Image3->Canvas->CopyRect(Image3->ClientRect, PictIm3->Canvas,

Rect(0,0,PictIm3->Width,PictIm3->Height));

}

if((X < Image1->Width / 2) && (Y > 2*(Image1->Height / 3)))

{

PictIm3->Picture->LoadFromFile("PI.bmp");

Image3->Canvas->CopyRect(Image3->ClientRect, PictIm3->Canvas,

Rect(0,0,PictIm3->Width,PictIm3->Height));

}

if((X > Image1->Width /2 ) && (Y > 2*(Image1->Height / 3) ) && (Y < Image1->Height ))

{

PictIm3->Picture->LoadFromFile("GEK.bmp");

Image3->Canvas->CopyRect(Image3->ClientRect, PictIm3->Canvas,

Rect(0,0,PictIm3->Width,PictIm3->Height));

}

}

 

//---------------------------------------------------------------------------

void __fastcall TForm1::Image2MouseDown(TObject *Sender,

TMouseButton Button, TShiftState Shift, int X, int Y)

{

TImage *PictK1 = new TImage(Form1); /---/для кнопок

PictK1->AutoSize = true;

TImage *PictP1 = new TImage(Form1); //---для приборов

PictP1->AutoSize = true;

switch(1+X /(Image2->Width /3) + 3*(Y /(Image2->Height/2)))

{

case 1: PictK1->Picture->LoadFromFile("But1_On.bmp");

Image2->Canvas->CopyRect(Image2->ClientRect, PictK1->Canvas,

Rect(0,0,PictK1->Width,PictK1->Height));

if(pic1_On_Off ==0) //---проверяем, чтобы не было мигания при повторных включениях

{

PictP1->Picture->LoadFromFile("Pic_1.bmp");

Image1->Canvas->CopyRect(Image1->ClientRect, PictP1->Canvas,

Rect(0,0,PictP1->Width,PictP1->Height));

 

pic1_On_Off =1;pic2_On_Off =0;pic3_On_Off =0;pic4_On_Off =0;

}

break;

case 2: PictK1->Picture->LoadFromFile("But2_On.bmp");

Image2->Canvas->CopyRect(Image2->ClientRect, PictK1->Canvas,

Rect(0,0,PictK1->Width,PictK1->Height));

if(pic2_On_Off == 0) //--проверяем, чтобы не было мигания при повторных включениях

{

PictP1->Picture->LoadFromFile("Pic_2.bmp");

Image1->Canvas->CopyRect(Image1->ClientRect, PictP1->Canvas,

Rect(0,0,PictP1->Width,PictP1->Height));

pic1_On_Off =0;pic2_On_Off =1;pic3_On_Off =0;pic4_On_Off =0;

}

break;

case 3: PictK1->Picture->LoadFromFile("But3_On.bmp");

Image2->Canvas->CopyRect(Image2->ClientRect, PictK1->Canvas,

Rect(0,0,PictK1->Width,PictK1->Height));

if(pic3_On_Off == 0) //---проверяем, чтобы не было мигания при повторных включениях

{

PictP1->Picture->LoadFromFile("Pic_3.bmp");

Image1->Canvas->CopyRect(Image1->ClientRect, PictP1->Canvas,

Rect(0,0,PictP1->Width,PictP1->Height));

pic1_On_Off =0;pic2_On_Off =0;pic3_On_Off =1;pic4_On_Off =0;

}

break;

case 4: PictK1->Picture->LoadFromFile("But123_Off.bmp");

Image2->Canvas->CopyRect(Image2->ClientRect, PictK1->Canvas,

Rect(0,0,PictK1->Width,PictK1->Height));

if(pic4_On_Off == 0)//---проверяем, чтобы не было мигания при повторных включениях

{

PictP1->Picture->LoadFromFile("Pic_4.bmp");

Image1->Canvas->CopyRect(Image1->ClientRect, PictP1->Canvas,

Rect(0,0,PictP1->Width,PictP1->Height));

pic1_On_Off =0;pic2_On_Off =0;pic3_On_Off =0;pic4_On_Off =1;

}

break;

case 5: PictK1->Picture->LoadFromFile("But123_Off.bmp");

Image2->Canvas->CopyRect(Image2->ClientRect, PictK1->Canvas,

Rect(0,0,PictK1->Width,PictK1->Height));

if(pic4_On_Off == 0) //---проверяем, чтобы не было мигания при повторных включениях

{

PictP1->Picture->LoadFromFile("Pic_4.bmp");

Image1->Canvas->CopyRect(Image1->ClientRect, PictP1->Canvas,

Rect(0,0,PictP1->Width,PictP1->Height));

pic1_On_Off =0;pic2_On_Off =0;pic3_On_Off =0;pic4_On_Off =1;

}

break;

case 6: PictK1->Picture->LoadFromFile("But123_Off.bmp");

Image2->Canvas->CopyRect(Image2->ClientRect, PictK1->Canvas,

Rect(0,0,PictK1->Width,PictK1->Height));

if(pic4_On_Off == 0) //---проверяем, чтобы не было мигания при повторных включениях

{

PictP1->Picture->LoadFromFile("Pic_4.bmp");

Image1->Canvas->CopyRect(Image1->ClientRect, PictP1->Canvas,

Rect(0,0,PictP1->Width,PictP1->Height));

pic1_On_Off =0;pic2_On_Off =0;pic3_On_Off =0;pic4_On_Off =1;

}

}

}

//---------------------------------------------------------------------------

 

//---------------------------------------------------------------------------

void __fastcall TForm1::SpeedButton1Click(TObject *Sender)

{

Screen->Cursor = crHandPoint;

}

//---------------------------------------------------------------------------

 

//---------------------------------------------------------------------------

void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button,

TShiftState Shift, int X, int Y)

{

Screen->Cursor = crDefault;

}

//---------------------------------------------------------------------------

 

 

Дата_______________________

(відпрацювання лаб. роботи)

Студент___________________ Група ____________

 

Складови знань   Бали для оцінювання знань Уміння змінювати та налагоджувати алгоритм С++ програми Знання програмного та файлового забезпечення лабораторної роботи
2,0 1,0
Набрані бали    

 

Дата __________________ Викладач ______________________

(захисту лаб. роботи) (підпис)

Лабораторная работа № 7

Технология Drag & Doc и плавающие окна

Цель работы состоит в изучении команд и техники разработки приложения Windows

с технологией Drag & Doc (встраивание оконных объектов).

Задание на лабораторную работу.

1). Составить описание последовательности действий и команд для разработки заданного образца программы многооконного редактора с встраиванием окон .

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

Методические указания.

1. В приложении используются две формы. Одна форма называется Fmain и вторая форма для текстового документа Fdoc. Вид этих форм и наполнение компонентами показано ниже на рисунках

   

 

2. Для формы Fmain файлы листингов кода программы имеют такие названия:

Umain.cpp, Umain.h.

3. Для формы FDoc файлы листингов кода программы имеют следующие названия:

Udoc.cpp, Udoc.h, Pdoc.cpp.

4. Файлы модулей реализации и заголовочных файлов имеют следующие коды:

 

Pdoc.cpp

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

USEFORM("Umain.cpp", Fmain);

USEFORM("Udoc.cpp", FDoc);

//---------------------------------------------------------------------------

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

{

try

{

Application->Initialize();

Application->CreateForm(__classid(TFmain), &Fmain);

Application->CreateForm(__classid(TFDoc), &FDoc);

Application->Run();

}

catch (Exception &exception)

{

Application->ShowException(&exception);

}

return 0;

}

//---------------------------------------------------------------------------

 

Umain.cpp

#include <vcl.h> #pragma hdrstop  

Umain.h

#ifndef UmainH #define UmainH //---------------------------------------------------------------------------

Udoc.cpp

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

 

#include "Udoc.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TFDoc *FDoc;

//---------------------------------------------------------------------------

__fastcall TFDoc::TFDoc(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

 

Udoc.h

//---------------------------------------------------------------------------

#ifndef UdocH

#define UdocH

//---------------------------------------------------------------------------

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

//---------------------------------------------------------------------------

class TFDoc : public TForm

{

__published: // IDE-managed Components

TMemo *Memo1;

private: // User declarations

public: // User declarations

__fastcall TFDoc(TComponent* Owner);

};

//---------------------------------------------------------------------------

extern PACKAGE TFDoc *FDoc;

//---------------------------------------------------------------------------

#endif

 

 

Результат работы программы

 

Дата_______________________

(відпрацювання лаб. роботи)

Студент___________________ Група ____________

 

Складови знань   Бали для оцінювання знань Уміння змінювати та налагоджувати алгоритм С++ програми Знання програмного та файлового забезпечення лабораторної роботи
2,0 1,0
Набрані бали    

 

Дата __________________ Викладач ______________________

(захисту лаб. роботи) (підпис)

Лабораторная работа № 8

Компоненты отображения иерархических данных

 

Цель лабораторной работы состоит в изучении методики работы с компонентами отображения произвольных иерархических данных.

 

Общие сведения о компонентах

В библиотеке VCL для отображения иерархических структур имеются такие компоненты

Таблица № 1

Компонента Страница VCL Описание
TreeView (окно дерева данных) Win32 Просмотр структуры иерархических данных в виде дерева в стиле Windows 95/98/2000
OutLine (окно дерева данных) Win3.1 Просмотр структуры иерархических данных в виде дерева в стиле Windows 3.х
ListView (список данных в стиле Windows 95) Win32 Отображение в стиле папок Windows списком в виде колонок или пиктограмм
OpenDialog (открыть файл) Dialogs Предназначен для создания окна диалога «Открыть файл»
FileListBox (список файлов) Win3.1 Отображает список всех файлов каталога
DirectoryListBox (структура каталогов) Win3.1 Отображает структуру каталогов диска
DriveComboBox (список дисков) Win3.1 Выпадающий список доступных дисков
CDirectoryOutline (дерево каталогов) Samples Пример компонента, используемого для отображения структуры каталогов выбранного диска

Компонента ListViewпозволяет в стиле Windows отображать данные в виде списков, таблиц, крупных и мелких пиктограмм. Пользователь сталкивается с таким отображением данных при раскрытии папок Windows.

Стиль отображения информации определяется свойством ViewStyle , которое может устанавливаться в процессе проектирования или программно во время выполнения. Свойство может принимать такие значения: vsIcon – крупные значки; vsSmallIcon – мелкие значки; vsList – список; vsReport – таблица. Основное свойство компоненты ListViewзадается в поле свойств – Items. Реорганизация дерева, связанная с созданием или удалением многих узлов, может вызывать неприятные мерцания изображения. Избежать этого можно с помощью методов BeginUpdate и EndUpdate. Первій метод запрещает перерисовку дерева, а второй – разрешает.

 

Постановка задачи лабораторной работы.

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

Порядок действий и команд при выполнении работы.

Шаг 1. Перейдите на форму приложения и в свойстве Caption напишите название работы “Лаб. работа № 13 компонента ListView ”, чтобы этот текст появился в заголовке формы. Выполните команду File/Save Project As… . На диске D:\ создайте папку Lab_13 для файлов проекта P_work_13.bpr и файла U_work_13.cpp.

Шаг 2. Установите на форму компоненты DriveComboBox1 и DriveComboBox2 , как это показано рис.1.

 

Рис.1.

Шаг 3. Установите на форму компоненты DirectoryListBox1 и DirectoryListBox2 , как это показано рис.2.

 

 

Рис.2.

Шаг 4.Установите на форму компоненты ListView1 и ListView2 , как это показано рис.3.

 

 

Рис. 3.

 

Шаг 5.Выполните предварительную компиляцию с целью проверки.

Шаг 6.Установите на форму компоненты Label1 и Label2 .В свойстве Caption задайте синим цветом пояснительную надпись «Свойства значков» и расположите их согласно рис.4.

Шаг 7.Установите на форму компоненты ComboBox1 и ComboBox2 ,как это показано рис.4. .В свойстве Items задайте названия для выпадающего списка: Крупные значки

Мелкие значки

Список

Таблица.

Шаг 8.Задайте событие void __fastcall TForm1::FormCreate(TObject *Sender);и заполните оператоы согласно листинга программы файла U_work_13.cpp .

Шаг 9.Задайте события void __fastcall TForm1::DirectoryListBox1Change(TObject *Sender);и void __fastcall TForm1::DirectoryListBox2Change(TObject *Sender);изаполните оператоы согласно листинга программы файла U_work_13.cpp .

Шаг 10.Задайте события void __fastcall TForm1::ComboBox1Click(TObject *Sender);и void __fastcall TForm1::ComboBox2Click(TObject *Sender);и заполните оператоы согласно листинга программы файла U_work_13.cpp .

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

Рис.4.

 

 

Рис. 5. Результат работы приложения Windows.

Листинг файла U_work_13.cpp.

 

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

 

#include "U_work_13A.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void UpdateFiles_1()

{

TSearchRec sr1;

// TSHFileInfo * fi1;

TListItem *pItem1 = NULL;

int IconIndex1;

TSHFileInfo * fi1 = new TSHFileInfo;

Form1->ListView1->Items->BeginUpdate();

Form1->ListView1->Items->Clear();

if (FindFirst(Form1->DirectoryListBox1->Directory + "\\*.*", faAnyFile, sr1) == 0)

do

{

if (sr1.Attr == faDirectory) continue;

pItem1 = Form1->ListView1->Items->Add();

pItem1->Caption = sr1.Name;

SHGetFileInfo(("*" + LowerCase(ExtractFileExt(pItem1->Caption))).c_str(),

0, fi1, sizeof(fi1),

SHGFI_SMALLICON | SHGFI_SYSICONINDEX | SHGFI_TYPENAME);

pItem1->ImageIndex = fi1->iIcon;

if (sr1.Size < 1024)

pItem1->SubItems->Add(IntToStr(sr1.Size) + " byte");

else if (sr1.Size < 1024 * 1024)

pItem1->SubItems->Add(IntToStr(sr1.Size / 1024) + " KByte");

else pItem1->SubItems->Add(IntToStr(sr1.Size / (1024 * 1024)) + " MByte");

pItem1->SubItems->Add(fi1->szTypeName);

}

while (FindNext(sr1) == 0);

FindClose(sr1);

Form1->ListView1->Items->EndUpdate();

}

//---------------------------------------------------------------------------

void UpdateFiles_2()

{

TSearchRec sr2;

// TSHFileInfo * fi2;

TListItem *pItem2 = NULL;

int IconIndex2;

TSHFileInfo * fi2 = new TSHFileInfo;

Form1->ListView2->Items->BeginUpdate();

Form1->ListView2->Items->Clear();

if (FindFirst(Form1->DirectoryListBox2->Directory + "\\*.*", faAnyFile, sr2) == 0)

do

{

if (sr2.Attr == faDirectory) continue;

pItem2 = Form1->ListView2->Items->Add();

pItem2->Caption = sr2.Name;

SHGetFileInfo(("*" + LowerCase(ExtractFileExt(pItem2->Caption))).c_str(),

0, fi2, sizeof(fi2),

SHGFI_SMALLICON | SHGFI_SYSICONINDEX | SHGFI_TYPENAME);

pItem2->ImageIndex = fi2->iIcon;

if (sr2.Size < 1024)

pItem2->SubItems->Add(IntToStr(sr2.Size) + " byte");

else if (sr2.Size < 1024 * 1024)

pItem2->SubItems->Add(IntToStr(sr2.Size / 1024) + " KByte");

else pItem2->SubItems->Add(IntToStr(sr2.Size / (1024 * 1024)) + " MByte");

pItem2->SubItems->Add(fi2->szTypeName);

}

while (FindNext(sr2) == 0);

FindClose(sr2);

Form1->ListView2->Items->EndUpdate();

}

//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)

{

TSHFileInfo * fi1, *fi2;

DriveComboBox1->DirList = DirectoryListBox1;

ListView1->SmallImages->Height = 16;

ListView1->SmallImages->Width = 16;

DriveComboBox2->DirList = DirectoryListBox2;

ListView2->SmallImages->Height = 16;

ListView2->SmallImages->Width = 16;

// SHGetFileInfo("*.*", 0, fi,

// sizeof(fi), SHGFI_SMALLICON | SHGFI_ICON | SHGFI_SYSICONINDEX);

ListView1->SmallImages->Handle =

SHGetFileInfo("*.*", 0, fi1,

sizeof(fi1), SHGFI_SMALLICON | SHGFI_ICON | SHGFI_SYSICONINDEX);

ListView1->LargeImages->Handle = SHGetFileInfo("*.*", 0, fi1,

sizeof(fi1), SHGFI_LARGEICON | SHGFI_ICON | SHGFI_SYSICONINDEX);

ComboBox1->ItemIndex = 0;

 

ListView1->SmallImages->Handle =

SHGetFileInfo("*.*", 0, fi2,

sizeof(fi2), SHGFI_SMALLICON | SHGFI_ICON | SHGFI_SYSICONINDEX);

ListView2->LargeImages->Handle = SHGetFileInfo("*.*", 0, fi2,

sizeof(fi2), SHGFI_LARGEICON | SHGFI_ICON | SHGFI_SYSICONINDEX);

ComboBox2->ItemIndex = 0;

UpdateFiles_1();

UpdateFiles_2();

}

//---------------------------------------------------------------------------

void __fastcall TForm1::DirectoryListBox1Change(TObject *Sender)

{

UpdateFiles_1();

}

//---------------------------------------------------------------------------

void __fastcall TForm1::ComboBox1Click(TObject *Sender)

{

switch (ComboBox1->ItemIndex)

{

case 0: ListView1->ViewStyle = vsIcon;

break;

case 1: ListView1->ViewStyle = vsSmallIcon;

break;

case 2: ListView1->ViewStyle = vsList;

break;

case 3: ListView1->ViewStyle = vsReport;

}

}

//---------------------------------------------------------------------------

 

void __fastcall TForm1::ComboBox2Click(TObject *Sender)

{

switch (ComboBox2->ItemIndex)

{

case 0: ListView2->ViewStyle = vsIcon;

break;

case 1: ListView2->ViewStyle = vsSmallIcon;

break;

case 2: ListView2->ViewStyle = vsList;

break;

case 3: ListView2->ViewStyle = vsReport;

}

}

//---------------------------------------------------------------------------

 

void __fastcall TForm1::DirectoryListBox2Change(TObject *Sender)

{

UpdateFiles_2();

}

//---------------------------------------------------------------------------

 

Листинг U_work_13.h

//---------------------------------------------------------------------------

 

#ifndef U_work_13H

#define U_work_13H

//---------------------------------------------------------------------------

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <ComCtrls.hpp>

#include <FileCtrl.hpp>

#include "ShellAPI.h"

#include "shlwapi.h"

#include <ImgList.hpp>

//---------------------------------------------------------------------------

class TForm1 : public TForm

{

__published: // IDE-managed Components

TListView *ListView1;

TDirectoryListBox *DirectoryListBox1;

TDriveComboBox *DriveComboBox1;

TComboBox *ComboBox1;

TImageList *ImageList1;

TImageList *ImageList2;

TLabel *Label1;

TDriveComboBox *DriveComboBox2;

TDirectoryListBox *DirectoryListBox2;

TListView *ListView2;

TLabel *Label2;

TComboBox *ComboBox2;

void __fastcall FormCreate(TObject *Sender);

void __fastcall DirectoryListBox1Change(TObject *Sender);

void __fastcall ComboBox1Click(TObject *Sender);

void __fastcall ComboBox2Click(TObject *Sender);

void __fastcall DirectoryListBox2Change(TObject *Sender);

private: // User declarations

public: // User declarations

__fastcall TForm1(TComponent* Owner);

};

//---------------------------------------------------------------------------

extern PACKAGE TForm1 *Form1;

//---------------------------------------------------------------------------

#endif

 

 

Контрольные задания по лабораторной работе.

1. Настроить события для перемещения папки или файла мышкой.

2. Настроить события для копирования файлов.

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

 

 

Дата_______________________

(відпрацювання лаб. роботи)

Студент___________________ Група ____________

 

Складови знань   Бали для оцінювання знань Уміння змінювати та налагоджувати алгоритм С++ програми Знання програмного та файлового забезпечення лабораторної роботи
2,0 1,0
Набрані бали    

 

Дата __________________ Викладач ______________________

(захисту лаб. роботи) (підпис)

Лабораторная работа № 9

Работа с компнентой Tchat для построения графиков и диаграмм

 

 

Дата_______________________

(відпрацювання лаб. роботи)

Студент___________________ Група ____________

 

Складови знань   Бали для оцінювання знань Уміння змінювати та налагоджувати алгоритм С++ програми Знання програмного та файлового забезпечення лабораторної роботи
2,0 1,0
Набрані бали    

 

Дата __________________ Викладач ______________________

(захисту лаб. роботи) (підпис)

Лабораторная работа № 10

 

– Конец работы –

Используемые теги: методические, указания, курса, Компьютерные, технологии, раздел, Визуальное, Программирование, Builder0.138

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: МЕТОДИЧЕСКИЕ УКАЗАНИЯ курса “Компьютерные технологии” раздел «Визуальное программирование в С++Builder»

Что будем делать с полученным материалом:

Если этот материал оказался полезным для Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Еще рефераты, курсовые, дипломные работы на эту тему:

Краткий курс механики в качестве программы и методических указаний по изучению курса Физика Краткий курс механики: Программа и методические указания по изучению курса Физика / С
Федеральное агентство железнодорожного транспорта... Омский государственный университет путей сообщения...

Методические указания По курсовому и дипломному проектированию по дисциплине Ремонт автомобилей Методические указания предназначены для оказания практической помощи учащимся при выполнении курсового проекта по дисциплине Ремонт автомобилей . 1 Общая часть
Методические указания... По курсовому и дипломному проектированию... раздел Технологическая часть...

МЕТОДИЧЕСКИЕ УКАЗАНИЯ К выполнению курсового проекта по курсу “Механика грунтов, основания и фундаменты”
ХАРЬКОВСКАЯ НАЦИОНАЛЬНАЯ АКАДЕМИЯ ГОРОДСКОГО ХОЗЯЙСТВА...

Методические указания к семинарским занятиям Методические указания по самостоятельной работе Банк тестовых заданий в системе UniTest
ВСЕОБЩАЯ ИСТОРИЯ ИСКУССТВА... Учебная программадисциплины gt Курс лекций Методические... Лекция Основные понятия истории искусства ч...

МЕТОДИЧЕСКИЕ УКАЗАНИЯ по курсу ИНФОРМАЦИОННЫЕ ТЕХНОЛОГИИ В ПРОЕКТИРОВАНИИ СТВОЛЬНОГО ОРУЖИЯ
Федеральное государственное бюджетное образовательное учреждение... Высшего профессионального образования... ТУЛЬСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ...

Методические указания к лабораторным работам По курсу для бакалавров направления подготовки 6.051001 «Метрология и информационно-измерительные технологии»
НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ... ХАРЬКОВСКИЙ ПОЛИТЕХНИЧЕСКИЙ ИНСТИТУТ... Методические указания к лабораторным работам По курсу для...

МЕТОДИЧЕСКИЕ УКАЗАНИЯ по выполнению курсовой работы по курсу МОДЕЛИРОВАНИЕ СИСТЕМ
Кафедра Автоматизации технологических процессов... В А Шевцов Д Н Великанов МЕТОДИЧЕСКИЕ УКАЗАНИЯ...

МЕТОДИЧЕСКИЕ УКАЗАНИЯ МЕТОДИЧЕСКИЕ УКАЗАНИЯ УЧЕБНО-ИССЛЕДОВАТЕЛЬСКИХ РАБОТ
МЕТОДИЧЕСКИЕ УКАЗАНИЯ...

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

МЕТОДИЧЕСКИЕ УКАЗАНИЯ по технико-экономическому обоснованию дипломных проектов и работ специальности 220200 Автоматизированные системы обработки информации и управления Методические указания для специальности 2202 Автоматизированные системы обработки инфо
Российский химико технологический университет... им Д И Менделеева... Новомосковский институт Издательский центр...

0.038
Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • По категориям
  • По работам