seminarski vba

10
VISOKA POSLOVNO - TEHNIČKA ŠKOLA UŽICE Predmet : Uvod u objektno programiranje Tema : Muzički kviz, doba Baroka Profesor: Student: mr. Milovan Milivojević Admira Mostarac 163/04

Upload: gospodica-mostarac

Post on 21-Jul-2015

71 views

Category:

Documents


0 download

TRANSCRIPT

VISOKA POSLOVNO - TEHNIKA KOLA UICE

Predmet : Uvod u objektno programiranje Tema : Muziki kviz, doba Baroka

Profesor: mr. Milovan Milivojevi

Student: Admira Mostarac 163/04

1. UVODTema ovoga rada bie izrada VBA aplikacije koja e biti muziki kviz vezan za kompozitore iz doba Baroka i njihovu muziku. "Doba baroka bilo je doba raspevane, oseajne muzike. Kreativni kompozitori baroka stvarali su matovitu muziku i beeili je matovitim znacima." Najvei majstori baroka su Antonio Vivaldi, Georg Fridrih Hendl, Johan Sebastian Bah, ovani Batista Pergolezije, an Batist Lili. Ideja je bila da se iz padajue liste izabere kompozitor a potom numera 1,2 ili 3. Program e pustiti numeru i korisnik programa treba da pogodi o kojoj se numeri radi. Takoe tu je i teoretski deo sa pitanjima o samim kompozitorima.

2. O APLIKACIJIAplikacija se sastoji iz dva dela: muziki kviz kviz znanja

Muziki kviz je deo programa za pogaanje muzike numere odreenog kompozitora. Za svakog od ponuenih pet kompozitora date su tri numere, koje moemo da biramo iz padajue liste, i za svaku numeru su data etiri odgovora od kojih korisnik mora da odabere taan da bi nastavio dalje sa kvizom. Kviz znanja se odnosi na poznavanje podatako o ivotu i radu navedenih kompozitora. Izborom kompozitora iz padajue liste dobijamo pitanje vezano za njega, o njegovom ivotu, radu itd. Korisnik takoe dobija etiri ponuena odgovora i samo odabirom tanog odgovora moe nastaviti dalje sa kvizom. Pitanja i odgovori kao i nazivi numera nalaze se na radnim listovima ove radne sveske i oni nam koriste kao baza podataka iz koje program upa podatke o pitanju, numeri, izvoau, ponuenim i tanim odgovorima.

U radnoj svesci imamo est radnih listova (Majstori, Vivaldi, Hendl, Bah, Pergolezi, Lili). Prvi list je ifrarnik kompozitora dok ostali sadre podatke potrebne za kviz ( nazive numera, ponuene i tane odgovore). Svaki radni list sadri podatke za kompozitora po kome nosi naziv. Takoe, na radnom listu Majstori imamo i dve imenovane zone a to su Majstori i Numere.

One e nam kasnije posluiti kao Row source svojstvo kod korienih padajuih listi prilikom kreiranja aplikacije.

Podaci na radnim listovima sa kompozitorima su sloeni tako da u nam se u zonama A1:F3 nalaze podaci o kompozicijama. Sloene su tako da prva kolona sadri redni broj kompozicije, da bi kasnije mogli da naemo odgovarajuu kompoziciju koju korisnik odabere, naredne etiri kolone sadre etiri ponuena odgovora, dok peta kolona sadri taan odgovor. U rasponu elija A5:G9 nalaze se podaci za kviz znanja. Sloeni su tako da prva kolona sadri redni broj pitanja, druga kolona sadri pitanje, naredne etiri kolone sadre odgovore dok poslednja kolona sadri tane odgovore na pitanja.

3. KREIRANJE INTERFEJSA APLIKACIJENakon popunjenih radnih listova i dodavanja imenovanih zona prelazimo na kreiranje interfejsa aplikacije i pisanje kooda. Dodajemo korisniku formu i jedan programski modul. Objekte koje smo koristili pri kreiranju korisnikog interfejsa su Label, ComboBox, OptionButton i CommandButton. Da bi dobili lepi interfej aplikacije glavnoj formi menjamo svojstvo Picture gde biramo sliku koja e biti u pozadini. Takoe menjamo svojstvo PictureSizeMode da bi podesili da se slika automatski poveava ako se veliina glavnog prozora povea (1-fmPictureSizeModeStrech)

Objekti Label1, Label2 i Label3 sadre stalne podatke koje upisujemo prilikom kreiranja interfejsa aplikacije dok labela lblPitanje i svih osam OptionButton-a na formi dinamiki uzimaju svoju vrednost u zavisnosti od odabranog kompozitora odnosno odabranog broja kompozicije. Jedina svojstva promenjena kod objekata tipa Label su BackStyle, ForeColor i Font. cbMajstori je padajua lista iz koje biramo kompozitore i ona svoje podatke, preko svojstva RowSource, povlai sa radnog lista iz imenovane zone Majstori. cbPesma povlai svoje podatke iz imenovane zone Numere.

4. OBJANJENJE KOODA4.1 Kood u programskom modulu Kao to smo ve ranije naveli u prilikom kreiranja aplikacije dodali smo jedan programski Modul koji u sebi sadri deklarisanje glavnih promenjivih aplikacije kao i tri glavne funkcije koje se pozivaju iz same aplikacije.Option Public Public Public Public Public Public Public Public Public Public Public Public Public Public Public Public Explicit wb As Workbook ws As Worksheet ws1 As Worksheet rg As Range rg1 As Range Odgovor As String Odgovor1 As String Tacan As String Tacan1 As String Izvodjac As String Psm As Integer Const Const Const Const Const SND_SYNC = &H0 SND_ASYNC = &H1 SND_NODEFAULT = &H2 SND_LOOP = &H8 SND_NOSTOP = &H10

Sve promenjive u programskom modulu su deklarisane kao javne (Public) jer nam je potrebno da budu vidljive iz svakog dela programa i svake sub rutine. Od objektnih promenjivih koristili smo Workbook, Worsheet i Range. One nam koriste za kretanje kroz listove radne sveske i preuzimanje vrednosti iz elija. Promenjive Izvodjac i Psm nam slue da bi smo znali kog je kompozitora korisnik izabrao i koju numeru i tako se pozicionirali na radni list i preuzeli odgovajue ponuene odgovore kao i taan odgovor. Konstante koje smo deklarisali nam slue kao komande za Windows-ov API player muzikih fajlova. Njihova znaenja su sledea: SND_SYNC Ova komanda omoguava da se nastavi izvravanje programa dok traje muzika u pozadini. SND_ASYNC Ova komanda spreava izvravanje programa dok se ne zavri putena muzika SND_NODEFAULT Ukoliko ne moe da se pronae traeni muziki fajl nee biti puten Default zvuk SND_LOOP Program e putati fajl u krug, odnosno, kada se kompozicija zavri, pustie je ponovo. SND_NOSTOP Ukoliko ukljuimo ovu opciju program e ekati da se zavri prva kompozicija pre nego pusti sledeu tj. nee je prekidati.

Funkcija Pusti slui nam za putanje muzikih fajlova preko Windows API-ja.Declare Function Pusti Lib "winmm.dll" Alias "sndPlaySoundA" _ (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long

Ona se poziva na sistemsku biblioteku sistemsku winmm.dll i predaje joj putanju fajla koji treba pustiti lpszSoundName kao i jedan od zadatih parametara (flagova) kako da pusti odreeni fajl. Funkcija Pesma slui da bi na odgovoru izabrane pesme pronala na radnom listu kompoziciju koju je korisnik izabrao, pustila je, prikazala ponuene odgovore i preuzela odgovarajui taan odgovor.Public Function Pesma(Pes As Integer) Dim SoundName As String Dim wFlags As Double Dim X Set ws = wb.Worksheets(Izvodjac) Set rg = ws.Range("A1") Do Until rg.Value = Pes Set rg = rg.Offset(1, 0) Loop Barok.optOdg1.Caption = rg.Offset(0, Barok.optOdg2.Caption = rg.Offset(0, Barok.optOdg3.Caption = rg.Offset(0, Barok.optOdg4.Caption = rg.Offset(0, Tacan = rg.Offset(0, 5).Value

1).Value 2).Value 3).Value 4).Value

SoundName = Application.ThisWorkbook.Path & "\" & Izvodjac & "\" & Pes & ".wav" wFlags = SND_ASYNC X = Pusti(SoundName, wFlags) End Function

Prilikom poziva funkcije predajemo joj redni broj pesme koju je korisnik izabrao, ona se pozicionira na radni list odgovarajueg kompozitora i kroz petlju Do pozicionira se na odgovarajui red sa ponuenim pitanjima i tacnim odgovorom za izabranu kompoziciju. OptionButton-ima na korisnikoj formi dodeljuje za natpise vrednosti iz elija u tom redu a promenjivoj Tacan dodeljuje vrednost iz poslednje kolone. Zatim prelazi na pozivanje funkcije Pusti kojoj alje putanju ka fajlu koji treba pustiti kao i flag za njegovo putanje. NAPOMENA: Muziki fajlovi se nalaze rasporeeni u direktorijumima koji nose imena kompozitora i u svakom od njih nalaze se po tri muzike numere imenovane 1,2 i 3. Korienjem svojstva Application.ThisWorkbook.Path preuzimamo putanju radne sveske i na nju nadovezujemo, koristei ampersand (&), naziv direktorijuma, broj pesme i ekstenziju fajla ( .wav).

Funkcija Kviz nam koristi za kviz znanja. Ona na se osnovu izabranog izvoaa pozicionira na odgovarajui list u radnoj svesci i sa njega preuzima pitanja, ponuene odgovore i taan odgovor.Public Function Kviz() Dim Pitanje As Integer Set ws1 = wb.Worksheets(Izvodjac) Set rg1 = ws1.Range("A5") Randomize Pitanje = Round(Rnd() * (5 - 1) + 1, 0) Do Until rg1.Value = Pitanje Set rg1 = rg1.Offset(1, 0) Loop Barok.lblPitanje.Caption = rg1.Offset(0, 1).Value Barok.optKviz1.Caption = rg1.Offset(0, 2).Value Barok.optKviz2.Caption = rg1.Offset(0, 3).Value Barok.optKviz3.Caption = rg1.Offset(0, 4).Value Barok.optKviz4.Caption = rg1.Offset(0, 5).Value Tacan1 = rg1.Offset(0, 6).Value End Function

Prilikom poziva funkcije ona se pozicionira na odgovarajui radni list izabranog izvoaa, korienjem funkcija ROUND i RND() generie nasumian broj od 1 do 5 (za svakog kompozitora imamo po pet pitanja)i pozicionira se na red sa odgovarajuim pitanjem (petlja Do Until). Iz dobijenog reda preuzima se iz prve kolone pitanje i dodeljuje kao natpis lblPitanje na radnoj formi, OptionButton-ima vezanim za kviz se dodeljuju natpisi koji se nalaze u susedne etiri kolone a promenjiva Tacan1 uzima vrednost iz poslednje kolone. 4.2 Kood u aplikaciji Prvi podprogram koji se izvrava prilikom samog otvaranja radne sveske je Workbook_openPrivate Sub Workbook_Open() Application.WindowState = xlMinimized Barok.Show End Sub

On nam omoguava da odmah prilikom otvaranja radne sveske minimiziramo prozor Excel okruenja a nakon toga pokrenemo aplikaciju i prikaemo glavnu formu. NAPOMENA: Da bi se ovaj dogaaj odigrao kako treba svojstvo ShowModal kod korisnike forme mora biti podeeno na False. U suprotnom, prozor aplikacije e se minimizirati sa prozorom Excel-a.

Ulaskom u kood aplikacije (desni klik na formu i biranjem opcije Show code ili selektovanjem forme i pritiskom na taster F7) moemo da vidimo ta se krije u pozadini naeg programa. Sledei dogaaj koji se izvrava je uitavanje forme u memoriju, odnosno UserForm_Initialize.Private Sub UserForm_Initialize() Set wb = ThisWorkbook End Sub

On pri samom uitavanju forme u memoriju objektnoj promenjivoj wb dodljuje vrednost ThisWorkbook, odnosno, kasnije, omoguava da se sve kasnije operacije vre nad trenutno aktivnom radnom sveskom. Kao to smo ve ranije pomenuli, na formi imamo dva ComboBox objekta (cbMajstori i cbPesma). Za svaki od ovih objakata vezan je odgovarajui kod kao i pozivi ka odgovarajuim funkcijama u okviru modula.Private Sub cbMajstori_Change() Izvodjac = cbMajstori.Value Call Kviz optKviz1.Value = 0 optKviz2.Value = 0 optKviz3.Value = 0 optKviz4.Value = 0 End Sub

Promenom vrednosti u cbMajstori pokree se dogaaj (event) Change. Za njega smo vezali kood koji javnoj promenjivoj Izvoa (deklarisanoj u programskom modulu) dodeljuje vrednost cbMajstori, odnosno ime kompozitora. Ovo programu omoguava da se svaki put prilikom promene kompozitora pozicionira na odgovarajui radni list odnosno da zna o kom je kompozitoru re. Podprogram zatim poziva funkciju Kviz koju smo ranije objasnili a zatim resetuje OptionButton-e vezane za kviz da ne bi ostao neki od prethodno selektovanih odgovora nakon promene kompozitora.Private Sub cbPesma_Change() optOdg1.Value = 0 optOdg2.Value = 0 optOdg3.Value = 0 optOdg4.Value = 0 Psm = cbPesma.Value Call Pesma(Psm) End Sub

Promenom vrednosti u cbPesma program resetuje vrednosti u OB vezanim za muziki kviz, promenjivoj Psm dodeljuje izabranu vrednost u ComboBox-u a zatim poziva funkciju Pesma kojoj prosleuje redni broj pesme koju je korisnik izabrao.

Ispod ComboBox-ova nalaze se OptionButton-i koji bi do sada trebalo da imaju natpise sa ponuenim odgovorima.Private Sub optOdg1_Click() Odgovor = optOdg1.Caption End Sub Private Sub optKviz1_Click() Odgovor1 = optKviz1.Caption End Sub

Za sve OB-ove vezan je slian kood. Dogaaju Click dodeljena je akcija koja javnim promenjivim Odgovor, odnosno Odgovor1 dodeljuje vrednost natpisa iz odabranog OptionButton-a. Ovo nam omoguava da se na odabrani odgovor promeni svaki put kada kiknemo na drugo OB. Na formi imamo dva CommandButton-a. Oba imaju natpis Odgovori. Razlika je u tome to nam levo Cb slui za odgovaranje na muziki kviz a desno na odgovaranje na kviz znanja.Private Dim Dim Dim Sub CommandButton1_Click() wFlags As Double S Stani As String

If Odgovor = Tacan Then MsgBox "Odgovor je tacan", vbInformation, "Doba baroka" Stani = Application.ThisWorkbook.Path & "\Stop.wav" wFlags = SND_ASYNC S = Pusti(Stani, wFlags) Else MsgBox "Odgovor je pogresan", vbCritical, "Pokusajte ponovo" End If End Sub

Klikom na levo dugme aktiviramo dogaaj Click. Program zatim proverava da li je na selektovani odgovor jednak tacnom odgovoru. Ako jeste, program izbacuje odgovarajuu poruku o tome i zaustavlja muziku do odabira sledee kompozicije. Ako nije program izbacuje poruku o pogrenom odgovoru ali ne prekida muziku. NAPOMENA: S obzirom na to da Windows API nema opciju za zaustavljanje zvuka morali smo da kreiramo prazan .wav fajl (2 sekunde tiine) koji se nalazi u osnovnom folderu gde i radna sveska (Stop.wav) i on nam slui za zaustavljanje muzike , odnosno putanjem njega prekidamo kompoziciju koja je prethodno ila. Klikom na desno dugme, program proverava da li je na drugi odgovor jednak tanom odgovoru iz kviza znanja. Ako jeste, izbacuje odgovarajuu poruku o tome i ponovo poziva funkciju Kviz, a ako nije, izbacuje poruku da je odgovor pogrean i eka dok korisnik ne odgovori tano na postavljeno pitanje.

Private Sub CommandButton2_Click() If Odgovor1 = Tacan1 Then MsgBox "Odgovor je tacan", vbInformation, "Doba baroka" Call Kviz Else MsgBox "Odgovor je pogresan", vbCritical, "Pokusajte ponovo" End If End Sub

Poslednji dogaaj koji se izvrava u naoj aplikaciji je UserForm_Terminate odnosno gaenje forme a samim tim i programa.Private Dim Dim Dim Sub UserForm_Terminate() wFlags As Double S Stani As String

Stani = Application.ThisWorkbook.Path & "\Stop.wav" wFlags = SND_ASYNC S = Pusti(Stani, wFlags) End Sub

Ovaj potprogram poziva funkciju Pusti i alje joj putanju ka fajlu Stop.wav. Ovo je stavljeno kao zatita ako korisnik ugasi aplikaciju pre odgovaranja na pitanje iz muzikog kviza. U suprotnom, kompozicija bi nastavila da svira u pozadini bez obzira na to to je program ugaen.