Главная » Delphi » Начинаем работу Создаем типичное приложение

0

В качестве базового приложения мы создадим просмотрщик слайдов. Это, с одной стороны, функционально достаточно богатая вещь, и содержит в себе примеры многих типичных задач, возникающих при создании пользовательских программ. С другой стороны— само по себе приложение несложное, что позволит нам не отвлекаться на частности. В иллюстративных целях я опишу процесс создания достаточно подробно. Хотя в этой главе вы ничего, выходящего за рамки обычной работы в среде Delphi, не встретите, но подробности позволят даже самому неискушенному читателю избежать потерь времени на разрешение многих частных проблем, возникающих при создании приложений. А тем, кто процесс создания приложения уже знает достаточно хорошо, я все же рекомендую не просто скопировать проект с прилагаемого диска, а просмотреть эту главу хотя бы по диагонали — возможно, вы встретите здесь некоторые вещи, о которых ранее не знали.

Два слова по предварительной подстройке IDE (пункт меню Tools). Перед тем, как приступить к работе, я рекомендую сделать следующие установки:

? в пункте Tools | Environment Options на закладке Preferences установить флажки в обоих пунктах группы Autosavc options и в пункте Show compiler progress. Первое даст вам возможность автоматически сохранить последний вариант проекта в случае, если Delphi при пробном запуске приложения "повиснет" (а в некоторых случаях, особенно при прямом обращении к API, это совсем не исключено), второе сделает процесс компиляции более наглядным;

?       в пункте Tools | Editor properties на закладке General установить флажок в пункте Undo after save. Особенно актуально иметь такую возможность отмены изменений в тексте программы после неудачной компиляции.

Есть еще один пункт, на который стоит обратить внимание. Он находится на вкладке Tools | Debbuger Options | Language Exceptions и называется Stop on Delphi Exceptions. Если оставить его отмеченным (режим по умолчанию), то Delphi после запуска приложения будет "тормозить" на всех процедурах обработки исключений, что не слишком удобно на практике. Однако в некоторых случаях это может оказаться необходимым — не только, когда процедура обработки исключения работает не так, как запланировано, но и в случае необходимости отследить ошибки времени выполнения, которые иначе поймать не удается. Целесообразнее всего этот флажок снять, но на всякий случай помнить о такой возможности.

Теперь можно приступать к созданию проекта. Сначала надо кратко набросать его план — что именно мы хотим получить? В крупных проектах эта стадия — написание технического задания — может занять достаточно длительное время, а мы можем просто записать план на бумажке. Итак, наш простейший просмотрщик слайдов будет:

?      открывать JPEG-файлы, находящиеся в нужной папке;

?       демонстрировать картинки из этой папки по очереди от первой до последней по команде пользователя;

?       демонстрировать их в режиме автоматического слайд-шоу, с неким интервалом времени, в закольцованном режиме.

Конечно, для того чтобы создать нормальную программу такого направления, следовало бы еще ввести:

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

?      pei-улировку времени между демонстрацией отдельных слайдов;

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

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

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

Все это не так уж и сложно, но в результате получится довольно громоздкая конструкция, а наша задача сейчас в том, чтобы создать законченное и компактное приложение-основу, которое мы потом будем постепенно дорабатывать. Все перечисленные функции, и даже несколько сверх того, мы введем в дальнейшем по ходу изложения (законченный проект SlideShow см. в главах 15 и 16).

Начало

Запустим Delphi и создадим заготовку нового проекта (File | New | Application). Самое первое, что нужно сделать, — сохранить еще не рожденный проект, для чего выбираем пункт File | Save project as. У вас появится обычное окно сохранения файла с заголовком Save Unit As. Не забывайте, что введенное здесь имя — еще не имя проекта (программы), это только имя главного модуля с текстом, поэтому можно вести любое имя файла, и даже оставить предлагаемое по умолчанию— Unit 1.pas, хотя это и неудобно (представляете, сколько у вас этих одинаковых "юнитов-1" потом наберется?). Введем имя, например, slide.pas. Перед тем, как нажимать кнопку Сохранить, в текущей папке Projects следует создать специальную папку для проекта, иначе потом файлы этого и других проектов перепутаются. Выбор папки и наименований — очень ответственный момент, потому что в Delphi переименовать что-то в проекте с перемещением его в другую папку— процедура не совсем тривиальная. Если вы в дальнейшем будете создавать еще модули, то обращайте внимание на то, в какой папке они будут сохраняться— не исключено, что они по умолчанию окажутся, например, в папке Мои документы, и вы потом потратите кучу времени на то, чтобы корректно собрать проект воедино.

Итак, создаем папку с именем Glava2, открываем ее и, наконец, сохраняем модуль. У вас тут же появляется аналогичное окно, но с заголовком Save Project As — тут уже надо вводить то имя. которым потом будет называться исполняемый файл программы. Пусть это так и будет SiideShow (пока этим именем будет называться файл проекта — SlideShow.dpr).

Компоненты

Заготовка будущего проекта, которую мы видим, представляет собой пока просто пустую форму Formi — будущее окно программы. Процесс программирования будет заключаться в том, что мы наполним форму компонентами, расставим их по местам, придадим им в Object Inspector необходимые свойства, затем напишем обработчики нужных событий. В процессе работы нам придется неоднократно запускать на выполнение еще недоделанный проект, так удобнее искать ошибки — отлаживать программу. При запуске на выполнение проект будет каждый раз компилироваться — в выбранной нами папке появится исполняемый файл программы SlideShow.exe, который, собственно, и будет запускаться по команде Run из меню Delphi (для этого нужно выбрать пункт меню Run | Run <F9>). Напомним, что если в программе есть критические ошибки периода компиляции, то компиляция не пройдет до конца, а на ошибки вам укажут. Если вы просто хотите проверить программу на отсутствие ошибок, не запуская ее, то нужно нажать клавиши <Ctrl>+<F9> — тогда программа скомпилируется, не запускаясь (почему-то в 7-й версии Delphi этот пункт перенесен из меню Run в меню Project). При этом нужно учитывать два обстоятельства: во-первых, то. что при наличии ошибок ЕХЕ-файл не создается, а старый окажется стерт — т. е.. если вы хотите сохранить промежуточный вариант скомпилированного файла, это следует делать до внесения изменений.

Первый компонент, который нам понадобится.— матпмегш. главное меню программы. Он расположен в палитре компонентов на закладке Standard, второй слева. Щелкаем по иконке, потом щелкаем на форме — иконка переносится на форму. Подобные компоненты можно располагать в любом месте формы (меню после компиляции все равно окажется там, где надо), но удобнее его поместить ближе к верхнему обрезу формы, иначе иконка будет "путаться под иогами" при установке других компонентов.

Затем нам понадобится диалог открытия файла. Он расположен на закладке Dialogs. Для того чтобы до нее добраться, нужно прокрутить палитру компонентов с помощью стрелочки у правого края верхнего окна. Компонент OpenDialog1 самый первый слева. Переносим его на форму описанным ранее способом и располагаем где-нибудь рядом с меню. Далее таким же способом переносим на форму компонент Timer (нам ведь надо будет чем-то отмерять время при автоматическом показе) — он находится на закладке System.

Из визуальных компонентов нам в первую очередь понадобится кнопка, с помощью которой мы будем менять слайды. Используем также стандартную кнопку (компонент расположен на закладке Standard, иконка в виде маленькой кнопочки "Ok"). Переносим ее на форму и располагаем там, где она будет находиться в программе — внизу посередине. Кнопке можно придать любые размеры, растягивая ее мышью, но здесь нас устраивает и стандартный размер— если не нравится, можно подправить. Пока на ней написано Buttor.:. но потом мы изменим надпись.

Теперь мы добавим один компонент для красоты— рамку будущего экрана для демонстрации. Картинки на экране несравненно лучше выглядят на черном фоне. Одно из крупнейших упущений составителей почти всех без исключения подобных прог рамм под Windows — то, что они (скорее всего, даже не подозревая об этом) пытаются следовать рекомендациям для демонстрации именно картин, т. е. изображений на твердом носителе в отраженном свете. Такие изображения следует располагать на нейтральном сером или близком к нему фоне (именно так оформляют картинные галереи). А вот самосветящиеся изображения нужно помещать на черный и только на черный фон (вспомните интерьеры кинотеатров), иначе они зрительно потеряются. Причем дополнительным достаточно сильно искажающим восприятие фактором будут окружающие картинку интерфейсные элементы — меню, кнопки, бордюр и т. п.; особенно это критично для "развлекательного" стиля Windows ХР. В идеале нужно демонстрировать изображение "во весь экран", но это не всегда удобно для пользователя, поэтому придется хотя бы отделить изображение от интерфейсных элементов черным фоном-рамкой.

Рамку удобнее всего сделать из компонента Panel (находится на закладке Standard). Переносим ее на форму (она получит имя Paneii) и растягиваем за уголки так, чтобы от формы по боковым краям осталась только узенькая рамочка, а вверху и внизу оставалось небольшое пространство для меню и кнопки. Последний и главный компонент, который нам потребуется — собственно экран для отображения картинок. Этот компонент расположен на закладке Additional, носит незатейливое название image, и его иконка выглядит, как сине-голубой квадратик (который, видимо, означает деревенский пейзаж на фоне голубого неба). Переносим его на форму, щелкнув на уже имеющейся там панели paneii (компонент обозначится просто пунктиром и получит имя image 1), и тоже растягиваем, оставив поля, которые потом будут черными. К этому моменту наша форма должна иметь вид, показанный на рис. 2.1.

Рис. 2.1. Заготовка проекта SlideShow

Первый этап можно считать законченным — компоненты мы на форму "накидали". Теперь перейдем ко второму этапу — будем придавать им нужные свойства.

Свойства

Пунктир, обозначавший компонент imagel, у нас теперь пропал из виду, но мы помним, где компонент находится, а если забыли — нужный компонент

Начнем с панели, которую мы обещали сделать черной. Для этого выделите панель (нужно щелкнуть на ней с краю, вне пределов компонента image:, иначе выделится именно image!). В окне Object Inspector появится имя компонента (panel 1), а ниже— перечень его свойств. Во-первых, очистим свойство Caption, где написано Рапе п. — надпись на панели пропадет и она станет чистой. Теперь щелкните на пункте Color и затем на стрелочке справа — у вас появится длинный список цветов, среди которых нужно выбрать ciaiack. Другой способ, который позволяет задать цвет визуальным выбором — дважды щелкнуть на поле с названием цвета, а в появившейся таблице нажать кнопку Определить цвет. У вас появится таблица цветов (рис. 2.2 — не изумляйтесь, что гам все по-русски — это функция не Delphi, a Windows), из которой можно выбрать любой из 16 миллионов оттенков, так что если вам моя идея насчет черного цвета, несмотря на все высказанные аргументы, не нравится, то выбирайте по вкусу. Кроме этого, придайте свойству Borderstyle значение bssingle — края панели вместо выпуклых станут вогнутыми, как будто у нас настоящий экран.

Рис. 2.2. Окно выборе цвета

всегда можно выделить, выбрав его из выпадающего списка компонентов в верхнем окне Object Inspector. Выделим imagel и прежде всего установим в True значения свойств Stretch (лучше всего это перевести, как "растяжимость") и Proportional — тогда загруженная картинка будет всегда растягиваться до размеров окна компонента image, не искажаясь в пропорциях. А чтобы картинка располагалась по центру нашего экрана, надо установит ь в True свойство Center этого компонента. Да, а вдруг пользователь по ходу просмотра захочет распахнуть окно программы на максимум? Тогда, для того чтобы наши компоненты тоже соответственно поменяли размеры, нужно ДЛЯ компонентов Panell И Imagel выбрать свойство Anchors И установить в значение True все четыре пункта (akLeft, akTop, akRight И akBottom— ЭТИ пункты выравнивают компонент соответственно по левому, верхнему, правому и нижнему краям), которые раскрываются, если нажать на маленький плюсик слева от надписи "Anchors" (два из этих пунктов уже установлены в True по умолчанию).

Заметки на полях

Когда компонентов на форме много, процедура установки их свойств через Object Inspector (Инспектор объектов) может утомпять. На этот предмет в Delphi предусмотрена крвсиввя возможность клонироввния одинаковых компонентов со всеми их свойствами обычным методом Copy-Pasta. Можно даже выдепить все компоненты нв форме через обычный пункт Edit | Select All (<Ctrl>+<A>) (ипи насколько из них — щелчком мыши при нажатой клавише <Shift>) и перенести их через буфер обмена в новый проект, новую форму или на другое место без изменений, кроме имени, которое присваивается автоматически добавлением к старому порядкового номера.

Прежде чем двигаться дальше, неплохо бы запустить нашу программу и проверить, как это все выглядит. Но проверить хорошо бы прямо с какой-нибудь картинкой! Для загрузки картинки найдите для компонента imagel свойство Picture. Нажмите на кнопочку с тремя точками справа, и затем в открывшемся окне — на кнопку Load. Выберите какую-нибудь картинку типа JPEG — она загрузится в нашу форму (на диске файл 0klen2.jpg расположен в папке с проектом). Если вы ее потом не уберете, она внедрится в исполняемый файл (точнее в файл ресурсов проекта DFM, откуда и будет перенесена в исполняемый файл при компиляции) и будет всегда появляться при запуске программы. Можно изготовить какой-нибудь логотип с вашим портретом.

Итак, запускаем программу на выполнение (Run или <F9>) Сейчас, конечно, критических ошибок быть не может, поэтому она запустится наверняка. Распахнув окно программы на полную, мы увидим нечто, похожее на рис. 2.3.

Здорово, но куда же подевалась кнопка? Да вот она — посередине фотографии! И заголовок окна какой-то невнятный: "FormГ1… Немедленно исправлять! Закроем программу, выделим на форме кнопку Buttonl и в ее свойстве Anchors установим в False все пункты, кроме akBottom. Теперь перейдем к самой форме Formi (чтобы ее выделить, нужно щелкнуть на узенькой полоске между панелью и заголовком, или просто найти ее в Object Inspector). Там мы меняем заголовок (в свойстве Caption) на название нашей программы: siideshow l.o. Номер версии нужен не только для солидности, но и потому, что когда вы в дальнейшем будете улучшать программу, его следует увеличивать. как положено — если номера нет, вы и сами запутаетесь в том, какой именно вариант у вас перед глазами. Основной номер обычно соответствует капитальным переделкам, а цифра(ы) после запятой — косметическим улучшениям или просто вариантам. Следует отметить, что в Delphi имеется штатная возможность присвоения номера версии (а также ряда других "опознавательных" параметров— через пункт Project | Options | Version Info), но в этом случае номер версии будет автоматически доступен только через контекстное меню приложения. Для того чтобы его оттуда извлечь и поместить, например, в заголовок формы или в меню About (с целью автоматического изменения текста в них), нужно вызвать соответствующую структуру через функции API, мы вернемся к этому вопросу позже (см. главу II).

Рис. 2.3. Окно программы SlideShow

Кроме этого, для формы нужно установить положение на экране монитора, в котором она будет появляться после запуска. Это делается в свойстве

Position— по умолчанию там стоит poDesigned, т. е. окно программы будет появляться там, где вы его расположили при проектировании. Это неудобно, потому из многочисленных вариантов выбираем poDesktopCenter— тогда окно будет появляться в центре рабочего стола. Проверяем еще раз (Run или <F9>) и убеждаемся, что теперь все на месте. Да, а надпись на кнопке? Возвращаемся к Buttonl (не забыв закрыть запущенную программу) и в свойстве

(угадали каком?) caption меняем надпись на—————– > (имитацию стрелочки.

ведь кнопка у нас будет перелистывать картинки). Для того чтобы нарисовать на кнопке красивую стрелочку, есть известные специальные способы (см. главу 15), но описание того, как это делается, отвлекло бы нас сейчас от более насущных вещей.

Меню, таймер и диалог

Теперь сформируем главное меню. Дважды щелкнем на иконке меню, у нас появится окно с заготовкой. В свойствах выберем пункт Caption, ставший для нас уже родным, и напишем заголовок первого пункта: Файл (по-русски, естественно), а также сменим имя N1 (свойство Name) на более внятное Fiiei. После того как вы нажмете клавишу <Enter>, у вас заголовок перенесется на заготовку, а рядом с ним пунктиром обозначится следующий пункт. Выделим его, щелкнув по нему мышью, и назовем демонстрация, а имя пусть будет — ShowiA Теперь вернемся к первому пункту Файл и выделим появившийся квадратик ниже— заготовку для подпункта. Его мы назовем Открыть (имя — openl). Чтобы было все сделано грамотно, для подпунктов следует установить горячие клавиши. Это делается в свойстве shortcut — установим для открывания файла сочетание клавиш <Ctrl>+<0>. Перейдем опять к пункту Демонстрация и назовем его подпункт Запуск (имя — Runl), а горячую клавишу ддя него "своруем" у Delphi — <F9>. Пока пунктов нам достаточно. Окончательно меню в отладочном окне будет выглядеть, как показано на рис. 2.4. Закроем окно заготовки меню, запустим программу и убедимся, что меню появилось на нужном месте.

Для таймера Timerl нужно установить его свойство interval в значение 3000. тогда таймер будет срабатывать каждые три секунды (разумеется, можно в любое другое по выбору — идея установки ясна). Кроме того, для него нужно установить свойство Enable в raise, т. к. сразу после запуска он работать не должен.

Рис. 2.5. Маска файлов для программы SlideShow по умолчанию

Открытие файла

Наконец-то можно приступить непосредственно к программированию. Чтобы программа начала работать, нам нужно по крайней мере указать папку, в которой хранятся картинки. В нашей простейшей программе мы будем загружать какую-нибудь картинку через диалог открытия файла и заодно тем самым указывать, какую папку считать текущей. На самом деле это не совсем правильно— профессионально сделанные программы с возможностью просмотра некоторого набора файлов предполагают, что указание папки и просто загрузка одного файла разные операции, но к этому вопросу мы вернемся несколько позднее (см. главу 9).

На форме переходим к главному меню и щелкаем по пункту Файл | Открыть, как будто мы действительно собираемся открыть файл. На первый план выдвигается окно с заготовкой текста модуля slide.pas. Напоминаю, что все необходимые служебные записи в текст Delphi вносит автоматически, при указании интересующих нас событий, и попытка внести правку в эти служебные записи вручную должна предприниматься с полным пониманием того, как и что именно делается (далее мы изучим некоторые такие операции). В данном случае у нас появилась заготовка процедуры обработки события openiciick, которое состоит в том, что мы обратились к пункту Открыть. Что должна программа делать, если мы щелкнули по этому пункту? Разумеется, вызвать диалог открытия файла.

Прежде чем писать обработчик, сначала объявим глобальную переменную г. типа integer— флаг, который будет показывать, первая это загрузка из данной папки при обращении к пункту Открыть или нет. Без этого нам пришлось бы просматривать папку каждый раз заново, что значительно удлиняло бы время загрузки. Использование флага в данном случае — наиболее простой и очевидный способ, хотя, разумеется, и не единственный. В данном случае мы еще и инициализируем эту переменную начальным значением, равным 0.

Заметки на полях

Формально в языке Pascal (точнее, его варианте от Borland) так записывалась только типизированнвя константа, а не переменная, но разница между ними всегда была настолько гомеопатическая, что разработчики Delphi не сочли нужным даже изменить синтаксис. Типизированные константы, как таковые, также остались, но в Delphi, начиная с 6-й версии, в режиме по умолчанию их динамически изменять нельзя, для этого нужно установить флажок Assignable typed constants на вкладке Compiler в пункте Project | Options.

На самом деле все переменные в Delphi по умолчанию вроде бы и так инициализируются нулевым значением, но с идеологической точки зрения было бы категорически неправильно опустить этот момент — а вдруг область памяти, отведенная под переменную, уже рвнее использовалась? Любые критичные для дела начальные значения нужно всегда устанавливать явно — либо в свойствах компонента, либо динамически, например, при запуске программы.

Кроме флага п, нам в дальнейшем понадобится переменная типа rsoarchRec для поиска файлов, назовем ее srf, и строковая переменная st. Соответствующий фрагмент текста тогда будет выглядеть так:

var

Forml: TForml; n: integer^!); srf: TSearchRec; st: string; implementation

Корректно составленная программа в случае обнаружения ошибки при каких- то действиях пользователя (в данном случае — если при нажатии кнопки загрузка файла не прошла) должна выводить сообщение об этом. Еще раз подчеркнем — при действиях именно пользователя, а не самой программы (см. главу I). Это можно сделать самыми разными способами, и мы используем вызов окна сообщения через Delphi-трансляцию соответствующей функции API под названием MessageBox. Нельзя сказать, что с дизайнерской точки зрения это идеальное решение — функция выполнена довольно примитивно. Не так уж сложно сделать и красивее— организовать, например, невидимую изначально панельку, раскрасить ее, ввести хорошо читаемый шрифт и т. и. Главное — собственную функцию можно заставить автоматически убираться с экрана, как только мы начинаем делать что-то еще, и это будет наиболее правильно с точки зрения интерфейса, т. к. щелчок на кнопке ОК для простого сообщения есть, в общем, лишнее действие. Но это достаточно усложняет программу: при дальнейшем усовершенствовании все время придется следить за тем, чтобы вся автоматика работала, как надо, так что в большинстве случаев мы будем обходиться без этого.

Синтаксис вызова функции MessageBox очень хорошо иллюстрирует обращение с функциями API вообще. Напомним, что в Object Pascal строковые переменные фактически представляют собой массив значений типа char, индекс которого отсчитывается с 1, а по нулевому значению индекса хранится фактическое число элементов массива. В то же время во всех современных языках, сделанных на основе С, строки являются нуль-терминированными (подробную информацию об этом см. в главе 21). Поэтому паскалевские строки string при обращении к АР! приходится преобразовывать в нуль- терминированные (в языке Object Pascal такой тип называется Pchar). Проше всего это сделать с помощью обычной процедуры прямого преобразования типов (а обратный перевод, кстати, вообще не требуется — можно переменной типа string просто присвоить значение переменной типа pchar).

Заметки на полях

При задании строк в Delphi для функций API рекомендуется делать либо явное

преобразование типов:

var st:string;

st:=’Неправильный размер файла';

Application.MessageBox(Pchar(st),’Error’,MB_OK);

Либо прямо указывать строку внутри функции:

Application.MessageBox(‘Неправильный размер файла’,’Error’,МВ_ОК);

Не рекомендуется присваивать непосредственное значение строке типа Pchar: var pst:Pchar;

pstНеправильный размер файла'; Application.MessageBoxfpst,’Error’,MB_OK!;

В данном конкретном примере, возможно, все будет нормально, но у автора бывали случаи, когда подобная конструкция вызывала исключение ("Access violation…"). Вообще со строками типа Pchar, как с не "родным" для Delphi форматом, следует работать с большой осторожностью (см. также замечание на эту тему в главе 14 и подробности в главе 21).

Таким образом, между словами begin и end (так называемые операторные скобки) в заготовку процедуры обработки события вносим следующий текст:

procedure ТFcrml.OpenClick(Sender: TObject); /открытие файла} begin

If OpenDialogl.Execute then

{если диалог открытия файла завершился удачно!

Imagel.Picture.LoadFroroFile(OpenDialogl.FileName)

(захружаем картинку s Imagel}

else

begin

{иначе, если диалог завершился неудачно, выводим сообщение) stНеправильный формат файла ‘+ OpenDialogl.FileName; Application.MessageBox(Pchar(st),’Error’,MB_OK); exit; {выходмм из процедуры) end;

n:=0; ln=0 – признак первой захрузки из данной папки) end;

Здесь Error— то, что будет демонстрироваться в заголовке сообщения, а в переменной st содержится собственно текст. Заголовок, к слову, также имеет тип Pchar— если вы захотите его формировать отдельно. В принципе мы могли бы сразу объявить переменную типа Pchar, но st мы йотом можем использовать и в каких-нибудь других целях.

Запускаем программу и пробуем открыть какую-нибудь картинку. Если запуск прерывается и вам сообщают нечто вроде "jpg— unknown extension for files containing image" (jpg — неизвестное расширение для файлов, содержащих изображения), то это означает, что отсутствует ссылка на модуль, который умеет обрабатывать изображения, сжатые с помощью алгоритма JPEG. Скорее всего, вы в данном случае при установке свойств компонентов вообще не загружали начальную картинку в свойство Pucture компонента imagel.

или загруженное тогда изображение имеет тип не JPEG, a BMP— иначе бы ссылка вставилась автоматически. Теперь придется это делать вручную. В начале текста модуля slide.pas после слова uses идет перечисление всех используемых модулей, куда мы через запятую добавляем название нашего модуля — JPEG:

uses

……..  StdCtrls, Menus, JPEG;

Если теперь все запускается нормально, и файлы открываются как надо, идем дальше.

Перелистывание

Следующее событие, которое нас интересует, — нажатие кнопки Buttoni, по которому происходит загрузка очередного рисунка. Сначала мы отдельно оформим процедуру поиска файлов и их загрузки — она еще пригодится при работе по таймеру. При этом неплохо бы как-то узнать, что мы пролистали все файлы и дошли до конца каталога. В данном случае у нас сделано так, что последний файл в папке будет просто показываться дважды — и мы этим на данном этапе ограничимся. Если продолжать нажимать, то все будет начинаться сначала. Процедуру Loadfile (текст приведен далее) надо вставить в текст программы выше обработчиков событий, сразу после слова implementation и зелененькой надписи с директивой )$r *.dfm) — расположение своих процедур в начале (а не вперемешку с обработчиками событий) удобнее для чтения текста программы. Обратите внимание, что в своих процедурах наименование свойств и методов компонентов надо либо начинать с самого начала по всей цепочке их принадлежности (Formi и т. п.), либо использовать оператор with.

procedure Loadfile; /процедура поиска и загрузки файлов JPEG) begin

if n=0 then /если это первая загрузка) begin

if FindFirst С*.jpg’,faAnyFile,srf)<>0 then exit;

(ищем самый первый JPEG-файл в папке, если не находим – выход из процедура) try Iпробуем его загрузить в Image]} Forml.Imagel.Picture.LoadFromFile(srf .Mama); except (зто вовсе не JPEG}

(выводим сообщение/ 8Ь:=’Неправильный формат файла ‘+ srf.Кате; Application.MessageBox(Pchar(st),’Error’,МВ_ОК); exit /выход из процедуры}

end;

n:-=l; (следующая загрузка булат ужа не первой/ end else (если эта загрузка уже не первая} begin

if FindNexi(sr?)=0 then !если =0, то найден следукищт файп/ try {пробуем его загрузить в Image If Formi. Tmagel .Picture. LoadFror.iIfile (sr f .Name) except (это вовсе не Jpegl

{выводим сооСаце)»is} st :=?’Неправильный формат файла ‘ + srf.Name; Applicat ion.MessageBo.x (Pch-a r {s t) , ‘Error’, MB_0K) ; exit {выход из проиед^’ры}

end

else fa если не ?) – значит файлов больше нет) begin

FindClose (srf); (закрываем поиск) п:=0; (в следующий раз начнем сначала! end; end; end;

Заметки на полях

Текст этой процедуры хорошо иллюстрирует использование операторных скобок begin.. .end. Они нужны для того, чтобы выделить группу операторов программы, которые будут выполняться совместно. Например, они обязательно обрамляют все операторы процедуры, чтобы компилятор знал, где в тексте эта процедура заканчивается. Кроме этого, скажем, в данном случае ими выделяются те операторы, что будут выполняться по одному и тому же условию (оператор if.. .then.. .else). Если условие не выполняется, они будут пропущены и выполнится другая группа операторов. Еспи в группе всего один оператор, операторные скобки можно не ставить.

Оформлять текст программы принято так, чтобы внутри каждой группы, обрамленной операторными скобквми begin.. .end, текст сдвигался вправо. Осуществлять сдвиг текста полагвется клавишей <ТаЬ> или пробелами. Если сдвига не делать, то в сложных выражениях очень трудно бывает найти, к какому begin какой end относится. Пожалуй, единственная ошибка, при наличии которой компилятор может не указать на настоящую ее причину, а реагировать самым причудливым образом— несоответствие количества begin количеству end. Знайте, если сообщение об ошибке содержит откровенную чушь, то, скорее всего, дело именно в этом. Тем более, что служебное слово end используется не только как закрывающая опервторная скобка, но и в других случаях. Один из таких случаев мы также видим здесь: это пример использования обработки исключений. Имеется в виду конструкция try.. .except.. .end. Работает онв так: если процедура после try выполнилась правильно, то программа перейдет к оператору поспе end, а если нет — выполнит процедуру после спова except. Есть и более сложный формат процедур обработки исключений.

Теперь нужно создать обработчик события щелчка по кнопке Buttoni. Для этого просто дважды щелкнем по ней на форме, а затем впишем в появившуюся заготовку для процедуры обработчика события Buttoniciick строку с единственным оператором, который есть имя нашей процедуры:

begin

Loadfile; end;

Запустим программу и проверим, как это работает.

Осталось оформить процедуру автоматической демонстрации. Для чего щелкните в главном меню на пункте Демонстрация | Запустить. Появится заготовка обработчика соответствующего события Runiciick. Текст обработчика приведен далее.

procedure TForml.RunlClick(Sender: TObject); (запуск и остановка

демонстрации слайдов J

begin

if Timerl.Enabled=False then /если демонстрация была остановлена} begin

Runl.CaptionСтоп'; (меняем название пункта меню на "Стоп"} Timerl. Enabled :=*True; {запустили таймерj end else (иначе, если демонстрация уже идет} begin

Runl.Caption:=? ‘Запуск1; (меняем название пункта меню обратно на "Запуск"} Timerl.Enabled:-False; {таймер остановлен}

end; end;

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

begin

Loadfile; end;

Кстати, а как закрывать программу? Традиция предписывает введение специального подпункта в главном меню формы (обычно внутри пункта File), но автору кажется это излишним. Windows и так предоставляет достаточно удобных возможностей (через системное или контекстное меню, нажатием на системную кнопку-крестик, наконец, клавиатурной комбинацией клавиш <Alt>+<F-1>), и дублировать эти функции совершенно ни к чему. Единственно, когда это целесообразно — расчет на совершенных "чайников", которые не имеют представления о системных возможностях Windows. Другой случаи — если вы делаете настолько оригинальное окно, что системную кнопку там найти непросто или ее вообще нет. Во всех этих случаях для закрытия приложения следует вызвать по нужному событию метод Formi .Close.

Теперь можно считать, что программа закончена. Запустите ее для проверки. Находится она в одном-единсгвенном файле SlideShow.exe и для переноса ее в другое место достаточно переписать только этот файл.

Заметки на полях

По умолчанию Delphi присваивает всем новым проектам свой значок — нельзя пи его изменить? Чтобы попучить оригинапьную иконку, ее можно нарисовать (дпя этого в комплект пакета входит специальный графический редактор Image Editor, с которым мы еще не раз будем иметь депо), а можно просто подобрать из какой-нибудь коппекции. Для того чтобы сменить иконку, надо обратиться к пункту меню Project | Options, открыть там закладку Application и нажать на кнопочку Load Icon. Новый значок внедрится в исполняемый файп. Для образца программы, которая располагается на припагающемся диске, иконка быпа заменена именно таким образом.

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

По теме:

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