Введение
В статье я подробно расскажу, как ассоциировать собственное приложение с определенным типом файлов. Чтобы при двойном клике по файлу запускалось это приложение и открывало выбранный файл.
Для ассоциации файлов с приложением есть специальные компоненты и модули, например TFileType. В статье я буду описывать, как это делается вручную.
Как все это работает?
Вообще все работает очень просто. Вся необходимая для этого информация заносится в реестр в определенную ветку. Откройте редактор реестра (Пуск -> Выполнить -> regedit) и зайдите в ветку HKEY_CLASSES_ROOT. Там Вы увидите все существующие в системе расширения. Там вы найдете и .txt и .bmp и многие другие знакомые расширения.
Давайте рассмотрим расширение .jpg. В нем у меня есть ветка OpenWithProgids, а в ней есть ACDSee Pro 2.0.jpg типа REG_SZ. Дальше переходим по ветке HKEY_CLASSES_ROOT\ACDSee Pro 2.0.jpg. В ней есть несколько веток. Рассмотрим те, которые нам понадобятся, это: DefaultIcon - путь к иконке которой будет отображаться файл в проводнике; shell\Open\command - какую программу открывать при двойном клике по файлу.
Необходимо знать, что при запуске программы в качестве параметра передается путь к файлу, который открывается. Поэтому нужно будет обрабатывать этот параметр.
Реализация
Пусть файл будет расширения .dev. Напишем процедуру для добавления необходимых значений в реестр. Не забудьте добавить в секцию uses модуль Registry для работы с реестром.
uses Registry, ShlObj;
...
var Reg: TRegistry;
...
procedure Associate;
var s:string;
begin
Reg:=TRegistry.Create; // создаем
Reg.RootKey := HKEY_CLASSES_ROOT; // указываем корневую ветку
Reg.OpenKey('.dev\OpenWithProgids\', true);
Reg.WriteString('TestApplication.dev', '');
Reg.OpenKey('\TestApplication.dev\DefaultIcon\', true);
s:=Application.ExeName+',0';
Reg.WriteString('', s);
Reg.OpenKey('\TestApplication.dev\Shell\Open\', true);
Reg.WriteString('', 'Открыть в TestApplication');
Reg.OpenKey('command\', true);
s:='"'+Application.ExeName+'" "%1"';
Reg.WriteString('', s);
Reg.Free;
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);
end;
Функция OpenKey открывает ветку, указанную в первом параметре. Второй параметр установлен в True, чтобы ветвь создалась, если она не существует.
Далее в переменной s формируем путь к иконке. В данном случае берется иконка с индексом 0 из exe приложения. Например, можно добавить в приложение еще одну иконку и использовать её для файлов программы, но можно указать и путь к .ico файлу.
TestApplication.dev я выбрал сам. Название этой ветки придумываете вы сами. Обычно пишется название программы и добавляется расширение, так как программа может работать с несколькими расширениями.
После добавления данных в реестр вызывается процедура SHChangeNotify, чтобы иконки обновились и настройки применились.
Далее напишем процедуру для снятия ассоциации:
procedure DeleteAssociate;
begin
Reg:=TRegistry.Create;
Reg.RootKey := HKEY_CLASSES_ROOT;
reg.DeleteKey('.dev');
reg.DeleteKey('TestApplication.dev');
Reg.Free;
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);
end;
Тут все еще проще - просто удаляем созданные ветки.
Обработка загрузки
Теперь осталось только обработать параметр, чтобы программа не просто загружалась, а еще и открывала файл. Все очень просто, во время создания формы считываем функцией ParamCount количество параметров и если их число не 0, то вызываем функцию загрузки, а в качестве входного параметра в эту функцию передаем путь к файлу, который нужно открыть. Щелкните по форме два раза, тем самым создавая, обработчик создания формы.
procedure TForm1.FormCreate(Sender: TObject);
begin
if ParamCount <> 0 then Load(ParamStr(1));
end;
Ну и нужно еще написать функцию загрузки файла. Добавьте TMemo на форму.
function Load(FName:string): boolean;
begin
Form1.Memo1.Lines.LoadFromFile(FName);
end;
Скорее всего, в вашем приложении функция будет значительно сложнее с обработкой на невозможность открытия файла и возвратом результата открытия. В данном случае я не буду это делать.
Добавьте два TButton на форму. По клику по первому будет выполняться ассоциация, а по второму снятие ассоциации.
Кликаем два раза по первой кнопке и приводим процедуру к такому виду.
procedure TForm1.Button1Click(Sender: TObject);
begin
Associate;
end;
Выполняем действия аналогичные описанным выше, но для второй кнопки.
procedure TForm1.Button2Click(Sender: TObject);
begin
DeleteAssociate;
end;
Ну вот и все. При попытке открытия файла с расширением .dev в Memo1 должно загрузиться содержимое файла.
Просмотров: 20067
Ассоциация .MP3 не работает Winamp не хочет меняется а если выбрать другой расширение то тогда работает
|
10. Сергей
(Xaker)
в общем путь то я нашёл но при закрытии программа не закрывается а выдаёт ошибку.. File Access Denied как можно исправить..?
Ответ: Сложно сказать, ничего не известно.
Создайте тему на форуме с подробным разъяснением проблемы. |
9. Сергей
(Xaker)
А что если мне нужно просто получить адрес файла через который запустили мою программу...? Если использую FName то программа не работает + ещё и не закрывается...
Ответ: А это разве не то?
"Необходимо знать, что при запуске программы в качестве параметра передается путь к файлу, который открывается." |
У меня другая проблема все .exe открываются через блокнот каквернуть всё обратно? (я просто ассоциацию сделал вирусу чтоб он открылся в блокноте, но его учать постигла все программы)
Ответ: ууу сложный случай, вирус видимо был .exe вот и все.
Попробовать экспортировать эту ветвь реестра с другой ОС и импортировать у себя. |
С обработкой нескольких выделенных файлов все же проблема: windows открывает их моей программой каждый отдельно (paramcount для каждой запущенной =1 ), а очень хотелось бы, чтобы paramcount совпадал с числом выделенных:) Пробовал записать в реестре не %1, а %l, но не помогает. Программа не MDI
Ответ: Думаю тут уже нужно просто после запуска программы, смотреть есть ли уже экземпляр приложения в памяти, если есть, то передавать другому экземпляру путь к файлу, а после принятия пути, открывать файл. А после передачи закрывать приложение. Тем самым будет только 1 экземпляр в котором все файлы.
|
Copyright © 2008 - 2018 Программирование на Delphi для начинающих и не только.
Полнота авторских прав на все материалы, опубликованные на сервере DelphiDevelop.ru принадлежит их авторам.
Перепечатка материалов разрешается с указанием авторства и гиперссылки на первоисточник информации.