СообЧа > База Знаний > Программирование > Delphi

Вопрос

Каким образом можно привязать написанное на Delphi приложение к определенному типу файлов (к примеру, чтобы при двойном клике на текстовый файл он открывался не в Блокноте, а в моей программе)?

Ответ

Вот статейка на эту тему.

Ассоциации файлов

В основном вам необходимо добавить два ключа в улей регистра HKEY_CLASSES_ROOT. Зарегистрируете в корне ваше расширение типа ".ext» (создаете ключ с именем расширения):
HKEY_CLASSES_ROOT\.ext\
и запишите в строке «default» созданного ключа «внутреннее имя» вашего типа файлов — например, MyApp.Document:
HKEY_CLASSES_ROOT\.ext\Default = «MyApp.Document»

Затем создайте другой ключ с этим именем:
HKEY_CLASSES_ROOT\MyApp.Document\

Создайте подключ с именем «shell», в нем другой подключ с именем «open» и в «open», в свою очередь, еще один подключ с именем «command». Значение по умолчанию (default) — путь и имя вашего приложению с ключом "%1», представляющим параметр «имя файла», позволяя системе подставлять подставлять вызванный файл:
HKEY_CLASSES_ROOT\MyApp.Document\shell\ open\command\Default = "C:\myapp\myapp.exe %1"

Все манипуляции в коде производятся с помощью объекта TRegistry или при использовании InstallShield, который сделает это за вас автоматически. Я должен посоветовать вам использовать оба пути, поскольку пользователь может внести в регистры всякий мусор.

Вот еще один совет:

Самый простой путь достижения цели — модифицировать секцию Extensions в win.ini-файле, расположенном с директории Windows. Это также работает под Win 95, автоматически обновляя регистры при перезапуске системы. Взгляните на секцию Extensions win.ini-файл, а для определения формата записи. Поместите IniFiles в секцию используемых модулей и создайте код подобно этому:

var INIFile: TIniFile;
begin try
INIFile := TInifile.Create('WIN.INI');
INIFile.WriteString('Extensions','txt','c:\windows\notepad.exe ↑.txt');
finally
INIFile.Free;
end;
end;


Это ассоциирует файлы с расширением *.txt с Записной Книжкой (Notepad) Windows. Например, для ассоциации вашего приложения MyApp с каталогом расположения c:\MyApps с файлами, имеющими расширение *.MAP, необходимо выполнить следующее:

var INIFile: TIniFile;
begin
try
INIFile := TInifile.Create('WIN.INI');
INIFile.WriteString('Extensions','map','c:\myapps\myapp.exe ↑.map');
finally
INIFile.Free;
end;
end;


Это будет работать как в Win 3.11, так и в Win 95 и избавит вас от работы с регистрами в Win 95. Не уверен насчет Win NT (или Win98), поскольку у меня нет возможности протестировать это дома. Имейте в виду, что все вышеописанное — только часть проблемы, т.к. приложение после всех вышеуказанных манипуляций еще должно этот файл открыть. Для этого вы должны прочесть ParamStr(1), содержащий полный путь к файлу, выбранному пользователем, и должным образом загрузить его в свое приложение.

Дополнение

Михаил Шпанер продолжает эту тему:

Чтобы описание типа файлов появилось в списке «Типы файлов» Windows 98, укажите в параметре «default» ключа
'HKEY_CLASSES_ROOT\MyApp.Document\' краткое описание типа файлов (файл My App).
Чтобы ассоциированные файлы имели соответствующую приложению иконку, нужно в параметре «default» ключа
'HKEY_CLASSES_ROOT\ MyApp.Document\DefaultIcon\' указать путь к иконке. Иконки соответствующих файлов обновятся после перезагрузки Windows. Windows 98 делает это без перезагрузки системы, но как это сделать я не знаю, может быть кто-то подскажет.

Пример кода (проверено в Delphi5, Windows98):

Добавьте 'Registry' в строку Uses.

Объявите переменную 'RegFile':
var RegFile : TRegIniFile;
begin
RegFile:=TRegIniFile.Create;
RegFile.RootKey:=HKEY_CLASSES_ROOT; //устанавливаем текущий ключ
RegFile.WriteString('.ext','','MyApp.Document'); // определяем расширение
RegFile.WriteString('MyApp.Document','','Описание файлов');//Описание ассоциированных файлов (для списка «Типы файлов» Windows 98).
RegFile.WriteString('MyApp.Document \DefaultIcon','','Путь к иконе для файлов'); //устанавливаем икону для ассоциированных файлов
//Исполняемый файл (полный путь)
RegFile.WriteString(' MyApp.Document \Shell\Open\Command','','исполняемый файл "%1» ');
RegFile.CloseKey;
RegFile.Free;
End;


Из конференции Expert_FAQ



Copyright © 2000-2004 Сообщество Чайников
Контактная информация