Подписаться на RSS рассылку
Главная » Статьи по Delphi » Файлы » Ассоциация файлов с программой

Ассоциация файлов с программой

Автор: Борисов С. А.

Tweet

Введение

В статье я подробно расскажу, как ассоциировать собственное приложение с определенным типом файлов. Чтобы при двойном клике по файлу запускалось это приложение и открывало выбранный файл.

Для ассоциации файлов с приложением есть специальные компоненты и модули, например 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

Обсудить на форуме

0   Спам
(17.05.2011)
14. Алекс
Ассоциация .MP3 не работает Winamp не хочет меняется а если выбрать другой расширение то тогда работает

0   Спам
(19.03.2011)
13. Сергей (Xaker)
правда если файл уже зарегистрирован другой программой то ассоциация не сработает(

0   Спам
(19.03.2011)
12. Сергей (Xaker)
Ассоциация отлично работает спасибо, и всё вроде хорошо но назрел вопрос..

Как можно "добавить в приложение еще одну иконку" ? её нужно загрузить в файл ресурсов или ещё что? подскажите пожалуйста)


0   Спам
(15.07.2010)
11. Александр Чернявский
ассоциация не выходит

0   Спам
(21.02.2010)
10. Сергей (Xaker)
в общем путь то я нашёл но при закрытии программа не закрывается а выдаёт ошибку.. File Access Denied как можно исправить..?
Ответ: Сложно сказать, ничего не известно.
Создайте тему на форуме с подробным разъяснением проблемы.

0   Спам
(21.02.2010)
9. Сергей (Xaker)
А что если мне нужно просто получить адрес файла через который запустили мою программу...? Если использую FName то программа не работает + ещё и не закрывается...
Ответ: А это разве не то?
"Необходимо знать, что при запуске программы в качестве параметра передается путь к файлу, который открывается."

0   Спам
(10.12.2009)
8. levwv
У меня другая sad проблема все .exe открываются через блокнот каквернуть всё обратно? (я просто ассоциацию сделал вирусу чтоб он открылся в блокноте, но его учать постигла все программы)
Ответ: ууу сложный случай, вирус видимо был .exe вот и все.
Попробовать экспортировать эту ветвь реестра с другой ОС и импортировать у себя.

0   Спам
(16.11.2009)
7. Евгений
а у меня пишет failed to set data for 'editor.exe'

0   Спам
(11.11.2009)
6. melina
спасибо , ооочень помогло !! smile

0   Спам
(03.11.2009)
5. maksim_larionov
С обработкой нескольких выделенных файлов все же проблема: windows открывает их моей программой каждый отдельно (paramcount для каждой запущенной =1 ), а очень хотелось бы, чтобы paramcount совпадал с числом выделенных:) Пробовал записать в реестре не %1, а %l, но не помогает. Программа не MDI
Ответ: Думаю тут уже нужно просто после запуска программы, смотреть есть ли уже экземпляр приложения в памяти, если есть, то передавать другому экземпляру путь к файлу, а после принятия пути, открывать файл. А после передачи закрывать приложение. Тем самым будет только 1 экземпляр в котором все файлы.

1 2 »

Имя *:
Email:


Код *:

Copyright © 2008 - 2018 Программирование на Delphi для начинающих и не только.

Полнота авторских прав на все материалы, опубликованные на сервере DelphiDevelop.ru принадлежит их авторам.

Перепечатка материалов разрешается с указанием авторства и гиперссылки на первоисточник информации.