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

Я, уже в который встречаю вопрос о том, как ассоциировать расширение файла со своей программой. То есть, как заставить запускаться свою программу и открывать файл определенного расширения.

Начну с того, что это можно сделать тремя различными способами:

  • 1. Самый простой способ:
  • В проводнике выбрать и выделить некоторый файл. Затем, предварительно зажав клавишу Shift, кликнуть правой кнопкой мыши и выбрать пункт контекстного меню "Открыть с помощью...", а далее просто выбрать программу из предложенного списка или указать свою.

  • 2. Самый не хороший способ:
  • Зайти в редактор реестра и выбрать "улей" HKEY_CLASSES_ROOT. В этом "улье" найти интересующее вас расширения файла и просто его удалить. Далее так же через проводник попытаться открыть файла, с только что удаленным из реестра расширением. На экране точно так же появиться окно "Открыть с помощью...", в котором выбирается программа из предложенного списка или указываем свою.

  • 3. Программный способ:
  • А здесь я сам провел небольшой анализ реестра и понял принцип ассоциации файлов в Windows. Все в том же "улье" HKEY_CLASSES_ROOT располагаются все расширения файлов, известные системе. Если выбрать некоторое расширение, например, *.ttf, то в правой части редактора реестра можно увидеть значение по умолчанию, то есть в данном случае ttffile. Далее если перейти к разделу ttffile, то он представляет собой следующую структуру: ttffile -> Shell -> Open -> Command, где как раз и указан путь к программе, которая и будет открыть все файлы с расширением *.ttf. После этого я решил сам программно зарегистрировать новое расширение в системе, и закрепить за ним свою, ранее написанную программу. И вот что у меня получилось.

    procedure TForm1.Button1Click(Sender: TObject);
    Var Reg : TRegistry;
    begin
     Reg:=TRegIniFile.Create;
     Reg.RootKey:=HKEY_CLASSES_ROOT; // Открываем нужный "улей" системного реестра
    
     // Создаем новое расширение .ttt
     If NOT Reg.KeyExists('.ttt') Then Reg.CreateKey('.ttt');
     If Reg.OpenKey('.ttt', False) Then
       Begin
         Reg.WriteString('', 'ttt_text_file');
         Reg.CloseKey;
       End;
    
     // Cоздаем значение по умолчанию ttt_text_file
     If NOT Reg.KeyExists('ttt_text_file') Then
       Begin
         Reg.CreateKey('ttt_text_file');
         If Reg.OpenKey('ttt_text_file', False)
           Then Reg.WriteString('', 'Файл TTT');
         Reg.CloseKey;
       End;
    
     // Cоздаем значение ttt_text_file\shell
     If NOT Reg.KeyExists('ttt_text_file\shell') Then
       Begin
         Reg.CreateKey('ttt_text_file\shell');
         Reg.CloseKey;
       End;
    
     // Cоздаем значение ttt_text_file\shell\open
     If NOT Reg.KeyExists('ttt_text_file\shell\open') Then
       Begin
         Reg.CreateKey('ttt_text_file\shell\open');
         If Reg.OpenKey('ttt_text_file\shell\open', False)
           Then Reg.WriteString('', '');
         Reg.CloseKey;
       End;
    
     // Cоздаем значение ttt_text_file\shell\open\command
     If NOT Reg.KeyExists('ttt_text_file\shell\open\command') Then
       Begin
         Reg.CreateKey('ttt_text_file\shell\open\command');
         If Reg.OpenKey('ttt_text_file\shell\open\command', False)
           // Указываем нашу программу
           Then Reg.WriteString('', Application.ExeName + ' "%1"');
         Reg.CloseKey;
       End;
    
     Reg.Free;
    end;
    

    А при запуске программы мы просто будем загружать содержимое файла в редактор TMemo. Но перед этим узнаем полное имя файла и путь к нему.

    procedure TForm1.FormCreate(Sender: TObject);
    Var I        : Integer;
        NameFile : String;
    begin
     Try
       // Получаем полное имя файла и загружаем его в редактор
       If ParamCount > 0 Then
         For I:=1 To ParamCount Do NameFile:=ParamStr(I);
       If NameFile <> '' Then Memo1.Lines.LoadFromFile(NameFile);
     Except
       ShowMessage('Ошибка загрузки файла !');
     End;
    end;
    

    Вернуться в оглавление
    Вернуться на главную страницу
    Hosted by uCoz