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

Tipy a triky v Delphi, díl 10. - Aktualizace aplikace přes Internet; Zobrazení souborů včetně jejich asociovaných ikon; Práce se schránkou Windows – text

Jan Šindelář - 26.9.2001

Aktualizace aplikace přes Internet

Minule jsme si ukázali, jak stáhnout z Internetu soubor na svůj disk. Také jsme si slíbili, že se naučíme, jak zjistit, zda je na webu již aktuálnější verze programu než ta, kterou máme (nebo spíše uživatelé našich aplikací) nainstalovánu. Proto se teď budeme věnovat tomuto bezesporu užitečnému tématu.

Způsobů řešení je jistě celá řada, ale pokusím se vám nastínit jeden z těch jednodušších, který navíc vychází z minulého příkladu, takže už to nebude taková novinka. Pokud jste minulý díl nečetli, neváhejte a podívejte se na příklad, který popisuje způsob jak stáhnout soubor z Internetu, protože ten právě dnes využijeme. Vlastně ani není potřeba vám předkládat nějaký zdrojový kód, protože vám popíši pouze určitý návrh, jehož implementace závisí na každém z vás. Postup bych rozdělil na dvě části – na tu část, která se týká serveru s vaší aplikací (novou verzí), a na samotnou aplikaci jako takovou (nainstalovanou na disku).

Nejprve vytvoříme malý textový soubor (může být i binární, viz dále), který bude obsahovat informaci o aktuální verzi. Jako zcela nejjednodušší řešení je textový soubor, který bude obsahovat pouze číslo aktuální (nejnovější) verze. Způsob číslování závisí čistě na vás. Buď můžete použít vlastní jednoduché číslování (např. 0,1,2...n), nebo "klasický" způsob číslování verzí (např. 4.54 apod.). Takto vytvořený soubor umístíte na server k vaší stránce s aplikací a při vytvoření každé nové verze svého programu nesmíte zapomenout aktualizovat také tento informační soubor s verzí.

A druhá část? Teď už je to velmi jednoduché. Předpokládejme, že váš program, který mají uživatelé u sebe nainstalován, "ví" o svojí verzi. Buď tuto informaci uložíte přímo do nějaké konstanty programu, nebo si to aplikace zjistí sama (stejně jako to dělá systém, pokud kliknete na spustitelný soubor pravým tlačítkem a necháte si zobrazit jeho vlastnosti, konkrétně záložku "Verze"). Pokud budete chtít zjistit, zda se na serveru nachází novější verze než ta nainstalovaná, stačí pouze stáhnout (např. do adresáře "TEMP") onen informační soubor způsobem popsaným v minulém díle, přečíst z něj číslo nejnovější verze a porovnat ji s verzí programu na disku. Pokud zjistíte, že je verze již zastaralá, můžete uživateli nabídnout stažení novější verze.

Výhodou tohoto řešení je také to, že do onoho informačního souboru můžete umístit prakticky libovolné informace ve formátu, který vám nejlépe vyhovuje (můžete např. použít binární soubor místo textového). Může obsahovat různé informace o novinkách a další doplňující data, která můžete uživateli zobrazovat. Proto zde také neuvádím žádný zdrojový kód, neboť variant je celá řada. Důležitá je pouze celkem jednoduchá myšlenka, která je snad každému jasná. Samozřejmě by bylo elegantnější nestahovat celý soubor, ale stáhnout si jen příslušný text (který se na disk neuloží, pouze do paměti) z daného souboru, nicméně takto popsaný způsob je natolik jednoduchý, že jej zvládne každý, protože se prakticky jedná jen o čtení dat ze souboru.

Na závěr snad jen drobnost týkající se adresáře TEMP. Neodpustím si připomínku, že byste neměli zapomenout na odstranění všeho, co sem uložíte. Není nic horšího než to, když některé (i profesionální) aplikace odloží do tohoto adresáře někdy i desítky MB, které poté nesmažou.

Zobrazení souborů včetně jejich asociovaných ikon

Další věcí, kterou se dnes naučíme, bude zobrazení ikony daného souboru (případně příslušné asociované ikony) a informace o typu souboru. V naší ukázce se soubory ze zvoleného adresáře vypíší do ListView, a to včetně ikon a informací. Pro fungování příkladu musíte na formulář přidat zmiňovaný ListView a ImageList, kam se ukládají ikony, a také bude potřeba knihovna ShellApi, takže již ani nebudu připomínat, kam ji máte napsat.

procedure ZobrazSoubory;
const
  sPath = `c:\windows\`;
var
  i:        integer;
  Icon:      TIcon;
  SearchRec: TSearchRec;
  ListItem:  TListItem;
  FileInfo:  SHFILEINFO;
begin
  ListView1.SmallImages := ImageList1;
  ListView1.ViewStyle  := vsReport;
  ListView1.Columns.add;
  ListView1.Columns.add;
  Icon := TIcon.Create;
  try
    ListView1.items.BeginUpdate;
    i := FindFirst(sPath + `*.*`, faAnyFile, SearchRec);
    while i = 0 do
      begin
        application.ProcessMessages;
        with ListView1 do
        begin
        if ((SearchRec.Attr and FaDirectory <> FaDirectory) and (SearchRec.Attr and FaVolumeId <> FaVolumeID)) then
        begin
          ListItem := ListView1.items.add;         
          SHGetFileInfo(PChar(sPath + SearchRec.Name), 0, FileInfo, SizeOf(FileInfo), SHGFI_DISPLAYNAME);
          Listitem.Caption := FileInfo.szDisplayName;         
          SHGetFileInfo(PChar(sPath + SearchRec.Name), 0, FileInfo, SizeOf(FileInfo), SHGFI_TYPENAME);
          ListItem.SubItems.Add(FileInfo.szTypeName);         
          SHGetFileInfo(PChar(sPath + SearchRec.Name), 0, FileInfo, SizeOf(FileInfo), SHGFI_ICON);
          icon.handle        := FileInfo.hIcon;
          ListItem.ImageIndex := ImageList1.AddIcon(Icon);
        end;
      end;
      i := FindNext(SearchRec);
    end;
  finally
    ListView1.items.EndUpdate;
    Icon.Free;
  end;
end;

V konstantě je uložena cesta k adresáři se soubory. Nejprve se ListView přepne do módu "Report" (čímž nám připomíná obdobný výpis souborů z různých souborových manažerů) a přidají se dva sloupce pro jméno a typ. Poté se procházejí všechny soubory v daném adresáři a postupně se zjišťuje název souboru, jeho typ a konečně i samotná ikona, která se uloží do ImageListu a příslušný index je přiřazen k danému souboru.

Tento způsob je vhodný spíše pro zjišťování údajů o menším množství souborů (i když náš příklad může svádět k opaku), protože pokud byste chtěli vytvořit nějaký souborový manažer, vyžádala by si tato funkce jisté (zejména rychlostní) optimalizace.

Práce se schránkou Windows – text

Na závěr si dnes ukážeme, jak zkopírovat do schránky požadovaný text nebo jak ze schránky získat ten, který je tam aktuálně uložen. Budeme k tomu používat knihovnu ClipBrd a napíšeme si jednu proceduru a jednu funkci pro zápis a čtení, jejichž parametrem bude řetězec, který buď zapisujeme, nebo který se nám naopak vrací. Napíšeme si rovněž proceduru na smazání obsahu schránky.

procedure DoSchranky(VkladanyText: string);
var
  A: array[0..255] of char;
begin
  StrPCopy(A, VkladanyText);
  Clipboard.SetTextBuf(A);
end;


function ZeSchranky : string;
begin
if Clipboard.HasFormat(CF_TEXT) then result := Clipboard.AsText
else result := `schranka je prazdna !`;
end;
end;


procedure SmazSchranku;
begin
Clipboard.Clear;
end;

V proceduře pro vložení dat do schránky můžete podle potřeby zvětšit pole pro vkládané znaky. Ve funkci pro získání obsahu schránky je při nalezení prázdné schránky vrácena varovná hláška, což samozřejmě v reálné aplikaci nepoužijete a je to zde uvedeno pouze pro zpřehlednění a objasnění zdrojového kódu.