Работа с расширениями
Работа с расширениями
Работа с расширениями Действие 1: Ассоциация с расширением .txt Короче приступаем к реализации функции, ассоциирующей нашу прогу и её иконку с расширением .txt. Для этого мы создадим процедуру под названием fileass,а также занесем модуль registry, отвечающий за работу с реестром. uses registry;// это обязательно private // заносим ее вот сюда procedure fileass; // функция заносит все параметры ассоциации с расширением .txt в реестр или удаляет их Она будет отвечать за интеграцию или дизинтеграцию расширения .txt. Ну впрочем, все понятно из листинга с подробными комментариями: procedure tform9.fileass; var reg:TRegistry; // переменная, инициализирующая реестр begin if txt.Checked then // если флафок включен, то begin // инициализируем реестр reg := TRegistry.Create; // устанавливаем главный раздел reg.RootKey := HKEY_CLASSES_ROOT; // создается ключ ".txt", если его нет reg.OpenKey(?.txt?,true); // создается параметр со значением "!txt", если его нет reg.WriteString(??, ?!txt?); // закрываем этот ключ reg.CloseKey; // создается ключ "!txtDefaultIcon" reg.OpenKey(?!txtDefaultIcon?,true); // заносится значение параметра "имя приложения, 0" - пиктограмма нашей проги reg.WriteString(??, paramstr(0) + ?, 0?); // выходим из ключа reg.CloseKey; // создается ключ "!txtshellopencommand" reg.OpenKey(?!txtshellopencommand?, true); // создается параметр со значением "имя файла "%1"" - адрес нашей проги reg.WriteString(??, ParamStr(0) + ? "%1"?); // закрываем ключ reg.CloseKey; // освобождаем реестр, но настройки сохраняем reg.Free; end; if not txt.Checked then // если флажок отключен,то begin // инициализируем реестр reg := TRegistry.Create; // устанавливаем главный раздел reg.RootKey := HKEY_CLASSES_ROOT; // создается ключ ".txt" reg.OpenKey(?.txt?,true); // создается параметр со значением "!txt" reg.WriteString(??, ?!txt?); // выходим reg.CloseKey; // создается ключ "!txtDefaultIcon" reg.OpenKey(?!txtDefaultIcon?,true); // заносится значение параметра "имя приложения, 0" - пиктограмма блокнота reg.WriteString(??, ?NOTEPAD.exe? + ?, 0?); // выходим reg.CloseKey; // создается ключ "!txtshellopencommand" reg.OpenKey(?!txtshellopencommand?, true); // создается параметр со значением "имя файла %1" - адрес блокнота reg.WriteString(??, ?NOTEPAD.exe? + ? "%1"?); // закрываем ключ reg.CloseKey; // освобождаем реестр, но настройки сохраняем reg.Free; end; end; В принципе все... 1-я (и самая главная) функция готова. Только в адресе иконки я указал адрес программы (paramstr(0)), потому что я уже подготовил новую иконку, которая обозначает мой текстовый эдитор. Если вы ничего не сделаете. Под расширением .txt будет подразумеваться ваша прога с иконкой Delphi. Так что укажите правильный путь в ключе Defaulticon. Действие 2: Регистрация своего расширения Теперь сделаем сами регистрацию расширений (за это, как мы помним, у нас отвечают компоненты extension, createext,deleteext). Для этого мы создадим процедуру newext. А за дизинтеграцию у нас будет отвечать процедура delext. Как всегда добавляем их в раздел PRIVATE и потом описываем. Private Procedure fileass; Procedure newext; // интегрирует наше расширение Procedure delext; // дизинтегрирует наше расширение procedure tform2.newext; var reg:tregistry; // наша переменная для работы с реестром begin // инициализируем её reg:=tregistry.Create; // устанавливаем начальный раздел reg.RootKey:=Hkey_Classes_Root; // создаем ключ типа ".наше расширение" reg.OpenKey(?.?+extension.Text,true); // записываем в нем ссылку на ключ типа "!.наше расширение" reg.WriteString(??,?!?+extension.Text); // закрываем ключ reg.CloseKey; // создаем ключ типа "!.наше расширениеdefaulticon" reg.OpenKey(?!?+extension.Text+?defaulticon?,true); // записываем туда иконку нашей проги reg.WriteString(??,paramstr(0)+?, 0?); // выходим reg.CloseKey; // создаем ключ типа "!.наше расширениеshellopencommand" reg.OpenKey(?!?+extension.Text+?shellopencommand?,true); // записываем в него адрес проги reg.WriteString(??,paramstr(0)+? "1"?); // закрываем ключ reg.CloseKey; // убираемся, но настройки сохраняем reg.Free; end; Вторая процедурка: procedure tform2.delext; var reg:tregistry; // инициализируем переменную для работы с реестром begin // создаем класс для работы с реестром reg:=tregistry.Create; // устанавливаем начальный раздел reg.RootKey:=HKEY_CLASSES_ROOT; // удаляем ключ типа ".наше расширение" reg.DeleteKey(?.?+extension.Text); // удаляем ключ типа "!наше расширение" reg.DeleteKey(?!?+extension.Text); // закрываемся reg.CloseKey; // вырубаем все, но настройки сохраняем reg.Free; end; Действие 3: Добавление пункта в контекстное меню Windows Вот и вторая часть нашего доброго дела готова. Осталась последняя, отвечающая за добавление, удаления пункта контекстного меню. За это у нас (а ну ка вспомнили:) отвечают компоненты context и contextstr. Ну я как всегда создал новую процедуру checkcontext и написал в ней... Private procedure fileass; procedure newext; procedure delext; procedure checkcontext; // проверяет, нажат ли флажок, в случае успеха создает пункт контекста, // в случае неуспеха удаляет его procedure tform2.checkcontext; var reg:tregistry; // инициализируем переменную для работы с реестром begin // если флажок включен, то if context.Checked then begin // создаем класс для работы с реестром reg:=tregistry.Create; // устанавливаем начальный раздел reg.RootKey:=HKEY_CLASSES_ROOT; // создаем ключ типа "*Shellлюбое ваше слово" reg.OpenKey(?*ShellOpenWithMaksEditor?,true); // записываем в него строковой параметр типа "любое ваше слово" reg.WriteString(??,?OpenWithMaksEditor?); // записываем в него строковой параметр типа "пункт контекста" reg.WriteString(??,contextstr.Text); // закрываем ключ reg.CloseKey; // создаем ключ типа "*ShellOpenWithMaksEditorcommand" reg.OpenKey(?*ShellOpenWithMaksEditorcommand?,true); // записываем в него строковой параметр типа "command" reg.WriteString(??,?command?); // записываем в него также строковой параметр типа"адрес проги+" %1"" reg.WriteString(??,paramstr(0)+? "1%"?); // закрываем ключ reg.CloseKey; // вырубаем весь контекстный плагин нахрен, а настройки оставляем reg.Free; end else if not context.Checked then // иначе, если флажок отключен begin // инициализируем переменную для работы с реестром reg:=tregistry.Create; // устанавливаем начальнай раздел reg.RootKey:=HKEY_CLASSES_ROOT; // удаление ключа типа "*Shellлюбое слово" reg.DeleteKey(?*ShellOpenWithMaksEditor?); // закрываем реестр reg.CloseKey; // уходим reg.Free; end; end; Вот и последняя процедурка готова, как видно, здесь проверяется, включен ли флажок: если включен, то пункт, введенный в context, создается, если выключен, то пункт, который был предварительно создан - удаляется. Но мы еще забыли самое главное: ведь у нас есть только процедуры: а ведь их еще надо подставить куда-нибудь, чтобы они работали. Короче, подставляем процедуру, отвечающую за создание нового расширения (newext) в компонент createext (кнопка), функцию, отвечающую за удаление расширения (delext) в компонент deleteext (кнопка). А процедуру, ассоциирующую вашу прогу с .txt (fileass) и процедуру создания, удаления пункта контекста (checkcontext) в компонент Gues (кнопка) - вот она и пригодилась, она будет закрывать форму, предварительно сделав некоторые изменения, продекларированные выше! Ну конено все функции надо прописать в событии onclick кнопок: // реакция кнопки на клик мышью - создание расширения procedure TForm2.createextClick(Sender: TObject); begin newext; end; // реакция кнопки на клик мышью - удаление расширения procedure TForm2.deleteextClick(Sender: TObject); begin delext; end; // реакция кнопки на клик мышью - ассоциация с расширением .txt и создание/удаление пункта в контексте procedure TForm2.GuesClick(Sender: TObject); begin fileass; checkcontext; close; end; Ну вот в принципе и все... конечно можно было просто записать коды 4 вышесказанных процедур в события onclick кнопок, но это не есть самый удобный способ... И в заключение приведу весь код проги: interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,registry; type TForm2 = class(TForm) extension: TEdit; Gues: TButton; txt: TCheckBox; context: TCheckBox; contextstr: TEdit; createext: TButton; deleteext: TButton; procedure GuesClick(Sender: TObject); procedure createextClick(Sender: TObject); procedure deleteextClick(Sender: TObject); private procedure fileass; procedure newext; procedure delext; procedure checkcontext; public { Public declarations } end; var Form2: TForm2; implementation {$R *.dfm} procedure tform2.fileass; var reg:tregistry; begin reg:=tregistry.create; if txt.Checked then begin reg := TRegistry.Create; reg.RootKey := HKEY_CLASSES_ROOT; // создается ключ ".my" reg.OpenKey(?.txt?,true); // создается параметр со значением "myfile" reg.WriteString(??, ?!txt?); reg.CloseKey; // создается ключ "myfileDefaultIcon" reg.OpenKey(?!txtDefaultIcon?,true); // заносится значение параметра // "имя приложения, 0" - пиктограмма reg.WriteString(??, application.ExeName + ?, 0?); reg.CloseKey; // создается ключ "myfileshellopencommand" reg.OpenKey(?!txtshellopencommand?, true); // создается параметр со значением "имя файла %1" reg.WriteString(??, ParamStr(0) + ? "%1"?); reg.CloseKey; reg.Free; end; if not txt.Checked then begin reg := TRegistry.Create; reg.RootKey := HKEY_CLASSES_ROOT; // создается ключ ".my" reg.OpenKey(?.txt?,true); // создается параметр со значением "myfile" reg.WriteString(??, ?!txt?); reg.CloseKey; // создается ключ "myfileDefaultIcon" reg.OpenKey(?!txtDefaultIcon?,true); // заносится значение параметра "имя приложения, 0" - пиктограмма reg.WriteString(??, ?NOTEPAD.exe? + ?, 0?); reg.CloseKey; // создается ключ "myfileshellopencommand" reg.OpenKey(?!txtshellopencommand?, true); // создается параметр со значением "имя файла %1" reg.WriteString(??, ?NOTEPAD.exe? + ? "%1"?); reg.CloseKey; reg.Free; end; end; procedure tform2.newext; var reg:tregistry; // наша переменная для работы с реестром begin // инициализируем её reg:=tregistry.Create; // устанавливаем начальный раздел reg.RootKey:=Hkey_Classes_Root; // создаем ключ типа ".наше расширение" reg.OpenKey(?.?+extension.Text,true); // записываем в нем ссылку на ключ типа "!.наше расширение" reg.WriteString(??,?!?+extension.Text); // закрываем ключ reg.CloseKey; // создаем ключ типа "!.наше расширениеdefaulticon" reg.OpenKey(?!?+extension.Text+?defaulticon?,true); // записываем туда иконку нашей проги reg.WriteString(??,paramstr(0)+?, 0?); // выходим reg.CloseKey; // создаем ключ типа "!.наше расширениеshellopencommand" reg.OpenKey(?!?+extension.Text+?shellopencommand?,true); // записываем в него адрес проги reg.WriteString(??,paramstr(0)+? "1"?); // закрываем ключ reg.CloseKey; // убираемся, но настройки сохраняем reg.Free; end; procedure tform2.delext; var reg:tregistry; // инициализируем переменную для работы с реестром begin // создаем класс для работы с реестром reg:=tregistry.Create; // устанавливаем начальный раздел reg.RootKey:=HKEY_CLASSES_ROOT // удаляем ключ типа ".наше расширение" reg.DeleteKey(?.?+extension.Text); // удаляем ключ типа "!наше расширение" reg.DeleteKey(?!?+extension.Text); // закрываемся reg.CloseKey; // вырубаем все, но настройки сохраняем reg.Free; end; procedure tform2.checkcontext; var reg:tregistry; // инициализируем переменную для работы с реестром begin // если флажок включен, то if context.Checked then begin // создаем класс для работы с реестром reg:=tregistry.Create; // устанавливаем начальный раздел reg.RootKey:=HKEY_CLASSES_ROOT; // создаем ключ типа "*Shellлюбое ваше слово" reg.OpenKey(?*ShellOpenWithMaksEditor?,true); // записываем в него строковой параметр типа "любое ваше слово" reg.WriteString(??,?OpenWithMaksEditor?); // записываем в него строковой параметр типа "пункт контекста" reg.WriteString(??,contextstr.Text); // закрываем ключ reg.CloseKey; // создаем ключ типа "*ShellOpenWithMaksEditorcommand" reg.OpenKey(?*ShellOpenWithMaksEditorcommand?,true); // записываем в него строковой параметр типа "command" reg.WriteString(??,?command?); // записываем в него также строковой параметр типа"адрес проги"%1"" reg.WriteString(??,paramstr(0)+? "1%"?); // закрываем ключ reg.CloseKey; // вырубаем весь контекстный плагин нахрен, а настройки оставляем reg.Free; end else if not context.Checked then // иначе, если флажок отключен begin // инициализируем переменную для работы с реестром reg:=tregistry.Create; // устанавливаем начальнай раздел reg.RootKey:=HKEY_CLASSES_ROOT; // удаление ключа типа "*Shellлюбое слово" reg.DeleteKey(?*ShellOpenWithMaksEditor?); // закрываем реестр reg.CloseKey; // уходим reg.Free; end; end; procedure TForm2.GuesClick(Sender: TObject); begin fileass; checkcontext; end; procedure TForm2.createextClick(Sender: TObject); begin newext; end; procedure TForm2.deleteextClick(Sender: TObject); begin delext; end; end. Небольшое заключение, которое надо прочитать Я рассказал вам несколько полезных функций, но не учитывал те глюки, которые вы сразу заметите - например, я не прописывал событие oncreate и onclose формы (ну надо же сохранять настройки, отвечающие за активность флажков в Инифайлах, чтобы не было никаких изменение:). Это все я оставляю вам... на ужин...