Листинг 10.6. Слайд-проектор

unit shpic_;

Interface

Uses

Windows, Messages, SysUtils, Classes,

Graphics, Controls, Forms,

Dialogs, ExtCtrls, StdCtrls, Menu

Type

TForm1 = class (TForm) Image1: ТImage;

Button1: TButton;

procedure FormActivate(Sender: TObject);

procedure ButtonlClick(Sender: TObject);

Private

{ Private declarations }

Public

{ Public declarations }

end;

Var

Form1: TForm1;

aSearchRec: TSearchRec;

aPath: String; // каталог, в котором находятся иллюстрации

aFile: String; // файл иллюстрации

iw,ih: integer; // первоначальный размер компонента Image

Implementation

$R *.DFM}

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

// пропорционально размеру иллюстрации

Procedure Scalelmage;

Var

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

scaleX, scaleY: real; // масштаб по Х и 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;

// вывести первую иллюстрацию

procedure FirstPicture;

var

r: integer; // результат поиска файла

Begin

aPath:= 'f:\temp\';

r:= FindFirst(aPath+'*.bmp',faAnyFile,aSearchRec);

if г = 0 then

begin // в указанном каталоге есть bmp-файл

aFile:= aPath + aSearchRec.Name;

Form1.Image1.Picture.LoadFromFile(aFile); // загрузить

// иллюстрацию

Scalelmage; //-установить размер компонента

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

if r = 0 then // еще есть файлы иллюстраций

Forml.Button1.Enabled:= True;

end;

end;

// вывести следующую иллюстрацию

Procedure NextPicture();

var

r: integer;

Begin

aFile:= aPath + aSearchRec.Name;

Forml.Image1.Picture.LoadFromFile(aFile);

Scalelmage;

// подготовим вывод следующей иллюстрации

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

if r<>0

then // больше нет иллюстраций

Forml.Buttonl.Enabled:= False;

end;

procedure TForml.FormActivate(Sender: TObject);

Begin

Image1.AutoSize:= False; // запрет автоизменения размера компонента

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

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

iw:= Imagel.Width;

in:= imagel.Height;

Button1.Enabled:= False; // сделаем недоступной кнопку Дальше

FirstPicture; // вывести первую иллюстрацию

end;

//щелчок на кнопке Дальше

procedure TForm1.Button1Click(Sender: TObject);

Begin

NextPicture;

end;

End.

Программа выполняет масштабирование выводимых иллюстраций без искажения, чего нельзя добиться простым присвоением значения True свойству strech. Загрузку и вывод первой и остальных иллюстраций выполняют соответственно процедуры FirstPicture и NextPicture. Процедура FrirstPicture использует функцию FindFirst для того, чтобы получить имя первого BMP-файла. В качестве параметров функции FindFirst передаются:

  • имя каталога, в котором должны находиться иллюстрации;
  • структура asearchRec, поле Name которой, в случае успеха, будет содержать имя файла, удовлетворяющего критерию поиска;
  • маска файла иллюстрации.

Если в указанном при вызове функции FindFirst каталоге есть хотя бы один BMP-файл, значение функции будет равно нулю. В этом случае метод LoadFromFiie загружает файл иллюстрации, после чего вызывается функция scaieimage, которая устанавливает размер компонента пропорционально размеру иллюстрации. Размер загруженной иллюстрации можно получить, обратившись к свойствамForm1.Image1.Picture.Width и Form1.Шmage1.Picture.Height, значения которых не зависят от размера компонента Image.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: