Jak skojarzyć moją aplikację z rozszerzeniem danego typu
Adam Boduch
Trzeba dodać odpowiednie klucze do rejestru. Np. jeżeli chcesz skojarzyć swój program z plikiem *.txt to musisz dodać wartość do klucza w rejestrze.
var Reg : TRegistry;
begin
try
Reg := TRegistry.Create;
Reg.RootKey := HKEY_CLASSES_ROOT;
Reg.OpenKey('txtfile\shell\open\command', True);
Reg.WriteString('',Application.ExeName + ' "%1"');
Reg.CloseKey();
finally
Reg.Free;
end;
end;
Jeżeli chcesz zarejestrować swoje rozszerzenie i otwierać w swoim programie musisz zrobić tak samo tylko trochę inaczej :-)
Np.
var ExtMyFile : String; //rozszerzenie naszego pliku
Reg : TRegistry;
begin
//teraz rejestrujymy swoje rozszerzenie
//Najpierw podajemy nazwę rozszerzenia
ExtMyFile := 'xyz'; //to tak dla przykładu, może być zupełnie coś innego i
//nie koniecznie 3 literki
//Teraz definiujemy to rozszerzenie w rejestrze
try
Reg := TRegistry.Create;
Reg.RootKey := HKEY_CLASSES_ROOT;
Reg.OpenKey('.' + ExtMyFile, True); //tworzy klucz w rejestrze o nazwie dla nas np ".xyz"
Reg.WriteString('', AnsiUpperCase(ExtMyFile) + 'file'); //tworzy wartość zawierajaca
//nazwe klucza w rejestrze gdzie bedą
//znajdowały się dane na
//temat naszego pliku dla nas "XYZfile"
Reg.CloseKey(); //zamykamy ten klucz i idziemy dalej
Reg.OpenKey(AnsiUpperCase(ExtMyFile) + 'file', True); //tworze powyższy klucz
//teraz podaje opis naszego pliku
Reg.WriteString('','Plik programu ...'); //w miejsce kropek podajesz nazwę swojego programu
Reg.CloseKey(); //zamykamy ten klucz i idziemy dalej
//teraz przypisujemy plikowi ikonę
Reg.OpenKey(AnsiUpperCase(ExtMyFile) + 'file\DefaultIcon', True);
Reg.WriteString('',Application.ExeName + ',0'); //gdzie Application.ExeName to scieżka
//do pliku zawierającego ikonę w tym
//przypadku w tym przypadku jest to
//nazwa i ścieżka do Twojego
//programu ale może być to równie
//dobrze ścieżka do innego programu,
//ścieżka do ikony czy ścieżka
//do jakiejś biblioteki zarówno DLLki
//jak i ICLki a 0 to nr ikony, jeżeli
//plik ma więcej ikon nr może być inny
Reg.CloseKey(); //zamykamy ten klucz i idziemy dalej
//teraz tworzymy możliwość otwierania pliku w naszym programie
Reg.OpenKey(AnsiUpperCase(ExtMyFile) + 'file\shell\open', True);
Reg.WriteString('','&Otwórz'); //etykieta pozycji w menu kontekstowym
Reg.CloseKey();
Reg.OpenKey(AnsiUpperCase(ExtMyFile) + 'file\shell\open\command', True);
Reg.WriteString('',Application.ExeName + ' "%1"');
Reg.CloseKey();
//lub ewentualnie pozycje EDYTUJ w menu kontekstowym naszego pliku
Reg.OpenKey(AnsiUpperCase(ExtMyFile) + 'file\shell\edit', True);
Reg.WriteString('','&Edytuj');
Reg.CloseKey();
Reg.OpenKey(AnsiUpperCase(ExtMyFile) + 'file\shell\edit\command', True);
Reg.WriteString('',Application.ExeName + ' "%1"');
Reg.CloseKey();
//lub jeżeli chcemy otwierać nasze pliki typu np XYZ w jeszcze innym programie
Reg.OpenKey(AnsiUpperCase(ExtMyFile) + 'file\shell\Open2', True);
Reg.WriteString('','Otwórz &używając ...'); //w miejsce kropek nazwa innego programu
Reg.CloseKey();
Reg.OpenKey(AnsiUpperCase(ExtMyFile) + 'file\shell\Open2\command', True);
Reg.WriteString('',........ + ' "%1"'); //w miejsce kropek ścieżka do innego programu
Reg.CloseKey();
//na tej podstawie można dodawać wiele pozycji do menu kontekstowego
//naszego pliku
//może tam być również DRUKUJ
//przykład dla dowolnego programu
Reg.OpenKey(AnsiUpperCase(ExtMyFile) + 'file\shell\printin, True);
Reg.WriteString('',&Drukuj w ...'); //pozycja w menu kontekstowym
//a w miejsce kropek nazwa programu
Reg.CloseKey();
Reg.OpenKey(AnsiUpperCase(ExtMyFile) + 'file\shell\printin\command', True);
Reg.WriteString('',........ + ' /p "%1"'); //w miejsce kropek ścieżka do programu
//drukującego przy czym program wywoływany
//jest z parametrem /p - oznaczającym
//drukowanie więc program musi obsługiwać
//taki parametr
Reg.CloseKey();
//przykład dla drukowania w NOTATNIKU
Reg.OpenKey(AnsiUpperCase(ExtMyFile) + 'file\shell\printin, True);
Reg.WriteString('',&Drukuj w Notatniku'); //pozycja w menu kontekstowym
//a w miejsce kropek nazwa programu
Reg.CloseKey();
Reg.OpenKey(AnsiUpperCase(ExtMyFile) + 'file\shell\printin\command', True);
Reg.WriteString('','%SystemRoot%\system32\NOTEPAD.EXE /p %1');
//powyższa linia zawiera ścieżkę dostępu do Notatnika, jest ona poprawna
//dla Win NT (2000 i XP). Dla Win 9x i Me powinno być
//Reg.WriteString('','C:\Windows\NOTEPAD.EXE /p %1');
Reg.CloseKey();
finally
Reg.Free;
end;
end;
To by było na tyle. Jeżeli będą jakieś niejasności proszę wstawiać odpowiednie zapytania w komentarzach a ja w miarę możliwości postaram się na nie odpowiedzieć.
Powyższy przykład był pisany z głowy, na sucho. Nie był przetestowany w Delphi i może zawierać błędy.
Czekam na opinie
Polecam poczytanie artykułu Rejestry systemu Windows w dziale Delphi.
No taki tam gotowiec :P
A i wybacz adam ze wstawilem twoja procedurkę :D
No i znowu odsyłasz nas do innych artykółów.. OJOJOJ
i zapominasz o znacznikach < delphi >< /delphi >
:P
coś tu mi nie gra
Cholera, a jeżeli program ma swój własny typ plików i potrzzeba autoryzacji?
Dlaczego wyskakuje mi access violation?