Назло блокноту. Или всё для работы с расширениями в Windows с помощью DelphiИсточник: куфдсщвштп
Статья показывает на конкретных примерах, как ассоциировать вашу программу с каким-либо расширением Windows, самому зарегистрировать свое расширение в системе и как добавить пункт в контекстном меню Windows (типа "открыть в...") для открытия документов вашей прогой (по-видимому текстовым редактором:) Небольшое вступление, которое надо прочитатьПривет всем кодерам! Эта статья посвящается широкому кругу читателей - будь вы новичок в программировании на Delphi или продвинутый кодер. Я надесь, информация, представленная здесь мной, будет вам интересна. Ну да ладно, это так - отступление, приступим к главному, то бишь к кодингу! Но сначала я расскажу вам, зачем стал писать это пособие... Недавно я закончил делать текстовый редактор. А когда закончил, то подумал, неплохо было бы встроить в Maks Editor (в дальнейшем за этим названием будет подразумеваться мой текстовый процессор) функции ассоциации с различными расширениями Windows, заодно сделать так, чтобы можно было самому регистрировать расширения и прописывать пункты в контекстном меню Windows, отвечающие за запуск документов (типа "открыть в...") моим текстовым процессором!!! Кто разобрался в том, что я сказал, может пропускать следующие 3 параграфа и читать дальше, кто нет - сейчас объясню суть вышесказанных слов... Помните, когда вы создаете текстовый файл (неважно каким способом), то перед вами раскрывается блокнот (раскрываться может и что-либо другое), и значок вашего файла заменяется значком блокнота (или программы, отвечающей за обработку файлов с расширением .txt). Так вот, за каждое расширение в Windows отвечает одна программа, называемая "программой по умолчанию". Эту программу конечно можно легко изменить для любого расширения: выбираете пункт "открыть с помощью", находите нужную прогу и ставьте галочку - использовать её для всех файлов такого типа. С ассоциацией расширений вроде бы разобрались - едем дальше. Что значит - самому регистрировать расширения? А это значит, вы должны сказать Windows: "Вот тебе новое расширение, засоси, подруга!" и прописать прогу, которая будет работать с этим расширением - будет "прогой по умолчанию". То есть: зарегистрируете вы расширение .maks, и теперь при каждом открытия файла типа *.maks, будет открываться ваша прога (которую вы, наверное, сами создали) и появляться значок, соответствующий значку проги. С этим тоже вроде бы всё ясно - прем вперед...Прописка пункта контекстного меню. Ну тут всё легко - в главном контексте Windows создается ваш пункт, при нажатии по которому открывается ваше приложение с содержимым того файла, относительно которого находилось меню. Прогу тоже можно сделать любой. Так вот, все эти вещи могут понадобиться вам, если вы, например, создаете текстовый редактор. Причем, не обязательно стараться над кодингом редактора - можно просто положить какой-нибудь RichEdit на форму и все... прописать пункт в контекстном меню Виндоуз типа "Открыть с MyEditor". И написать вот это в событие onshow формы:
Теперь вы можете легко и быстро работать с документами с помощью вашего эдитора без предварительного инсталлированя его в систему!!! Виндоуз сама опознает поле для редактирования и будет заносить туда данные после открытия! И запомните, все, что я вам сейчас покажу, требует знаний работы с реестром - но это в принципе не главное. Просто я все делал под Windows XP, а реестр XP и реестр "Леноллиума" - это разные вещи. Поэтому я не даю никакой гарантии, что у вас все будет нормально в другой операционке (я даже с уверенностью говорю, что кроме XP, у вас ассоциация и прочая белиберда вообщей не пойдет в другой системе:~(. Так что если вы читаете это пособие, уютно расположившись в Win 3.1, то можете завязывать чтение (что я вам, конечно не рекомендую, так как материал полезен для упрочнения знаний о строении и работе реестра). И не думайте, что я в этой маленькой статейке расскажу о том, как сделать текстовый редактор, я просто покажу вам по 1 примеру на каждый из этих пунктов:
И все это сотворить програмно с помощью нашей любимой Delphi. Объяснять я буду, исходя из устройства Delphi 7, но в других средах этот процесс совсем не будет отличаться, так как модуль Registry действует везде. Начинаем кодинг (или немного про реестр)Итак начнем. Запускаем Delphi, создаем приложение, у нас появляется форма. На неё мы ложим RichEdit и изменяем его свойство align на alclient. Тем самым мы растянули его по всей форме. Также лучше стереть надпись "RichEdit1" в его свойстве Lines. Теперь создайте еще 1 форму: нажмите file->new->form. Но эта форма (буду называть её form2) у нас пока что не как не связана с главной формой (form1). Для того, что их хоть как-то связать, откройте окно редактора кода у form1 и добавьте модуль с вашей второй формой: пишете слово unit и идентификатор формы (в данной случае 2).
Соединили, ну все равно, form2 нигде не будет у нас видна при запуске проги. Для этого её надо вызвать. Как вы будете её вызывать, решать вам. Можно создать главное меню сверху и оттуда, но я не буду объяснять, как это делать. Я просто взял и поместил обычную кнопку на RichEdit1 - не слишком правильно, но на виду. Теперь обрабатываем событие onclick кнопки button1 (для этого щелкаем по ней 2 раза).
Все, теперь на form2 ложим несколько компонент: 2 edit'a, 2 checkbox'a, 3 button'a. Первый Edit будет служить у нас полем ввода для расширения, которое мы хотим зарегистрировать, так что изменим его свойство name на extension. А первая кнопка будет у нас регистрировать это расширение - назовем её createext, вторая кнопка будет это расширение дизинтегрировать (какое слово умное я придумал:) - назовем её deleteext.Первый CheckBox будет служить у нас расширением .txt (я покажу вам пример только с одним расширением, так как работа с остальными расширениями идентична), т.е. если чекбокс включен - стоит крестик, то ассоциируем нашу прогу с расширением *.txt, если выключен - крестика нет, то отменяем интеграцию, прописав блокнот "прогой по умолчанию" (как в начале было:). Так что изменяем его имя на txt. Второй CheckBox будет работать совместно с edit2: в edit2 мы будем вводить пункт в контекстном меню, который нам надо зарегистрировать, а флажок будет указывать нам, создавать этот пункт или удалять (включен - создаем, выключен - удаляем:). Изменяем имя второго флажка на context, а имя второго edit'a на contextstr. Изменения имен я сделал только для удобства (чтобы не запутаться:). И наконец последняя кнопка под именем Gues будет делать... потом узнаете что:) Итак начнем кодить, но сначала я дам вам некоторую инфу про реестр: Как вы, наверное, знаете, реестр - это большая база данных вашей системы, в котором очень легко напортачить, а исправить содеянное порой просто невозможно (вообще, я вам сразу советую открыть реестр и держать его открытым до конца кодинга). Так вот в реестре 6 главных разделов, а мы будем работать с разделом HKEY_CLASSES_ROOT - в нем хранятся настройки, отвечающие за регистрацию различных расширений, контекстных меню, названий системных программ (корзины, например) и еще куча всего прочего. Открыв раздел HKEY_CLASSES_ROOT, мы первым дело видим список из 18 зарегистрированных текстовых расширений, которые начинаются со знака ! (!txt, например). Спустившись чуть пониже мы, может найти эквиваленты этих расширений типа .txt (перед названием стоит точка). В этих расширениях мы ссылаемя на расширения типа !txt, которые находятся в самом начале и содержат основную информацию о "программе по умолчанию" и иконке этой проги. Так вот, открываем раздел !txt, с которым мы будем работать, и что же мы видим: раздел defaulticon, в котором содержится строковой параметр с адресом иконки проги + , 0 и раздел типа shell->open->command. В разделе command тоже строковой параметр со значением адреса "программы по умолчанию", после которой стоит "%1". Значит нам нужно только изменить адрес проги и иконки и готово дело. В принципе да, но посмотрите в раздел .txt - в нем хранится строковой параметр со значением, ссылающимя на раздел !txt, т.е. параметр !txt. Значит нам нужно, чтобы этот параметр тоже присутствовал - вдруг кто-нибудь нечаянно его удалит... Действие 1: Ассоциация с расширением .txtКороче приступаем к реализации функции, ассоциирующей нашу прогу и её иконку с расширением .txt. Для этого мы создадим процедуру под названием fileass,а также занесем модуль registry, отвечающий за работу с реестром.
Она будет отвечать за интеграцию или дизинтеграцию расширения .txt. Ну впрочем, все понятно из листинга с подробными комментариями: if not txt.Checked then // если флажок отключен,то В принципе все... 1-я (и самая главная) функция готова. Только в адресе иконки я указал адрес программы (paramstr(0)) , потому что я уже подготовил новую иконку, которая обозначает мой текстовый эдитор. Если вы ничего не сделаете. Под расширением .txt будет подразумеваться ваша прога с иконкой Delphi. Так что укажите правильный путь в ключе Defaulticon. Действие 2: Регистрация своего расширенияТеперь сделаем сами регистрацию расширений (за это, как мы помним, у нас отвечают компоненты extension, createext,deleteext). Для этого мы создадим процедуру newext. А за дизинтеграцию у нас будет отвечать процедура delext. Как всегда добавляем их в раздел PRIVATE и потом описываем.
Вторая процедурка:
Действие 3: Добавление пункта в контекстное меню WindowsВот и вторая часть нашего доброго дела готова. Осталась последняя, отвечающая за добавление, удаления пункта контекстного меню. За это у нас (а ну ка вспомнили:) отвечают компоненты context и contextstr. Ну я как всегда создал новую процедуру checkcontext и написал в ней...
Вот и последняя процедурка готова, как видно, здесь проверяется, включен ли флажок: если включен, то пункт, введенный в context, создается, если выключен, то пункт, который был предварительно создан - удаляется. Но мы еще забыли самое главное: ведь у нас есть только процедуры: а ведь их еще надо подставить куда-нибудь, чтобы они работали. Короче, подставляем процедуру, отвечающую за создание нового расширения (newext) в компонент createext (кнопка), функцию, отвечающую за удаление расширения (delext) в компонент deleteext (кнопка). А процедуру, ассоциирующую вашу прогу с .txt (fileass) и процедуру создания, удаления пункта контекста (checkcontext) в компонент Gues (кнопка) - вот она и пригодилась, она будет закрывать форму, предварительно сделав некоторые изменения, продекларированные выше! Ну конено все функции надо прописать в событии onclick кнопок: // реакция кнопки на клик мышью - удаление расширения // реакция кнопки на клик мышью - ассоциация с расширением .txt и создание/удаление пункта в контексте Ну вот в принципе и все... конечно можно было просто записать коды 4 вышесказанных процедур в события onclick кнопок, но это не есть самый удобный способ... И в заключение приведу весь код проги:uses type var implementation
{$R *.dfm}
procedure tform2.fileass; if not txt.Checked then procedure tform2.newext; procedure tform2.delext; procedure tform2.checkcontext; procedure TForm2.GuesClick(Sender: TObject); procedure TForm2.createextClick(Sender: TObject); procedure TForm2.deleteextClick(Sender: TObject); end. Небольшое заключение, которое надо прочитатьЯ рассказал вам несколько полезных функций, но не учитывал те глюки, которые вы сразу заметите - например, я не прописывал событие oncreate и onclose формы (ну надо же сохранять настройки, отвечающие за активность флажков в Инифайлах, чтобы не было никаких изменение:). Это все я оставляю вам... на ужин...
|