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

Классы. Наследование

Изучение компонента Image, приемов работы с файлами

Составить программу со следующим интерфейсом.

Программа позволяет просмотреть иллюстрации (цифровые фотографии), которые находятся в каталоге C:\КартинкиАвто\.

Файлы имеют расширение jpg, поэтому в модуле Unit1.pas в строке uses запишем jpeg, разрешая этот формат.

Для выбора jpg-файла предназначен компонент ListBox, в котором отображаются имена jpg-файлов.

Заполняет список компонент ListBox процедура обработчика события OnActivate формы.

Для доступа к директории и чтения имен файлов используются функции:

- DirectoryExists

- FindFirst,

- FindNext. а

Функция проверки существования директории:

function DirectoryExists(Name: string): Boolean;

Если директория указанная в параметре Name существует - то функция возвратит true.

Функция поиска файла в заданной директории:

function FindFirst (const FileMask: string; Attributes: Integer; var SearchResult: TSearchRec) : Integer;

Функция FindFirst ищет файлы, соответствующие FileMask и Attributes, возвращая первое соответствие (если найдено) в SearchResult.

Attributes определяют файлы, для поиска в дополнение к правильным файлам.

Если соответствие найдено, то возвращаемое значение - 0, иначе, оно отрицательное (и запись не заполняется).

FileMask может содержать путь, так же как имя файла.

Имя файла может содержать символы - шаблоны: ?:

Соответствие любого одного символа *: Соответствие 0, 1 или более символов

Attributes могут быть установлены следующим образом:

НЕ нашли? Не то? Что вы ищете?

faAnyFile: Любой файл

faReadOnly: Файлы nолько для чтения

faHidden: Скрытые файлы

faSysFile: Системные файлы

faVolumeID: файлы идентификатора объема

faDirectory: Файлы каталоги

faArchive: Архивные файлы

Вы можете установить один или более из вышеупомянутых атрибутов, связывая их.

Запись SearchResult включает много полей. Некоторые используются последующими запросами к FindNext. Другие доступны вашей программе:

Name: Из длинного названия найденного файла

Size: Размер файла в байтах

Time: Дата/время последнего изменения файла

Attr: атрибуты файла

Замечания

Вы должны вызвать FindClose после успешного FindFirst, когда Вы закончили искать. Это освобождает ресурсы, взятые процессом поиска.

Если FileMask не содержит никакой информации пути, то поиск будет проводится в текущем каталоге.

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

FindNext находит следующий файл после успешного применения FindFirst :

function FindNext ( var SearchResults : TSearchRec ) : Integer;

Функция FindNext ищет следующий соответствующий файл, как определено в критериях поиска, данных предыдущим запросом FindFirst. Найденные подробности файла сохраняются в SearchResults, и возвращаемое получает значение - 0. Иначе возвращаемое значение - отрицптельное.

Вы, должны выполнить успешный FindFirst перед запросом этой подпрограммы.

После запроса FindNext вы должны вызвать FindClose, в последний раз, чтобы освободить ресурсы.

Для отображения рисунка применяется компонент Image, свойство Picture.

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

Выполняет масштабирование процедура ScaleImage:

// изменение размера области вывода иллюстрации пропорционально

// размеру иллюстрации

Procedure ScaleImage;

var

pw, ph : integer; // размер иллюстрации

scaleX, scaleY : real; // масштаб по X и Y

scale : real; // масштаб

begin

// иллюстрация уже загружена получим ее размеры

pw := Form1.Image1.Picture. Width;

ph := Form1.Image1.Picture. Height;

if pw > iw

// ширина иллюстрации больше ширины компонента Image

then scaleX := iw/pw // нужно масштабировать

else

scaleX := 1;

if ph > ih

// высота иллюстр. больше высоты компонента

then scaleY := ih/ph // нужно масштабировать

else scaleY := 1;

// выберем наименьший коэффициент

if scaleX < scaleY

then scale := scaleX

else scale := scaleY;

// изменим размер области вывода иллюстрации

Form1.Image1.Height := Round(Form1.Image1.Picture. Height*scale);

Form1.Image1.Width := Round(Form1.Image1.Picture. Width*scale);

// так как Strech = True и размер области пропорционален

// размеру картинки, то картинка масштабируется без искажений

end;

Объявления на уровне модуля:

var

Form1: TForm1;

di : string; // директория с рисунками

mes : string[255]; // для вывода в свойстве Caption компонента Label

aSearchRec : TSearchRec; //для функции FindFirst

aFile : string; // имя файла

iw, ih: integer; // размеры Image

Свойство Items компонента ListBox заполняем программно при активации формы. В Items отправляются все файлы, имеющие расширение jpg.

procedure TForm1.FormActivate(Sender: TObject);

var

r, i : integer; // рабочие переменные

begin

// запомним первоначальный размер компонента Image

Image1.AutoSize := False;

Image1.Stretch := True; // разрешаем масштабирование

iw := Image1.Width;

ih := image1.Height;

// проверяем наличие директории

di := 'C:\КартинкиАвто\';

i:=0;

if not DirectoryExists(di) then

begin

ShowMessage('Ошибка! Директория не существует');

Close;

end

else

begin

// ищем в заданной директории 1-ый файл с расширением jpg

r := FindFirst(di+'*.jpg',faAnyFile, aSearchRec);

aFile := di + aSearchRec. Name; // полное имя файла

Image1.Picture. LoadFromFile(aFile); // помещаем файл в Image

ScaleImage; // масштабируем

// ищем другие jpg файлы в директории

while r=0 do

begin

ListBox1.Items. Add(aSearchRec. Name); //имя файла добавляем в ListBox

i:=i+1; // увеличиваем счетчик jpg-файлов

r:=FindNext(aSearchRec); // ищем следующий файл

end;

ListBox1.ItemIndex := 0; // выбран 1-й файл в списке ListBox

mes:= 'В директории ' + di+' файлов: ' + IntToStr(i);

Label1.Caption := mes; // в Label1 выводим число jpg-файлов

mes:=ListBox1.Items[0];

Label2.Caption:=mes; // в Label2 выводим имя jpg-файла

end;

end;

При выборе имени файла в ListBox должно выводиться его изображение в Image. Для этого программируем обработчик события OnClick для ListBox:

procedure TForm1.ListBox1Click(Sender: TObject);

begin

mes:=ListBox1.Items[ListBox1.ItemIndex];

Label2.Caption:=mes;

aFile := di + ListBox1.Items[ListBox1.ItemIndex];

Image1.Picture. LoadFromFile(aFile);

ScaleImage;

end;

Класс «Автомобиль»

Составить приложение со следующим интерфейсом.

Для хранения данных об одном автомобиле использовать класс Auto.

Состав класса:

- конструктор;

- поле «Марка»;

- поле «Год выпуска»;

- поле «Цена»;

- метод «Вывод информации об автомобиле».

Создать 5 объектов класса «Автомобиль». Вывести в таблице данные по этим 5 объектам.