Лабораторные работы С++ builder

gogox

Постоялец
Регистрация
11 Окт 2011
Сообщения
90
Реакции
41
Здесь буду выкладывать лабараторные работы по С++ builder и их решения,по возможности буду просить помощь если трудно.С каждым разом сложность будет возрастать.
P.S.В теме прошу не флудить тока помогать решать и самим набираться опыта в освоение.
Также в тексте и коде могут быть ошибки мы которые должны найти.

Лабораторная работа №1
Название: «Создание консольного приложения»
Тема: «Отладка приложений»
Цель работы: Получить первые навыки по созданию консольных приложений.
Порядок работы

1. Загрузите C++Builder6:
2. Пуск | Программы | Borland Developer Studio 2006 | Turbo C++.
3. Сохраните проект, выбрав для этого меню File->Save Project as... и сохраните файлы проекта в отдельном каталоге (папке), имена проекта и модуля могут быть любыми, расширения Turbo C++ подставит сам.
4. Выберите в главном меню File->New->Other; появится окно New Items (рис.1).
Снимок.PNG

Рис. 1. Окно New Items для выбора способа создания приложения



5. Выберите Console Application и нажмите кнопку ОК. Появится другойе диалоговое окно: New Console Application (рис. 2).

Снимок.PNG

Рис. 2. Диалоговое окно New Console Application

6. Выберите радиокнопку «C++».

7. После того как выбор будет сделан мастер создаст вам скелет вашей будущей программы. При этом Менеджер Проектов будет содержать список созданных файлов (рис.3.).

Снимок.PNG
Рисю 3. Окно Менеджера Проектов
8. В модуле Unit.cpp вы увидите код:
#include <windows.h>
#pragma hdrstop
#pragma argsused
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
return 0;
}
9. Чтобы эта программа что-то делала, допишем пару строк в тело функции WinMain. Надо включить заголовочный файл iostream.h #include <iostream.h> для организации функций ввода-вывода.
10. Преобразуем код исходного файла:
#include <vcl.h>
#include <windows.h>
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#include <condefs.h>
#pragma hdrstop
//------------------------------------------
#pragma argsused int main(int argc, char* argv[])
{
for(int i=0; i<3; i++)
{
cout << “line is” << i<< endl;
}
getch() ;
return 0;
}
11. Сохраните файл и нажмите F9 (или зелененькую стрелочку инструментальной панели) для выполнения задачи.
Контрольные вопросы и задание к лабораторной работе №1
1. Назовите последовательность создания консольного приложения
2. Варианты заданий для самостоятельного выполнения (по указанию преподавателя:(
Найти и вывести на экран
a. максимум матрицы;
b. максимум матрицы;
c. максимум нижнетреугольной части матрицы;
d. максимум верхнетреугольной части матрицы;
e. минимум нижнетреугольной части матрицы;
f. минимум верхнетреугольной части матрицы;
g. минимум главной диагонали матрицы;
h. максимум главной диагонали матрицы;
i. минимум второстепенной диагонали матрицы;
j. максимум второстепенной диагонали матрицы;
k. среднеарифметическое значение элементов матрицы;
l. среднеарифметическое значение элементов нижнетреугольной части матрицы;
m. среднеарифметическое значение элементов верхнетреугольной части матрицы;
n. среднеквадратичное отклонение элементов матрицы;
o. суммы строк матрицы;
p. суммы столбцов матрицы;
q. минимальные значения строк;
r. минимальные значения столбцов;
s. максимальные значения строк;
t. максимальные значения столбцов;
u. среднеарифметические значения строк;
v. среднеарифметические значения столбцов;
w. результат умножения матрицы на вектор, задаваемый с клавиатуры;
x. результат умножения матрицы на матрицу;
y. суммы нижне- и верхнетреугольных частей матрицы;
z. элемент, наиболее близкий по значению к среднеарифметическому.

 

Вложения

  • Снимок.PNG
    Снимок.PNG
    2,9 KB · Просмотры: 11
Лабораторная работа №2
Название: «Знакомство со средой Turbo C++»
Тема: «Отладка приложений»
Цель работы: познакомиться с оболочкой Borland C++ Builder и получить первые навыки по созданию Windows-приложения.

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

1. Перенесите на пустую форму, которая открылась вам, кнопку типа TButton состраницы Standard палитры компонентов, Для этого выделите пиктограмму кнопки(она седьмая слева) и затем щелкните курсором мыши в нужном вам месте формы. На форме появится кнопка, которой C++Builder присвоит имя по умолчанию —Buttonl.
2. Аналогичным образом перенесите на форму с той же страницы Standard палитры компонентов метку Label (она на странице четвертая слева). В этой метке впроцессе выполнения приложения будет появляться текст при нажатии пользователем кнопки. C++Builder присвоит метке имя Labell.
3. Уменьшите до разумных размеров окно формы, так как в вашем первом приложении никаких других компонентов не будет.
4. Выделите на форме компонент Buttonl — кнопку. Перейдите в Инспектор Объектов и измените ее свойство Caption (надпись), которое по умолчанию равно Buttonl (имя, которое по умолчанию присвоил этому компоненту C++Builder) на «Пуск».
5. Укажите метке Label1, что надписи на ней надо делать жирным шрифтом. Для этого выделите метку, в окне Инспектора Объектов раскройте двойным щелчкомсвойство Font (шрифт), затем также двойным щелчком раскройте подсвойство Style (стиль) и установите в true свойство fsBold (жирный).
6. Удалите текст в свойстве Caption метки Labcll, чтобы он не высвечивался, пока пользователь не нажмет кнопку приложения. Теперь вам осталось только написатьоператор, который заносил бы в свойство Caption метки Labell нужный вам текст в нужный момент. Этот момент определяется щелчком пользователя на кнопке. Прищелчке в кнопке генерируется событие OnClick. Следовательно, обработчик этого события вы и должны написать.
7. Выделите кнопку Buttonl на форме, перейдите в Инспектор Объектов, откройте в нем страницу событий (Events), найдите событие кнопки OnClick (оно первоесверху) и сделайте двойной щелчок в окне справа от имени этого события. Это стандартный способ задания обработчиков любых событий. Но перейти в обработчиксобытия OnClick (только этого события) можно и иначе: достаточно сделать двойной щелчок на компоненте Buttonl на форме. В обоих случаях вы окажетесь в окнеРедактора увидите текст:
void fastcall TForml::ButtonlClick(TObject *Sender)
{

}
Заголовок этой функции складывается из имени класса вашей формы (TForml), имени компонента (Buttonl) и имени события без префикса On (Click).
8. Если хотите, можете закрыть окно Исследователя Классов, встроенное в окно Редактора Кода, так как оно пока вам не нужно и будет только мешать. Закрыть этодополнительное окно можно, щелкнув на кнопке в его правом верхнем углу.
9. Напишите в обработчике оператор задания надписи метки Labell. Этот оператор может иметь вид:
Labell->Caption = "Это мое первое приложение!";
Таким образом, полностью ваш обработчик события должен иметь вид:
void fastcall TForml::ButtonlClick(TObject *Sender)
{
Labell->Caption = "Это мое первое приложение!";
}
10. Сохраните созданное приложение.
Сохранение лучше всего выполнять с использованием пункта File/Save All.
Далее вам будет предложено сохранить форму (формы) с именем по умолчанию Unit1 (Unit2, и т.д.), а затем проект с именем Project1. Имена, предлагаемые по умолчанию можно изменять по своему усмотрению, но никогда форма и проект не должны быть названы одинаково.
11. Нажмите клавишу F9, для запуска программы на выполнение.
Контрольные вопросы и задание к лабораторной работе №2
1. Как запустить Borland C++ Builder?
2. Как открыть новый проект (Windows-приложение)?
3. Как выбрать компонент и поместить его на форму?
4. Как запустить приложение на компиляцию?
5. Создайте приложение, которое по кнопке меняет цвет формы.
 
Лабораторная работа №3
Название: «Размещение компонентов на форме»
Тема: Библиотека визуальных компонентов
Цель работы: закрепление навыков выделения компонентов, изменения размеров отдельных компонентов, перемещения компонента (компонентов), а также выравнивания компонентов с использованием палитры выравнивания

Порядок работы

Для создания нового приложения запустите Borland C++ Builder и выберите в главном меню пункт File|New Application.
В инспекторе объектов выберите свойство Name и задайте новое имени формы, например MainForm.
Для дальнейшей работы необходимо выбрать компоненты, поместить их на форму, выровнять при необходимости.
Компонентом называется функционально законченный участок двоичного кода, выполняющий некоторую предопределенную функцию (например, отображение текста, реализация линейки прокрутки и т.п.). Использование компонента сводится к помещению графического значка, также называемого компонентом, в форму создаваемого приложения.
Для выбора компонента необходимо выбрать соответствующую вкладку палитры компонентов и щелкнуть по требуемому компоненту. Щелчок внутри формы приведет к помещению, выбранного компонента в форму — верхний левый угол компонента будет совпадать с положением курсора в момент щелчка.
Для помещения нескольких одинаковых компонентов необходимо щелкнуть по компоненту в палитре компонентов при нажатой клавише Shift. Каждый последующий щелчок внутри формы позволят помещать в нее новый компонент. Прекращения вставки осуществляется щелчком по стрелке в левой части палитры компонентов.
Для выделения одного компонента в форме нужно по нему щелкнуть мышью или несколько компонентов выделить рамкой с черными узлами. Несколько компонентов можно также выделить последовательными щелчками при нажатой клавише Shift. Выделенные компоненты имеют обрамление в виде рамки с серыми узлами. Повторный щелчок по компоненту при нажатой клавише Shift снимает выделение с компонента. Выделение компонентов можно осуществлять путем охвата пунктирной рамкой, появляющейся при нажатии на левую кнопку мыши.
Выделенный компонент (компоненты) можно перемещать по форме при помощи мыши. При выходе компонента за границы формы он будет усекаться. В ряде случаев смещение компонента за границы вызовет появление линеек прокрутки. Используя мышь можно изменять размеры одиночного выделенного компонента (но не у всех компонентов).
Для выравнивания компонента внутри формы наиболее часто используется палитра выравнивания Align (к��манда основного меню View/Alignments Palette).
Снимок.PNG
Рис.​
1​
.Окно выравнивания​
Снимок.PNG
Рис.2.Окно палитры выравнивания​
Функции кнопок данного окна приведены ниже.
1. Выровнять левые края.
2. Выровнять центры по вертикали.
3. Отцентрировать в окне по горизонтали.
4. Установить равный шаг по горизонтали.
5. Выровнять правые края.
6. Выровнять верхние края.
7. Выровнять центры по горизонтали.
8. Отцентрировать в окне по вертикали.
9. Установить равный шаг по вертикали.
10. Выровнять нижние края. Выравнивание может быть применено как к одному выделенному компоненту, так и к группе выделенных компонентов.
Задание 1
Создайте новое приложение. Заполните форму нового приложения пятью компонентами Button (кнопка), находящимися на вкладке Standard. Месторасположение данных компонентов произвольно.
Используя полученные знания, закрепите навыки выделения компонентов, изменения размеров отдельных компонентов, перемещения компонента (компонентов), а также выравнивания компонентов с использованием палитры выравнивания.
В инспекторе объектов отображаются свойства и события компонентов. Инспектор отображает свойства выделенного компонента или общие свойства для группы выделенных компонентов.
Для знакомства с некоторыми свойствами компонентов выполните следующие действия.
1. Очистите форму от всех имеющихся компонентов. Для этого выделите все компоненты, например командой Edit/Select All главного меню и нажмите клавишуDelete.
2. Поместите в форму компонент Shape, находящийся на вкладке Additional палитры компонентов. Инспектор объектов отражает свойства или события этогокомпонента, о чем свидетельствует надпись Shape1 : TShape в ниспадающем меню в верхней части инспектора объектов.
3. Выберите, если необходимо, вкладку "Свойства" (Properties) инспектора объектов.
4. Найдите свойство Name и измените имя, предложенное по умолчанию с Shape1 на Circle. Обратите внимание на изменения в ниспадающем меню.
5. Найдите свойство Brush. Плюс перед названием свойства означает наличие раскрывающегося меню, расширяющего данное свойство. Дважды щелкните по названию свойства Brush. Обратите внимание на появление меню со свойствами Color и Style, а также на изменение знака "+" на "–" перед свойством Brush.
6. Щелкните один раз по свойству Color. Справа от названия свойства появится список возможных значений этого свойства. Раскройте этот список и выберите clRed. Обратите внимание на изменение цвета компонента в форме.
7. Найдите свойство Shape и выберите stCircle.
8. Выполнив данные действия, из белого квадрата получим красный круг. Изменение и контроль свойств компонентов, а также привязка их изменений к событиямсоставляют существенную часть программирования в Borland C++ Builder.
Задание 2
Создайте при помощи нескольких компонентов, изменяя, при необходимости их свойства, модель светофора в виде прямоугольника синего цвета. Задайте компоненту, изображающему красный фонарь, имя (свойство Name) Red, желтый фонарь – имя Yellow, зеленый фонарь – имя Green.
Внимание! Выполните следующие действия точно в соответствие с указанным порядком.
1. Добавьте в форму компонент Timer (вкладка System).
2. Измените свойство Name этого компонента на Timer.
3. Дважды щелкните по компоненту Timer, который уже расположен на форме. Откроется окно редактора кода. Курсор расположен между открывающей и закрывающей тело функции скобками.
4. Далее приводится текст обработчика события для компонента таймер. Введите следующий код.
if (RedBrushColor = = clRed)
{
RedBrushColor = clGray;
YellowBrushColor = clYellow;
}
else
{
if (YellowBrushColor = = clYellow)
{
YellowBrushColor = clGray;
GreenBrushColor = clGreen; }
else
{
GreenBrushColor = clGray;
RedBrushColor = clRed;
}
}
5. Сохраните созданное приложение.
6. Нажмите клавишу F9, для запуска программы на выполнение.
7. После компиляции программы (выявленные компилятором ошибки в программе устраните самостоятельно) откроется окно с созданным Вами приложением. Проанализируйте работу данного приложения в соответствие с записанным ранее программным модулем.
Задание 3
Создать приложение на движение компонентов. Создание приложения «Поршень» начнем с того, что поместим на форму необходимые компоненты, так же как это показано на рис. 4.
1. Компоненты находятся во вкладках: Shape (Additional), Button (Standard), Timer (System).

Shape4 Timer1

Shape3

Shape5
Shapel Shape2
Снимок.PNG

Рис.4.Пример заполнения формы приложение «Поршень»

2. Далее, при нажатии на кнопку «поршень» (Shape4) должен двигаться вправо, а при нажатии на кнопку влево. Если он достигает крайне левого (или крайне правого) положения, загорается соответствующая сигнальная лампа и «поршень» останавливается.

3. Таймер в приложении будет использоваться как элемент повторения. Поэтому зададим для Timer1 свойства Interval (интервал) равный 15 и Enabled (разрешение доступа к компоненту) как false.

4. Теперь щелкните на Button1, откроется редактор кода на событии Button1Click. Нужно записать следующее:

Timer1→Enabled=true; //включаем таймер

Timer1→OnTimer=Button1Click; //задаем режим повторений

if (Shape1→BrushColor= =clRed)

Shape1→BrushColor=clWhite; if (Shape4→Left+Shape4→Width= =Shape3→Left+Shape3→Width)

{

Shape4→Left=Shape3→Left+Shape3→Width–Shape4→Width;

//останавливаем поршень

Shape2→BrushColor=clGreen; //включаем лампу

Timer1→Enabled=false; //выключаем таймер

}

else

{

Shape4→Left+=1; //перемещаем поршень на 1

Shape5→Width+=1;} //вправо

5. Теперь щелкните на Button2, откроется редактор кода на событии Button2Click. Нужно записать следующее:

Timer1→Enabled=true;

Timer1→OnTimer=Button2Click;

if (Shape2→BrushColor= =clGreen)

Shape2→BrushColor=clWhite; if (Shape4→Left= =Shape3→Left)

{

Shape4→Left=Shape3→Left;

Shape1→BrushColor=clRed;

Timer1→Enabled=false;

}

else

{

Shape4→Left– =1; //перемещаем поршень на 1 влево

Shape5→Width– =1;

}

Написаны два обработчика событий, которые будут выполняться всякий раз, когда выбирается соответствующая кнопка (Button1 или Button2).

Запустите приложение на выполнение.

Контрольное задание к лабораторной работе №2

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

2. «красный→красный + желтый→зеленый→мигающий зеленый»

3. Создать приложение «Автопогрузчик», примерный вид формы показан на рис.5. Для кнопок описать соответствующее движение:

«Вперед» «Поднять» «Переместить» «Опустить» «Назад»

автопогрузчика с грузом до опоры

груз с подъемной платформой поднять до верха опоры

груз переместить на опору

опустить подъемную платформу

автопогрузчик без груза откатывается на исходную позицию



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

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

for (int i=0; i < ComponentCount; i++) { if (Components → Tag == 1)

((TControl *)Components) →Left +=1; }



Подъемная платформа Груз Опора

Снимок.PNG
Рис.5.Пример заполнения формы приложение «Автопогрузчик»
Контрольные вопросы и задание к лабораторной работе №3
1. Как выделить компонент (компоненты), переместить и изменить его (их) размеры?
2. Как выровнять компонент (компоненты) внутри формы?
 

Лабораторная работа №4
Название: Свойства компонентов. Приложение «Пятнашки»
Тема: Библиотека визуальных компонентов
Цель работы: изучить различные свойства компонентов и форм. Создать приложение «Пятнашки».
Порядок работы: рассмотрим основные свойства компонентов и варианты работы с ними.
Быстрая разработка приложений (RAD) подразумевает поддержку свойств, методов и событий компонентов в рамках объектно-ориентированного программирования.
Свойства компонентов определяют их работу. Изменение свойств обычно приводит к выполнению некоторого двоичного кода. Некоторые свойства одинаковы для всех компонентов. Например, свойства Left и Тор определяют положение компонента в форме, или формы на экране. Однако компоненты могут иметь свои индивидуальные свойства.
Свойства могут быть численными значениями (Left=192), логическими переменными (Enabled=tru) или строками символов (Align=alClient). Значения некоторых свойств могут быть оформлены в виде перечислений (раскрывающегося списка). Значения свойств могут меняться во время разработки программы и во время ее выполнения. Не все свойства способны производить видимые действия на этапе разработки программы, но когда это возможно, результат тут же отобразится в форме.
Свойства имеют два спецификатора доступа, которые используются при чтении и модификации их свойств. Это спецификатор чтения и спецификатор записи. Когда имеет место ссылка на свойство, то есть свойство используется справа от оператора присваивания, например
int a = Form1→Top;
то идет обращение к спецификатору чтения. Во многих случаях спецификатор чтения только возвращает текущее значение свойства.
Свойство может быть доступно только для чтения (read-only). В этом случае изменения значения свойства невозможно. Иногда свойство может быть доступно только для записи (write-only). Некоторые свойства могут быть доступны только во время выполнения (runtime-only). Доступ к такому свойству невозможен во время разработки, и оно не отображается во вкладке "Свойства" инспектора объектов. Свойства свойств задаются разработчиком компонента.
Рассмотрим некоторые наиболее важные свойства.
1. Свойство Name
При помещении компонента в форму C++Builder создает указатель на компонент и использует свойство Name в качестве имени переменной. Очевидно, что данное свойство широко используется при работе с компонентом. Например, при помещении в форму компонента Edit, свойство Name которого изменено на MyEdit, то C++Builder поместит в заголовочный файл формы следующую запись
TEdit* MyEdit;
В дальнейшем указатель MyEdit может использоваться в программах для обращения к компоненту
MyEditText ="Переменная равна =";
Для компонентов, помещаемых в форму, свойство Name устанавливается по умолчанию и может быть изменено с использованием инспектора объектов.
2. Свойство Align. Данное свойство определяет способ выравнивания компонента в окне. Возможные значения свойства приведены ниже.
alBottom Компонент располагается вдоль нижнего края окна.
alClient Компонент заполняет всю рабочую область окна.
alLeft Компонент располагается вдоль левого края окна.
alNone Компонент располагается произвольно.
alRight Компонент располагается вдоль правого края окна.
alTop Компонент располагается вдоль верхнего края окна.
Задание 1
Поместите в форму компонент Panel.
Найдите свойство Align для этого компонента и отметьте, какое значение присвоено по умолчанию.
Измените, значение данного свойства последовательно на alTop, alLeft, alBottom, alRight и отметьте результаты, обратив внимание на возможность изменения размеров компонента Panel.
Измените значение свойства на alClient. Попытайтесь изменить размер компонента.
3. Свойство Color. Свойство Color определяет цвет фона компонента. Значения свойства представ��ены в виде раскрывающегося списка. Первая группа в списке — от clBlack до clWhite — это предопределенные цвета C++Builder. Вторая группа цветов — системные цвета Windows. Рекомендуется в приложениях для стандартных элементов управления использовать цвета из второй группы.
Двукратный щелчок по свойству Color в столбце Value вызовет диалоговое окно выбора заказных цветов.
4. Свойство Cursor. Данное свойство определяет вид курсора мыши во время его перемещения через компонент. Данное свойство может меняться программно.
Задание 2
Поместите в форму двадцать один компонент Button. Расположите в виде матрицы 7×3, с одинаковым шагом по вертикали и по горизонтали. Для каждой кнопки измените свойство Cursor так, чтобы охватить все возможные значения этого свойства. Запустите приложение. Составьте таблицу, содержащую название значения свойства Cursor, краткой характеристики и рисунка курсора.
5. Свойство Enabled. Это свойство определяет возможность доступа к компоненту. Обычно разрешение/запрещение доступа к компоненту выполняется во время работы программы.
6. Свойство Hint. Свойство Hint (Подсказка) задает текст подсказки для компонента. Текст подсказки состоит из двух частей.
Первая часть называется короткой (ей соответствует функция GetShortHint) и выводится, когда пользователь задерживает курсор на компоненте. Чтобы выводить краткие подсказки, необходимо установить свойство ShowHint в "true".
Вторая часть, называемая длинной (GetLongHint), содержит текст, отображаемый в какой-то выделенной для этого части окна, например, в строке состояния. Тексты короткой и длинной подсказок отделяются друг от друга символом «|».
Для того, чтобы вторая часть сообщения, записанного в Hint, отображалась в строке состояния (или в каком-либо другом компоненте) в момент, когда курсормыши проходит над компонентом, надо использовать обработку события OnHint.
Пример
Создадим две подсказки для компонента Button:
на форму поместите компоненты: Button (кнопка) и StatusBar (статусная строка);
добавить в заголовочный файл формы (*.h) в раздел public: строку;
void __fastcall DisplayHint(TObject *Sender);
в свойстве Hint для Button запишите;
Открыть файл | Открыть файл для редактирования.
установите для кнопки Button свойство ShowHint в true;
в обработчике события FormCreate запишите;
Application OnHint = DisplayHint;
во вкладке редактора кода создайте обработчик события DisplayHint;
void __fastcall TForm1::DisplayHint(TObject *Sender) { StatusBar1→SimpleText = GetLongHint(ApplicationHint);
}
запустите приложение на компиляцию.
Форма в приложении выступает как специфический компонент, который обладает специфическими свойствами, методами, событиями.
При желании в приложении 1 можно посмотреть основные свойства форм, доступные как на этапе разработки программы, так и на этапе ее выполнения.
Контрольные вопросы и задание к лабораторной работе №4
1. Изучите основные свойства компонентов вкладок Standard, Additional. Найдите компоненты близкие по назначению и разбейте их на группы. Какие свойства являются общими для группы? Какие уникальными?
2. Можно ли изменять свойство Name компонента во время выполнения программы?
3. Написать приложение «Пятнашки». На основной форме расположите 16 компонентов, выравненных в виде матрицы 4×4. Компоненты должны быть различны по цвету и стилю заливки. Для каждого компонента написать два вида подсказок (например, «1|Кнопка 1»). Данную подсказку выводить в заголовок формы.
 
Лабораторная работа №5
Название: «Обработка исключительных ситуаций»
Тема: «Библиотека визуальных компонентов»
Цель работы: изучить способы обработки исключительных ситуаций.
Порядок работы
Turbo C++ поддерживает стандартный механизм обработки исключений (exception), то есть ошибок, которые могут возникнуть при выполнении программы (например, при делении на нуль или нарушении обслуживания потоков). При встрече с ненормальной ситуацией он может передать управ ление другой части программы, продолжить ее выполнение либо завершить работу. Обычно определяют обработчик исключения (exception handler), вы полняющий необходимые действия перед завершением программы. Блоки кода, генерирующие исключения, начинаются словом try и заключаются в фигурные скобки. В случае обнаружения ошибки происходит программное прерывание. При этом управление передается блоку обработчика исключения catch. В скобках указывают спецификацию класса конкретного исключения, а для перехвата всех ошибок – многоточие (…). Не менее одного такого блока следует за блоком try. Для каждой исключительной ситуации определен свой класс.
Таблица 1
Некоторые классы исключений
Класс
Описание
EAccessViolation
Ошибка доступа в память
EConvertError
Ошибка преобразования данных
EDatabaseError
Ошибка доступа к базе данных
EDivByZero
Ошибка деления на нуль целого числа
EInOutError
Ошибка файлового обмена
EPrinterError
Ошибка печати
EStackOverflow
Переполнение стека
EZeroDivide
Ошибка деления на нуль вещественного числа
EOverflow
Переполнение регистров вещественных чисел
Простой пример обработки исключений показывает, как при возникновении любой ошибочной ситуации, например при отсутствии текста в поле, можно вывести сообщение.
1. Установите на форму компоненты Label, Edit и Button.
2. В обработчик события кнопки введите код:
void _ _fastcall TForm1::Button2Click (TObject *Sender) {
try
{
Label1–>Caption = Edit1–>Text ; }
catch (...)
{
ShowMessage ("Ошибка");
}
}
3. Сохраните приложение и запустите его.

В блоке try можно использовать лексему throw для вызова исключительной ситуации или для указания типа исключения, которое вызывает функция. Вслед за блоком try вместо catch часто располагают блок _ _finally, выполняющийся вне зависимости от наличия исключительной ситуации.
Контрольные вопросы и задание к лабораторной работе №5

1. Какую роль играют исключения и их обработчики?
2. Как выполняется отладка программ в режиме обработки исключений?
 
Лабораторная работа №6
Название: «Методы компонентов. Приложение Калькулятор»
Тема: Библиотека визуальных компонентов
Цель работы: изучить различные методы компонентов и форм. Как пример создать приложение «Калькулятор».
Порядок работы: рассмотрим основные методы компонентов и варианты работы с ними.
Методы в компонентах VCL — это функции, которые могут быть вызваны для выполнения компонентом определенных действий. Методы могут принимать аргументы и возвращать значения. Но могут не принимать аргументов и не возвращать значений. Методы могут быть закрытыми (private), защищенными (protected) и открытыми (public). Пользователь компонента может вызвать только открытые методы. В отличие от свойств и событий, методы не имеют соответствующей вкладки в инспекторе объектов (Object Inspector). Методы вызываются при помощи оператора косвенного доступа (>).
Насчитывается более 20 методов, которые используются большинством компонентов. Компоненты оконного типа имеют более 40 общих методов. Однако не все из них используются широко. Многие функциональные возможности компонентов реализуются при помощи свойств. Например, чтобы скрыть компонент, вы можете вызывать метод Hide() или установить для свойства Visible значение false. Кроме того, компоненты обычно имеют свои специальные методы, и именно эти методы для данного компонента используются чаще всего. Ниже в табл.2 приведены методы, часто используемые для создания приложений.
Таблица 2
Общие методы компонентов
Снимок.PNGСнимок.PNG
При построении приложения «Калькулятор» необходимо выполнить следующее;
1. на первую форму поместить следующие компоненты: три компонента Label, два компонента Edit, компонент Panel, два компонента Button;
2. жирным шрифтом сделать надписи в метках, так же как показано на рис. 6а;
Снимок.PNG
Рис.6.Окончательный вид формы (а) и окно во время ��ыполнения при
обнаружении ошибки ввода (б)
3. Для компонентов Edit и Button выполнить аналогичные действия самостоятельно;
4. Написать обработчик щелчка кнопки Button1.
При этом будем использовать два метода FloatToStr() и StrToFloat().
if (Edit1→Text != “” || Edit2→Text != “”)
Panel1→Caption = Edit1→Text + “*” + Edit2→Text + “=” +FloatToStr(StrToFloat(Edit1→Text)*StrToFloat(Edit2→Text));
else
Form2→ShowModal();
5. написать обработчик щелчка кнопки Button2; Edit1→Clear(); Edit1→SetFocus(); Edit2→Clear(); Panel1→Caption = “”.
6. Создать вторую форму, в которой будет один компонент Label. Форма будет вызываться в случае обнаружения ошибки ввода данных. Для этого откройте редактор кода, а между { } вставьте следующую строку:
Label1→Caption = «Введите значение чисел».
7. Подключите вторую форму к первой.
8. Приложение запустите на выполнение. Убедитесь, что оно работает нормально, иначе откроется окно ошибки (рис.11б).
Формы по своей сути также являются компонентами. А это значит, что они имеют много общих с компонентами методов. К этим методам, в частности, относятсяShow(), ShowModal(), Invalidate(). Однако существуют методы, используемые только в формах. В приложении 2 приведены часто используемее методы форм, с которыми вы можете познакомиться самостоятельно.
Контрольные вопросы и задание к лабораторной работе №6
1. Изучите основные методы компонентов.
2. Назовите три метода, которые могут использоваться для принудительной перерисовки элементов управления?
3. Внести изменения в приложение «Калькулятор», чтобы было возможным производить выбор арифметической операции (+ , –, *, /), а также сделайте проверку на возникновение исключительных ситуаций.
Пример обработки исключительной ситуации связанный с ошибкой ввода числовых данных.
try
{
Roubles–>Text = FloatToStrF (floor (StrToFloat (EditDollars–>Text) *
StrToFloat (EditRate–>Text) + 0.5), ffFixed, 10, 2);
}
catch (const EConvertError &)
{
LabelError–>Caption = “Неверный формат числа”;
}
catch (const EOverflow &)
{
LabelError–>Caption = “Неверная величина числа”;
}

 
Лабораторная работа №7
Название: Обработка событий компонентов.
Тема: «Библиотека визуальных компонентов»
Цель работы: изучить процесс обработки событий.
Порядок работы
Прежде чем рассматривать основные свойства компонентов (или форм) нужно знать, что Windows является средой, управляемой событиями. К событиям относятся, например, перемещение мыши, щелчки кноп��ами мыши, нажатия кнопок на клавиатуре. Прикладная программа непрерывно опрашивает Windows на предмет возникновения событий. Windows уведомляет программу о событии, посылая соответствующее сообщение. Общее количество сообщений превышает 170. На практике используется несколько десятков.
Событие в Borland C++ Builder — это все происходящее в компоненте, о чем пользователь может захотеть узнать. Каждый компонент спроектирован так, чтобы реагировать на определенные события. Реакция на событие, относящееся к данному компоненту, называется обработкой (handle) события. События обрабатываются функциями, которые называются обработчиками событий.
Обработка событий крайне проста. Список событий, на который реагирует компонент, приведен во вкладке «События» (Event) инспектора объектов. Имя события служит одновременно его описанием. Например, щелчок мышью называется OnClick.
Нет необходимости обрабатывать все события. Если какие-либо события не прописываются, то они либо игнорируются, либо обрабатываются предопределенным способом. Ниже в табл.3 приведены основные события компонентов, используемые при создании приложений.
Таблица 3
Основные события компонентов
Снимок.PNGСнимок.PNG
Обратите внимание, что при выполнении некоторых действий может возникнуть несколько событий.
Перечисленные выше события характерны не для всех компонентов. Например, компонент Shape имеет (помимо прочих) только три последних события, из перечисленных выше.
Обработка события программистом состоит в написании программного кода, отражающего реакцию разрабатываемого приложения на возникшее событие.
Для перехода в редактор кода с целью написания кода обработки события необходимо:
• сделать активным тот компонент, помещенный в форму, событие для которого предполагается обработать;
• перейти на вкладку Events (События) инспектора объектов;
• найти требуемое событие;
• дважды щелкнуть в правой колонке напротив названия выбранного события;
• записать код обработки события в открывшемся окне редактора кода.
При выполнении этих действий в редакторе кода создается функция, которая будет вызываться при обработке события. Имя этой функции появится в правой колонке вкладки Events инспектора объектов напротив названия события.
Функцию, ранее созданную для обработки одного события, можно использовать для обработки другого события. В правой колонке вкладки Events инспектора объектов напротив названия события может находиться раскрывающийся список имеющихся обработчиков событий, доступных для данного события.
Формы имеют специфические события форм, некоторые из которых описаны в приложении 3.
Задание
Имеется белое квадратное поле в нижней части окна, и желтое поле такого же размера с цифрой 1 в верхней части окна. Требуется при помощи мыши перетаскивать желтое поле в белое. Если при отпускании левой кнопки мыши желтое поле точно попадает в белое, оно там фиксируется. В противном случае оно возвращается к своему исходному месту.
Листинг программы, реализующей решение данной задачу, приведен ниже.
int x0, y0, xn, yn; bool flag1 = false; Tform1 *Form1;
__fastcall TformExample1::TformExample1(Tcomponent* Owner) : Tform(Owner)
{
xn = Label1→Left;
yn = Label1→Тор; }
void __fastcall TformExample1::Label1MouseDown (Tobject*Sender, TmouseButton Button, TshiftState Shift, int X, int Y)
{
flag1 = true; x0 = X; y0 = Y;
}
void __fastcall TformExample1::Label1MouseMove (Tobject*Sender, TshiftState Shift, int X, int Y)
{
if (flag1) {
Label1→Left += X–x0; Label1→Top += Y–y0; } }
void __fastcall TformExample1::Label1MouseUp (Tobject*Sender, TmouseButton Button, TshiftState Shift, int X, int Y)
{
if (abs(Label1→Left – Shape1→Left) < 10 &&
abs(Label1→Top – Shape1→Top) < 10) {
Label1→Left=Shape1→Left;
Label1→Top=Shape1→Top; }
else
{
Label1→Left=xn;
Label1→Top=yn; }
flag1 = false; }
Контрольные вопросы и задание к лабораторной работе №7
Проанализируйте программу. Постарайтесь ответить на следующие вопросы:
1. какое имя (свойство Name) имеет главная форма программы?
2. какие компоненты использовались для создания приложения?
3. обработчики, каких событий и для, каких компонентов используются в программе?
4. Что обозначает строка:
void __fastcall*TformExample1::Label1MouseDown(Tobject*Sender, TmouseButton Button, TshiftState Shift, int X, int Y);
4. Для чего используется переменная flag1.
5. Что делает следующий фрагмент программы:
if (flag1)
{
Label1→Left += X–x0;
Label1→Top += Y–y0;
}
6. После ответа на вопросы создайте приложение, решающее рассматриваемую задачу, и проверьте его работоспособность.
7. Перечислите события, возникающие при однократном и двойном щелчке кнопкой мыши по компоненту.
8. Перечислите события клавиатуры и события перемещения фокуса ввода.
 

Лабораторная работа №8
Название: «Работа с модальными окнами»
Тема: Модальные и немодальные формы
Цель работы: познакомиться с назначением форм в Borland C++ Builder и исследовать свойства диалоговых окон.
Порядок работы: при создании приложений используют, по крайней мере, одну форму, которая является главным окном приложения. При создании главного окна существует множество вариантов, определяемых требованиями к проекту. В частности, главное окно может иметь меню, панели с кнопками, растровые изображения и т.п.
Помимо формы главного окна, в приложении могут присутствовать формы диалоговых окон. Диалоговым окнам характерны следующие свойства:
фиксированный размер;
наличие кнопки OK для закрытия окна (некоторые диалоговые окна имеют кнопку Close, выполняющую аналогичную функцию);
наличие кнопок Cancel и Help;
наличие в строке заголовка только кнопки закрытия окна;
наличие вкладок;
использование клавиши Tab для перемещения между элементами управления диалогового окна.
Некоторые диалоговые окна могут удовлетворять рассмотренным свойствам не в полной мере.
Работу с диалоговыми окнами рассмотрим на примере создания приложения, имеющего диалоговое окно About, выводящее информацию об этом приложении. Выполним следующие действия.
1. Создайте новое приложение. Форма Form1 будет являться главным окном создаваемого приложения.
2. Измените свойство Caption данной формы на "BMP Viewer". Обратите внимание на изменения в строке заголовка формы.
3. Поместите в форму компонент Button. Для поиска компонентов не прибегая к палитре компонентов можно использовать лист компонентов (Component List),вызываемый через команду главного меню View.
4. Расположите кнопку в правой верхней части формы. Измените свойство Name кнопки на AboutButton. В свойстве Caption запишите About. Данная кнопка будет служить для вызова диалогового окна About, выводящего информацию о приложении.
5. Создадим новую форму, которая будет служить основой для диалогового окна. Новая форма создается командой основного меню File/New Form. Измените имя новой формы на AboutBox. Выполните действия, позволяющие получить в строке заголовка данной формы надпись "About This Program" (разумеется, без кавычек).
6. Каждой форме ставится в соответствие своя вкладка редактора кода. Переключитесь в редактор кода. Обратите внимание, что редактор кода имеет две вкладкиUnit1.cpp и Unit2.cpp, соответствующие двум открытым формам.
7. Сохраним наработанные данные. Выполним File/Save Project As…. В открывшимся окне сохранения, выберем требуемый каталог (каталог вашей группы в папкеStudent). Предлагается сохранить программу с именем Unit1.cpp изменим имя на prog1.cpp и сохраним. Следующее имя Unit2.cpp изменим на about.cpp и сохраним. Далее запрашивается разрешения на сохранение проекта с именем Project1.bpr. Изменим, название проекта на Viewer.bpr и сохраним.
8. Возвращаемся к редактору кода. Обратите внимание на изменения названий вкладок в этом редакторе. Попытайтесь объяснить изменения.
9. Сформируем диалоговое окно из формы AboutBox. Изменим размеры окна. Высота окна задается свойством Height (задаем 150),
ширина задается свойством Width (200). Размеры можно изменять и при помощи мыши, как рассматривалось ранее применительно к компонентам.
Внимание! Уменьшенная в размерах форма легко может спрятаться под другую форму, создавая иллюзию исчезновения с экрана.
Для перехода между формами используйте кнопку View Form из панели инструментов главного окна Borland C++ Builder. Потренируйтесь!
ель работы: познакомиться с назначением форм в Borland C++ Builder и исследовать свойства диалоговых окон.
Порядок работы
При создании приложений используют, по крайней мере, одну форму, которая является главным окном приложения. При создании главного окна существует множество вариантов, определяемых требованиями к проекту. В частности, главное окно может иметь меню, панели с кнопками, растровые изображения и т.п.
Помимо формы главного окна, в приложении могут присутствовать формы модальных окон. Модальные окна имеют следующие свойства:
фиксированный размер;
наличие кнопки OK для закрытия окна (некоторые модальные окна имеют кнопку Close, выполняющую аналогичную функцию);
наличие кнопок Cancel и Help;
наличие в строке заголовка только кнопки закрытия окна;
наличие вкладок;
использование клавиши Tab для перемещения между элементами управления диалогового окна.
Некоторые модальные окна могут удовлетворять рассмотренным свойствам не в полной мере.
Работу с диалоговыми окнами рассмотрим на примере создания приложения, имеющего модальное окно About, выводящее информацию об этом приложении.
1. Создайте новое приложение. Форма Form1 будет являться главным окном создаваемого приложения.
2. Измените свойство Caption данной формы на "BMP Viewer". Обратите внимание на изменения в строке заголовка формы.
3. Поместите в форму компонент Button. Для поиска компонентов не прибегая к палитре компонентов можно использовать лист компонентов (Component List), вызываемый через команду главного меню View.
4. Расположите кнопку в правой верхней части формы. Измените свойство Name кнопки на AboutButton. В свойстве Caption запишите About. Данная кнопка будет служить для вызова диалогового окна About, выводящего информацию о приложении.
5. Создадим новую форму, которая будет служить основой для диалогового окна. Новая форма создается командой основного меню File/New Form. Измените имя новой формы на AboutBox. Выполните действия, позволяющие получить в строке заголовка данной формы надпись "About This Program" (разумеется, без кавычек).
6. Каждой форме ставится в соответствие своя вкладка редактора кода. Переключитесь в редактор кода. Обратите внимание, что редактор кода имеет две вкладки Unit1.cpp и Unit2.cpp, соответствующие двум открытым формам.
7. Сохраним наработанные данные. Выполним File/Save Project As…. В открывшимся окне сохранения, выберем требуемый каталог (каталог вашей группы в папке Student). Предлагается сохранить программу с именем Unit1.cpp изменим имя на prog1.cpp и сохраним. Следующее имя Unit2.cpp изменим на about.cpp и сохраним. Далее запрашивается разрешения на сохранение проекта с именем Project1.bpr. Изменим, название проекта на Viewer.bpr и сохраним.
8. Возвращаемся к редактору кода. Обратите внимание на изменения названий вкладок в этом редакторе. Попытайтесь объяснить изменения.
9. Сформируем диалоговое окно из формы AboutBox. Изменим размеры окна. Высота окна задается свойством Height (задаем 150), ширина задается свойством Width (200). Разме��ы можно изменять и при помощи мыши, как рассматривалось ранее применительно к компонентам.
Внимание! Уменьшенная в размерах форма легко может спрятаться под другую форму, создавая иллюзию исчезновения с экрана.
Для перехода между формами используйте кнопку View Form из панели инструментов главного окна Borland C++ Builder. Потренируйтесь!
10. Чтобы зафиксировать размер создаваемого окна, требуется изменить свойство BorderStyle формы на bsSingle или bsDialog. Последнее предпочтительнее, так как в строке заголовка диалогового окна будет находиться только одна кнопка закрытия окна.
11. Поместите в форму AboutBox один под другим четыре компонента Label из вкладки Standard. Данные компоненты обычно используются для вывода текстовой информации. Поместите в свойства Caption этих компонентов слова (без кавычек) "Программа", "просмотра", "растровых", "изображений". Обратите внимание на свойство AutoSize — оно отвечает за автоматическое изменение размера компонента и должно быть включено (true). Поместите компоненты с текстовой информацией желаемым образом, например, друг под другом в середине формы.
12. Поместите в форму компонент BitBtn. Данный компонент позволяет сформировать стандартную кнопку с рисунком и надписью. Поместите этот компонент по середине формы ближе к нижнему краю. Измените свойство Kind на bkOk.
13. Поместите в форму компонент Bevel из вкладки Additional. Для этого щелкните по соответствующему значку палитры компонентов. Значок "западет". Затем поместите курсор несколько выше и левее компонента Label, содержащего слово "Программа", нажмите (и держите) левую кнопку мыши и ведите курсор вниз и вправо, стремясь охватить появившейся рамкой весь текст. В нужном месте отпустите кнопку мыши. Размер компонента Bevel можно изменять стандартным образом.
14. Установите свойство Shape компонента Bevel в bsFrame.
15. Перейдите к форме Form1. Дважды щелкните по кнопке с надписью "About...". В раскрывшемся окне редактора кода введите следующий фрагмент программы:
AboutBox ShowModal();
Данный код открывает форму AboutBox как модальное окно. Модальное окно прерывает работу вызвавшего его приложения. Работа приложения может быть продолжена только после закрытия модального окна. Диалоговое окно может быть открыто как немодальное посредством программного кода:
AboutBox Show();
16. Остается связать воедино два имеющихся программных модуля prog1.cpp и about.cpp. Перейдем в редактор кода на вкладку prog1.cpp и выполним следующие действия:
команда меню File/Include Unit Hdr...;
в раскрывшемся диалоговом окне Include Unit выбрать About.
17. Откомпилируйте и запустите приложение.
Контрольные вопросы и задание к лабораторной работе №8
1. Какое окно называется модальным (немодальным)?
2. Как открыть форму в виде модального (немодального) окна?
3. Как включить несколько форм в проект?
4. Создайте приложение, состоящее из двух форм. Причем, вторая форма должна открываться как немодальное окно при нажатии на кнопку. Сохранить проект в своем рабочем каталоге.
5. Исследуйте доступные свойства компонентов, используемых в приложении.
6. Создайте приложение, основная форма которого имеет кнопку, которая открывает новую форму. Новая форма содержит две кнопки, одна из которых закрывает эту форму, а другая открывает новую форму. Новая форма содержит две кнопки, одна из которых закрывает эту форму, а другая открывает новую форму и т.д. до четвертой формы, которая имеет только закрывающую кнопку. Всего получается четыре уровня.
 
Лабораторная работа №9
Тема: «Стандартные диалоговые окна на примере окон работы с файлами»
Цель работы: изучить компоненты системного диалога. Создание приложения «Текстовый редактор».
Порядок работы: рассмотрим, как в Borland C++ Builder реализованы стандартные режимы диалога. Windows содержит целый ряд стандартных диалоговых окон, которые могут быть доступны любой прикладной программе.
В табл.4 перечислены стандартные окна Windows и функции, выполняемые окнами и компоненты C++ Builder, обеспечивающие работу с этими окнами. Стандартные диалоговые окна находятся на вкладке Dialog панели компонентов. Данные компоненты относятся к невизуальным.
Таблица 4
Основные события компонентов
Снимок.PNGСнимок.PNG
Для создания и отображения всех стандартных окон используется метод Execute(). Диалоговое окно отображается в модальном режиме, за исключением немодальных окон Find и Replace. Метод Execute() возвращает true, если пользователь нажал кнопку «OK», дважды щелкнул по имени файла или нажал Enter на клавиатуре. Если пользователь нажал кнопку «Cancel», нажал клавишу Esc или закрыл кнопкой закрытия окна, то метод возвращает false. Стандартное диалоговое окно может быть реализовано в программе, например, следующим образом.
if (OpenDialogExecute()) {
MemoLinesLoadFromFile(OpenDialogFileName); }
Данный код выводит диалоговое окно FileOpen, в котором пользователь выбирает нужный файл. Если файл выбран, то будет выполнен код внутри if, в результате чего содержимое файла будет загружено в компонент Memo.
Диалоговые окна для работы с файлами достаточно просты, но имеют свои специфические свойства, которые приведены в табл.5.
Таблица 5
Некоторые свойства диалоговых компонентов
Снимок.PNG

С диалоговыми окнами File не связаны никакие события.

Внимание! Компоненты OpenDialog и SaveDialog оперируют только с именем файла. Реализация каких-либо действий в отношении этого файла целиком зависит от программиста.

Задание

Создать приложение — простой текстовый редактор, способный открывать существующий текстовый файл, создавать новый файл, сохранять файл.

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

1. Создайте новое приложение.

2. Переименуйте форму в MyNotepad.

3. Сделайте так, чтобы строка заголовка формы содержала надпись MyNotepad v1.0.

4. Сохраните приложение в личном каталоге под именем MyNotepad. Имя файла формы программы задайте Notepad.cpp. В процессе работы над приложением периодически сохраняйте результаты при помощи команды File/Save All.

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

6. В приложения кнопки обычно находятся на панелях. Поэтому создадим панель с требуемыми нам кнопками "New", "Open", "Save". Поместите в форму компонентPanel из палитры компонентов. Переименуйте ее в ToolBar.

7. Сделайте высоту панели равной 32. Свойство BevelOuter установите в bvNone. Обратите внимание на изменения, происшедшие с панелью.

8. Сотрите значение свойства Caption.

9. Измените свойство Align на alTop. Обратите внимание на взаимное расположение панели и разделителя.

10. В качестве кнопок используем компонент SpeedButton, специально предназначенный для установки в панель. Поместите компонент SpeedButton в панель (не в форму!). Не беспокойтесь о точном положении кнопки, выравнивание осуществим позднее.

11. Переименуйте кнопку в FileOpenBtn.

12. Установите свойство Left кнопки равным 5.

13. С помощью палитры выравнивания отцентрируйте кнопку в панели по вертикали.

14. На кнопку, реализованную через компонент SpeedButton (или через BitBtn) может быть помещен графический объект — значок, характеризующий функцию кнопки. Дважды щелкните в колонке Value напротив свойства Glyph компонента SpeedButton. Откроется окно редактора изображений. При помощисоответствующих кнопок перейдите в каталог …\Builder\Borland Shares\Images\Buttons и выберите файл Fileopen.bmp (указать точный путь невозможно, так как он различен для разных версий Borland C++ Builder). Если все действия были выполнены правильно, на кнопке появится графическое изображение.

15. Аналогичным образом добавьте в панель кнопки FileSaveBtn и FileNewBtn. Разместите их "без зазора" по горизонтали.

16. На все кнопки создайте короткие всплывающие подсказки, аналогичные тем которые используются в Windows.

17. Добавьте в форму компонент Memo. Данный компонент предназначен для отображения текстовой информации, а также для ее набора. Информация определяется свойством Lines компонента.

18. Добейтесь того, чтобы компонент Memo занимал все оставшееся поле формы.

19. Дважды щелкните в колонке Value инспектора объектов напротив свойства Lines. В открывшемся окне удалите надпись Memo1.

20. Разрешите использование в компоненте Memo линеек прокрутки (ScrollBar).

21. Добавьте в форму, место не имеет значения, компоненты OpenDialog и SaveDialog. У данных компонентов настройте фильтр на работу с текстовыми (*.txt) и всеми файлами (*.*).

22. Форма должна иметь вид такой же как показано на рис.5.

Снимок.PNG
Рис.5.Вид формы приложения «Текстовый редактор»
23. Ниже приведен листинг программы, реализующей создание нового файла, считывание и сохранение файла. Найдите функции — обработчики события щ��лчка по соответствующей кнопке панели Вашего приложения. Реализуйте эти функции у себя. TMyNotepad *MyNotepad;
//
__fastcall TMyNotepad :: TMyNotepad(TComponent*Owner)
: TForm(Owner) { }
//
void __fastcall TmyNotepad :: FileOpenBtnClick(TObject*Sender) {
if (OpenDialog1→Execute()) {
if (Memo1→Modified) {
int res=ApplicationMessageBox("The current file has changed. Save changes?", "MyNotepad Message", MB_YESNOCANCEL | MB_ICONWARNING); if (res == IDYES) FileSaveBtnClick(Sender); if (res == IDCANCEL) return; }
Memo1→LinesLoadFromFile(OpenDialog1→FileName); } }
//
void __fastcall TMyNotepad :: FileNewBtnClick(TObject*Sender) {
if (Memo1→Modified) {
int res=ApplicationMessageBox("The current file has changed. Save changes?", "MyNotepad Message", MB_YESNOCANCEL | MB_ICONWARNING); if (res == IDYES) FileSaveBtnClick(Sender); if (res == IDCANCEL) return; }
if (Memo1→LinesCount > 0) Memo1→Clear(); SaveDialog1→FileName = " "; }
//
void __fastcall TmyNotepad :: FileSaveBtnClick(TObject *Sender) {
if (SaveDialog1→FileName != " ") {
Memo1→LinesSaveToFile(SaveDialog1→FileName); Memo1→Modified = false; }
else
{
SaveDialog1→Title="Save As";
if (SaveDialog1→Execute())
{
Memo1→LinesSaveToFile(SaveDialog1→FileName);
Memo1→Modified=false;
} } } Запустите приложение.
Контрольные вопросы и задание к лабораторной работе №9
1. Внесите необходимые изменения в созданную программу, чтобы все предупреждения выдавались на русском языке.
2. Создайте приложение для просмотра и сохранения графических файлов.


 

Лабораторная работа №10
Тема: «Создание меню приложения»
Цель работы: научиться строить падающее меню. Добавить меню в созданное ранее приложение «Текстовый редактор».
Порядок работы: рассмотрим, как в C++ Builder реализует возможность создания падающего меню.
Меню являются важной частью большинства приложений Windows. В некоторых программах меню отсутствует, но таких программ очень мало.
В C++ Builder для создания меню используется специальный редактор меню, что сильно облегчает работу. Редактор меню обладает следующими возможностями:
создание, как главного, так и контекстных меню;
обеспечение оперативного доступа к редактору кода для обработки событий OnClick, соответствующих пунктам меню;
вставка меню из шаблонов или файлов ресурсов;
сохранение пользовательских меню в виде шаблонов.
Все команды редактора меню доступны через его контекстное меню или из инспектора объектов. Редактор меню позволяет быстро разрабатывать меню любой структуры. Главное меню представлено компонентом MainMenu, которому соответствует класс TMainMenu. Каждый пункт меню, в свою очередь, является компонентом MenuItem, инкапсулированным в классе TMenuItem. Пользователю не требуется знать, как функционируют эти классы, поскольку редактор меню берет на себя всю работу по созданию меню. Рассмотрим все этапы создания падающего меню.
1. Создайте новое приложение и поместите в него компонент MainMenu. Измените имя этого компонента на MainMenu.
2. В верхней части формы поместите горизонтальный разделитель.
3. Дважды щелкните по значку главного меню. Появится редактор меню.
4. Хотя существует более легкий способ создания меню File, первый раз
5. проделаем это вручную. Редактор меню всегда содержит пустой пункт меню, который обозначает место для вновь создаваемого пункта. При первом запуске редактора меню пустой пункт будет выделен.
6. Измените значение свойства Name на FileMenu.
7. Щелкните на свойстве Caption в окне инспектора объектов, наберите &File и нажмите Enter.
Амперсант (&) используется для ввода подчеркнутого символа в название пункта меню. Подчеркнутый символ служит для ускоренного выбора пункта меню с клавиатуры путем нажатия соответствующей клавиши в сочетании с Alt. Амперсант можно размещать в любом месте текста.
После проведенных операций в редакторе меню появится пункт File (он появился и в главной форме, закрытой редактором меню), под только что созданным пунктом File появился новый пустой пункт, и такой же пустой пункт
возник справа. Инспектор объектов содержит пустой компонент MenuItem, ожидая ввода значений для свойств Caption и Name. Продолжим создание меню.
6. Смените значение свойства Name нового пункта на FileNew.
7. Измените, значение свойства Caption на &New и нажмите Enter. Редактор меню снова создаст пустой пункт.
8. Повторите шаги 1 и 2 для создания пунктов меню Open..., Save и Save As...
9. Теперь нам нужен разделитель меню. Разделитель (separator) это горизонтальная линия в меню, разделяющая группы пунктов. Добавле��ие разделителя с помощью редактора меню C++Builder выглядит очень просто. Нужно только установить для свойства Caption значение «–» (дефис). Перейдите к пустому пункту меню под Save As, введите дефис в поле Caption и нажмите Enter.

10. Добавьте в меню пункты Exit.
11. Для создания меню Edit рассмотрим более легкий путь. Сначала щелкните на пустом пункте справа от пункта File. Затем щелкните правой кнопкой мыши и выберите в открывшемся контекстном меню пункт Insert From Template. На экране появится диалоговое окно Insert Template. В диалоговом окне приведен список доступных шаблонов. Есть возможность использовать предопределенные шаблоны или создавать свои собственные. Сейчас нам нужно загрузить меню Edit, поэтому выберите из списка Edit Menu и нажмите кнопку «ОК». В редактор меню сразу же будет вставлено полное меню Edit. На самом деле оно содержит больше пунктов, чем нужно. Удалением лишнего займемся чуть позже.
12. Давайте заодно вставим в меню Help. Щелкните на пустом пункте справа от Edit. Снова выберите в контекстном меню пункт Insert From Template и вставьте шаблон Help Menu. (He выберите по ошибке Expanded Help Menu.). Обратите внимание, что вновь вставленные пункты уже отображены в главной форме.
13. Меню Edit, вставленное ранее, содержит слишком много пунктов. Некоторые из них никогда не будут использоваться в программе. Для того чтобы удалить пункт меню нужно:

выбрать из меню Edit пункт Repeat<command>;
нажать клавишу Delete или выбрать пункт Delete в контекстном меню редактора, выделенный пункт исчезнет, а оставшиеся пункты сдвинутся вверх;
аналогичным образом удалить пункты Paste Special, Go To, Links, Objects и разделитель после Replace;
�� в меню Help оставьте только Contents и About...
Вставка пунктов меню выполняется очень просто. Щелкнуть мышью на том пункте, над которым нужно поместить новый пункт, и нажать клавишу Insert (или выбрать Insert в контекстном меню редактора). После этого можно установить свойства Caption и Name для нового пункта.
14. Давайте вставим еще один пункт в меню Edit:
вызовите из меню Edit пункт Find;
нажмите клавишу Insert (в меню возникнет новый пункт, а все лежащие под ним пункты сдвинутся вниз);
измените значение свойства Name на EditSelectAll, а свойства Caption — на Select&All;
в пустом пункте в нижней части меню Edit поставьте разделитель (для этого достаточно ввести в поле Caption дефис);
снова щелкните на пустом пункте и установите для свойства Name значение EditWordWrap, а для свойства Caption&WordWrap.
Перемещение пунктов меню можете проделать очень легко. При этом, возможно, перемещать пункты как в пределах одного всплывающего меню, так и между различными меню. Для перемещения пунктов существуют два способа. Первый заключается в использовании буфера обмена. Операции Cut и Paste выполняются как обычно, поэтому не будем описывать их. Другой способ заключается в использовании техники drag-and-drop. При необходимости размещения пункта SelectAll под пунктом Undo проделайте следующее:
• откройте пункт Edit для вызова соответствующего меню;
• щелкните на пункте SelectAll и перетащите его, пока разделитель под Undo не окажется выделен;
• отпустите кнопку мыши, и пункт займет новое место.
Создание подменю не имеет каких-либо особенностей. Подменю(submenu) это меню, которое вызывается при выборе пункта вышестоящего меню. Наличие подменю обозначается стрелкой вправо, расположенной за названием пункта. Вы можете создать подменю, выбрав в контекстном меню редактора пункт CreateSubmenu, или нажав одновременно Ctrl и стрелку вправо на клавиатуре. При создании подменю, справа от соответствующего пункта основного меню размещается пустой пункт. Вы можете добавлять в подменю пункты точно так же, как и при создании главного меню. Создать подменю можно также вставкой шаблона.
Добавить сочетания клавиш, соответствующие пунктам меню, можно изменив значение свойства ShortCut в инспекторе объектов. Для меню Edit, которое было вставлено из шаблона, сочетания клавиш уже определены. Например, пункту Cut соответствует сочетание Ctrl+X. Если вы посмотрите на меню Edit, то увидите, что за названием пункта стоит Ctrl+X. Щелкнув на пункте Cut, вы увидите, что свойство ShortCut в окне инспектора объектов также имеет значение Ctrl+X. Щелкните в столбце Value рядом со свойством ShortCut. Справа вы увидите кнопку со стрелкой. Щелкните на ней для вызова списка возможных значений. Этот список содержит практически все сочетания, которые могут когда-либо понадобиться. Чтобы установить новое сочетание клавиш, просто выберите его из списка.
Стандартным сочетанием клавиш для SelectAll является Ctrl+A, поэтому давайте установим его для этого пункта меню:
выберите в созданном меню пункт Edit | SelectAll;
щелкните на свойстве ShortCut в окне инспектора объектов;
выберите Ctrl+A из списка доступных сочетаний, и теперь за названием пункта SelectAll появится Ctrl+A.
Это все, что вам нужно сделать — остальное берет на себя C++Builder. Для использования сочетаний клавиш не требуется писать какой-либо код.
Давайте сделаем еще несколько действий, направленных на "облагораживание" созданного меню.
Во-первых, по умолчанию включим пункт WordWrap. Этот пункт предназначен для включения и выключения режима заворачивания слов. Когда режим заворачивания включен, пункт WordWrap отмечен. Щелкните на пункте WordWrap и установите для свойства Checked значение true. При этом рядом с названием пункта появится отметка, сообщающая, о его включении.
Во-вторых, необходимо установить значения свойств Name для всех пунктов, вставленных из шаблона. Они имеют имена по умолчанию, которые желательно заменить на более информативные. Выберите пункт Edit | Undo. Измените значение свойства Name с Undo1 на EditUndo. Можно использовать любое соглашение об именах, но будьте при этом последовательны. Повторите процедуру для пунктов Cut, Copy, Paste, Find и Replace. Потом перейдите к меню Help и измените значения свойств Name для пунктов Contents и About на HelpContents и HelpAbout.
На этом создание меню завершено. Просмотрите его еще раз и устраните замеченные ошибки. Убедившись, что меню построено правильно, закройте окно редактора меню.
15. Переименуйте главную форму приложения в TextViewer. Дополните созданное приложение панелью, содержащей кнопки New, OpenFile, SaveFile, Cut,Copy, Paste. Кнопки должны содержать соответствующие графические значки и имена. Обработчики событий для этих кнопок не писать!
16. Написать обработчик события для команды меню Help | About..., выводящий модальное окно AboutBox с информацией о приложении.
Далее приводится текст программы, который содержит все необходимые обработчики событий. //—————————————————————————————
#include <vcl.h> #pragma hdrstop #include "SPMain.h" //—————————————————————————————
#pragma resource "*.dfm" TScratchPad *ScratchPad; //—————————————————————————————
__fastcall TScratchPad :: TScratchPad(TComponent*Owner)
: TForm(Owner) { } //—————————————————————————————
void__fastcall TScratchPad :: FileNewClick(TObject*Sender)
{
//Открытие нового файла. Перед этим
//проверка необходимости сохранения текущего файла
if(MemoModified)
{
//Отображение окна сообщения
int result = ApplicationMessageBox(
"The current file has changed. Save changes?",
"Scratchpad Message", MB_YESNOCANCEL | MB_ICONWARNING);
//Если нажата кнопка Yes, сохранение текущего файла
if(result == IDYES) FileSaveClick(Sender);
//Если нажата кнопка No, текущий файл не сохраняется
if(result == IDCANCEL) return;
}
//Стирание строк в компоненте Memo, если они присутствуют
if(MemoLinesCount > 0) MemoClear();
//Установка для свойства FileName диалога SaveDialog
//значения "пустая строка".
//Это будет означать, что файл еще не был сохранен.
SaveDialogFileName = " ";
}
//—————————————————————————————
void__fastcall TScratchPad :: FileOpenClick(TObject*Sender)
{
//Открытие файла. Проверка необходимости сохранения
//текущего файла (логика работы аналогична FileNewClick())
if(MemoModified)
{int result = ApplicationMessageBox(
"The current file has changed. Save changes?",
"Scratchpad Message", MB_YESNOCANCEL | MB_ICONWARNING);
if(result == IDYES) FileSaveClick();
if(result == IDCANCEL) return;
}
//Вызов диалога File Open. Если нажата кнопка ОК,
//открытие файла с помощью метода LoadFromFile().
//Перед этим очистка свойства FileName
OpenDialogFileName = " ";
if (OpenDialogExecute())
{
if(MemoLinesCount > 0) MemoClear();
MemoLinesLoadFromFile(OpenDialogFileName);
SaveDialogFileName = OpenDialogFileName;
}
} //—————————————————————————————
void __fastcall TScratchPad :: FileSaveClick(TObject*Sender)
{
//Если имя файла уже было введено, нет необходимости
//вызывать диалог FileSave. Достаточно сохранить файл
//с помощью SaveToFile()
if(SaveDiaiogFileName != " ")
{
MemoLinesSaveToFile(SaveDialogFileName);
//Установка Modified в false, т.к. файл уже сохранен
MemoModified = false;
}
//Если имя файла не было указано, выполнение SaveAs()
else FileSaveAsClick(Sender) ;
}
//—————————————————————————————
void__fastcall TScratchPad :: FileSaveAsClick(TObject*Sender)
{
//Вызов диалога FileSave для сохранения файла.
//Установка Modified в false, т.к. файл уже сохранен
SaveDiaiogTitle = "SaveAs";
if(SaveDialogExecute())
{
MemoLinesSaveToFile(SaveDialogFileName);
MemoModified = false;
}
}
//—————————————————————————————
void__fastcall TScratchPad :: FileExitClick(TObject*Sender)
{
//Работа завершена. Закрытие формы.
Close();
}
//—————————————————————————————
void__fastcall TScratchPad :: EditUndoClick (TObject*Sender)
{
//TMemo не содержит метода Undo, поэтому нужно послать
//сообщение Windows WM_UNDO для компонента Memo
SendMessage(MemoHandle, WM_UNDO, 0, 0);
}
//—————————————————————————————
void__fastcall TScratchPad :: EditSelectAllClick(TObject*Sender) {
//Вызов TMemo::SelectAll()
MemoSelectAll();
}
//—————————————————————————————
void_fastcall TScratchPad :: EditCutClick(TObject*Sender)
{
//Вы��ов TMemo::CutToClipboard()
MemoCutToClipboard() ;
}
//—————————————————————————————
void __fastcall TScratchPad :: EditCopyClick(TObject*Sender)
{
//Вызов TMemo::CopyToClipboard()
MemoCopyToClipboard();
}
//—————————————————————————————
void_fastcall TScratchPad :: EditPasteClick(TObject*Sender)
{
//Вызов TMemo::pasteFromClipboard().
MemoPasteFromClipboard();
}
//—————————————————————————————
void_fastcall TScratchPad :: EdltWordWrapClick(TObject*Sender)
{
//Переключение свойства TMemo::Wordwrap. Установка такого же
//значения для свойства Checked пункта меню Word Wrap
MemoWordWrap = !MemoWordWrap;
EditWordWrapChecked = MemoWordWrap;
//Если режим Wordwrap включен, достаточно только вертикальной
//линейки прокрутки; в противном случае требуются обе линейки
if (MemoWordWrap) MemoScrollBars = ssVertical;
else MemoScrollBars = ssBoth;
}
//—————————————————————————————
Контрольные вопросы и задание к лабораторной работе №10
2
1. Что означает многоточие, следующее за названием пункта меню?
2. Какими двумя способами можно переместить пункт меню?
3. Как сопоставить пункту меню определенное сочетание клавиш?
4. Как изначально запретить пункт меню?
5. Свяжите с кнопками New, OpenFile, SaveFile, Cut, Copy, Paste обработчики событий для соответствующих пунктов меню.
6. Добавьте сочетание Ctrl+S для пункта меню File | Save.
 
Назад
Сверху