Tapahtumapohjainen ohjelmointi Juha Järvensivu juha.jarvensivu@tut.fi 2008
Sisältö Tapahtumapohjainen ohjelmointi Käyttöliittymän rakenne Pääikkuna (top-level window) Lapsi-ikkuna (child window) Dialogit (owned window) Unkarilainen notaatio
Tapahtumapohjaisuus käyttöliittymissä Timer Sovellus Käyttöjärjestelmä
Tapahtuman kulku Event generator Event Dispatcher Handler1 Handler2 Handler n
Tapahtuma Tapahtumille ei yleensä määritellä paluuarvoa Windowsissa yleinen tapa on merkitä tapahtuman kuuntelija onetuliitteellä Kuuntelijat tietynlaisia funktioita, jotka rekisteröidään kuuntelemaan tapahtumaa Esim. Button btnok = new Button(); btnok.click += new EventHandler(OnOKClicked); public void OnOKClicked(object sender, EventArgs e) //
Erot perinteisiin sovelluksiin Sovelluksen kulku ei ole ennalta tiedossa Start A B C D End Dispatcher A C B D End
Perinteinen sovellus void main(string[] args ) string nimi, hetu, osoite; Console.WriteLine("Anna nimi: "); nimi = Console.ReadLine(); Console.WriteLine("Anna henkilötunnus: "); hetu = Console.ReadLine(); Console.WriteLine("Anna osoite: "); osoite = Console.ReadLine(); Save(nimi, hetu, osoite);
Tapahtumapohjainen sovellus string nimi, osoite, hetu; static void main() Application.Run( new Form1() ); private void nimi_handler(object sender, EventArgs e) nimi = ((TextBox)sender).Text; private void hetu_handler(object sender, EventArgs e) hetu = ((TextBox)sender).Text; private void osoite_handler(object sender, EventArgs e) osoite = ((TextBox)sender).Text; private void tallenna_click(object sender, EventArgs e) Save(nimi, hetu, osoite); Close();
Tapahtumakuuntelijan toteutus.net Java GTK WinApi MFC QT eventtien avulla rajapintojen avulla signaalien avulla sanomien avulla makrojen avulla signaalien ja slottien avulla
Esimerkki.NET public class MyWindow : System.Windows.Form Button btn = new Button(); public void MyWindow() //... btn.click += new EventHandler(BtnClick); public void BtnClick(object sender, EventArgs e) //
Esimerkki Java public class MyWindow extends JFrame implements ActionListener Button btn = new Button(); public void MyWindow() // btn.addactionlistener(this); public void actionperformed(actionevent e) //
Esimerkki MFC // CMyDlg.h class CMyDlg:public CDialog afx_msg void OnBnClick() DECLARE_MESSAGE_MAP() // CMyDlg.cpp BEGIN_MESSAGE_MAP( CMyDlg, CDialog ) ON_BN_CLICKED(IDC_BTN, &CMyDlg::OnBnClicked) END_MESSAGE_MAP() void CMyDlg::OnBnClick () //
Esimerkki GTK int main(int argc, char *argv[]) // GtkWidget *button = gtk_button_new(); g_signal_connect(g_object(button), clicked, G_CALLBACK(btnclick),NULL); void btnclick(gtkwidget* w, gpointer data) //
Esimerkki WinApi int WinMain( ) CALLBACK WndProc(HWND hwnd, UIT message, WPARAM wparam, LPARAM lparam) static HWND hwndbtn; switch( message ) case WM_CREATE: hwndbtn = CreateWindow( button, nimi", WS_CHILD WS_VISIBLE, 0, 30, 100, 30, hwnd, (HMENU) 1, hinst, NULL); break; case WM_COMMAND: if ( LOWORD(wParam) == BN_CLICKED ) if( HIWORD(wParam) == hwndbtn ) //
Sisältö Tapahtumapohjainen ohjelmointi Käyttöliittymän rakenne Pääikkuna (top-level window) Lapsi-ikkuna (child window) Dialogit (owned window) Unkarilainen notaatio
Pääikkuna (top-level window) Jokaisella sovelluksella on pääikkuna (main window), joka luodaan ohjelman käynnistyessä Pääikkuna sisältää yleensä otsikon, valikon, reunukset sekä minimize- ja maximize-painikkeet Kun pääikkuna suljetaan, myös sovellus suoritus päättyy Pääikkunalla ei ole parent-ikkunaa
Pääikkuna (top-level window)
Lapsikkuna (child window) Lapsi-ikkunalla (child window) on aina yksi isäntäikkuna (parent window) Paikkakoordinaatit suhteessa isäntäikkunaan Lapsi-ikkuna ei voi sijaita isäntäikkunan ulkopuolella
Dialogit Modaalinen vs modaaliton ikkuna Omistus-suhde (owner)
Z-järjestys
Ikkunan fokus Valittuna oleva ikkuna (kuvassa btn1) Komponentti, joka ottaa vastaan näppäinpainallukset jne. Käyttäjä voi vaihtaa focusta esim hiiren tai näppäimistön avulla
Tab-järjestys Tabulaattori-näppäimellä voidaan vaihtaa focus seuraavalle (lapsi)ikkunalle Suunnittele käyttöliittymä aina siten että sitä voidaan käyttää pelkän näppäimistönkin avulla!.net TabIndex TabStop Tab
Sisältö Tapahtumapohjainen ohjelmointi Käyttöliittymän rakenne Pääikkuna (top-level window) Lapsi-ikkuna (child window) Dialogit (owned window) Unkarilainen notaatio
Unkarilainen notaatio Nimeämiskäytäntö, jossa muuttujan nimi kertoo myös muuttujan tyypin tai käyttötarkoituksen int nrow; // n kertoo muuttujan tyypin (int) int rwpos; // rw kertoo muuttujan // käyttötarkoituksen (row)
Esimerkkejä Tyyppi Etuliite Esimerkki int n nage char ch chinitial float fl flangle double d dsalary unsigned u uid long l lhours BOOL b bdone WORD w wsize DWORD dw dwerror osoitin p pbutton
Esimerkkejä m_ jäsenmuuttuja (esim m_value) p osoitin (pvalue) m_pvalue m_nvalue (integer jäsenmuuttuja) m_pnvalue (osoitin integer-muuttujaan)
Esimerkki class Class1 void createcopy(int & nid, Class1*& pclass); bool copy(class1* pclass); int m_nid; bool Class1::createCopy(int & nid, Class1*& pclass) bool bret = false; nid = m_nid; pclass = new Class1(); if( pclass) if( pclass->copy(this) ) bret=true; else delete pclass; pclass = NULL; nid = 0; return bret;
Lähteitä Event-driven programming (wikipedia) http://en.wikipedia.org/wiki/event-driven_programming Event-Driven programming: Introduction, Tutorial, History http://eventdrivenpgm.sourceforge.net/event_driven_programming.pdf Windows overviews (top-level, child, owner) http://msdn.microsoft.com/library/default.asp?url=/library/enus/winui/winui/windowsuserinterface/windowing/windows/aboutw indows.asp
Lähteitä Window features http://msdn.microsoft.com/library/default.asp?u rl=/library/enus/winui/winui/windowsuserinterface/windowi ng/windows/windowfeatures.asp Ikkunan fokus http://en.wikipedia.org/wiki/focus_(computing )