Własne rozszerzenie

Adam Boduch

Często
dostaje listy z pytaniem w jaki sposób zarejestrować, a następnie używać
własne rozszerzenie. Nie jest to nic trudnego - wystarczy tylko, że
potrafisz obsługiwać rejestr. O rejestrze możesz poczytać w artykule
Rejestry. W naszym programie do
menu wywoływanego prawym klawiszem myszy dodamy jeszcze jedną bezużyteczną
pozycje. Tak dla bajeru :)

Zacznijmy więc. Oto
kod, który rejestruje rozszerzenie - przyjrzyj się jemu, a ja zaraz go
omówię:

uses Registry;

procedure TMainForm.Button1Click(Sender: TObject);
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create;  // otworz rejestr
  try
    try
      Reg.RootKey := HKEY_CLASSES_ROOT; // odpowiedni klucz otworz :)
      Reg.OpenKey( // Utworz klucz
      '.rzi', True);
      Reg.WriteString('', 'RziFile'); // dodaj typ klucza
      Reg.CloseKey;  // zamknij klucz
      Reg.OpenKey(  // stworz klucz oznaczajacy ikone
      'rzifileDefaultIcon', True);
      Reg.WriteString('', Application.ExeName + ',1');
      Reg.CloseKey;
      Reg.OpenKey(  // stworz kolejny...
      'rzifileshellopencommand', True);  // akcja po nacisnieciu
      Reg.WriteString('','"'+Application.ExeName+'" "%1"');// wpisz sciezke programu
      Reg.CloseKey;
      Reg.OpenKey(
      'rzifileshellEdytuj', True); // stworz nowe pozycje - Edyuj
      Reg.WriteString('', 'Otwórz w programie...'); // tekst pozycji
      Reg.CloseKey;
      Reg.OpenKey(  // stworz akcje po nacisnieciu
      'rzifileshellEdytujcommand', True);
      Reg.WriteString('', '"' + Application.ExeName + '" "%1"'); // dopisz sciezke programu
    except
      raise Exception.Create('Błąd! Wystąpił błąd wzwiązany z rejestrem!');
    end;
  finally
    Reg.Free;
  end;
  Application.MessageBox(
  'Rejestracja udała się! Stwórz teraz jakiś plik z rozszerzeniem *.rzi');
end;

Najpierw w rejestrze rejestrujemy rozszerzenie .rzi. Następnie
dodajemy do niego nową wartość, która opisuje nazwę nowego
rozszerzenia - w naszym wypadku jest to: RziFile. Następnie tworzymy
nowy klucz o tej właśnie nazwie, czyli - RziFile. Tutaj teraz dodawać
będziemy akcje, czyli co zrobić ma system jeżeli użytkownik naciśnie
na ikonę z tym właśnie rozszerzeniem. Będzie to na początek opis
ikony rozszerzenia, czyli tworzymy podklucz o nazwie DefaultIcon. PóĽniej
wpisujmy wartość - ikona rozszerzenia będzie taka sama jak ikona
programu. PóĽniej na tej samej zasadzie tworzymy nową wartość do
menu wywoływanego spod prawego klawisza myszy.

Dobra - teraz procedura usuwająca klucze z rejestru. Oto ona:

procedure TMainForm.Button2Click(Sender: TObject);
var
  Reg: TRegistry;
begin
{  usuwa rozszerzenie }
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CLASSES_ROOT;
    Reg.DeleteKey('.rzi');  // usun klucz
    Reg.DeleteKey('rzifile');
  finally
    Reg.Free;
  end;
end;


//Tutaj nie ma nic specjalnie do omawiania. 



//Oto cały kod programu:



(****************************************************************)
(*                                                              *)
(*              Copyright (c) 2001 by Adam Boduch               *)
(*              http://PROGRAMOWANIE.OF.PL                      *)
(*              boduch@poland.com                               *)
(*                                                              *)
(****************************************************************)

unit MainFrm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls;

type
  TMainForm = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
  end;

var
  MainForm: TMainForm;

implementation

{$R *.DFM}

uses Registry;

procedure TMainForm.Button1Click(Sender: TObject);
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create;  // otworz rejestr
  try
    try
      Reg.RootKey := HKEY_CLASSES_ROOT; // odpowiedni klucz otworz :)
      Reg.OpenKey( // Utworz klucz
      '.rzi', True);
      Reg.WriteString('', 'RziFile'); // dodaj typ klucza
      Reg.CloseKey;  // zamknij klucz
      Reg.OpenKey(  // stworz klucz oznaczajacy ikone
      'rzifileDefaultIcon', True);
      Reg.WriteString('', Application.ExeName + ',1');
      Reg.CloseKey;
      Reg.OpenKey(  // stworz kolejny...
      'rzifileshellopencommand', True);  // akcja po nacisnieciu
      Reg.WriteString('','"'+Application.ExeName+'" "%1"');// wpisz sciezke programu
      Reg.CloseKey;
      Reg.OpenKey(
      'rzifileshellEdytuj', True); // stworz nowe pozycje - Edyuj
      Reg.WriteString('', 'Otwórz w programie...'); // tekst pozycji
      Reg.CloseKey;
      Reg.OpenKey(  // stworz akcje po nacisnieciu
      'rzifileshellEdytujcommand', True);
      Reg.WriteString('', '"' + Application.ExeName + '" "%1"'); // dopisz sciezke programu
    except
      raise Exception.Create('Błąd! Wystąpił błąd wzwiązany z rejestrem!');
    end;
  finally
    Reg.Free;
  end;
  Application.MessageBox('Rejestracja udała się! Stwórz teraz jakiś plik z rozszerzeniem *.rzi');
end;

procedure TMainForm.Button2Click(Sender: TObject);
var
  Reg: TRegistry;
begin
{  usuwa rozszerzenie }
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CLASSES_ROOT;
    Reg.DeleteKey('.rzi');  // usun klucz
    Reg.DeleteKey('rzifile');
  finally
    Reg.Free;
  end;
end;

procedure TMainForm.FormShow(Sender: TObject);
begin
{  jezeli uzytkownik kliknie na plik z rozszerzeniem - otworz program }
  if ParamCount > 0 then
    Panel1.Caption := ParamStr(1);
end;

end.

No tak, ale samo dodanie rozszerzenia nie wystarczy. Teraz
rozszerzenie jest jedynie skojarzone z programem. Ale co ma program robić
po otwarciu jeżeli użytkownik kliknie na ikonę programu? To właśnie
zapisane jest w procedurze OnShow. ParamStr(1) zawiera pełną ścieżkę
naciśniętego pliku - np. C:plik.rzi

5 komentarzy

Jak uzyskać prawidlowy parametr, czyli pełną ścierzkę dostępu do pliku z nazwą. Teraz wygląda ona tak :
D:\001MUZ1\00DOSP1\01PYTA~1\

Czemu on zwraca ParamString(1) w takiej dziwnej postaci? (Bo ja bym potrzebował takiej prawidłowej ścieżki do wczytania pliku)

Ja bym jeszcze po przypisaniu ikony (rzifile\DefaultIcon) proponował wymuszenie przebudowania pamięci podręcznej ikon shell'a:

SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST or SHCNF_FLUSHNOWAIT, nil, nil);

Jest jeden znaczący błąd.
Nazwy kluczy (chodzi o składnie) są źle napisane: jest 'rzifileshellopencommand' , a powinno być 'rzifile\shell\open\command.itd
Wtedy to wszystko działa panie Adamie.

MARTINEZO.

przydaly by sie "/"