Как подобрать обои на Рабочий стол? Предлагаю использовать все по очереди! Попробуем создать программу для смены обоев на Рабочем столе через заданный интервал времени. Отличие программы от всех подобных в том, что в ней не будет лишних никому не нужных функций, а значит, она будет меньше загружать оперативную память компьютера и мысли пользователя.

Пример выполнен на Delphi 7 и ориентирован на неопытного кодера, поэтому постараюсь описать все очень подробно и доступно. Тем не менее, пример будет отлично работать и в предыдущих версиях.

Визуализация

С чего начнем? Конечно же, с формы приложения. Итак, создаем VCL Forms Application. Посмотрим, какие компоненты нам необходимы. Вкладка палитры компонентов Standart — берем Label, для отображения пути к выбранному файлу; Panel — чисто декоративно, как использовать и сколько надо, не буду комментировать, можно вообще не использовать. Вкладка Additional — Bitbtn — берем две кнопки (старт/стоп); Image — для предварительного просмотра выбранного файла. Вкладка System — здесь нам нужен только Timer, для периодичности смены картинки. Для того, чтобы задавать интервал смены картинки для нашего таймера, возьмем с вкладки Samples компонент SpinEdit. Для полного удобства выбора пути к файлу с вкладки Win 3.11 берем DriveComboBox, DirectoryListBox, FileListBox. Назначение этих компонентов понятно из их названия.

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

Маленькое отступление

Это отступление только для юных кодеров, чтобы скрасить понимание. Компонентом можно манипулировать в инспекторе объектов (он находится снизу слева), который имеет две вкладки: properties и events. В properties мы можем изменить параметры, которые касаются оформления компонента, в events хранятся процедуры действия компонента. Поэтому если я говорю про значения свойств компонента, я имею в виду вкладку properties, а если про действия — ищите их на вкладке events. Для перехода от дизайнера формы к коду формы и наоборот используется клавиша F12. Названия всех компонентов я оставляю стандартными, чтобы потом ни у кого не возникло недоразумений с названиями.

Надстройки формы

У нас есть уже заготовка, теперь посмотрим, что с этим всем делать. Для формы Form1 в инспекторе объектов меняем такие параметры: caption — пишем название приложения, borderIcons->biMaximize — false, borderStyle — bsSingle, position — poScreenCenter. Теперь форма нашего приложения будет всегда располагаться по центру экрана и не будет иметь возможности максимизироваться, так как это сможет привести к некорректному отображению элементов в нашей программе. Иными словами, делаем так называемую «защиту от дураков» (fool protection).

DriveComboBox — в свойствах меняем параметр DirList (там только одно значение, ошибиться невозможно), соответственно связываем этот объект с DirectoryListBox. Теперь при смене диска в DriveComboBox меняется содержимое DirectoryListBox.

Идем дальше и для DirectoryListBox меняем свойства FileList и DirLabel — тут все и так понятно, если посмотреть на результат.

FileListBox — свойство MASK пишем *.jpg — это чтобы мы смогли смотреть только на картинки jpg и не видеть остальное.

Для того, чтобы наша картинка красиво отображалась пропорционально и по центру, у компоненты Image1 меняем свойства Center, Proportional в TRUE.

В принципе, все необходимое вроде сделано. Другими настройками не буду увлекаться, я думаю, каждый сможет раскрасить свое приложение по собственному усмотрению. Если что-то не получилось, возвращатесь в начало, а если все нормально, то следуте за мной дальше.

Кодинг

Жмем клавишу F12 и в листинге формы в разделе Uses добавляем модули ComObj, ShlObj. Jpeg. Для FileListBox в инспекторе объектов на вкладке events для события OnClick пишем две строчки:

Label1.Caption:=FileListBox1.Filename;
Image1.Picture.LoadFromFile(Label1.Caption);

Первая строка хранит имя и путь к выбранному файлу-картинке. Вторая строка будет отображать картинку на элементе Image1. Теперь мы располагаем готовым приложением для просмотра картинок! Но у нас есть еще другая цель, поэтому идем дальше и в коде программы после слов implementation {$R *.dfm} пишем следующую процедуру:

Procedure Change;
const
Desktop: TGuid='{75048700-EF1F-11D0-9888-006097DEACF9}’; //для получения доступа к рабочему столу
var
ActiveDeskTop:IActiveDesktop; // вроде понятно, зачем
begin
ActiveDesktop:=CreateComObject(Desktop) as IActiveDesktop; //создаем объект и получаем разрешение доступа к рабочему столу
ActiveDesktop.SetWallpaper(StringToOleStr(form1.Label1.Caption), 0); // определились с выбором картинки
ActiveDesktop.ApplyChanges(AD_APPLY_ALL); // применяем картинку на рабочем столе
end;

Есть, конечно, и другие способы менять обои, но преимущество нашей процедуры в том, что она работает под WindowsXP. Я думаю, комментарии написаны понятно. Во всяком случае, для начала хватит с головой. А хитрость в том, что мы работаем с реестром Windows и {75048700-EF1F-11D0-9888-006097DEACF9} — это реальный адрес в реестре, в котором есть параметр ActiveDesktop. Если не верите, можете проверить.

Что бы наша программа могла работать с картинками, логично будет сначала посмотреть, есть ли картинки в выбранной папке, и определить их количество. Поэтому нам надо создать числовую переменную i, которая будет выступать у нас в качестве счетчика картинок. В разделе var нашего приложения дописываем:

i:integer;

Для формы form1 в events -> OnCreate пишем i:=0; — при запуске программе обнуляем счетчик.

Переходим к таймеру — свойство enabled ставим в false, interval — 1000 и в действии OnTimer пишем:

 i:=i+1; //переходим к следующей картинке
if i=form1.FileListBox1.Items.Capacity // если наш счетчик дошел до конца списка, идем в начало
then i:=0;
label1.caption:=form1.FileListBox1.Items[i]; //все понятно
change; //меняем обои

Дважды щелкните по кнопке BitBtn1 и впишите следующую строку:

timer1.enabled:=true;

В свойстве Caption назовем ее Start, другую назовем Stop и для нее напишем

timer1.enabled:=false;

И еще пара доработок: у счетчика spinedit свойству increment присвоим значение 1000 (а чего мелочиться?), и на событие OnChange напишем следующее

timer1.Interval:=spinedit1.Value;

От греха подальше уберем поначалу кнопку Start — в свойстве кнопки enabled->false. А разрешим ее только тогда, когда выберем картинку, то есть кликнем по FileListBox1. Допишем в событие OnClick:

BitBtn1.Enabled:=true;

Если мы заходим перейти в другую папку, то логично будет отключить таймер и запретить кнопку Start. Для этого в DirListBox1 в событие OnClick пишем такие строки:

timer1.Enabled:=false; BitBtn1.Enabled:=false;

Красота… да, но еще надо поработать. Надо убрать наше приложение с панели задач, дабы оно не раздражало наш зоркий глаз и не портило нам зрение. Спрячем нашу программу в трей. Но про это мы поговорим в следующий раз. А пока смело жмем F9 и наслаждаемся проделанной работой.