Úvod do formulárov Windows c#. Vlastnosti implementácie MVP pre Windows Forms
Ak chcete písať programy podobné známym aplikáciám Windows, pravdepodobne použijete triedy z menného priestoru System.Windows.Forms. Umožňujú vám používať tlačidlá, zoznamy, textové polia, ponuky, správy a mnoho ďalších „ovládacích prvkov“. Ovládacie prvky sú to, čo vložíte do formulára. Sú potrebné na zobrazenie informácií, ako je text (ovládací prvok Label) alebo grafika (ovládací prvok PictureBox), alebo na vykonávanie určitých akcií, ako je výber hodnoty alebo prechod do iného formulára po kliknutí na tlačidlo. Všetky ovládacie prvky sú umiestnené na formulári.
Pojem „formulár“ prijatý v programovaní je podobný pojmu „dotazníkový formulár“ alebo „forma dokumentu“ z každodenného života. Na formulári môžete usporiadať rôzne prvky v určitom poradí (text, obrázky, polia na vyplnenie atď.). Keď nám dajú hotové tlačivo dokladu a vypýtajú si ho vyplniť, my zvyčajne čítame typické informácie, ktoré obsahuje, a potom zadajte chýbajúce údaje určité riadky.
V programovaní je koncept formulára veľmi podobný: formulár umožňuje umiestniť text, obrázky, vstupné polia, tlačidlá atď., čím sa dosiahne ich presné umiestnenie na obrazovke. IN konzolová aplikácia Na obrazovke sa zobrazujú iba riadky textu.
Spoločnosť Microsoft poskytla obrovské množstvo „ovládacích prvkov“ ako súčasť knižnice tried .NET Framework, ktoré môžete umiestniť na formuláre. Keď si osvojíte tento nástroj, budete môcť rýchlo vytvárať pútavé aplikácie.
Niektoré užitočné triedy z menného priestoru System.Windows.Forms
Tu je niekoľko ovládacích prvkov, ktoré môžete umiestniť do formulárov:
- Označenie.
- Tlačidlo.
- ListBox (Zoznam).
- CheckBox.
- RadioButton (prepínač).
- MessageBox.
- Ponuka.
- TabControl (Ovládanie Tab).
- Panel s nástrojmi.
- TreeView (Strom).
- DataGrid.
- PictureBox (obrázok).
- RichTextBox (textové pole s podporou formátu RTF).
Práca so vzorovými programami Windows Forms vo Visual C# Express
Možno radšej nepoužijete už pripravené vzorové projekty, ale rozvíjať ich od začiatku. V tomto prípade musíte vziať do úvahy, že pre každý projekt C# Express okamžite vytvorí dva súbory (tzv Form1.cs A Program.cs) a naplní ich zdrojovým kódom v C#, to znamená, že na začiatku získate jednoduchý, ale plnohodnotný program. Nami navrhovaná metóda práce s už prijatým projektom pozostáva z vykonania nasledujúcich akcií:
- Odstráňte súbor Form1.cs.
- Nahraďte kód v súbore Program.cs vzorovým kódom, s ktorým pracujete.
Oba tieto kroky nie sú potrebné, ak programy otvoríte pomocou príkazu „Otvoriť projekt“ v ponuke „Súbor“ a po rozbalení nájdete požadovaný projekt v priečinku, do ktorého ste ho umiestnili.
Príklad programu 3.3
Pozrime sa na príklad jednoduchej aplikácie Windows Forms. Len vytvorí nový formulár a zobrazí nejaký text v záhlaví okna formulára.
Pomocou System.Windows.Forms; class SimpleWindowsForm: Form ( // Metóda konštruktora našej triedy public SimpleWindowsForm() ( // Zadajte nadpis okna this.Text = "Toto je jednoduchý formulár s nadpisom"; ) static void Main() ( // Vytvoriť nový inštancia triedy //a spustite ju na vykonanie // V dôsledku toho sa na obrazovke otvorí formulár Application.Run(new SimpleWindowsForm()); ) ) Výpis 3.3.
Príklad programu 3.4
Ďalší príklad je tiež celkom jednoduchý, ale urobíme krok vpred - umiestnime tlačidlo na formulár.
Pomocou System.Windows.Forms; class SimpleWindowsFormWithButton: Form ( Button button1; // Metóda konštruktora našej triedy public SimpleWindowsFormWithButton() ( // Zadajte názov okna this.Text = "Formulár s príkazovým tlačidlom"; // Pridanie tlačidla do kolekcie ovládacích prvkov formulára / / Hoci na tlačidle je napísané: "Stlačte ma!", // po stlačení sa nič nestane! button1 = new Button(); button1.Text = "Stlačte ma!"; button1.Top = 100; button1.Left = 100; button1.Height = 50; button1.Width = 70; this.Controls.Add(button1); ) static void Main() ( // Vytvorenie a spustenie formulára Application.Run(new SimpleWindowsFormWithButton()); ) ) Výpis 3.4.
Príklad programu 3.5
Na formulár sme umiestnili tlačidlo, no keď naň klikneme, nič sa nedeje. Je to nuda.
Musíme opísať metódu, ktorá vykoná nejakú akciu po kliknutí na tlačidlo. Nechajte zmeniť text v nadpise okna. Pretože táto metóda detekuje výskyt nejakej udalosti (v našom prípade kliknutie na tlačidlo) a následne ju nejakým spôsobom spracuje, nazýva sa „obslužný program udalosti“. Okrem toho musíte naviazať obsluhu udalosti na zodpovedajúcu udalosť, teda na stlačenie tlačidla.
Používanie systému; pomocou System.Windows.Forms; pomocou System.Drawing; class FormWithWorkingButton: Form ( Button mrButton; // Metóda konštruktora našej triedy public FormWithWorkingButton() ( // Zadajte názov okna this.Text = "Formulár s pracovným tlačidlom!"; // Pridajte tlačidlo a naviažte ho na udalosť handler mrButton = new Button(); mrButton.Text = "Klikni na mňa"; mrButton.Top = 100; mrButton.Left = 100; mrButton.Height = 50; mrButton.Width = 70; mrButton.Click H= new System.Event (mrButton_Click); this.Controls.Add(mrButton); ) static void Main() ( // Vytvorenie a spustenie formulára Application.Run(new FormWithWorkingButton()); ) // Obslužný program udalosti, ktorý sa spustí po kliknutí na tlačidlo void mrButton_Click(object sender, EventArgs e ) ( // Zmena textu mrButton.Text = "Tlačidlo bolo stlačené!"; ) ) Výpis 3.5.
Príklad programu 3.6
Dosiahli sme úspech: náš program dokáže vykonávať základné akcie. Teraz do formulára pridáme pár nových ovládacích prvkov, opatrne ich rozmiestnime a trochu s nimi popracujeme. Zoberme si 4 typy ovládacích prvkov: Button, ListBox, MessageBox a PictureBox.
Všimnite si, že okrem System.Windows.Forms sa v tomto príklade spomína aj priestor názvov System.Drawing. Ide o to, že používame ovládací prvok PictureBox a práca s obrázkami vyžaduje triedy kreslenia.
Pomocou System.Windows.Forms; pomocou System.Drawing; class MyForm: Form ( // Deklarujme prvok ListBox ako pole triedy: // budeme k nemu musieť pristupovať z rôznych metód ListBox listBox1; // Metóda konštruktora našej triedy public MyForm() ( //Formulárne veľkosti this.Size = new Size( 400, 400); // Vytvorte prvok PictureBox, umiestnite doň obrázok, // pridajte ho do formulára PictureBox pictureBox1 = new PictureBox(); pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; Bitmap image1 = new Bitmap ("..//. .//images//Zakat.jpg"); pictureBox1.ClientSize = new Size(this.Width, 150); pictureBox1.Image = (Image)image1; this.Controls.Add(pictureBox1) ; // Vytvorte objekt Button, definujte niektoré jeho vlastnosti Button button1 = new System.Windows.Forms.Button(); button1.Location = new Point(150, 160); button1.Size = new Size(100, 30) ; button1.Text = "Stlačte ma "; button1.Click += new System.EventHandler(button1_Click); this.Controls.Add(button1); // Vytvorte ListBox, definujte vlastnosti a pridajte ho do formulára listBox1 = new System. Windows.Forms.ListBox(); listBox1.Location = new System.Drawing.Point(20, 200); listBox1.Size = new Size(100, 100); listBox1.Items.Add("Les"); listBox1.Items.Add("Steppe"); listBox1.Items.Add("Jazero"); listBox1.Items.Add("More"); listBox1.Items.Add("Ocean"); listBox1.SelectedIndex = 2; this.Controls.Add(listBox1); ) // Obsluha udalosti, ktorá sa spustí po kliknutí na tlačidlo void button1_Click(object sender, System.EventArgs e) ( // Zobrazí správu označujúcu položku vybratú v zozname MessageBox.Show(this, "Vybrali ste " + listBox1 .SelectedItem, "Notification" , MessageBoxButtons.OK); ) static void Main() ( // Vytvorte a spustite formulár Application.Run(new MyForm()); ) private void InitializeComponent() ( this.SuspendLayout(); / / // MyForm // this .BackColor = System.Drawing.SystemColors.Control; this.ClientSize = new System.Drawing.Size(292, 273); this.Name = "MyForm"; this.ResumeLayout(false); ) ) Zoznam 3.6.
Dobrý deň!
Model-View-Presenter je pomerne známy dizajnový vzor. Na prvý pohľad všetko vyzerá jednoducho: existuje Model, ktorý obsahuje celú obchodnú logiku obrazovky; View/View, ktorý vie, ako zobraziť určité údaje; Prezentátor, ktorý je spojovacím článkom, reaguje na akcie používateľa v zobrazení, zmenu modelu a naopak.
Zložitosť začína, keď sa počet formulárov v projekte stane viac ako jedným.
Tento článok zahŕňa:
- trochu teórie;
- všeobecné problémy implementácie MVP (konkrétne Passive View) pod Windows Forms;
- vlastnosti implementácie prechodov medzi formulármi a prenos parametrov, modálne okná;
- použitie kontajnera IoC a šablóny Dependency Injection - DI (menovite Constructor Injection);
- niektoré funkcie testovania aplikácie MVP (pomocou NUnit a NSubstitute);
- to všetko sa stane na príklade miniprojektu a pokúsime sa to objasniť.
Článok sa dotýka:
- aplikácia šablóny adaptéra;
- jednoduchá implementácia vzoru Application Controller.
Pre koho je tento článok určený?
Hlavne pre nových vývojárov Windows Forms, ktorí o tom počuli, ale neskúšali to, alebo to skúšali, ale nefungovalo to. Aj keď som si istý, že niektoré techniky sú použiteľné pre WPF a dokonca aj pre vývoj webových aplikácií.
Formulácia problému
Poďme si vymyslieť jednoduchú úlohu – implementujte 3 obrazovky:1) autorizačná obrazovka;
2) hlavná obrazovka;
3) modálna obrazovka na zmenu používateľského mena.
Malo by to vyzerať asi takto:
Trochu teórie
MVP, rovnako ako jeho materská spoločnosť, MVC (Model-View-Controller), bol vynájdený pre pohodlie oddelenia obchodnej logiky od spôsobu, akým sa zobrazuje.Na internete nájdete množstvo implementácií MVP. Na základe spôsobu doručovania údajov do zobrazenia ich možno rozdeliť do 3 kategórií:
- Passive View: View obsahuje minimálnu logiku pre zobrazovanie primitívnych dát (reťazcov, čísel), zvyšok má na starosti Presenter;
- Prezentačný model: do zobrazenia je možné preniesť nielen primitívne údaje, ale aj obchodné objekty;
- Kontrolný kontrolór: View vie o prítomnosti modelu a sám z neho berie údaje.
Ďalej sa bude uvažovať o úprave pasívneho zobrazenia. Poďme si popísať hlavné vlastnosti:
- View interface (IView), ktorý poskytuje zmluvu o zobrazovaní údajov;
- Pohľad je špecifická implementácia IView, ktorá sa môže zobraziť v špecifickom rozhraní (či už Windows Forms, WPF alebo dokonca konzola) a nevie nič o tom, kto ho ovláda. V našom prípade sú to formy;
- Model - poskytuje určitú obchodnú logiku (príklady: prístup k databáze, úložiská, služby). Môže byť reprezentovaný ako trieda alebo, opäť, rozhranie a implementácia;
- Zástupca obsahuje odkaz na Pohľad cez rozhranie (IView), spravuje ho, prihlasuje jeho udalosti a vykonáva jednoduchú validáciu (kontrolu) zadaných údajov; obsahuje aj odkaz na model alebo jeho rozhranie, odovzdávanie údajov z Pohľadu do neho a požadovanie aktualizácií.
Typická reprezentatívna implementácia
public class Presenter ( private readonly IView _view; private readonly IService _service; public Presenter(IView view, IService service) ( _view = view; _service = service; _view.UserIdChanged += () => UpdateUserInfo(); ) private void UpdateUserInfo( ) ( var user = _service.GetUser(_view.UserId); _view.Username = user.Username; _view.Age = user.Age; ) )
Aké výhody nám dáva spojka nízkej triedy (použitie rozhraní, udalostí)?
1. Umožňuje relatívne voľne meniť logiku ľubovoľného komponentu bez porušenia zvyšku.
2. Skvelé príležitosti na testovanie jednotiek. Fanúšikovia TDD by mali byť nadšení.
Poďme začať!
Ako organizovať projekty?
Dohodnime sa, že riešenie bude pozostávať zo 4 projektov:- DomainModel - obsahuje služby a všetky druhy úložísk, jedným slovom - model;
- Prezentácia - obsahuje aplikačnú logiku, ktorá nezávisí od vizuálnej prezentácie, t.j. všetci zástupcovia, rozhrania zobrazenia a ďalšie základné triedy;
- UI - Windows Forms aplikácia, obsahuje len formuláre (implementácia View rozhraní) a logiku spúšťania;
- Testy - jednotkové testy.
Čo napísať do Main()?
Štandardná implementácia spustenia aplikácie Windows Forms vyzerá takto:Súkromné statické void Main() ( Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); // priame spustenie formulára (zobrazenie) )
Dohodli sme sa však, že Zástupcovia budú spravovať zobrazenia, takže by sme chceli, aby kód vyzeral asi takto:
Súkromné statické void Main() ( Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); var presenter = new LoginPresenter(new LoginForm(), new LoginService()); // Dependency Injection presenter.Run(); )
Skúsme implementovať prvú obrazovku:
Základné rozhrania
// spoločné metódy pre všetky pohľady verejné rozhranie IView ( void Show(); void Close(); ) // zmluva, na základe ktorej bude zástupca interagovať s formulárom verejné rozhranie ILoginView: IView ( string Username ( get; ) string Password ( get ; ) udalosť Action Login; // udalosť "používateľ sa pokúša prihlásiť" void ShowError(string errorMessage); ) verejné rozhranie IPresenter ( void Run(); ) // hlúpa autorizačná služba verejné rozhranie ILoginService ( bool Login(User user); // true - úspešná autorizácia, inak nepravda)
Výkon
public class LoginPresenter: IPresenter ( súkromné iba na čítanie ILoginView _view; súkromné iba na čítanie ILoginService _service; verejné LoginPresenter (zobrazenie ILoginView, služba ILoginService) ( _view = zobrazenie; _service = služba; _view.Login += () => Login (_view.Username, _view .Password); ) public void Run() ( _view.Show(); ) private void Login (reťazec používateľské meno, reťazec heslo) ( if (username == null) hodiť novú ArgumentNullException("username"); if (password == null) throw new ArgumentNullException("password"); var user = nový používateľ (meno = používateľské meno, heslo = heslo); if (!_service.Login(user)) ( _view.ShowError("Neplatné používateľské meno alebo heslo"); ) else ( // úspešná autorizácia, spustenie hlavnej obrazovky (?) ) ) )
Vytvorenie formulára a implementácia rozhrania ILoginView v ňom nie je náročná, rovnako ako napísanie implementácie ILoginService. Treba poznamenať len jednu vec:
Verejná čiastočná trieda LoginForm: Form, ILoginView ( // ... public new void Show() ( Application.Run(this); ) )
Toto kúzlo umožní spustiť našu aplikáciu, zobraziť formulár a po zatvorení formulára správne ukončiť aplikáciu. Ale k tomu sa vrátime neskôr.
Budú testy?
Od okamihu, keď je napísaný zástupca (LoginPresenter), je možné ho okamžite otestovať ako celok bez implementácie formulárov alebo služieb.Na písanie testov som použil knižnice NUnit a NSubstitute (knižnica na vytváranie tried stub na základe ich rozhraní, mock).
Testy pre LoginPresenter
Verejná trieda LoginPresenterTests ( private ILoginView _view; public void SetUp() ( _view = Substitute.For
Testy sú dosť hlúpe, zatiaľ čo samotná aplikácia. Ale tak či onak boli úspešne dokončené.
Kto a ako spustí druhú obrazovku s parametrom?
Ako ste si mohli všimnúť, po úspešnom prihlásení som nenapísal žiadny kód. Ako môžem spustiť druhú obrazovku? Prvé, čo ma napadne, je toto:// LoginPresenter: úspešná autorizácia var mainPresenter = new MainPresenter(new MainForm()); mainPresenter.Run(user);
Zhodli sme sa však na tom, že zástupcovia nevedia nič o pohľadoch okrem ich rozhraní. Čo robiť?
Na pomoc prichádza vzor aplikačného kontroléra (implementovaný zjednodušeným spôsobom), ktorý obsahuje kontajner IoC, ktorý vie, ako získať implementačný objekt pomocou rozhrania.
Kontrolér sa odovzdá každému zástupcovi ako parameter konštruktora (opäť DI) a implementuje približne nasledujúce metódy:
Verejné rozhranie IApplicationController (IApplicationController RegisterView
Po menšom prerobení vyzeralo spustenie aplikácie takto:
Súkromné statické void Main() ( Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); // všetky závislosti sú teraz zaregistrované na jednom mieste: var controller = new ApplicationController(new LightInjectAdapder()) .RegisterView
Pár slov o novom ApplicationController(new LightInjectAdapder()) . Ako IoC kontajner som použil knižnicu LightInject, ale nie priamo, ale cez adaptér (vzor adaptéra), takže ak potrebujem zmeniť kontajner na iný, mohol som napísať iný adaptér a nemeniť logiku radiča. Všetky použité metódy sú vo väčšine IoC knižníc, nemali by byť žiadne ťažkosti.
Implementujme prídavné rozhranie IPresenter, ktoré sa líši len tým, že metóda Run akceptuje parameter. Potom z nej budeme dediť rovnakým spôsobom ako z prvej obrazovky.
Teraz, nie bez pýchy, spúšťame druhú obrazovku a prechádzame tam autorizovaným používateľom:
Ovládač.Spustiť
Nemôžete jednoducho pokračovať a zavrieť formulár...
Jedno z úskalí je spojené s riadkom View.Close(), po ktorom sa prvý formulár zatvoril a s ním aj aplikácia. Faktom je, že Application.Run(Form) spúšťa štandardnú slučku správ systému Windows a považuje odovzdaný formulár za hlavnú formu aplikácie. To je vyjadrené v skutočnosti, že aplikácia visí ExitThread na udalosti Form.Closed, čo spôsobí zatvorenie aplikácie po zatvorení formulára.Existuje niekoľko spôsobov, ako tento problém obísť, jedným z nich je použiť inú verziu metódy: Application.Run(ApplicationContext) , potom včas zmeniť vlastnosť ApplicationContext.MainForm. Odovzdávanie kontextu do formulárov je implementované pomocou aplikačného kontroléra, v ktorom je zaregistrovaný objekt ApplicationContext (inštancia) a následne vložený do konštruktora formulára (opäť DI) počas spúšťania zástupcu. Spôsoby zobrazenia prvých dvoch obrazoviek teraz vyzerajú takto:
// LoginForm public new void Show() ( _context.MainForm = this; Application.Run(_context); ) // MainForm public new void Show() ( _context.MainForm = this; base.Show(); )
Modálne okno
Implementácia modálneho okna je jednoduchá. Kliknutím na tlačidlo „Zmeniť názov“ sa spustí Controller.RunVerejné nové void Show() ( ShowDialog(); )
Ak chcete otvoriť bežné okno, metóda nemusí byť vôbec definovaná, pretože je už implementovaná v triede Form.
Dobre, máme to... Ako teraz TOTO použiť?
Teraz, keď je rám pripravený, pridanie nového tvaru pozostáva z nasledujúcich krokov:- Napíšeme rozhranie View, Model interface (ak je to potrebné).
- Implementujeme Zástupcu a zároveň sa rozhodneme, či mu prenesieme nejaké údaje alebo model.
- [Voliteľné] Napíšeme testy pre zástupcu, aby sme sa uistili, že je všetko v poriadku.
- [Voliteľné] Implementujeme model a testujeme ho.
- Hodíme na formuláre a implementujeme rozhranie View.
Demo projekt si môžete vyzdvihnúť z
Posledná aktualizácia: 31. 10. 2015
Vzhľad aplikácie sa nám prezentuje predovšetkým prostredníctvom formulárov. Tvary sú základným stavebným kameňom. Poskytujú kontajner na rôzne ovládacie prvky. A mechanizmus udalostí umožňuje prvkom formulára reagovať na vstup používateľa, a tak interagovať s používateľom.
Pri otvorení projektu vo Visual Studiu v grafickom editore môžeme vidieť vizuálnu časť formulára – časť, ktorú vidíme po spustení aplikácie a kam prenášame prvky z ovládacieho panela. V skutočnosti však formulár skrýva výkonnú funkčnosť pozostávajúcu z metód, vlastností, udalostí atď. Uvažujme o základných vlastnostiach foriem.
Ak spustíme aplikáciu, zobrazí sa nám jeden prázdny formulár. Avšak aj taký jednoduchý projekt s prázdnou formou má niekoľko komponentov:
Napriek tomu, že vidíme iba formulár, východiskovým bodom vstupu do grafickej aplikácie je trieda Program nachádzajúca sa v súbore Program.cs:
Používanie systému; pomocou System.Collections.Generic; pomocou System.Linq; pomocou System.Threading.Tasks; pomocou System.Windows.Forms; menný priestor HelloApp ( statická trieda Program ( static void Main() ( Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); ) ) )
Program najprv spustí túto triedu a potom použije výraz Application.Run(new Form1()) na spustenie Form1. Ak zrazu chceme zmeniť počiatočný formulár v aplikácii na nejaký iný, potom musíme zmeniť Form1 v tomto výraze na zodpovedajúcu triedu formulára.
Samotná forma je obsahovo zložitá. Je rozdelená na množstvo komponentov. Takže v štruktúre projektu je súbor Form1.Designer.cs, ktorý vyzerá asi takto:
Priestor názvov HelloApp ( čiastočná trieda Form1 ( ///
Toto deklaruje čiastočnú triedu formulára Form1, ktorá má dve metódy: Dispose(), ktorá funguje ako deštruktor objektov, a InitializeComponent(), ktorá nastavuje počiatočné hodnoty vlastností formulára.
Keď pridáte ovládacie prvky, ako napríklad tlačidlá, do tohto súboru sa pridá aj ich popis.
Ale v praxi sa s touto triedou stretneme len zriedka, keďže plnia hlavne dizajnové funkcie – nastavenie vlastností objektu, nastavenie premenných.
Ďalší súbor - Form1.resx- zásoby tvoria zdroje. Spravidla sa zdroje využívajú na vytváranie jednotných foriem pre niekoľko jazykových kultúr naraz.
A dôležitejší súbor - Form1.cs, ktorý sa v štruktúre projektu nazýva jednoducho Form1, obsahuje kód alebo programovaciu logiku formulára:
Používanie systému; pomocou System.Collections.Generic; pomocou System.ComponentModel; pomocou System.Data; pomocou System.Drawing; pomocou System.Linq; pomocou System.Text; pomocou System.Threading.Tasks; pomocou System.Windows.Forms; menný priestor HelloApp ( verejná čiastočná trieda Form1: Form ( public Form1() ( InitializeComponent(); ) ) )
V predvolenom nastavení existuje iba návrhár formulárov, ktorý jednoducho volá metódu InitializeComponent() deklarovanú v súbore návrhára Form1.Designer.cs. Práve s týmto súborom budeme viac pracovať.
Môže byť užitočné prečítať si:
- Prepojenie pluginov pre DLE, WordPress, Joomla;
- Blog o blogoch od Dmitrija Dončenka RAM limit;
- H1, h2, h3 tagy ako používať nadpisy v SEO propagácii;
- Máte problémy s nabíjaním telefónu?;
- Dobitie MTS Russia cez Webmoney: pohodlný a ekonomický spôsob platby na internete Dobite si svoj mobilný účet MTS prostredníctvom služby TelePay;
- Počúvanie hudby v cloude sa stalo pohodlným!;
- Nástroj na tvorbu mobilných aplikácií;
- Spojenie pozadia obrázka s pohyblivým spritom;