čtvrtek 23. června 2016

Knihovna FireMonkey

Přesto, že vývoji aplikací pro mobilní platformy jsem se již v některých příspěvcích věnoval, nebyl vysvětlen význam knihovny FireMonkey (někdy také označované zkratkami FMX nebo FM).

Co je FireMonkey


FireMonkey je aplikační platforma (knihovna komponent), kterou společnost Embarcadero poprvé přidalo do svých nástrojů ve verzi XE2. Jedná se o alternativu k populární VCL, která je určena výhradně pro rychlý vývoj aplikací pro Windows a je tak v mnoha ohledech závislá na službách poskytovaných operačním systémem.

Hlavním důvodem pro rozšíření vývojových nástrojů o knihovnu FireMonkey byla právě snaha nabídnout vývojářům možnost vyvíjet aplikace pro různá zařízení a různé operační systémy. Knihovna FireMonkey je napsána v přímo v jazyce Objec Pascal a pro přístup k hardware jsou používány knihovny cílového operačního systému. U Windows jde o GDI+/Direct2D, na Mac OS X je to OpenGL a na iOS pak OpenGL_ES. Většina vizuálních objektů knihovny je založena na přístupu "CustomDraw", který řeší jejich vykreslování na úrovni hardwaru. Přes instanci "Platform", která tvoří můstek mezi FireMonkey a zvoleným OS je pak realizována například práce s okny, myší nebo vybranými nativními ovládacími prvky. Přibližně 80 - 90% kódu je tak nezávislá na hostitelském operačním systému.

Aby použití vlastních prvků uživatelského rozhraní nemělo nepříznivý dopad na rychlost běhu výsledných aplikací, využívá FireMonkey v maximální možné míře výkonu grafických procesorů. Všechny operace pracující s grafikou běží na samostatném vláknu a výkon CPU je tak k dispozici pro zpracování aplikační logiky. Zapojení GPU kromě rychlosti přináší i přístup k řadě grafických funkcí, které lze využít k návrhu poutavějších a uživatelsky přívětivějších aplikací.

Knihovny FireMonkey a VCL (Visual Component Library) nejsou vzájemně kompatibilní a nelze je kombinovat v rámci jednoho modulu. Příčinou jsou některé rozdíly v jejich vnitřní implementaci.

Podporované platformy
Aplikace vytvořené za pomoci FireMonkey lze přeložit do nativního tvaru pro operační systémy:

  • Windows 32-bit (Intel)
  • Windows 64-bit (Intel)
  • Mac OS X (Intel)
  • iOS (ARM) + iOS Simulátor (Intel)
  • Android (ARM) + Android Emulator
  • Android (Intel, s využitím libhoudini)

Hlavní rozdíly mezi FMX a VCL

Použití vektorové grafiky


Knihovna VCL využívá rastrovou (bitovou, bitmapovou) grafiku, která je založena na popisu vlastností jednotlivých bodů, neboli pixelů. Ve FireMonkey je naopak většina vizuálních objektů "složena" z takzvaných primitivních grafických tvarů vektorové grafiky, jako je například obdélník, oblouk, kruh a další. Protože vektorová grafika na matematickém popisu grafických prvků, umožňuje bezproblémovou změnu měřítka, což je v době, kdy trh nabízí nekonečnou kombinaci velikostí a rozlišení zobrazovacích zařízení důležitá přednost.

Rastrová grafika

Rozměry, umístění prvků


Pokud v knihovně VCL nastavujeme šířku, výšku nebo například vzdálenost od okraje formuláře, musíme použít datový typ Integer. V opačném případě obdržíme chybové hlášení.

VCL - Chybové hlášení

FireMonkey v tomto případě těží z použití vektorové grafiky. Nejen, že umožňuje použití datového typu Float, ale místo pevné hodnoty lze použít takzvané animace (v inspektorovi objektů jsou označeny ikonkou okénka filmového pásu).

Zadávání rozměrů ve FireMonkey

Kódování barev


FireMonkey je určeno pro vytváření grafických aplikací. Zásadní je proto co nejširší podpora pro práci s barvami. Zásadním rozdílem v používání barev ve FireMonkey je využívání takzvaného "Alfa kanálu", neboli průhlednosti.

Rozdíly v kódování barev VCL a FireMonkey

Všechny parametry přístupné během návrhu lze samozřejmě nastavit i prostřednictvím kódu. Zde je třeba zohlednit rozdíly mezi knihovnami VCL a FireMonkey. Ty se týkají především již zmiňovaného kódování barev a jiného pojmenování barevných konstant.


Delphi


Knihovna VCL
Knihovna FMX

uses
  VCL.Graphics

var
  barva: TColor;

barva := clRed;
barva := 255;
barva := rgb(255, 0, 0);
barva := $0000FF;
uses
  System.UIConsts

var
  barva: TAlphaColor;

barva := claRed;
barva := $00FF0000;
barva := TAlphaColorRec.Red;
barva := TAlphaColors.Red;



C++Builder


Knihovna VCL
Knihovna FMX
#include <System.UIConsts.hpp>

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  TColor b;
  barva = clRed;
  barva = 255;
  barva = rgb(255, 0, 0);
  barva = $0000FF;
}


#include <System.UIConsts.hpp>

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  TAlphaColor b;
  barva = claRed;
  barva = System::Uiconsts::claRed;
  barva = TAlphaColors::Red;
  barva = 536870911;
}

Použití fontů


Ve VCL se velikost fontu určuje v bodech. Na palec připadá 72 bodů. Ve FireMonkey jsou velikosti fontů uváděny v DIP (Device Independent Pixel). Na palec připadá 96 pixelů. Při stejné velikosti písma tak bude text ve FireMonkey drobnější.

Porvnání velikosti fontů

Vztah předek rodič


VCL omezuje možnost nastavit objekt jako vlastníka pouze pro kontejnery jako jsou komponenty tříd "TForm", "TFrame", "TPanel" nebo "TDataModule". FireMonkey je v tomto směru mnohem otevřenější a prakticky kterýkoliv objekt může být vlastníkem libovolného jiného objektu. Implementace je možná nejen z kódu, ale často i vizuálně za pomoci okna "Structure Window":

Okno "Structure Window"


úterý 14. června 2016

FAQ Invalid platform

Na některých počítačích se je možné setkat při překladu s chybovým hlášením spojeným s neplatným určením cílové platformy:

Chyba Invalid Platform

Delphi v současné době podporuje překlad pro 7 různých platforem (Windows 32, Windows 64, MacOSX, Android, Android Emaulátor, iOS a iOS Simulátor). Nastavení pro jednotlivé platformy je uloženo v souboru EnvOptions.proj.
Při typické instalaci jej naleznete v adresáři:
C:\Users\UserName\AppData\Roaming\Embarcadero\BDS\verze\
tedy například:
C:\Users\petr\AppData\Roaming\Embarcadero\BDS\18.0\EnvOptions.proj  

Konkrétní hodnoty se načítají na základě proměnné $(Platform), která se přebírá z nastavení systému.

EnvOption

V případě, že je z jakéhokoliv důvodu na počítači tato proměnná nastavena a její hodnota neodpovídá očekávaným variantám (na Windows Win32 nebo Win64), je při překladu zobrazena výše uvedená chyba.

Proměnné prostředí Windows

Nejčastějším doporučením, které je možné najít na Internetu je otevřít dialog pro nastavení proměnných prostředí a proměnnou "PLATFORM" jednoduše odstranit.

Toto řešení je ve většině případů postačující. Existuje zde však riziko, že na nastavení této proměnné závisí korektní fungování některého z jiných programů, který je na počítači provozován.

Prostředí Delphi nabízí pro takové situace možnost "potlačení" nastavené hodnoty a její nahrazení hodnotou požadovanou. Stačí otevřít prostředí a v nabídce "Tools/Options/Environment Variables" kliknout na tlačítko "New", přidat novou proměnnou "PLATFORM" a přiřadit ji odpovídající hodnotu (například "Win32").

Přidání nové proměnné

V systému tak bude nyní tato proměnné k dispozici dvakrát, jednou na úrovni operační systému a jednou pro Delphi.

Provedené změny v nastavení Delphi

Po restartu vývojového prostředí by již mělo vše pracovat dle očekávání.