fotogallery-delphiВсем привет. В этой статье, я хотел бы рассказать: как я делал, в своем проекте, фотогалерею. Если честно, то сперва, решил немного «погуглить» по этому вопросу и найти что-нибудь интересное. В принципе я ничего не нашел, были варианты создавать TImage и в них грузить фото, но это меня, почему-то не сильно устроило. Дальше я нашел какой-то компонент, который предлагает создать фотогалерею, с разными эффектами и все в этом плане, но я даже не стал качать его.

После этого, я начал выбирать для себя, самый оптимальный вариант, тут пришла мне в голову мысль, использовать именно TStringGrid для фотогалереи, хотя тут, конечно, лучше бы подошел TDrawGrid, но я остановился, именно на компоненте TStringGrid. Тем более, я уже что-то похожее делал с данным компонентом, а еще скажу Вам, я даже про это рассказывал, в данном блоге – Как закрасить нужные ячейки в TStringGrid. Я решил этот вариант модернизировать и применить для своей задачи. Не знаю, правильно ли я все организовал и сделал, но у меня получилась фотогалерея, которая полностью устраивает меня.

На форму я установил компоненты:

  • TStringGrid
  • TListBox
  • TImage

Компонент TStringGrid – естественно для самой фотогалереи. Компонент TListBox – для списка файлов фотогалереи (не обязательно компонент, можно TStringList использовать), а компонент TImage – для отображения фотографии, которую мы будем крепить в нашу фотогалерею (TStringGrid).

У меня получилась, примерно, следующая фотогалерея:

fotogalereya-na-delphi

Да, эта возможность мне нужна была, именно для моего проекта MapWindow GIS в Delphi, а особенно для того, чтобы собрать локальные карты Яндекс в одно целое.

Для начала, я определился с размером каждой фотографии, которая будет отображаться в фотогалереи. Я остановился на стандартном размере – 150 на 150 пикселей. Поэтому, в свойствах DefaultColWidth и DefaultRowHeight, выставил значение 150. Затем, я подключил в uses, модуль pngimage, так как фотогалерея может содержать различные форматы изображений. Сделал фиксированную ширину фотогалереи (5 фотографий, затем переход на новую строку).

Далее, я просканировал папку с изображениями, получил их название (название каждого файла, с расширением) и названия всех файлов помещал в компонент TListBox (я говорил не обязательно в TListBox, можно, например, использовать тип TStringList). После того, как я получил список всех файлов, для фотогалереи (название всех файлов), я заполняю TStringGrid (каждую ячейку), названием этих файлов. В общем, событие OnShow формы, предназначенной для фотогалереи, выглядит следующим образом:

procedure TLocalMapYandex.FormShow(Sender: TObject);
var
 fs:TSearchRec;
 k,l:integer;
begin
  try
   ListBox1.Clear;
   j:=2;
   if FindFirst(ExtractFilePath(ParamStr(0))+'Yandex\'+'*.*', faAnyFile, fs)=0 then
    repeat
     ListBox1.Items.Add(fs.Name);
    until FindNext(fs)<>0;
     FindClose(fs);
   StringGrid1.RowCount:=Round((ListBox1.Count-3)/3);
   k:=0;
   l:=0;
   for i:=2 to ListBox1.Count-1 do
    begin
     StringGrid1.Cells[l,k]:=ListBox1.Items[i];
     inc(l);
     if l=5 then
      begin
       inc(k);
       l:=0;
      end;
    end;
  except
   on e:Exception do
  end;
end;

 

Для получения списка файлов, я использую функции FindFirst, после того, как список у меня сформирован, я создаю цикл, сначала этого списка (начинается с двух) и до конца, заполняю TStringGrid названием файлов. То есть, в каждой ячейке TStringGrid, будет присутствовать название каждого файла фотогалереи.

После того, как все это мы сделали, нам необходимо событие OnDrawCell компонента TStringGrid. В нем мы и будем отображать, каждую фотографию в каждой ячейке компонента. Я сделал так: если значение ячейки в TStringGrid (имя файла), совпадает со значением TListBox (именем файла), то загружаем в TImage данную картинку и перерисовываем в TStringGrid (в ячейку). Весь обработчик, у меня выглядит следующим образом:

procedure TLocalMapYandex.StringGrid1DrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
var
 fs:TSearchRec;
 i:integer;
begin
  try
   for j:=2 to ListBox1.Count-1 do
    begin
     if (StringGrid1.Cells[ACol,ARow]=ListBox1.Items[j]) then
      begin
       Image1.Picture.LoadFromFile('Yandex\'+ListBox1.Items[j]);
       StringGrid1.Canvas.StretchDraw(Rect, Image1.Picture.Graphic);
      end;
    end;
   except
    on e:Exception do
   end;
end;

Не знаю, на сколько это правильно будет, но я особых примеров не нашел, как сделать фотогалерею, а дополнительный компонент, мне был ни к чему. Я просто модернизировал то, когда я закрашивал ячейки в TStringGrid. Остается только лишь узнать количество строк, для нашей фотогалереи. Я написал абы что, поэтому лучше всего сделать хорошую фотогалерею, чтобы выдавалось правильное количество строк, а не как у меня, с запасом. Поэтому можно добавить вот такую проверку, а затем определиться с количеством строк:

if ListBox1.Count-3 mod 5=0 then
    StringGrid1.RowCount:=(ListBox1.Count-3) div 5
   else
    StringGrid1.RowCount:=(ListBox1.Count-3) div 5+1;

Это с учетом того, что в каждой строке будет по 5 ячеек с фотографиями.

Это с учетом того, что в каждой строке будет по 5 ячеек с фотографиями. Также, можно добавить такую функцию, чтобы по нажатию на каждую картинку, она открывалась в новом окне (в полном размере), для этого, можно использовать событие OnSelectCell компонента TStringGrid.

Ну вот и все, как-то так я это все сделал!

Метки: , , ,




К записи “Фотогалерея с помощью TStringGrid” оставлено комментариев: 1.

  1. […] получить, а в следующей, как можно совместить нашу фотогалерею на TStringGrid с данной статьей. Для осуществления такой идеи нам […]

Оставить комментарий

Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*