Лабораторная работа № 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 объектам.


