Tipy a triky v Delphi, díl 10.

Tématem dnešního dílu bude aktualizace aplikací prostřednictvím Internetu, naučíme se zjišťovat, která ikona je přiřazena danému souboru a jaký je jeho typ, a na závěr si ukážeme, jak číst a zapisovat textová data do schránky Windows.
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.

Diskuze (1) Další článek: Dnes by měl Apple uvést Mac OS X 10.1

Témata článku: Software, Windows, Programování, Minulá verze, Trik, Díl, DEL, SHF, Malý text, Icon, TRI


Určitě si přečtěte

Google chystá funkci, která z chytrého Gmailu udělá hloupý Gmail
Lukáš Václavík
SoukromíGmailGoogle
Čím nahradit WhatsApp: Vyberte si z 10 alternativních komunikátorů

Čím nahradit WhatsApp: Vyberte si z 10 alternativních komunikátorů

** Z WhatsAppu kvůli novým podmínkám utíkají tisíce uživatelů ** Čím nahradit populární aplikaci pro zasílání zpráv? ** Vybrali jsme pro vás 10 alternativních komunikátorů

Karel Kilián | 110

Karel Kilián
KomunikaceWhatsAppInstant Messaging
Nejlepší herní notebooky a pracovní stroje: Když máte více než 20 tisíc

Nejlepší herní notebooky a pracovní stroje: Když máte více než 20 tisíc

** Když máte na notebook více než 20 tisíc korun, odpadají kompromisy ** Notebooky na práci dostávají tenká kovová těla a styl ** Herní notebooky zvládnou i nejmodernější hry v plné kvalitě

David Polesný | 43

David Polesný
Notebooky
Fedora 33 prostě funguje. Linux si zaslouží dobýt laptop, je to ale asi opět marné

Fedora 33 prostě funguje. Linux si zaslouží dobýt laptop, je to ale asi opět marné

** Desktopový Linux funguje a vypadá stále lépe ** Fedora 33 není výjimkou ** Ve stínu Windows a macOS tu vyrostly skvělé alternativy

Jakub Čížek | 156

Jakub Čížek
FedoraOperační systémyLinux
Jak se šíří Covid v Česku: Čerstvá data, semafor PES, mapy okresů a obcí. Každý den aktualizované grafy

Jak se šíří Covid v Česku: Čerstvá data, semafor PES, mapy okresů a obcí. Každý den aktualizované grafy

** Vývoj COVID-19 v Česku: nakažení, úmrtí, testovaní, hospitalizovaní ** Mapa podle okresů, přehled podle věku, situace v Evropě i ve světě ** Každý den aktualizované grafy a mapy

Marek Lutonský | 172

Marek Lutonský
COVID-19Koronavirus
Uživatelé hlásí problémy s jednou z listopadových záplat pro Windows 10
Karel Kilián
Windows UpdateAktualizaceWindows 10
Apple Macbook Air M1: testujeme výkon, výdrž, a hlavně kompatibilitu aplikací [průběžně aktualizováno]

Apple Macbook Air M1: testujeme výkon, výdrž, a hlavně kompatibilitu aplikací [průběžně aktualizováno]

** Testujeme Apple Macbook Air s procesorem M1 ** Zajímá nás nejen výkon, ale zejména kompatibilita aplikací ** Článek je průběžně doplňován na základě vašich dotazů

Jiří Kuruc | 205

Jiří Kuruc
Apple

Aktuální číslo časopisu Computer

Jak prodloužit výdrž notebooku

Velké testy: gamepady a inkoustové tiskárny

Důkladný test Sony Playstation 5