úterý 12. července 2016

Windows 10 (část 3.)

RAD Studio 10 Seattle a Windows 10 (část 3.)

Windows 10 jsou univerzálním systémem, který by měl být dobře použitelný jak na stolních tak přenosných zařízeních. Z obou světů se snaží nabídnout uživatelům jednak to nejlepší a jednak to, na co jsou uživatelé zvyklí. Na stolní počítače tak proniklo například centrum akcí, které jsem zmiňoval minule.

Centrum sdílení

Další podobnou funkcionalitou převzatou z "mobilního světa" je zjednodušení nejběžnějších uživatelských postupů (workflow). Ta byla zřejmě motivována snahou do jisté míry kompenzovat absenci klávesnice a myši u telefonů a tabletů, výrazně zpříjemnit práci však může i na PC. Vytvoříme-li v aplikaci nějaký obsah (data, obrázky, multimédia) a potřebujeme jej předat jinému programu, stačí zvolit možnost sdílet a vybrat aplikaci, které jej chceme předat. Odpadá tak nutnost na tabletu ne úplně pohodlného "copy - paste" nebo uložení a import souboru.

Centrum sdílení na mobilních platformách


RAD Studio 10.x umožňuje rozšířit aplikace o sdílení obsahu za pomoci nové komponenty "Sharing Contract". Některé časté operace tak lze podstatně zjednodušit, což ocení i uživatelé, kteří Windows 10 provozují na zařízeních bez dotykové obrazovky.

Sdílení obsahu mezi aplikacemi zajišťuje operační systém, v tomto případě Windows 10. Aplikace musí vytvořit v požadovaném tvaru "balíček dat" a odkaz na něj odeslat správci sdílení. Ten nabídne uživateli seznam cílových aplikací, které jsou registrovány a umí v balíčku obsažená data zpracovat.

Zpracování požadavku na sdílení

Komponenta "Sharing Contract" výše uvedené kroky "zapouzdřuje" a zjednodušuje tak jejich implementaci.


Delphi


Prvním krokem je vytvoření datového balíčku:

sc.ApplicationName := 'SCDemo';
sc.PackageName := 'SCDemoBalicek';
sc.DataTitle := 'Data sdílená aplikací SCDemo';

Následně je třeba balíček naplnit daty:

sc.DataTitle := 'SCTestData';
sc.IconFile := 'embfavicon.ico';
sc.LogoFile := 'delphi_red.png';
sc.ImageFile := 'eso.bmp';
sc.DataText := 'Nějaký zajímavý text';
sc.RtfText := 'Text ve formátu RTF';
sc.HTML = '<h1>HTML kód<h1>';
sc.WebAddress = 'http://www.embt.cz';

Nakonec balíček publikujeme, čímž je zároveň aktivován správce sdílení Windows 10:

sc.InitSharing;


C++Builder


sh->ApplicationName = "SCDemo";
sh->PackageName = "SCDemoBalicek";
sh->Description = "Data sdílená aplikací SCDemo";

sh->DataTitle = "SCTestData";
sh->IconFile = "embfavicon.ico";
sh->LogoFile = "cpp_red.png";
sh->ImageFile = "eso.bmp";
sh->DataText = "Nějaký zajímavý text.";
sh->RtfText = "Text ve formátu RTF";
sh->HTML = "<h1>HTML kód<h1>";
sh->WebAddress = "http://www.embt.cz";

sh->InitSharing();

Relative panel

Další novou komponentou, která ve VCL pro podporu Windows 10 přibyla je RelativePanel. Můžeme jej využít všude tam, kde je třeba přizpůsobit rozmístění či velikost prvků velikosti obrazovky. RelativePanel slouží jako kontejner, do kterého lze umisťovat další vizuální komponenty. Na jednotlivé komponenty lze následně odkazovat pomocí indexu, který jim byl v rámci kolekce přiřazen a stanovit jejich polohu vůči jiné komponentě nebo panelu samému. Možnosti jsou:


Delphi


Zarovnání k pravému, levému, hornímu nebo spodnímu okraji komponenty RelativePanel:
rp.ControlCollection[0].AlignLeftWithPanel := True;

Přichycení nad, pod, zleva nebo zprava k určené komponentě:
rp.ControlCollection[5].RightOf := Label1;

Horizontální nebo vertikální vystředění vzhledem ke komponentě RelativePanel:
rp.ControlCollection[9].AlignHorizontalCenterWithPanel := True;

Horizontální nebo vertikální vystředění vůči určené komponentě:
rp.ControlCollection[7].AlignVerticalCenterWith := Label2;

Pozor! Komponenta "RelativePanel" nehlídá možné křížové závislosti nebo protichůdné požadavky. Je proto vhodné ošetřit, aby nedošlo k například k překrytí ovládacích prvků nebo třeba k jejich posunutí mimo formulář.

Rozteč, tedy vzdálenost mezi prvky lze kontrolovat definováním okrajů jednotlivých prvků:
label1.Margins.Left := 20;


Info: Okraje (Left|Right|Top|Bottom) jsou přednastaveny na hodnotu 3.


C++Builder


rp->ControlCollection->Items[0]->AlignLeftWithPanel = True;
rp->ControlCollection->Items[0]->RightOf = Shape1;
rp->ControlCollection->Items[1]->AlignHorizontalCenterWithPanel = True;
rp->ControlCollection->Items[0]->AlignVerticalCenterWith = Shape1;
rp->ControlCollection->Items[1]->AlignLeftWithPanel = False;
label1->Margins->Left = 20;

ActivityIndicator

ActivityIndicator je náhradou za staré dobré "přesýpací hodiny". Protože umožňuje nastavení řady parametrů, vytvořila pro ně společnost Embarcadero samostatnou komponentu. Nastavit lze:


Delphi


// Barvu Indikátoru
  ActivityIndicator.IndicatorColor := aicBlack;
  ActivityIndicator.IndicatorColor := aicWhite;

// Vzhled (typ) Indikátoru
  ActivityIndicator.IndicatorType := aitSectorRing;
  ActivityIndicator.IndicatorType := aitMomentumDots;
  ActivityIndicator.IndicatorType := aitRotatingSector;

// Velikost Indikátoru
ActivityIndicator.IndicatorSize := aisSmall; //24 x 24 pixelů
ActivityIndicator.IndicatorSize := aisMedium; //32 x 32
ActivityIndicator.IndicatorSize := aisLarge; //48 x 48
ActivityIndicator.IndicatorSize := aisXLarge //64 x 64

// Rychlost animace    
  ActivityIndicator.FrameDelay := 30;

// Spuštění/ukončení animace
  ActivityIndicator.Animate := True;
  ActivityIndicator.Animate := False;

ActivityIndicator: varianty vzhledu


C++Builder


  ActivityIndicator->IndicatorColor = aicBlack;
  ActivityIndicator->IndicatorType = aitSectorRing;
  ActivityIndicator->IndicatorSize = aisSmall;
  ActivityIndicator->FrameDelay = 30;
  ActivityIndicator->Animate = True;

ToggleSwitch

Komponenta Toggle Switch je vhodnou alternativou ke komponentě CheckBox. Odhlédneme-li od vzhledu, je její hlavní předností použití na dotykových zařízeních, protože lze nastavit její velikost a lze ji tak pohodlně obsluhovat i "tlustými prsty".

Počeštěný ToggleSwit



Delphi


if TSAnimate.State = tssOn then
  ActivityIndicator.Animate := True;
 else
  ActivityIndicator.Animate := False;


C++Builder


 if (TSAnimate->State == tssOn)
  ActivityIndicator->Animate = True;
 else
  ActivityIndicator->Animate = False;

SearchBox

SearchBox je tvořen kombinací dvou v Delphi či C++Builderu běžně používaných komponent kterými jsou edit box a klasické tlačítko. Podle zvoleného nastavení může komponenta reagovat na stisk tlačítka (ikony) nebo na klávesu Enter. V obou případech je vyvolána událost "OnInvokeSearch".

Komponenta SearchBox


Delphi


// Inicializace vyhledávacího políčka
procedure TForm1.SearchBox1Enter(Sender: TObject);
begin
  SearchBox1.Text := '';
end;

procedure TForm1.SearchBox1InvokeSearch(Sender: TObject);
begin
  ShowMessage('Vyhledávám ' + SearchBox1.Text + ' ...');
  // kód pro realizaci vyhledávání
end;


C++Builder


void __fastcall TForm1::SearchBox1Enter(TObject *Sender)
{
  SearchBox1->Text = "";
}

void __fastcall TForm1::SearchBox1InvokeSearch(TObject *Sender)
{
  ShowMessage("Vyhledávám " + SearchBox1->Text + " ...");
}

K tomuto článku je k dispozici videotutoriál:



Zdrojové kody jsou k dispozici zde.