Delphi.cz

Český portál Delphi

Úvod do FireMonkey

FireMonkey je nová multiplatformní knihovna komponent. Zkuste ji považovat jako alternativu k VCL, přičemž VCL bude i nadále podporována a rozvíjena. VCL je ale striktně vázána na Windows, naopak FireMonkey momentálně existuje pro Windows, Mac OSX a iOS, přičemž je deklarována budoucí podpora pro Linux a Android (a další mobilní platformy).

Na rozdíl od CLX, která byla postavena na QT (která je díky situaci momentálního vlastníka Nokia na konci života), je FireMonkey nativně vytvořena v Object Pascalu a jen pro přístup k HW je používána příslušná knihovna - na Windows GDI+ nebo Direct2D, na MAC to je OpenGL, pravděpodobně pro Linux také, pro iOS je to OpenGL_ES, Android asi také. Vše je v podstatě "CustomDraw" a jen např. práce s okny, myší je přes instanci Platform předávána OS. Tzn. že cca 90% kódu je nezávislé na OS (protože je to CustomDraw a vše je kresleno HW).

Nový projekt

Pro upřesnění - HD je 2D aplikace.

Základem je styl

V porovnání FireMonkey a VCL je patrno, že VCL je komplexnější, ale už během životního cyklu XE2 je očekáváno několik rozšíření. Michael Swindell napsal, že první dávka rozšíření je plánována na konec září.

Na druhou stranu, FireMonkey je úplně jinak postavena a nic tam není fixní. To mimochodem znamená, že např. rozdíl mezi TButton a TCheckBox je jen v grafické reprezentaci - obojí je kresleno, ale každý jinak. Samozřejmě styl jak to bude kresleno lze změnit.

Můžete např. TCheckBox vykreslovat jako tlačítko nebo třeba jako cokoliv jiného (přiznám se, že je pro mne problém myslet tímto způsobem, ale snažím se) - vše je popsáno vektorově. Vše je samozřejmě plně dynamické, tj. uvedený checkbox může být checkboxem do doby než na něj najedete myší, pak jen změníte "Style". Každý control má property StyleLookup, která slouží k přeplácnutí normálního vzhledu. "Normální vzhled" je samozřejmě různý pro různé OS.

PropertyProperty

Všimněte si kromě jiného výrazného rozšíření Align, je to ten rozbalený combobox na obrázku.

Samozřejmě, nejde jen o změnu vzhledu aplikace. Styly slouží k mnohem zásadnějším věcem. Mějme následující definici položky pro TListBox. Styly se definují v komponentě TStyleBook.

Položka

V designeru lze definovat rozpad stromu uvedené položky (CustomItem). Všimněte si vybrané položky - je to checkbox se speciálním style. Lze definovat styl per control, tj. TCheckBox může vypadat normálně, ale hned vedlejší úplně jinak.

Položka

Definice uvedeného stylu pro checkbox.

CheckBox

A jak to bude vypadat za běhu?

Za běhu

Vytvoření jedné položky.

procedure TfrmCustomList.Button2Click(Sender: TObject);
var
  Item: TListBoxItem;
begin
  // create custom item
  Item := TListBoxItem.Create(nil);
  Item.Parent := ListBox1;
  // this code set event - when we need to setup item
  Item.OnApplyStyleLookup := DoApplyStyleLookup;
  // this set our style to new item
  Item.StyleLookup := 'CustomItem';
end;

procedure TfrmCustomList.DoApplyStyleLookup(Sender: TObject);
var
  B: TBitmap;
  Item: TListboxItem;
begin
  Item := TListBoxItem(Sender);
  // create thumbnail
  B := TBitmap.Create(10 + random(50), 10 + random(50));
  B.Clear($FF000000 or TAlphaColor(random($FFFFFF)));
  // use this to set our child controls value - this code use BindingName in style to search
  Item.Binding['image'] := ObjectToVariant(B); // set thumbnail
  Item.Binding['text'] := 'item ' + IntToStr(Item.Index); // set filename
  Item.Binding['resolution'] := IntToStr(B.Width) + 'x' + IntToStr(B.Height) + ' px'; // set size
  Item.Binding['depth'] := '32 bit';
  Item.Binding['visible'] := true; // set Checkbox value
  Item.Binding['visible'] := EventToVariant(DoVisibleChange); // set OnChange value
  Item.Binding['info'] := EventToVariant(DoInfoClick); // set OnClick value
  // free thumbnail
  B.Free;
end;

procedure TfrmCustomList.DoInfoClick(Sender: TObject);
begin
  InfoLabel.Text := 'Info Button click on ' + IntToStr(ListBox1.ItemIndex) + ' listbox item';
end;

procedure TfrmCustomList.DoVisibleChange(Sender: TObject);
begin
  InfoLabel.Text := 'Checkbox changed ' + IntToStr(ListBox1.ItemIndex) + ' listbox item to ' + BoolToStr(Listbox1.Selected.Binding['visible'], true);
end;

Skládání komponent

Díky tomu jak je FireMonkey koncipován, lze úplně jednoduše skládat komponenty na formuláři.

Tlačítko

Tlačítko

Zde je v jednom tlačítku druhé tlačítko a navíc checkbox. Tj. uživatel může kliknout na vnější tlačítko nebo vnitřní (je to příklad), při nastavení pozice vnějšího tlačítka se upravuje pozice vnitřního (jinak řečeno vnitřní komponenty jsou relativně k pozici vnější). Úplně stejně to funguje i pro jiné komponenty.

Něco proměnných

Ve FMX.Types je definováno

  // On low-end hardware or mobile bitmap effects are slowly
  GlobalDisableFocusEffect: Boolean = False;
  // Use Direct2D in Windows Vista or Windows 7 by default
  GlobalUseDirect2D: Boolean = True;
  // Use Direct2D in Windows Vista or Windows 7 in software mode
  GlobalUseDirect2DSoftware: Boolean = False;
  // Use HW accelerated effect if possible
  GlobalUseHWEffects: Boolean = True;

Spolupráce VCL a FMX

Není oficiálně doporučováno, ale není problém zobrazit FMX dialog z VCL aplikace. Opačně to jde také, ale nedělal bych to.

Poslední poznámka: pozor na rozdíl velikosti EXE u debug verze (10MB) a release (3MB).

Pokračování příště.

Datum: 2011-09-06 22:34:00 Tagy: DelphiXE2, FireMonkey, super

Komponenty