Главная » Delphi » Доделываем SlideShow

0

Настало время нам довести до ума наш самый первый проект— SlideShow. Точнее, доделать функциональную часть— потому что в дальнейшем мы еще обязаны "прикрутить" к нему как минимум справку. Так как, несмотря на довольно навороченный код (а то ли еще будет!), у нас эта программа все равно останется в одном-единственном файле (кроме справки, которую все равно лучше располагать всегда отдельно) и не требует ровным счетом никаких системных установок1, то возиться с инсталлятором здесь просто ни к чему. И доведя в этой главе до некоторого логического конца функциональность SlideShow, а в следующей — расправившись со справкой, мы на этом с ней закончим. Я решил посвятить доработке SlideShow специальную главу, т. к., чтобы программой было удобно пользоваться, доделывать придется довольно много, и при этом все равно мы ее по большому счету не доделаем. Хотя некоторые приемы вы здесь встретите впервые, большинство операций вам уже знакомы по предыдущим главам — если бы мы вводили их здесь по ходу доработки, то эта глава растянулась бы на полкниги и освоить ее было бы значительно труднее.

Итак, приступим: перенесем наш последний вариант из главы 12 (папка Glaval2/1) в новую папку (GIaval5 — я специально не делаю подпапок, т. к. вариант будет всего один) и дадим ему номер версии 2.00 — переделки будут достаточно капитальные.

Составим список этих переделок, дополнив тот, что мы приводили в главе 2:

?       поиск файлов не только с расширением jpg, но и j peg, а также, по возможности, и других форматов;

?      сортировка имен файлов по алфавиту;

?      отображение имени файла и размера изображения;

?      возможность просмотра картинок в виде набора "превыошек" (preview);

?      обеспечение операций Drag&Drop и загрузки файлов из командной строки;

?      возможность распахнуть окно во весь экран без рамки;

?      возможность запустить музыкальное сопровождение.

Что касается "других форматов", то штатно Delphi позволит нам иметь дело еще только с BMP. Для чтения TIFF, GIF и PNG (а но большому счету этим вполне можно ограничиться) придется устанавливать специальные библиотеки (см., например, [26]) или пользоваться возможностями технологий ActiveX./COM/OLE и т. п. Мы здесь этим заниматься не будем.

Дтя того чтобы решить первые четыре задачи, мы пойдем таким путем: будем сразу составлять список всех файлов с картинками, которые содержатся в текущей папке. Это облегчит нам процедуры их перелистывания и отображения в виде "превыошек". Кроме тего, мы сможем отображать их общее количество и номер текущей картинки. Заодно в паком списке легко обеспечить сортировку по алфавиту. Список мы будем составлять неоптимальным ни первый взгляд способом — сначала оценим общее количество файлов JPG. JPEG и BMP в папке (чтобы можно было установить ползунок), а потом уточним его, пытаясь загрузить каждый файл в соответствующий объект (TBitmap или Tjpegjmage). Данная процедура относительно длительная — ведь каждый файл нужно прочесть с диска, хотя это и происходит много быстрее, чем в нашем побайтном чтении текстовых файлов в главе 13 и 14. Но она оправдывается — так мы точно определим, является ли файл корректной картинкой и будем уверены, что список наш правильный.

Учитывая то, что в дальнейшем нам придется опять читать файлы при их отображении (а. возможно, и не один раз — если еще и показывать их в виде "превыошек"), возникают вопросы: нельзя ли либо определять "валидность" файла иным, более быстрым способом, либо, раз уж мы один раз прочитал», загрузить заодно при этом картинку в какой-либо контейнер в памяти и потом только отображать ее? Ответ на первый вопрос в принципе положительный — можно читать форматы напрямую, согласно их спецификации, и это будет, возможно, несколько быстрее, чем делать то же самое через посредников в виде объектов. Но г ипотетическое увеличение скорости здесь не оправдывает многократно возрастающую сложность программного кода— чем сложнее, тем больше можно наделать ошибок. Что же касается второго предложения — например, было бы заманчиво загружать картинки в какой- нибудь DrawGrid, и тем самым сразу формировать "превыошки", не так ли? Но предварительное чтение и создание некоей базы картинок может привести к ускорению разве только при десятке-другом файлов (а такое количество будет читаться достаточно быстро и без предварительной загрузки, в любом случае), потом оперативная память переполнится, и в результате вместо ускорения мы получим только "тормоза" для всей системы в целом.

Обосновав таким образом наш подход, приступим к практической его реализации. Отметим, что составлять список нам нужно в четырех случаях: при загрузке конкретного файла (пункт Файл | Открыть), при смене папки (Файл | Перейти к папке), а также при операциях Drag&Drop и загрузке из командной строки (что то же самое, при "бросании" файла с картинкой на иконку программы в Проводнике, как мы знаем из главы 13). Во втором случае у нас конкретного файла нет, и мы будем загружать первый по списку, а в остальных будем загружать конкретный файл, а потом определять его номер.

Источник: Ревнч Ю. В.  Нестандартные приемы программирования на Delphi. — СПб.: БХВ-Петербург, 2005. — 560 е.: ил.

По теме:

  • Комментарии