Tapahtumapohjainen ohjelmointi Juha Järvensivu juha.jarvensivu@tut.fi 2007
Sisältö Tapahtumapohjainen ohjelmointi Käyttöliittymän rakenne Pääikkuna (top-level window) Lapsi-ikkuna (child window) Dialogit (owned window) Unkarilainen notaatio
Hollywood Principle "Don't call us; we'll call you." You implement the interfaces, you get registered. You get called when the time is right. This requires a distinctly different way of thinking to that which is taught in introductory programming where the student dictates the flow of control. Dafydd Rees
Tapahtumapohjaisuus käyttöliittymissä Timer Sovellus
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) //
// CMyDlg.h class CMyDlg : public CDialog afx_msg void OnBnClick() DECLARE_MESSAGE_MAP() Esimerkki MFC // 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) 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 ) //
Esimerkki
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 sulkeutuu 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 (owner window) Dialogeilla voi kysyä käyttäjältä tietoa ja antaa käyttäjälle palautetta (keskustelu) Dialogi voi olla modaalinen tai modaaliton Omistus-suhde (owner)
Z-järjestys
Ikkunan fokus Valittuna oleva ikkuna (kuvassa btn1) Komponentti, joka ottaa vastaan näppäinpainallukset jne. Fokus voi olla yhdellä komponentilla kerrallaan Fokus voidaan vaihtaa hiirellä klikkaamalla
Tab-järjestys Tabulaattori-näppäimellä voidaan vaihtaa aktiivista komponenttia.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 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;
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
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 Hollywood principle http://c2.com/cgi/wiki?hollywoodprinciple 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 )