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

Tipy a triky v Delphi, díl 78. - Použití animovaného kurzoru; Seznam souborů ve schránce

Jan Šindelář - 19.2.2003

Použití animovaného kurzoru

Jestliže chcete vaši aplikaci graficky opravdu vyšperkovat, určitě se nespokojíte s kurzory, které používá samotný systém, ale můžete si vytvořit či stáhnout kurzory jiné (řeč je teď o ukazatelích myši, tedy šipka, přesýpací hodiny atd..). Obzvlášť efektně mohou zapůsobit kurzory animované a jejich použití si právě nyní ukážeme. Ne že bych snad byl nějaký jejich příznivce, osobně nic proti obyčejným systémovým kurzorům nemám, ale jsou jisté typy aplikací, kde se podobné efekty mohou hodit.

Tak tedy, celá záležitost je vlastně velmi jednoduchá a vše pochopíte z následujícího kratičkého příkladu. Jedná se klasicky o událost stisku tlačítka jak jsme v našich ukázkách zvyklí a po jeho stisknutí se změní typ kurzoru pro formulář aplikace. Ale pozor, pouze pro formulář a všem ostatním objektům (tedy i samotnému tlačítku) zůstane kurzor původní. Můžete tak každému jednotlivému objektu přiřadit jiný typ kurzoru.

procedure TForm1.Button1Click(Sender: TObject);
var
  CurHandle: THandle;
begin
  CurHandle := LoadImage(0, `C:\windows\cursors\Hourglas.ani`, IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE or LR_LOADFROMFILE);
  if CurHandle = 0 then ShowMessage(`Chyba! Kurzor nebyl načten!`)
  else
    begin
      Screen.Cursors[1] := CurHandle;
      Form1.Cursor := 1;
    end;
end;

Jak vidíte, je třeba pochopitelně přesně specifikovat cestu k příslušnému souboru .ani, který kurzor obsahuje. V naší ukázce je použit kurzor animovaných přesýpacích hodin, které jsou přímo součástí Windows (zde konkrétně Windows 98). Cestu si tedy upravte podle potřeby.

Seznam souborů ve schránce

Druhý dnešní tip bude zase z jiného soudku. Ukážeme si, jak ze schránky získat seznam souborů, které obsahuje. Pokud si v Průzkumníku nebo jiném souborovém správci označíte jeden či více souborů a zkopírujete je do schránky, nebude do schránky zkopírován obsah těchto souborů, ale pouze jejich cesty. Když poté použijete kdekoliv na disku příkaz "Vložit", systém se pouze podívá do schránky na uložené cesty a soubory ze zdroje prostě zkopíruje. Tím se šetří čas a data se přesouvají pouze jednou. Má to bohužel ten vedlejší efekt, že pokud stihnete soubor ze zdrojového umístění smazat či přesunout ještě před tím, než použijete příkaz "Vložit", dojde k chybě. Ale zpět k našemu příkladu. Abychom mohli implementovat cosi jako vlastní příkaz "Vložit", budeme potřebovat znát seznam souborů ve schránce i s jejich cestami. A to si právě teď ukážeme.

Příklad je opět vytvořen jako událost stisku tlačítka, takže jej přidejte na formulář a kód vložte do události OnClick. Ještě přidejte na formulář komponentu Memo, do které bude seznam souborů vypsán. Příklad dále využívá jednotek Clipbrd a ShellAPI, takže je nezapomeňte přidat do seznamu.

procedure TForm1.Button2Click(Sender: TObject);
var
  f: THandle;
  buffer: array [0..MAX_PATH] of Char;
  i, numFiles: Integer;
begin
  if not Clipboard.HasFormat(CF_HDROP) then Exit;
  Clipboard.Open;
  try
    f := Clipboard.GetAsHandle(CF_HDROP);
    if f <> 0 then
    begin
      numFiles := DragQueryFile(f, $FFFFFFFF, nil, 0);
      Memo1.Clear;
      for i := 0 to numfiles - 1 do
      begin
        buffer[0] := #0;
        DragQueryFile(f, i, buffer, SizeOf(buffer));
        Memo1.Lines.Add(buffer);
      end;
    end;
  finally
    Clipboard.Close;
  end;
end;

Takto získaný seznam pak můžete použít k práci s danými soubory, ale nezapomeňte vždy testovat jejich skutečnou existenci kvůli způsobu práce se schránkou popsaným výše.