2000. Вроде все ОК, но вот беда: нет просмотрщика графических файлов:-(... Пошарив
по дискам, я пришел в разочарование... К знакомым идти лень, да и холодно на
улице... Как быть? Эх... так ведь у меня delphi есть! Там все это дело замутить
просто, а значит, быстро. Приступим-с. Запускай дельфина. Вот перед тобой среда разработки, а значит,
кидай следующие компоненты:timage со страницы additional.Три tbitbnt также со страницы additional.Одну tpanel со страницы standard.tdirectorylistbox, tdrivecombobox с закладки win 3.1.Постарайся расположить компоненты, как показано на рисунке.

Теперь выставь свойства компонентов, для примера, так:Для tpanel (на панели у меня все, кроме image'а:-d)align alrightcolor clnavycaption '' (удали оттуда все)Для timagename imviewalign alclientcenter trueДля tformname fmmaincolor clblackwindowstate wsmaximizedДля tbitbtnОдна пимпа будет ОК'шная (name btok). Две другие управляют просмотром (name
btnback, btnnext соответственно). Так как при старте программы пользователь
еще не укажет каталог, где искать картинки, то необходимо запретить нажимать
на кнопки управления, поэтому для этих двух пимп свойство enabled поставь в
false.Более подробно рассмотрим компоненты tdirectorylistbox и tdrivecombobox. directorelistbox
создает список для отображения структуры папок диска, а drivecombobox создает
выпадающий список всех доступных дисков. Эти компоненты можно связать между
собой: в свойстве dirlist для drivecombobox укажи на directorylistbox. Теперь
дай толковые имена для этих компонентов. Для directorylistbox — lbdir, а для
drivecombobox — cbdrive. Вот и все! Разработка интерфейса закончена. Итак, теперь
давай научим прогу искать jpg-файлы в заданном каталоге. Для работы нам нужны
различные переменные. В разделе var необходимо сделать изменения: varfmmain: tfmmain;//собственно формаfilefind:tsearchrec; //это необходимо для поиска файловfilelist:tstringlist; //это тожеhfindfile:thandle; //и этоk:integer=-1; //надо для управления Также необходимо добавить модуль jpeg (ведь мы будет юзать jpg-файлы). useswindows, messages, sysutils, variants, classes, graphics, controls, forms, dialogs,
stdctrls, filectrl, extctrls, buttons, jpeg; Создай обработчик onclick для btok. Я туда написал вот что: procedure tfmmain.bbokclick(sender: tobject);beginbtnback.enabled:=false;btnnext.enabled:=false;filelist:=tstringlist.create; //создаю объект для работы со строкамиhfindfile:= findfirst(lbdir.directory+'*.jpg',faanyfile,filefind); //задаю маску поиска и начинаю оныйif hfindfile <> invalid_handle_value then// если все пучком, тоrepeatif fileexists(filefind.name) then// проверяю существование файла (на всякий
случай)filelist.add(lbdir.directory+''+filefind. name); //добавляю в список полный
путь к файлуuntil findnext(filefind)<> 0; //если файлов не найдено, то ухожу из цикла
(или если ошибка)findclose(filefind); //закрываю поискif filelist.count<> 0 thenbeginbtnnext.enabled:=true;btnback.enabled:=true;//если число картинок больше 0, то разрешаю просмотрk:=0;//обнуление счетчикаimview.picture.loadfromfile(filelist.strings [k]); //читаю картинку с файлаend;end; Здесь ничего сложного нет. Поначалу блокирую доступ к кнопкам управы (вдруг
пользователь сменил каталог на тот, где нет jpg-файлов). Потом создаю лист строк
(это типа массива строк).function findfirst(path:string, attr:integer, f:tsearchrec):integer — функция
начинает поиск файла по заданной маске в указанном каталоге. Если чего случилось
нехорошее, то ф-ция возвратит код ошибки. Результат поиска записывается в переменную
f (если не было ошибки). Теперь про маску поиска: у каждого файла есть атрибуты.
Они могут быть такими:fareadonly — $00000001 — Только для чтенияfahidden — $00000002 — Скрытый файлfasysfile — $00000004 — Системный файлfavolumeid — $00000008 — Идентификаторfadirectory — $00000010 — Папкаfaarchive — $00000020 — Архивный файлfaanyfile — $0000003f — Любой файл У меня lbdir.directory+'*.jpg', faanyfile,filefind, это значит, что я ищу все
jpg-файлы в директории, указанной в lbdir. Далее, если нет ошибки, я создаю
цикл, где ищу все файлы, соответствующие маске. typetsearchrec = recordtime: integer;size: integer;attr: integer;//атрибутыname: tfilename;//имя файлаexcludeattr: integer;findhandle: thandle;finddata: twin32finddata;end; function findnext(f:tsearchrec) — продолжает поиск, который начался ф-ей findfirst.
По мере нахождения графических файлов я формирую список. Когда файлы закончились,
я останавливаю поиск. Проверяю количество строк в filelist (if filelist.count<>
0 then). Если ничего нет (ни одного файла не найдено), я ничего не делаю, а
вот если в списке имеется хоть одна запись, то я разрешаю управление и загружаю
картинку с файла.Осталось реализовать управление. Для этого вставь следующий программный код
в обработчики onclick для btnback и btnnext соответственно: procedure tfmmain.btnbackclick(sender: tobject);beginif k=0 then k:=filelist.count-1 else//если счетчик на нуле, то необходимо вновь
поставить максимальное значениеdec(k);//уменьшаю на 1 значение kimview.picture.loadfromfile(filelist.strings[k]);end; procedure tfmmain.btnnextclick(sender: tobject);beginif k=filelist.count-1 then k:=0 else//тут все наоборот: ставлю счетчик на нольinc(k);//увеличиваю на 1 значение kimview.picture.loadfromfile(filelist.strings[k]);end;

Вроде все хорошо, все работает... Ан нет, необходимо запоминать каталог, где
работала программа в последний раз, а при запуске сразу работать с этим каталогом.
Меня очень раздражало по n раз за день переходить в один и тот же каталог. Поэтому
нужно реализовать возможность сохранять/читать полный путь к папке, в которой
приложение работало при прошлом запуске. Добавь в uses модуль registry и в исходный
программный текст две процедуры: procedure tfmmain.formclose(sender: tobject; var action: tcloseaction);varreg:treginifile;beginreg:=treginifile.create('software');reg.openkey('viewer', true);reg.writestring('setting', 'dir', lbdir.directory);reg.free;end; procedure tfmmain.formcreate(sender: tobject);varreg:treginifile;beginreg:=treginifile.create('software');// создаю объект для работы с реестромreg.openkey('viewer', true);//открываю ключlbdir.directory:=(reg.readstring('setting', 'dir', lbdir.directory));{читаю значение, а если его нет, то будет lbdir.directory}reg.free;//освобождаю ресурсыend;Работу с реестром я уже объяснял, но если непонятно совсем, то читай комментарии.
Вот и все. Теперь действительно все. Удачи и хороших сновидений:-d (у меня сейчас 1:06).