double arrow

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



unitshpic_;

Interface

Uses

Windows, Messages, SysUtils, Classes,

Graphics, Controls, Forms,

Dialogs, ExtCtrls, StdCtrls, Menu

Type

TForm1 = class(TForm) Image1: ТImage;

Button1: TButton;

procedureFormActivate(Sender: TObject);

procedureButtonlClick(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}

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

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

ProcedureScalelmage;

Var

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

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

scale : real; // общий масштаб

Begin

// иллюстрация уже загружена

// получим ее размеры

pw := Form1.Image1.Picture.Width;

ph := Form1.Image1.Picture.Height;

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

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

elsescaleX := 1;

if ph > ih // высота иллюстрации больше высоты компонента

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

elsescaleY := 1;

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

if scaleX < scaleY

thenscale := scaleX

elsescale := scaleY;

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

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

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




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

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

end;

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

procedureFirstPicture;

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;

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

ProcedureNextPicture();

var

r : integer;

Begin

aFile := aPath + aSearchRec.Name;

Forml.Image1.Picture.LoadFromFile(aFile);

Scalelmage;

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

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

ifr<>0

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

Forml.Buttonl.Enabled := False;

end;

procedureTForml.FormActivate(Sender: TObject);

Begin

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

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

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

iw := Imagel.Width;

in := imagel.Height;

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

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

end;

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

procedureTForm1.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.



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