ESEMÉNY VEZÉRELT ALKALMAZÁSOK FEJLESZTÉSE I. Bevezetés Készítette: Gregorics Tibor
Előfeltétel: OAF (EAF2) Kötelező házi feladatok: 4 darab feladat max. 5-5 pontért Feltételek 2 hét késés: legfeljebb 3 pont, 4 hét késés 1 pont mindet a szorgalmi időszakban legalább 1 pontosra Géptermi zárthelyi: 2 darab 0-5-ig értékelt mindkettő legalább 2-es,1 javító zh Gyakorlati jegy: géptermi zárthelyik duplán és házi feladatok átlaga http://people.inf.elte.hu /gt/eva1
Cél Eseményvezérelt grafikus felületű alkalmazások készítése Windows/.NET Visual Studio / C# Linux/ Qt (C++) Több rétegű, komponens alapú alkalmazás fejlesztés
4 Eseményvezérelt alkalmazás A felhasználó párbeszéd üzemmódban kommunikál a programmal. A rendelkezésére álló perifériákkal (billentyűzet, egér, érintő képernyő stb.) avatkozik be a program futásába A program várakozik a felhasználó jelzéseire, és azokra reagál. Nemcsak a felhasználó válthat ki eseményt.
kezelő objektum tevékenység esemény-kapcsolat a forrás objektum és a kezelő objektum között akció forrás objektum kiváltó/okozó
Jellegzetes alakú és funkciójú objektumok, amelyeken meghatározott események válthatók ki. A gyakran előforduló komponensek előre definiáltak (újrafelhasználható kód), használatuk konvencionális. ablak (űrlap, form, keret) nyomógomb, jelölő négyzet, rádiógomb, címke, szövegdoboz, listadoboz, kombináltdoboz, szám beállító, folyamat jelző, űrlap (form, ablak, keret), szabványos dialógus ablak (üzenet ablak, megerősítés, fájl betöltés, fájl mentés, szín kiválasztás, stb.), kartonozó, panel. csúszka, görgető sáv, térköz menü (menübár, almenü, helyzet-érzékeny felnyíló menü) időzítő Grafikus felület vezérlői 7
Egy EVA felülete 9
10 Form Egy űrlap osztálydiagramja SajátŰrlap 2 TextBox GroupBox Button 2 RadioButton 2 ListBox
Űrlap osztálydefiníciója 11 public class SajátŰrlap : public Form { Button nyomógomb; TextBox doboz1, doboz2; GroupBox csoport; RadioButton rádiógomb1, rádiógomb2; ListBox lista; public void SajátŰrlap(void) { nyomógomb = new Button(); doboz1 = new TextBox(); csoport = new GroupBox(); rádiógomb1 = new RadioButton();... this.add(nyomógomb); this.add(doboz1); this.add(csoport); csoport.add(rádiógomb1);... vezérlők deklarálása vezérlők létrehozása vezérlők felvétele az űrlap felületére
Űrlap osztálydefiníciója... CONNECT(nyomógomb.Click, this.call); nyomógomb.click += new EventHandler(this.call); connect(nyomógomb,signal(clicked()),this,slot(call())); nyomógomb.addactionlistener(this); esemény-tevékenység kapcsolat eseménykezelő függvény void call(){ doboz1.text = "megnyomtak"; void call(object sender, EventArgs e) void call() public void actionperformed(actioneventargs e) 12
Űrlapot megjelenítő alkalmazás kódja public class SajátŰrlap : public Form { Button nyomógomb;... public void SajátŰrlap(void) { nyomógomb = new Button();... this.add(nyomógomb); CONNECT(nyomógomb.Click, this.call); Generálható kód void call(){ doboz1.text = "megnyomtak"; public class Main { static void Main() { run( new SajátŰrlap() ) 14
15 Felület-tervező (Designer) Vizuális felület-tervező (szerkesztő, designer) funkciói: vezérlő elemek "drag&drop" elrendezése egy form-on vezérlők kezdeti tulajdonságainak beállítása eseményekhez esemény-kezelők rendelése A tervezés eredménye egy magas szintű programozási nyelvű kód, amely beépül az alkalmazásunkba. Kérdések: mit kódoljunk a tervezővel, és mit közvetlenül? módosíthatunk-e a tervező által generált kódon?
16 Generált kód beépülésének technikája Button nyomógomb;... private void Init(void) { nyomógomb = new Button();... this.add(nyomógomb); CONNECT(nyomógomb.Click, this.call); public class SajátŰrlap : public Form {? public void SajátŰrlap(void) { Init(); void call(){ doboz1.text = "megnyomtak"; public class Main { static void Main() { run( new SajátŰrlap() ); Generált kód
Qt Designer form.ui uic UI_Form SetupUI() MyForm MyForm() XML ui_form.h myform.h myform.cpp.net Visual Studio MyForm NetBeans InitializeComponent() MyForm() MyForm InitComponents() MyForm() MyForm.java public static void main() main.cpp myform.designer.cs myform.cs program.cs 17
Űrlap-objektumok osztályai felületi logika Szolgáltatásokat nyújtó, önálló megjelenést nem biztosító osztályok 18 Két rétegű szoftver architektúra Felületi réteg Logikai réteg
19 Egymástól független eseménykezelések (primitív eset) Egymástól függő eseménykezelés (állapotdiagram) Korábbi események eredményeként előálló állapottól függ egy újabb esemény kezelése az aktuális állapotot jelezheti a forrás objektumok együttes tulajdonsága vagy egy speciális állapotjelző objektum Megvalósítás Felhasználói felület működési logikája az egyes eseménykezelők lekérdezik az aktuális állapotot egy központi eseménykezelő metódusban (control()) implementáljuk az állapot-átmeneteket (többágú elágazás)
Felületi réteg Tervezés Megjelenési terv Vezérlők specifikálása: funkciójuk leírása, fajtájuk kiválasztása, tulajdonságaik felsorolása Vezérlők típusának hierarchiája (osztálydiagramja) adott, nem kell explicit módon megadni Állapotdiagram: állapotok és állapot-átmenetek (esemény-tevékenység párok) definiálása Logikai réteg A EVA esemény-kezelését kiszolgáló részfeladatok feltárása (használati esetek) Osztályokba szervezett (objektumokhoz rendelt) tevékenységeket, számításokat végző eljárások, amelyeket a felületi réteg eseménykezelői hívnak meg. 20