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
Jak uzyskać prawidlowy parametr, czyli pełną ścierzkę dostępu do pliku z nazwą. Teraz wygląda ona tak :
D:\001MUZ
1\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 "/"