
- •Лабораторная работа № 1 Тема: Работа с компонентами tLable, tButton, tEdit.
- •Краткая теоретическая часть
- •Задача для самостоятельного решения
- •Лабораторная работа №2 Тема: Работа с компонентами тRadioButtоn, тRadioGroup, tСheckBox.
- •Краткая теоретическая часть
- •Задача для самостоятельного решения
- •Лабораторная работа № 3 Тема: Работа с компонентами tComboBox.
- •Краткая теоретическая часть
- •Задачи для самостоятельного решения
- •Лабораторная работа № 4 Тема: Работа с компонентами tTimer, tРrogressBar, tStatusBar
- •Краткая теоретическая часть
- •Задачи для самостоятельного решения
- •Лабораторная работа № 5 Тема: Работа с компонентами ListBox, OpenDialog, Image.
- •Краткая теоретическая часть
- •Задача для самостоятельного решения
- •Лабораторная работа № 6 Тема: Работа с графикой.
- •Краткая теоретическая часть
Задача для самостоятельного решения
Программа «Просмотр иллюстраций» (рис. 5.2) позволяет просмотреть файлы формата JPEG, например - фотографии. Выбор папки выполняется в стандартном окне «Выбор папки». Иллюстрации можно просматривать по кадрам или в режиме слайд-шоу. Значения свойств компонента Image1: Autosize – false, Stretch – false, Proportional – true. Частоту смены кадров в режиме слайд-шоу определяет значение свойства Interval таймера.
Лабораторная работа № 6 Тема: Работа с графикой.
Цель работы: разработать приложения для работы с различными графическими объектами.
Краткая теоретическая часть
C++Builder инкапсулирует функции Windows GDI на разных уровнях. Наиболее важным здесь является способ, посредством которого графические компоненты представляют свои изображения на экране монитора. При прямом вызове функции GDI необходимо передавать им дескриптор контекста устройства (device context handle), который задает выбранные вами орудия рисования - перья, кисти и шрифты. После завершения работы с графическими изображениями, вы обязаны восстановить контекст устройства в исходное состояние и только потом освободиться от него.
C++Builder предоставляет вам простой и завершенный интерфейс посредством свойства Canvas (Канва) графических компонент. Это свойство проинициализирует правильный контекст устройства и освободит его в нужное время, когда вы прекратите рисование. По аналогии с функциями Windows GDI канва имеет вложенные свойства, представляющие характеристики пера, кисти и шрифта.
Использование канвы
Объектный класс канвы инкапсулирует графические функции Windows на различных уровнях, начиная с функций высокого уровня для рисования отдельных линий” фигур и текста. Далее идут свойства и методы среднего уровня для манипуляций с канвой для рисования. Наконец, на нижнем уровне обеспечивается доступ к самим функциям Windows GDI. В следующей таблице обобщаются характеристики основных методов и свойств канвы.
Действие |
Методы |
Свойства |
Определяет текущую позицию пера |
MoveTo |
PenPos |
Рисует прямую до заданной точки |
LineTo |
PenPos |
Рисует прямоугольник заданного размера |
Rectangle |
|
Рисует эллипс заданного размера |
Ellipse |
|
Выводит текстовую строку |
TextOut |
|
Задает высоту, отведенную для вывода текстовой строки |
TextHeight |
|
Задает ширину, отведенную для вывода текстовой строки |
TextWidth |
|
Вывод текста внутри прямоугольника |
TextRect |
|
Заливка указанного прямоугольника цветом и текстурой текущей кисти |
FillRect. |
|
Заливка области канвы (произвольной формы) заданным цветом |
FloodFill |
|
Используется для установки цвета, стиля, ширины и режима пера |
|
Pen |
Используется для установки цвета и текстуры при заливке графических фигур и фона канвы. |
|
Brush |
Используется для установки шрифта заданного цвета, размера и стиля |
|
Font |
Используется для чтение и записи цвета заданного пикселя канвы |
|
Pixels |
Копирует прямоугольную область канвы в режиме CopyMode |
CopyRect |
CopyMode |
Копирует прямоугольную область канвы с заменой цвета |
BrushCopy |
|
Рисует битовый образ, пиктограмму, метафайл в заданном месте канвы |
Draw |
|
Рисует битовый образ, пиктограмму или метафайл так, чтобы целиком заполнить заданный прямоугольник |
StretchDraw |
|
В среде C++Builder существует три рода объектов, которые имеют отношение к графике:
• Канва предоставляет битовую карту поверхности для рисования на форме, графической компоненте, принтере или на другом битовом образе. Канва не является самостоятельным объектом, она всегда является свойством какого-то другого графического объекта.
• Графика представляет растровое изображение некоторого файла или ресурса (битового образа, пиктограммы или метафайла). C++Builder определяет производные от базового класса TGraphic объектные классы TBitmap, Ticon и TMetafile. Конечно, вы можете объявить свои собственные классы графических объектов. TGraphic предоставляет минимальный стандартный интерфейс для использования в вашем приложении всех видов графики.
• Рисунок представляет собой контейнер для графики, т.е. он может содержать любые классы графических объектов. Таким образом, контейнерный класс TPicture может содержать битовый образ, пиктограмму, метафайл или некоторый другой графический тип, определенный пользователем, а приложение может стандартизовано обращаться ко всем объектам контейнера посредством объекта "рисунок". Действительно, большинство компонент управления изображениями имеют свойство Picture объектного типа TPicture, которое дает возможность представления изображений различных видов графики.
Отметим, что объект "рисунок" всегда содержит некоторую графику, которой в свою очередь может потребоваться иметь канву (единственный стандартный графический класс с канвой - это TBitmap). Обычно, имея дело с рисунком, вы работаете только с той частью графического объекта, которая открыта для доступа через контейнер TPicture. Если вам надо указать доступ к конкретному графическому объекту, задайте его в свойстве Graphic данного рисунка.
Программа «Олимпийский флаг» демонстрирует вывод графики на поверхность формы.
Листинг программы
// конструктор формы
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Canvas->Font->Name = "Tahoma";
Canvas->Font->Size = 12;
}
void __fastcall TForm1::FormPaint(TObject *Sender)
{ #define WB 140
#define HB 80
#define D 36 // диаметр колец
int x,y;
AnsiString st = "Быстрее, выше, сильнее!";
// вычислить координаты левого верхнего угла флага
x = (ClientWidth - WB) / 2;
y = (ClientHeight - HB ) / 2 - Canvas->Font->Size;
// полотнище
Canvas->Brush->Color = (TColor) RGB(255,255,255);
Canvas->FillRect( Rect(x,y,x+WB,y+HB) );
int x1 = (ClientWidth - Canvas->TextWidth(st)) / 2;
Canvas->Brush->Style = bsClear;
Canvas->TextOutA(x1,y+HB+6,st);
/* Чтобы область вывода текста не была закрашена цветом фона, а также чтобы метод Ellipse рисовал окружность, а не круг, значение свойства Brush->Style должно быть равно bsClear */
Canvas->Brush->Style = bsClear;
Canvas->Pen->Width = 2; // ширина колец - два пикселя
// первый ряд колец
x = x + (WB - 3.2 * D) / 2; // 3.2 * D - ширина области, занимаемой кольцами первого ряда
y = y + (HB - 1.6 * D) /2;
Canvas->Pen->Color = (TColor) RGB(0,0,225); // синий
Canvas->Ellipse(x,y,x+D,y+D);
x = x + 1.1* D;
Canvas->Pen->Color = clBlack; // черный
Canvas->Ellipse(x,y,x+D,y+D);
x = x + 1.1 * D;
Canvas->Pen->Color = (TColor) RGB(255,0,0); // красный
Canvas->Ellipse(x,y,x+D,y+D);
// второй ряд колец
x = x - D * 0.55;
y = y + 0.6 * D;
Canvas->Pen->Color = (TColor) RGB(0,128,0); // зеленый
Canvas->Ellipse(x,y,x+D,y+D);
x = x - 1.1 * D;
Canvas->Pen->Color = (TColor) RGB(250,217,25); // желтый
Canvas->Ellipse(x,y,x+D,y+D);}
// пользователь изменил размер окна
void __fastcall TForm1::FormResize(TObject *Sender)
{
Form1->Refresh(); }
Задача для самостоятельного решения
Надо вывести ниже представленные рисунки (графику) на поверхность формы.
Лабораторная работа № 7
Тема: Визуальная разработка приложений баз данных
Цель работы: создать базу данных и наполнить ее информацией с помощью утилиты Database Desktop.
Краткая теоретическая часть
Все приложения СУБД, создаваемые в среде C++Builder, основаны на компонентах пользовательского интерфейса с некоторой базой данных, которые предоставляют удивительно легкие в использовании средства разработки специальных приложений.
Использование визуальных компонент
Одним из важнейших достоинств интегрированной среды C++Builder является наличие удобных средств быстрой визуальной разработки приложений СУБД- специализированных компонент баз данных. C++Builder предоставляет разработчикам интерфейсные элементы баз данных из Библиотеки Визуальных Компонент на следующих двух вкладках Палитры компонент:
• Компоненты управления данными Data Control (такие как область редактирования TDBEdit или сетка TDBGrid) обеспечивают отображение и редактирования записей на форме приложения.
• Компоненты доступа к данным Data Access (такие как таблица TTable или запрос TQuery) адресуют фактические данные, хранящиеся в файле базы данных, а компонента источника TDataSource служит как интерфейс межкомпонентной связи.
Компонента TDataSource, допускает менять фактическую таблицу на стадии проектирования формы без какого бы то ни было перепрограммирования самого приложения - все отображаемые элементы связаны с источником, а не с питающими его таблицей или запросом.
Компоненты доступа к данным
Компонента TDataSource действует как интерфейс между некоторым объектом набора данных (таблица, запрос) и визуальной компонентой управления. С одной стороны, все наборы данных должны быть ассоциированы с некоторым источником. С другой стороны, каждая компонента управления должна быть ассоциирована с источником, чтобы получать данные для отображения и редактирования. Каждой компоненте набора данных должна соответствовать по меньшей мере одна компонента источника. Свойства компоненты источника в окне Инспектора объектов:
- AutoEdit разрешает или запрещает режим редактирования записей, вводимых в поля компонент управления. Значение true включает режим редактирования по умолчанию.
- DataSet определяет имя конкретного набора данных (таблицы или запроса), который питает данный источник. Можно переключаться с одного набора данных на другой "на лету", во время выполнения программы.
Компонента таблицы представляет собой один из самых фундаментальных и гибких компонентных классов. TTable устанавливает прямую связь с таблицей базы данных посредством BDE, причем все записи или столбцы этой таблицы становятся доступными для приложения - как раздельно, так и внутри определенного интервала адресов. Свойства компоненты таблицы в окне Инспектора объектов:
- Active разрешает или запрещает режим просмотра "живых данных" таблицы на этапе проектирования. Значение true или метод Open открывают просмотр таблицы. Значение false (устанавливается по умолчанию) или метод Close закрывают просмотр.
- DatabaseName содержит псевдоним базы данных или полный путь к ее каталогу. Использование псевдонима всегда предпочтительнее: вы можете переназначить физический носитель данных, например, заменив локальный дисковод на сетевой. Перекомпиляция приложения не требуется - просто измените путь на вкладке Aliases в утилите конфигурации BDE.
Программа «Магазин» (рис. 7.1) работает с одноименной базой данных и демонстрирует использование компонентов BDE. Состоит из одной таблицы stock.db и содержит информацию о товарах (таблица 7.1).
Для доступа к базе данных используется псевдоним stock. Создать псевдоним можно при помощи утилиты BDE Administrator. Форма программы приведена рис. 7.2, значения свойств компонентов – таблицы 7.2, 7.3, 7.4, 7.5.
Рисунок 7.1 – Программа «Магазин»
Рисунок 7.2 – Форма программы работы с базой данных «Магазин»
Таблица 7.1 – Поля таблицы stock.db.
-
Поле
Тип
Размер
Комментарий
Title
A (Alpha)
50
Название товара
Price
$ (Money)
-
Цена
Memo
A (Alpha)
100
Описание товара
Image
A (Alpha)
30
Файл иллюстрации (в формате bmp)
Таблица 7.2 – Значение свойств компонента Table1
-
Свойство
Значение
Комментарий
DatabaseName
stock
Псевдоним базы данных
TableName
stock.db
Файл, в котором находится таблица
Таблица 7.3 – Значение свойств компонента DataSource1
-
Свойство
Значение
DataSet
Table1
Таблица 7.4 – Значение свойств компонента DBGrid1
-
Свойство
Значение
DataSource
DataSource1
Columns[0].FildName
Title
Columns[0].Title.Caption
Название
Columns[1].FildName
Price
Columns[1].Title.Caption
Цена
Columns[2].FildName
Memo
Columns[2].Title.Caption
Описание
Columns[3].FildName
Image
Columns[3].Title.Caption
Image
Таблица 7.5 – Значение свойств компонентов DBEdit1 и DBMemo
-
Свойство
Значение
DBEdit1. DataSource
DataSource1
DBEdit1.DataField
Title
DBEdit2. DataSource
DataSource1
DBEdit2. DataField
Price
DBMemo1. DataSource
DataSource1
DBMemo1. DataField
Memo
Листинг программа
#include <vcl.h>
#pragma hdrstop
#include "Stock_.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
// начало работы программы
void __fastcall TForm1::FormShow(TObject *Sender)
{
try
{
Table1->Open(); // открыть базу данных
}
catch ( EDBEngineError &e)
{
ShowMessage("Для доступа к базе данных надо создать псевдоним stock");
}}
// изменилось состояние набора данных
void __fastcall TForm1::DataSource1StateChange(TObject *Sender)
{
if ( DataSource1->State == dsBrowse)
StatusBar1->Panels->Items[1]->Text = "Просмортр";
else
StatusBar1->Panels->Items[1]->Text = "Редактирование";
}
// событие AfterScroll возникает после перехода к другой
// записи (смены текущей записи)
void __fastcall TForm1::Table1AfterScroll(TDataSet *DataSet)
{
AnsiString Picture;
if ( Table1->RecNo != -1)
{
StatusBar1->Panels->Items[0]->Text = "Запись: " + IntToStr( Table1->RecNo );
// Доступ к значению поля текущей записи можно получить
// через свойство FieldValue.
// Если поле Image пустое, то при попытке чтения из него
// данных возникает ошибка.
try {
Picture =
Table1->Database->Directory + DataSet->FieldValues["Image"];
}
catch (EVariantTypeCastError &e) {
Image1->Visible = false;
return;
}
ShowPhoto(Picture);
}
else
{
StatusBar1->Panels->Items[0]->Text = "";
StatusBar1->Panels->Items[1]->Text = "Новая запись";
Image1->Visible = false;
}}
// отображает картинку в поле компонента Image1
void __fastcall TForm1::ShowPhoto(AnsiString Picture)
{
try
{
Image1->Picture->LoadFromFile(Picture);
}
catch ( EFOpenError &e)
{
// ни чего не делаем, просто не отображаем картинку
Image1->Visible = false;
return;
}}
// завершение работы программы
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
if (Table1->State == dsEdit )
// таблица в режиме редактирования
Table1->Post(); // сохранить внесенные изменения
}