Орядок действий и команд при выполнении работы.
Шаг 1. Перейдите на форму приложения и в свойстве Caption напишите название работы “Лаб. работа № 3 события мышки”, чтобы этот текст появился в заголовке формы. Выполните команду File/Save Project As… . На диске D:\ создайте папку Lab_3 и в этой папке сформируйте внутреннюю папку Lab_3_1 для файлов проекта P_work_3 и файла U_work_3.cpp.
Шаг 2. Выберите в библиотеке компонент страницу Additional и разместите на форму компоненты Image1, Image2иImage3 затем маркерной рамкой определите размеры под рисунки, как это задано на рис. 3.
Шаг 3.Установите поочередно курсор на поля Image1 и Image2и в свойствеCursorвыберите из списка вид курсора crHandPoint (рука).
Шаг 4.Установите курсор на сетку формы и в списке событий откройте шаблон для OnCreate, чтобы можно было заполнить исходные рисунки и задать необходимые объявления при открытии формы приложения.
Шаг 5.Установите курсор на компоненту Image1и откройте шаблон для события OnMouseDown и заполните соответствующие команды.
Шаг 6.Установите курсор на компоненту Image2и откройте шаблон для события OnMouseDown(переключение трех кнопок на форме) и заполните соответствующие команды.
Шаг 7.На форму приложения поместите кнопку SpeedButton1и для нее задайте событиеOnClick, где определите вид курсораcrHandPoint (рука).
Шаг 8.При помощи встроенного редактора Image Editor создайте нестандартный временный курсор и его зафиксируйте в файл ресурсов проекта приложения. Для этого выполните:
8.1. Выберите в меню команды Tools/ ImageEditor.
8.2. Выберите в меню команды File/ Open и найдите для приложения файл ресурсов проекта .res. В результате откроется окно со структурой и в меню добавится Resource.
8.3. Выполните команды Resource/ New/ Cursor , чтобы добавилась новая группа Cursor и новое имя Cursor1.
8.4. На имени Cursor1 сделайте щелчок правой клавишей мышки и выберите команду Rename и задайте новое имя нестандартного курсора.
8.5. На новом имени курсора сделайте двойной щелчок и создайте свою иконку(рисунок) нестандартного курсора.
8.6. Через команды File / Save сохраните новый курсор в файл ресурсов проекта, создаваемого приложения.
ис. 3
Шаг 9.ВфайлU_work_10.cpp сохраните текст исходной программы в следующем виде:
/* Исходный текст файла U_work_3.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;
}
//---------------------------------------------------------------------------
абораторная работа № 4
Компоненты для отображения иерархических данных
Цель лабораторной работы состоит в изучении методики работы с компонентами отображения произвольных иерархических данных.
Общие сведения о компонентах
В библиотеке VCL для отображения иерархических структур имеются такие компоненты
Таблица № 4-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. Первій метод запрещает перерисовку дерева, а второй – разрешает.