Programowanie w języku Delphi » Gotowce

Własne rozszerzenie

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                      *)
(*              [email protected]                               *)
(*                                                              *)
(****************************************************************)
 
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

ppwys 2006-09-13 01:40

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

mike_p 2005-06-29 20:05

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

Szczawik 2005-04-10 17:23

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);

MARTINEZO 2004-07-12 22:33

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.

Drajwer 2003-06-29 15:09

przydaly by sie "/"