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

Tipy a triky v Delphi, díl 159. - drobné chuťovky

Jan Šindelář 20.10.2004

Dnešní díl bude po čase zase všehochuť čtyř nesouvisejících ale užitečných tipů, které se nevešly jinam.

Více jednou ranou

Nejprve se naučíme detekovat stisk několika kláves najednou. Obvykle není problém detekovat stisk dvou kláves, takže klasické kombinace CTRL+něco nebo ALT+něco jistě běžně používáte, protože mají interní podporu v událostech komponent. Pokud ale budeme potřebovat poněkud "brutálnější" kombinaci, třeba CTRL+F3+X, musíme použít trošku odlišnější způsob. Těch existuje jako obvykle víc, tohle je jeden z nich:

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var
  KeybState: TKeyboardState;
begin
  GetKeyboardState(KeybState);
  if ((KeybState[VK_CONTROL] and 128) = 128) and ((KeybState[VK_F3] and 128) = 128) and ((KeybState[Ord(`X`)] and 128) = 128) then ShowMessage(`Stisknuto CTRL+F3+X`);
end;

Jsme na NTFS?

Druhý tip je z jiného soudku. Ukážeme si, jak zjistit, zda-li se konkrétní soubor nachází na disku se souborovým systémem NTFS. Může se to někdy hodit, protože pokud se soubor nachází na NTFS disku, může být omezen přístupovými právy a je třeba s tím v programech počítat. Příslušná funkce využívá knihovnu ComObj a vypadá takto:

function IsNTFS(AFileName: string): Boolean;
var
  fso, drv: OleVariant;
begin
  IsNTFS := False;
  fso := CreateOleObject(`Scripting.FileSystemObject`);
  drv := fso.GetDrive(fso.GetDriveName(AFileName));
  IsNTFS := drv.FileSystem = `NTFS`
end;

Hledáme vypalovačku

Třetí dnešní tip se týká vypalovačky. Jednoduchým testem zjistíme, zda je v systému nainstalovaná vypalovací mechanika CD/DVD. Nebude to žádný složitý hardwarový test, požadovaná informace se totiž dá nalézt v registrech systému. Proto budeme také potřebovat knihovnu Registry a pak jen jednoduchým způsobem ověříme existenci určité větve. Postup je funkční pod Windows XP.

function CDRecorder: Boolean;
var
  reg: TRegistry;
begin
  reg := TRegistry.Create;
  try
    reg.RootKey := HKEY_CURRENT_USER;
    reg.OpenKey(`Software\Microsoft\Windows\CurrentVersion\Explorer\CD Burning`, False);
    Result := reg.ValueExists(`CD Recorder Drive`);
    reg.CloseKey;
  finally
    reg.Free;
  end;
end;

IE: Reloaded

Poslední tip pracuje s Internet Explorerem. Budeme tentokrát potřebovat knihovny MSHTML a SHDocVw a naše funkce slouží k znovunačtení stránky v právě otevřených oknech IE.

procedure TForm1.Button3Click(Sender: TObject);
var
ShellWindow: IShellWindows;
WB: IWebbrowser2;
spDisp: IDispatch;
IDoc1: IHTMLDocument2;
k: Integer;
begin
ShellWindow := CoShellWindows.Create;
for k := 0 to ShellWindow.Count do
begin
  spDisp := ShellWindow.Item(k);
  if spDisp = nil then Continue;
  spDisp.QueryInterface(iWebBrowser2, WB);
  if WB <> nil then
  begin
    WB.Document.QueryInterface(IHTMLDocument2, iDoc1);
    if iDoc1 <> nil then
    begin
      WB := ShellWindow.Item(k) as IWebbrowser2;
      WB.Refresh;
    end;
  end;
end;
end;

A to už je z dnešního mixu úplně všechno. Ukázkový projekt s použitím všech uvedených funkcí můžete stahovat zde.