Отображение изображений внутри ячеек AdvStringGrid

21.07.2011
В этой заметке рассмотрим отображение в AdvStringGrid изображений, а поможет нам в этом метод CreateFilePicture, а для большего охвата воспользуемся и другими компонента из набора TMS Component Pack.


Наборчик


Для создания формы как на скриншоте выше нам понадобятся следующие компоненты TMS:
1) DriveComboBoxEx
2) DirectoryListBoxEx
3) FileListBoxEx
4) AdvOfficeCheckBox
5) AdvGlowButton
6) AdvProgressBar
Все они находятся на палитре компонентов во вкладке TMS. И конечно же не забываем и про AdvStringGrid, его можно найти на вкладке TMS Grids соответственно. Как их расположить на форме, это уже дело вкуса каждого. А как изменить текст на кнопке и CheckBox'е, а также поставить начальное значение AdvProgressBar равным 0 думаю вы знаете.

Связи


Связи необходимы нам для того, что бы выбрав, к примеру, в DriveComboBoxEx жёсткий диск D: в DirectoryListBoxEx вывелся список папок находящихся именно на диске D:. Тоже самое касается связи DirectoryListBoxEx и FileListBoxEx.
И начнём с первой пары:
DriveComboBoxEx1.DirList := DirectoryListBoxEx1;

Здесь мы указали что после выбора диска из списка DriveComboBoxEx1, список директорий выбранного диска будет отображаться в DirectoryListBoxEx1.
Аналогично и с DirectoryListBoxEx:
DirectoryListBoxEx1.FileList := FileListBoxEx1;

После выбора папки из списка DirectoryListBoxEx1, список файлов выбранной папки будет отображаться в FileListBoxEx1.
Но нам ведь надо что бы отображались лишь картинки, давайте будем фильтровать файлы по расширению .jpg
FileListBoxEx1.Mask := '*.JPG';


Отображение изображений


Теперь разберёмся с самым вкусным, а именно с отображением изображений внутри ячеек AdvStringGrid. Сначала объявим новую процедуру LoadImages.
procedure LoadImages;

А вызов её будет происходит по событию OnChange у FileListBoxEx1, т.е.:
procedure TForm1.FileListBoxEx1Change(Sender: TObject);

begin
LoadImages;
end;

А вот и текст самой процедуры:
procedure TForm1.LoadImages;

var
i, CurrentRow, CurrentCol, Step: integer;
DirPath: string;
begin
DirPath := DirectoryListBoxEx1.Directory;
//Добовляем слэш к пути
if (DirPath[length(DirPath)] <> '') then
DirPath := DirPath + '';
//Если нет картинок, то выходим из процедуры
if (FileListBoxEx1.items.Count <= 0) then
Exit;
AdvStringGrid1.Clear;
//Координаты текущей ячейки
CurrentRow := 0;
CurrentCol := 0;
//Шаг изменения ProgressBar
Step := 100 div FileListBoxEx1.Items.Count;
AdvProgressBar1.Position := 0;

AdvStringGrid1.BeginUpdate;

with FileListBoxEx1, AdvStringGrid1 do
begin
//Перебираем все картинки
for i := 1 to Items.Count do
begin
//Добавляем или нет текст
if AdvOfficeCheckBox1.Checked then
begin
AdvStringGrid1.Cells[CurrentCol, CurrentRow] := items[i - 1];
AdvStringGrid1.CreateFilePicture(CurrentCol, CurrentRow, true, ShrinkWithAspectRatio, 20, haCenter, vaAboveText).FileName:=(DirPath + items[i - 1]);
end
else
AdvStringGrid1.CreateFilePicture(CurrentCol, CurrentRow, true, ShrinkWithAspectRatio, 20, haCenter, vaCenter).FileName:=(DirPath + items[i - 1]);
inc(CurrentCol);
//Определяем координаты следующей ячейки
if (CurrentCol = ColCount) then
begin
CurrentCol := 0;
inc(CurrentRow);
end;
if (CurrentRow = RowCount) then
begin
RowCount := RowCount + 1;
RowHeights[RowCount - 1] := RowHeights[RowCount - 2];
end;
//Увеличиваем позицию ProgressBar
AdvProgressBar1.Position := AdvProgressBar1.Position + Step;
end;
end;
AdvProgressBar1.Position := 100;
AdvStringGrid1.EndUpdate;
end;

Вот и всё, теперь давайте посмотрим на синтаксис метода CreateFilePicture:
AdvStringGrid.CreateFilePicture(ACol: integer; ARow: Integer; Transparent: Boolean; StretchMode: TStreachMode; padding: Integer; hal: TCellHAlign; val: TCellVAlign);

И подробное описание:
ACol: Номер столбца;
ARow: Номер строки;
Transparent: Включена или выключена прозрачность (true|false);
StretchMode: Расположение картинки в ячейки (Растянуть/Замостить и т.д.);
padding: Минимальный тступ от краёв ячейки в пикселях;
hal: Выравнивание по горизонтали;
val: Выравнивание по вертикали.
StretchMode может принимать следующие значения:
TStretchMode = (noStretch,Stretch,StretchWithAspectRatio,Shrink,ShrinkWithAspectRatio);  

А выравнивание по горизонтали и вертикали принимает следующие значения:
TCellHAlign = (haLeft,haRight,haCenter,haBeforeText,haAfterText,haFull);

TCellVAlign = (vaTop,vaBottom,vaCenter,vaUnderText,vaAboveText,vaFull);

Что означают эти значения вам помогут узнать знания английского или переводчик. Ведь значения говорят сами за себя ;)
Успехов!