E N D
UVOD V VIZUALNO PROGRAMIRANJE • Ko enkrat obvladamo programiranje v programskem jeziku C++, predvsem z vidika objektnega programiranja, je naš nov izziv okensko programiranje. Grafično okolje (Integrated Development Environment, IDE), ki nam ga zagotavlja Visual Studio 2005 je intuitivno naravnano, tako da bomo uporabo kontrolnikov in drugih orodij, ki nam jih ponuja, zlahka usvojili že po nekaj primerih. • Koncept .NET Framework • .NET Framework je sestavljen iz dveh komponent: CLR okolja (Common Language Runtime), v katerem se izvaja naš program in nabora .NET Framework knjižnic, ki zagotavljajo podporo delovanja našemu programu v CLR okolju, ne glede na to, v katerem jeziku smo naš program napisali. • .NET Framework ni del Visual C++-a temveč dodatek Windows operacijskega sistema, ki olajšuje izdelavo programskih in spletnih aplikacij. Zagotavlja večjo zanesljivost in varnost kode ter možnost povezovanja naše C++ kode s kodo, ki je lahko napisana v preko 20 različnih jezikih, ki jih implementira. • Common Language Runtime (CLR) je standardizirano okolje za izvajanje programov, napisanih v različnih programskih jezikih (C++, VB, C#). Specifikacije za CLR so zapisane v ECMA standardu (European Computer Manufacturers), ki narekuje CLI (Common Language Infrastructure). CLI vsebuje specifikacije vmesniškega jezika (Intermediate Language, IL) za virtualni računalnik (Virtual Machine), v kateri se prevede naša koda, ki smo jo napisali v nekem izmed višjih programskih jezikov. Med izvajanjem programa kodo, pretvorjeno v IL jezik, v strojno kodo pretvori JIT prevajalnik (just-in-time). • CLI določa tudi osnovne podatkovne tipe (Common Type System, CTS), ki jih lahko uporabljamo za pisanje programov v programskih jezikih, ki so zajeti v CLI implemenaciji. • CLI je standard, CLR pa Microsoftova implementacija CLI-ja. • Obstajata dva osnovna tipa C++ programov: • native C++ programi (Microsoft Foundation Classes, MFC; Windows Application Programming Interface, API) in • C++/CLI ali CLR programi. • Za pisanje native C++ programov bomo uporabljali C++, ki je določen z ISO/ANSI standardom, za pisanje CLR programov pa bomo uporabljali razširjeno verzijo jezika C++, imenovano C++/CLI.
UVOD V VIZUALNO PROGRAMIRANJE Vizualne C++ aplikacije Za pisanje okenskih CLR aplikacij bomo za izdelavo grafičnega uporabniškega vmesnika (Grafical User Interface, GUI) uporabljali Windows Forms šablono. V tej šabloni je na voljo veliko standardnih komponent, za katere nam kodo povsem samodejno ustvari sam VS. Naša naloga je potem le, da tako ustvarjenemu grafičnemu vmesniku dodamo kodo, ki bo zagotavljala funkcionalnost aplikacije glede na specifikacije naloge. C++ kodo, ki je napisana za izvajanje v CLR okolju, imenujemo upravljana (managed C++), ker z njo in podatki upravlja CLR. C++ kodo, ki se ne izvaja v CLR okolju, pa imenujemo neupravljana (unmanaged C++). V managed programih se sprostitev pomnilnika, ki smo ga za shranjevanje podatkov zasegli na dinamičen način, izvede samodejno, medtem ko v unmanaged programih mora za to poskrbeti programer. managed C++ native C++ .NET Framework Classes native C++ MFC Common Language Runtime operacijski sistem strojna oprema (hardware)
UVOD V VIZUALNO PROGRAMIRANJE Programiranje Pri okenskih programih potrebujemo: 1 - kodo za izdelavo grafičnega vmesnika, preko katerega bo uporabnik vplival na potek izvajanja programa in 2 - kodo za zagotavljanje zahtevanih funkcionalnosti programa. Visual C++ 2005 nam zagotavlja širok spekter pomoči pri izdelavi obeh. Pri tem pa je zelo pomembno, da vemo, na kakšen način deluje samodejno ustvarjanje kode, ker bomo pogosto morali ali dodajati svojo kodo ali modificirati že ustvarjeno. Vizualni programi imajo drugačno strukturo kot konzolni in so nasploh kompleksnejši. V konzolnem programu, ki ga poženemo iz ukazne vrstice, beremo podatke iz vhodnega toka (npr. tipkovnice) in rezultate izpisujemo neposredno na zaslon. Pri okenskih programih pa lahko do vhodnih in izhodnih naprav dostopamo le preko funkcij, ki nam jih zagotavlja Windows operacijski sistem. Ker je v oknih lahko istočasno aktivnih več programov, mora OS vedno vedeti, kateri izmed aplikacij je namenjen nek klik na miško ali tipkovnico, in potem ta program obvestiti o tem dogodku. Druga posebnost pri okenskih aplikacijah je ta, da morajo biti vedno pripravljene sprejemati podatke različnega podatkovnega tipa, ker vnaprej ne moremo vedeti, kdaj bo uporabnik izbral kakšno opcijo ali vnesel nek podatek. Te uporabnikove akcije zato sprejema operacijski sistem in jih beleži kot dogodke. Za programe, ki delujejo na ta način pravimo, da so dogodkovno naravnani in se razlikujejo od proceduralnih, ki imajo vnaprej določeno zaporedje izvajanja. Vhod v proceduralni program kontrolira program sam in se lahko zgodi le, ko program to dopusti, medtem ko se okenski program sestoji iz več funkcij, ki ustrezno odgovorijo na dogodke, ki jih sprožajo akcije uporabnika ali samega OS.
UVOD V VIZUALNO PROGRAMIRANJE • IDE • Integrirano razvojno okolje (Integrated Development Environment, IDE), ki ga dobimo z Visual C++ 2005, vsebuje vsa orodja, ki jih potrebujemo za pisanje, prevajanje, povezovanje in testiranje naših C++ programov. • Visual C++ 2005 omogoča tri načine pisanja interaktivnih vizualnih aplikacij: • - s pomočjo Windows API; gre za vmesnik, ki nam ga zagotavlja Windows operacijski sistem za komuniciranje med njim in aplikacijami, ki se izvajajo pod njegovim nadzorom. • - s pomočjo MFC; gre za nabor C++ razredov, v katerih je zajet Windows API. • s pomočjo Windows Forms šablone; gre za šablono, ki omogoča ustvarjanje aplikacij za izvajanje v CLR okolju. • Po kompleksnosti in velikosti kode, ki jo mora programer napisati, si ti trije načini sledijo tako, kot so tukaj našteti. • Naš okenski program je le eden izmed programov, ki so pod nadzorom Windows operacijskega sistema. Okenski program ne more sam komunicirati s periferijo, temveč vse poteka preko Windowsov. Zato je več razlogov. Eden izmed teh je ta, da si naš program vedno deli računalnik z drugimi programi, ki istočasno tečejo na računalniku in morajo Windowsi nadzorovati delitev računalniških resursov. • Dogodke, kot so npr. klik na miški, pritisk na tipko ali ko izteče nastavljena vrednost timerja, Windows operacijski sistem zapisuje kot sporočila in jih daje v zaporedje (message queue), ki je namenjeno našemu programu, naš program pa jih jemlje iz zaporedja in ustrezno obdeluje. Poleg tega lahko Windowsi od našega programa tudi zahtevajo neko akcijo ali pa mu sporočijo, da ima na razpolago nek nov podatek.
UVOD V VIZUALNO PROGRAMIRANJE • Windows Forms aplikacije • Kaj je Windows Forms? Gre za pripomoček pri kreiranju okenskih aplikacij, pripravljenih za izvajanje v CLR okolju. Uporabniški vmesnik (form) je okno, v katero lahko namestimo kontrolnike, preko katerih bo uporabnik interaktivno vplival na izvajanje programa. Visual C++ 2005 vsebuje preko 60 standardnih kontrolnikov, pripravljenih za takojšnjo uporabo. • Uporabljena okna in kontrolniki so pravzaprav objekti razredov, definiranih v C++/CLI knjižnici. Vsak razred vsebuje nabor lastnosti, preko katerih določamo obnašanje in pojavitev kontrolnikov ali posameznih oken. • Šablona Windows Forms aplikacij nam omogoča: • - izdelavo grafičnega uporabniškega vmesnika z okni in kontrolniki, • - spreminjanje lastnosti kontrolnikov in oken, • - definiranje dogodkov in pisanje kode in • spreminjanje obstoječih in dodajanje lastnih razredov. • Pisanje aplikacije • Po odprtju novega projekta vidimo, da koda, ki definira razred Form1, tvori svoj lasten imenski prostor, in sicer zato, da se imena objektov, deklariranih v tem projektu ne bi ujemala z imeni objektov, deklariranih v drugih projektih. • namespace UvodVizualno_1 • { • using namespace System; • using namespace System::ComponentModel; • using namespace System::Collections; • using namespace System::Windows::Forms; • using namespace System::Data; • using namespace System::Drawing; • … // preostali del kode • }
UVOD V VIZUALNO PROGRAMIRANJE Razred Form1 je izpeljan iz razreda Form, ki je definiran v imenskem prostoru System::Windows::Forms. Razred Form definira okno, razred Form1, v katerem bo definirano okno UvodVizualno_1 pa deduje vse člane razreda Form. V spodnjem delu definicije razreda Form1 je zapisana definicija funkcije InitializeComponent(). To funkcijo kliče konstruktor, služi pa za postavitev okna in vseh komponent, ki smo jih izbrali in dodali v grafičnem vmesniku. Tega dela kode, kot nam sporoča tudi komentar zapisan pred funkcijo, naj ne bi spreminjali ročno, saj bo za vse potrebne spremembe kode po spremembi grafičnega uporabniškega vmesnika poskrbel sam Visual Studio. void InitializeComponent(void) { this->components = gcnew System::ComponentModel::Container(); this->Size = System::Drawing::Size(300,300); this->Text = L"Form1"; this->Padding = System::Windows::Forms::Padding(0); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; } Zagon aplikacije Izvajanje aplikacije se kot vedno začne v funkciji main(), ta pa je definirana v datoteki UvodVizualno_1.cpp. int main(array<System::String ^> ^args { // Enabling Windows XP visual effects before any controls are created Application::EnableVisualStyles(); // Create the main window and run it Application::Run(gcnew Form1()); return 0; } Funkcija main() kliče dve statični funkciji, ki sta definirani v razredu Application, ki pa je definiran v System::Windows::Forms imenskem prostoru. Funkcija EnableVisualStyles(), ki je klicana prva, omogoči vizualne sloge v aplikaciji, funkcija Run() pa v Windowsih zažene sporočilno zanko za našo aplikacijo in na ta način naredi viden naš Form objekt (podan je kot dejanski argument funkcije).
UVOD V VIZUALNO PROGRAMIRANJE Aplikacije za delo z zbirkami podatkov Pri razvoju aplikacije, ki bo uporabljala obstoječi podatkovni vir (data source, relacijske podatkovne baze, spletne aplikacije, objekti), moramo ta vir navesti v samem projektu. To bomo naredili preko Data Sources okna, ki nam se pokaže, ko v glavnem meniju izberemo Data > Show Data Sources. Isto lahko dosežemo tudi tako, da na naše okno najprej namestimo DataGridView kontrolnik (predstavitev podatkov v obliki tabele z določenim številom vrstic in stolpcev, vsak stolpec se začne z zaglavno celico na vrhu, ki običajno opisuje vsebino tega stolpca, vsaka vrstica pa tudi ima na začetku zaglavno celico) DataGridView kontrolnik lahko uporabimo v dveh načinih: - nevezan (unbound); v tem načinu prenos podatkov moramo opraviti sami, običajno s funkcijo Add() za dodajanje posameznih vrstic in se običajno uporablja za manjše količine podatkov. - vezan (bound), v tem načinu podatkovno zbirko in tabelo določimo preko DataSource lastnosti kontrolnika in se nalaganje opravi avtomatsko;
UVOD V VIZUALNO PROGRAMIRANJE Vezan (bound) način Če kliknemo na majhno puščico v zgornjem desnem vogalu DataGridView kontrolnika, se nam odpre okno, v katerem določimo vir podatkov (po korakih, po katerih nas vodi čarovnik). Med določitvijo podatkovnega vira Visual Studio projektu samodejno doda še xxxBindingSource komponento, ki upravlja s komunikacijo med izbrano podatkovno zbirko in DataGridView kontrolnikom, xxxTabelAdapter, s katerim dostopamo do podatkov v izbrani tabeli ter MyZbirka1DataSet1 objekt, ki predstavlja samo zbirko. Sedaj lahko na naše okno namestimo BindingNavigator kontrolnik, ki je že prirejen za delo z xxxBindingSource komponento (v lastnostih BindingNavigator-ja je kot BindingSource potrebno določiti xxxBindingSource). Za obnovitev podatkovne zbirke z novimi ali spremenjenimi podatki je potrebno dodati ukazni gumb s klicem funkcije Update(). Primer ukazne vrstice je naslednji: DijakiTableAdapter->Update(MyZbirka1DataSet1->Dijaki);