Živě.cz o počítačích a internetu

Tipy a triky v Delphi, díl 73. - Přidání položky do kontextového menu systému

Jan Šindelář - 15.1.2003

Přidání položky do kontextového menu systému

Kontextové menu je velmi užitečnou pomůckou, která umožňuje uživatelům lepší práci a orientaci v systému. Pokud vše funguje jak má, po kliknutí pravým tlačítkem na nějaký objekt (obvykle soubor) se zobrazí kontextové menu, které nabízí právě ty funkce, které jsou pro daný soubor dostupné. To všichni jistě dobře znáte a této vlastnosti s úspěchem využívá nejen systém samotný, ale i různé další aplikace, které si do systému nainstalujete. Po kliknutí pravým tlačítkem na soubor tak můžete provést například antivirový test nebo soubor zkomprimovat. Jak tedy přidat do kontextového menu vlastní položky si ukážeme právě teď.

Stejně jako již mnohokrát, i v tomto případě použijeme systémový registr, kde jsou tyto informace uloženy. Budeme proto potřebovat knihovnu Registry. Jednoduchou úpravou či přidáním nové položky na vhodné místo registrů zařídíme, že se příslušný "příkaz" zobrazí za určitých definovaných podmínek v kontextovém menu. Takže konkrétněji, musíme se nejprve rozhodnout, jakého typu souboru se bude naše funkce týkat, dále jaká aplikace bude spuštěna a s jakým parametrem. Vše pak zapíšeme do příslušné větve v HKEY_CLASSES_ROOT. Kompletní zdrojový kód našeho příkladu následuje zde:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure AddMenu(FilePrefix, Menu, Command: string);
var
  reg: TRegistry;
  typ: string;
begin
  reg := TRegistry.Create;
  with reg do
  begin
    RootKey := HKEY_CLASSES_ROOT;
    OpenKey(`.` + FilePrefix, True);
    typ := ReadString(``);
    if typ = `` then
    begin
      typ := Fileprefix + `file`;
      WriteString(``, typ);
    end;
    CloseKey;
    OpenKey(typ + `\shell\` + Menu + `\command`, True);
    WriteString(``, command + ` "%1"`);
    CloseKey;
    Free;
  end;
end;

procedure DeleteMenu(Fileprefix, Menu: string);
var
  reg: TRegistry;
  typ: string;
begin
  reg := TRegistry.Create;
  with reg do
  begin
    RootKey := HKEY_CLASSES_ROOT;
    OpenKey(`.` + Fileprefix, True);
    typ := ReadString(``);
    CloseKey;
    OpenKey(typ + `\shell`, True);
    DeleteKey(Menu);
    CloseKey;
    Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  AddMenu(`bmp`, `Upravit v Malování`, `C:\Windows\pbrush.exe`);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  DeleteMenu(`bmp`, `Upravit v Malování`);
end;

end.

Náš příklad se skládá ze dvou procedur, které mají na starosti přidání a smazání záznamu z registru. Vše je řešeno parametricky, takže jsou procedury víceméně univerzální. První parametr funkce AddMenu je typ souboru, kterého se bude položka v menu týkat. Následuje samotný text, který bude v menu zobrazen a posledním parametrem je aplikace, která bude spuštěna. Jako parametr bude aplikaci předán právě název zvoleného souboru.

V naší ukázce najdete pro otestování funkčnosti dvě tlačítka. První přidá do menu položku, která se týká obrázků BMP, které budou spuštěny v aplikaci Malování. Druhé tlačítko záznam z registru opět odstraní pomocí funkce DeleteMenu.