Transcript

MAREKBISZ MIROSAW CIELECKI

WICZENIA ZC++BUILDERA -.' Spis treci Wstp.......................................................................................................................................5 1. Podstawy programowania w Windows i C++ Builderze...............................................6 2.Biblioteka VCL - przegl/d najwa1niejszych komponentw........................................20 3.Programowanie obiektowe w C++ Builderze.................................................................41 4.Operacje wejcia-wyjcia...............................................................................................58 5.Grafika i multimedia w C++ Builderze..........................................................................66 6.Bazy danych w C++ Builderze.......................................................................................75 7.Pliki pomocy Windows, DDE, modu= LZExpand.........................................................101 WstpNiniejsza ksi/1ka ma za zadanie unaoczni@ czytelnikowi prostot dzisiejszego programowania w Windows. Narzdziem, ktre w niej zosta=o omwione jest pakiet firmy Borland - C++ Builder. W trakcie lektury czytelnik przejdzie kilka etapw - pocz/wszy od prostej aplikacji, skoAczywszy na zagadnieniach zwi/zanych z dyna- miczn/ wymian/ danych midzy procesami. Zgodnie z zasad/, i1 jeden przyk=ad jest wart wicej ni1 1000 s=w, ka1de z oma- wianych zagadnieA zrealizowane jest wed=ug schematu: wprowadzenie - kolejne za- dania wnioski i podsumowanie. Gotowe projekty zadaA znajdzie czytelnik na dys- kietce po brzegi wypchanej interesuj/cymi przyk=adami i do=/czonej do ksi/1ki. Pole- cam dok=adne przeledzenie wszystkich zadaA (w=asnorczne wpisywanie kodu Erd=owego cho@ bardziej dowiadczonym wystarczy by@ mo1e sama jego analiza). Przed jednym chcia=bym przestrzec potencjalnego czytelnika, ktry by@ mo1eoczekuje, i1 zostanie poprowadzony od kliknicia do kliknicia - prost/ drog/ stan- dardowych aplikacji: nie jest to typowa ksi/1ka dla pocz/tkuj/cych. Nie bdziemy w niej chadza@ utartymi cie1kami. Od pocz/tkuj/cego czytelnika wymaga ona zwik-szonego wysi=ku. Nie ma tu konkretnych przepisw w rodzaju jak upiec ciasto mali- nowe", Za=o1eniem tej ksi/1ki jest wskazanie pewnych drg jako materia=u do w=a- snych eksperymentw. Czytelnikowi nie stawia si 1adnych wymagaA. Przyda=aby si jedynie podstawo- wa znajomo@ jzyka C(C++), ale i to nie jest konieczne. Staram si poni1ej wyjania@potrzebne konstrukcje jzyka, wiele mo1na rwnie1 nauczy@ si z za=/czonych do ksi/1ki przyk=adw. Przyda si te1 znajomo@ (cho@by podstawowa) jzyka angiel- skiego, gdy1 dokumentacja on lin" dla C++ Buildera nie zosta=a na razie spolszczona. Chcia=bym w tym miejscu zaznaczy@, 1e ksi/1ka ta w 1adnym wypadku nie obej- muje wszystkich zagadnieA zwi/zanych z programowaniem w C++ Builderze. Ma ona jedynie za zadanie umo1liwi@ czytelnikowi =atwe i szybkie wejcie w bogaty wiat programowania w Windows. 1.PodstawyprogramowaniawWindowsiC++ Builderze wiczenie 1.1. Ilustracja sensu uywania procedur, inaczej: nis wilk razy kilka, ponieli i wilka..." Wprowadzenie:wszyscy,ktrzyzaczynaj/ programowa@, robi/ towprzestarza=ymstylui zak=adaj/, 1e wszystko odbywa@ si musi w z gry okrelonym porz/dku.Program.sekwencyjnysk=adasi z nastpuj/cychposobieinstrukcjiwykonywanychw sztywnejkolejnoci. W poni1szychzadaniach udowodnimy,1e z odejciaodsekwencyjnego stylu programowania wyp=ywaj/ pewne wymierne korzyci. Zadanie1.1.1:pos=uguj/c si liniamikomentarzanapisa@ programwywietlaj/cytrzyrazy okienko z napisem Witaj". Wykonanie: // utworzenie okna // wywietlenie napisu Witaj" // zamknicie okna // utworzenie okna // wywi et l eni e napi suWi t aj " //zamkni ci eokna //utworzenieokna // wywi et l eni enapi su Wi t aj "//zamkni ci eokna Podsumowanie: ju1 na pierwszy rzut oka wida@, 1e co jest nie tak. Nasz program" wykona swoje - wypisze trzy razy na ekranie napis Witaj", ale brakuje temu wszystkiemu elegancji. Gdybymychcielizmieni@ napisWitaj"najaki inny,musielibymytozrobi@ trzykrotnie! Poza tym nasz program sk=ada si z trzech identycznych czci. W ka1dej z nich moglibymy si pomyli@. Wszystkie te wady programowania sekwencyjnego rozwi/zuje u1ycie procedur. Zadanie1.1.2:pos=uguj/c si liniamikomentarzanapisa@ szkielet"programuwy-wietlaj/cego trzy razy okienko Witaj" przy u1yciu procedury wyswietl_okno. Wykonanie: // procedura wyswietl_okno //C // utworzenie okna // wywietlenie napisuWitaj" // zamknicie okna // ] // program g$wny // C // wyswietl__okno (pierwsze wywo$anieprocedury) // wyswietl_okno (drugie wywo$anie procedury) // wyswietl_okno (trzecie wywo$anie procedury) // ) Podsumowanie:dzisiajzmianas=owaWitaj"nainnewymagaingerencjitylkowjednym miejscuprogramu.Naszprzyk=adowyalgorytmjestprosty,alewyobraEmysobie,1emielibymypoprawia@ du1y programzawieraj/cydziesi/tkitysicyliniikodu....Nastpna sprawa - gdyby si okaza=o, 1e w naszej procedurze trzeba co zmieni@ (np. dopisa@ pobranie odpowiedziodu1ytkownika)-wystarczydotegojednazmianawewn/trzprocedury,anie trzy kolejne identyczne, jak w przypadku zadania 1.1.1. Zadanie 1.1.3: napisa@ program wywietlaj/cy kolejno ,,Witaj", Witaj ponownie", Witaj raz jeszcze". Wykonanie: // procedura wyswietl_okno ($a(cuch_znakw tekst_do__wyswietlenia) // C // utworzenieokna // wywietlenie napisu tekst_do_wyswietlenia // zamknicieokna // } // program g$wny // t // wyswietl_okno(,.Witaj") (pierwsze wywo$anieprocedury) // wyswietl_okno(Witaj ponownie") (drugie wywo$anieprocedury) // wyswietl_okno(Witaj razjeszcze") (trzecie wywo$anieprocedury) // } Podsumowanie:jakwida@, to1e pos=u1ylimysi procedur/, w niczymnieogranicza naszychmo1liwoci,Przyodpowiedniejjejmodyfikacji(dodalimyparametr tekst_do_wyswietlenia)mamywdalszymci/gumo1liwo@wywietleniazaka1dymrazem innego tekstu. Na uwag zas=uguje fakt, 1e tekst dowyswietlenia jest jedynie identyfikatorem tekstu przesy=anego do procedury z programu g=wnego. Tak wicprzypierwszymwywo=aniunaszejproceduryzawartoci/ tekst_do_wyswietleniabdzie Witaj",wdrugim-Witajponownie"itd.Tymsposobemtasamaproceduramo1ewywietla@ za ka1dym razem inny tekst, cho@ przecie1 nie zmieniamy jej kodu. Takiidentyfikator"bdziemydalejnazywa@ zmienn/. Dlaka1dejzmiennejmusizosta@okrelony typ danych, ktre ma zawiera@ (dlatego w deklaracji procedury u1ylimy okrelenia (a)cuch_znakw). wiczenie 1.2. Funkcje - poszerzenie informacji z wiczenia 1.1 Wprowadzenie: funkcja jest odpowiednikiem procedury, ale zwraca warto@. W C++ mamy do czynienia w=anie z funkcjami. Zadanie 1.2.1: przekszta=ci@ nasz program przyk=adowy z zadania 1.1.3, tak aby pobiera= ort od u1ytkownika odpowiedE na nasze pozdrowienie lub pytanie. Wykonanie: //$a(cuch__ znakw wyswietl^okno ($a(cuctwnakw tekst_do_wysw1etleni a) //{ //$a(cuctwnakw Odpowiedz // utworzenie okna //wywietlenie napisu tekst_do_wyswietlenia //pobranie odpowiedzi u1ytkownika i wstawienie jej podzmienn2// Odpowiedz // zamknicieokna // zwrotzmiennej Odpowiedz // } //program g$wny // { // $a(cuch_znakw warto3_zwrcona // warto3_zwrcona - wyswietl_okno(Witaj") (pierwsze wywo$anie // funkcji) // warto3_zwrcona=wyswietl_okno(warto3_zwrcona) (drugie wywo$anie // funkcji) // warto3_zwrcona= wyswietl_okno(warto"3_2wrcona) (trzecie wywo$anie // funkcji ) // } Podsumowanie: jak wida@ program bawi si z u1ytkownikiem w papug": za ka1dym razem wywietla to, co zosta=o poprzednio wpisane. Warto zauwa1y@, 1e w deklaracji naszej funkcji znajdujesi okrelenietypuzwracanychdanych.Takwic przypierwszymwywo=aniu funkcji z programu g=wnego zostanie zwrcony =aAcuch znakw i podstawiony pod zmienn/warto./_zwrcona.Zauwa1my,1e przynastpnymwywo=aniufunkcjijakoparametrdo wywietlenia przesy=anajest w=anie owa zmienna (czyli to.co wprowadzi= u1ytkownik). W drugim wywo=aniu funkcja wywietli zawarto@ tej zmiennej it wiczenie 1.3. Zdarzenia i ich obsuga, czyli wszystko si% moe zdarzy'"Wprowadzenie:systemWindowszmieni= podejciedozasadsterowaniaprogramem. Dawniejwszystkoopiera=o si o wykonywaniejednejustalonejsekwencjioperacji.W Windowswszystkowi/1e si z odpowiadaniemnazdarzenia.Naprzyk=adgdyklikniemy mysz/ w odpowiednimmiejscu,rozwiniesi menu-oznaczato, 1e aplikacjaodpowiedzia=anazdarzenieonazwiemouseclick.ProgramowaniewWindowsjestzorientowaneprzez zdarzenia.Musimyby@ przygotowaninawszystko,como1e zrobi@ u1ytkownik.Wzadaniu poni1ejczekanaspierwszykontaktzIDE-czylirodowiskiemC++Buildcra,orazprosty program odpowiadaj/cy na kliknicie mysz/.Po uruchomieniu C++ Buildcra, widzimy przed sob/ co mniej wicej takiego: Cz@ A-B to trzon" pakietu. Znajduje si tutaj podrczne menu u1ytkownika, z lewej strony kilkaprzyciskwoperacyjnychoraz(rzeczwa1na)wczciB-zestawkomponentw,czyli klockw",zktrychbdziemybudowa@ aplikacje.Komponentys/ specjalnie zaprojektowanymi obiektami jzyka C++ (lub Pascal). Zbudowane s/ tak, aby =atwe by=o ich wielokrotneu1ycie.Wdalszejczciksi/1ki komponentyzostan/ jeszczeomwione dok=adniej. Cz@CtoInspektorObiektw-bardzoprzydatnenarzdzies=u1/cedoedycjiw=aciwoci obiektw (komponentw), a tak1e przypisywania im okrelonych reakcji na zdarzenia.Naprzyk=adreakcjanaklikniciemysz/ nosinazw OnClick".Zestaw obs=ugiwanychprzezdanyobiektzdarzeA jestwidocznynakarcieEvents(zdarzenia) Inspektora Obiektw. Wczci D widzimy g=wne okno naszej przysz=ej aplikacji. Zadanie1.3.1:napisa@ programodpowiadaj/cynaklikniciemysz/ w dowolnymmiejscu formularza (czyli naszego okna g=wnego) wywietleniem okienka z wiadomoci/.Wykonanie: 1.WInspektorze Obiektw wybieramy kart Events (zdarzenia). 2.Dwukrotnieklikamywbia=e poleobokpozycjiOnClick.Pojawisi okno edycjikodu.Teraz midzy klamrami {" i }" oznaczaj/cymi cia=o funkcji wpiszemy kod odpowiedzi na zdarzenie mouseclick (rysunek 1.3) .3.Wpisujemy,M^^sageBox(0,"Hejtoja!","Uhaha",0);"(wporwnaniuzprzyk=adamiz poprzednich @wiczeA nie jest to mo1e zbyt jasne - ale taka jest cena przeniesienia teorii w praktyk).Jeszczejednauwaga-uwa1ajmynadu1e i ma=e litery.Je1eliwpiszemy messagebox\ C++ Builder nie rozpozna tego jako nazwy funkcji wywietlaj/cej okienko (MessageBox). 4.Pozostajenamskompilowa@ i uruchomi@ naszprogram.Kompilacjajestprocesem t=umaczenia wpisanego przez nas (lub wygenerowanego automatycznie) kodu Erd=owego do postacibezporedniozrozumia=ejdlamaszyny.PodC++Builderemmo1emyto wykona@ za pomoc/ klawisza skrtu (F9") lub wybieraj/c z menu Run pozycj Run. 5.Jeliwszystkozrobilimypoprawnie,powinnopojawi@ si okno z napisemForml". Kliknijmy w obszar tego okna. Pojawi=o si mniejsze okienko Uhaha" z napisem Hej to ja!"-naszaaplikacjaodpowiedzia=a na nacinicieprzyciskumyszywykonaniem wpisanego przez nas kodu, czyli utworzeniem okienka dialogowego. 6.Nale1a=obyterazzapisa@ naszedokonania.Zamknijmyaplikacj (wystarczynacisn/@ znakX"wprawymgrnymroguoknaaplikacji).PopowrociedoC++Bu-ildera wybieramy z menu File opcj Save Project As ...". 7. W tym miejscu umwimy si co do konwencji nazw, jakich bdziemy u1ywa@. Porz/dek wymaga, aby kolejne zadania zapisywa@ w osobnych katalogach. Umwmy si, 1e nazwy katalogw(folderw)bdziemyzawszetworzy@ wed=ug schematuzad"+nrzadania. Nazw plikuprojektuiprogramuczytelnikmo1e nada@ wed=ug uznania,cho@ mo1nazostawi@ po prostu Projectl" i Unitl". 8.Wpierwszymoknie,ktresi pojawi,nacinijmyprawyklawiszmyszy,anastpnie wybierzmy kolejno Nowy obiekt" i Folder". W nazw nowego foldera wpiszmy zad 131", a nastpnie wejdEmy do niego (dwukrotne kliknicie mysz/)i nacinijmyZapisz".Pojawisi nastpneoknozpytaniemonazw projektu- wciskamyZapisz". Podsumowanie:nauczylis'mysi, jakskompilowa@ i zapisa@ prostyprojektwC++ Builderze.Cowa1niejsze-nauczylis'mysi, jakobs=ugiwa@ zdarzeniaWindows.Pod Windows wystpuj/ dziesi/tki, a raczej setki r1nego typu zdarzeA. Nie wszystkie z nich bd/naswdanymmomencieinteresowa@, jednakwartozda@ sobiespraw z tego,1e tow=anie zdarzeniabd/ orodkiemnaszychprogramw.Ka1dynaszprogram,jakbardzonieby=by skomplikowany-bdziejedyniezbioremodpowiedzinaszeregr1norodnychzdarzeA.Odwrotnieni1 w programowaniusekwencyjnym-unasu1ytkownikprzejmieinicjatyw wswoje rce i to on bdzie decydowa=, jakie operacje w danym momencie [email protected] 1.4. Waciwoci i metody zwi*zane z obiektami C++ Builder Wprowadzenie:w dalszejczciksi/1ki bardzoczstobdziemypos=ugiwa@ si pojciem obiektu,jegow=aciwoci(atrybutw)imetod(czylimo1liwychdowykonaniananim operacji). Mam nadziej, 1e pojcie obiektu stanie si jasne w trakcie wykonywania kolejnych @wiczeA. Wstpnie mo1emy zdefiniowa@ obiekt jako odpowiednik dowolnego rzeczownika w jzykuludzi.Je1elichcemyprzygotowa@ fili1ank kawy,obiektaminaszejczynnocibd/=y1eczka,cukier,fili1anka,kawaitp.Musimyterazwykona@ nanaszychobiektach odpowiednieoperacje,awic wsypa@ kaw do fili1anki,=y1eczk/ nabra@ cukru,zala@ kawwrz/tkiemitd.Operacjewykonywanenaobiektachbdziemydalejnazywa@ ichmetodami lub funkcjami. Odpowiednikiem okrelenia metoda" w jzyku ludzi jest dowolny czasownik. W poni1szychzadaniachnauczymysi, jakzmienia@ atrybutyobiektw(ichw=aciwoci) oraz w jaki sposb wykonywa@ na nich r1norodne operacje (ich metody). Zadanie1.4.1:zmodyfikowa@ programzzadania1.3.1,takabyFormularzg=wnymia= wnag=wku napis Test w=aciwoci". Wykonanie: 1. Musimy najpierw odczyta@ projekt z zadania 1.3.1. Z menu File wybieramy opcj OpenProject".Je1elidlanaszegoprojektuwybralimyzalecan/ nazw, towpowsta=ym okienkuwybieramyfolder"zadl31"iplikprojektuProject1.mak"(mo1emyklikn/@ dwukrotnie lub zaznaczy@ i nacisn/@ przycisk Otwrz"). 2.Zabierzemysi terazzazmian nag=wkanaszegoformularza.Mo1emygozmieni@wykorzystuj/c w tymceluInspektoraObiektw.Wpoluedycjitu1 pod nag=wkiem ObjectInspector"widzimynapisForml:TForml"- oznaczaon,1e aktywnym obiektem, ktrego dotycz/ wszystkie inne wywietlane przez Inspektora dane, jest w=anie naszeokienkog=wneaplikacji-czyliForml".Poni1ejznajdziemymidzyinnymi w=aciwo@ (property) Caption - czyli nag=wek, tytu=, a zaraz obok napis Forml". Nie trzeba chyba podpowiada@, 1e to w=anie tutaj musimy dokona@ zmian dotycz/cych tekstu nag=wka.WpiszmyTestw=aciwoci".Nale1y w tymmiejscuzaznaczy@, 1ezmienilimy jedynie tekst nag=wka, a nie nazw samego formularza. Tak wic formularz o nazwieForml"posiadanag=wekTestw=aciwoci".Gdybychodzi=o namozmiannazwy formularza, musielibymy pos=u1y@ si inn/ w=aciwoci/- Name. 3. Jeli poprawnie zmienilimy w=aciwo@ Caption w Inspektorze Obiektw, to efekty tego powinny pojawi@ si bezzw=ocznie w nag=wku naszego formularza. 4.Zapiszmyteraznaszprojektiplikprogramuwfolderzeonazwiezgodnej"zprzyjt/konwencj/, czyli zad 141" (patrz zadanie 1.3.1 p. 6). Podsumowanie:nauczylimysi, jakzapomoc/ InspektoraObiektwzmienia@ atrybuty obiektw.Zauwa1ylimynapewno,1e obiektyposiadaj/ szeregr1norodnych w=aciwoci,zapomoc/ ktrychmo1emywp=ywa@ na ichwygl/d, rozmiaritp.Mo1-liwoci naszej ingerencji w atrybuty obiektw nie ograniczaj/ si tylko do wykorzystania InspektoraObiektw.Mo1emyzmienia@ jerwnie1 bezporedniowkodzieprogramu. Zostanietowyjanionewnastpnymzadaniu,wktrymzapoznamysi rwnie1 ze sposobami wykonywania na obiektach r1norodnych operacji (uruchamiania ich metod). Zadanie1.4.2: do programuzzadania1.4.1doda@ przycisk.Nacinicieprzyciskuma powodowa@ zmian koloruformularzananiebieski.Zmieni@ funkcj FormClick" (zdarzenieOnClickdlaformularza),takabypowodowa=a na przemianpojawianiesi iznikanie tego przycisku. Wykonanie: 1. Z menu File wybieramy opcj Open Project" i otwieramy projekt z katalogu zadl41". 2.Abydoda@ przyciskwpoluformularzazpaletykomponentw([email protected]) wybieramykart Standard,a nastpniekomponentszstyzlewej(czyliBut-ton-przycisk).Terazjeszczeklikniciewobrbienaszegoformularzaiju1 jest-mamydrugi obiekt w projekcie. 3.SpjrzmynaInspektoraObiektw-identyfikatornaszegoobiektutoButtonl",poni1ej widzimy jego atrybuty, takie jak Caption (czy domylamy si, co on oznacza?). 4.Zaprojektujmyterazreakcj naszegoprzyciskunawcinicieklawiszamyszy.Jak robilimytopoprzedniowwypadkuformularza,takiterazwybieramykart Events Inspektora Obiektw i klikamy podwjnie na bia=e pole obok pozycji OnClick". Wcia=ofunkcjiwpisujemy,fotml->Color=clBlue;".Znaki->"oznaczaj/ operatorselekcji (wskazania).Zjegopomoc/ wskazujemymaszynie,i1 chodzinamow=aciwo@Color obiektuForml.Znak="oznaczaprzypisanie-komputerobliczawyra1eniepoprawej stronieoperatora(cIBlue",czylikodkoloruniebieskiego)iwstawiajenastpniew wyra1eniepolewejstronie(Forml->CoIor",czyliw=aciwo@okrelaj/cakolor naszego formularza). 5.Po=ow zadaniamamyju1 zasob/ - po naciniciuprzyciskuzostanieuruchomiona funkcja,ktrazmienikolorformularza.Pozosta=a nammodyfikacjafunkcjizwi/zanejz klikniciemwformularz-FormCIick".Abydokona@ edycjitejfunkcji,najwygodniej bdziezmieni@ aktualnyobiektwInspektorzeObiektwnaForml(wystarczyklikn/@ gdziekolwiek w obszar formularza), a nastpnie wybra@ OnClick" z karty Events. 6.Kliknijmywobszarzeformularza.NapiswInspektorzeObiektwzmieni= si naForml::TForml".Oznaczato,1e aktywnymobiektem,ktregoatrybutywywietla Inspektor Obiektw, jest znw nasz formularz g=wny. 7.Wybieramykart EventsInspektoraObiektw,anastpnieklikamypodwjniewnapis FormCIick"obok pozycjiOnClick".Poprawejpojawisi poleedycjigotowedo przyjciapoprawek.Wy=/czamyinstrukcj ,J\dessageBox(0"Hejtoja!","Uhaha",0);". Dodajemyzprzodudwaznaki,//".Spowoduj/ one,i1 kompilatort=umacz/c kodErd=owypominiewszystko,coznajdziesi zanimia1 do koAcawiersza.Jest tobardzo przydatnecho@byprzywpisywaniukomentarzydotekstuprogramu(abyuczyni@ go bardziej czytelnym). 8.Poni1ej wpiszmy teraz: //jeliw$aciwo3 Visib1e"(widzialny)obiektuButtonljestrwna // () true(czyli prawda") - wykonuj komend poni1ej if(Buttonl->Visib1e==true) // warunek Buttonl->Hide(); //komenda wykonywana przy spe$nionym warunku else // w innym wypadku... Buttonl->Show();//komenda wykonywana,jeliwarunek nie //jestspe$niony 9.Oczywicie wszystko, co znajduje si po znakach //" mo1emy pomin/@...10.Zapiszemyterazprojektiprogramwkolejnymkatalogu(zadl42")imo1emy uruchamia@ program w celu sprawdzenia efektw jego dzia=ania (F9"). Podsumowanie: dowiedzielimy si, jak w sposb dynamiczny (podczas dzia=ania programu) wp=ywa@ na w=aciwoci obiektw. Poznalimy konstrukcj wykonania warunkowego (if (...) else(...)).Potrafimyju1 tak1e wykonywa@ na obiektachpewneoperacje(metoda,,Buttonl->Hide()"chowa"przycisk,za ,,Buttonl->Show()"powoduje,i1 stajesi on z powrotem widzialny). Wartozauwa1y@,1e zdarzenias/ przechwytywane"przezobiekty,ktrychdotycz/.Nacinicieklawiszamyszynadprzyciskiempowodowa=o tylkojegoodpowiedE, pomimo tego, 1e obszar ten nale1y rwnie1 do formularza. wiczenie 1.5. Pierwsza aplikacja (podstawy pracy ze rodowiskiem) Wprowadzenie:na pocz/tekzbudujemysobieodtwarzaczdoplikwanimacji*.avi. Wystarcz/ do tego trzy linie rcznie wpisanego kodu. Tak! To nie 1art! Zeby zbudowa@ podC++ Builderem prost/ aplikacj, nie potrzeba ani wiele wiadomoci, ani du1ego wysi=ku.Zadanie 1.5.1: zbudowa@ odtwarzacz plikw animacji (*.avi). Wykonanie: 1. Z menu File wybieramy opcj New.... 2. Wybieramy ikon Application z karty New. 3.Zmieniamytekstwnag=wkuformularzanaOdtwarzacz"(InspektorObiektw-w=aciwo@ Caption - patrz zadanie 1.4.1). 4.Niestety-samnapiswnag=wkunieza=atwinamodtwarzaniaplikw*.avi.Po-trzebujemykomponent(obiekt),ktryodwali"zanasca=/czarn/ robot - czyli wywietlaniekolejnychklatekfilmu,odtwarzaniedEwiku itd.C++Buildertaki komponentposiada.Znajdujesi on na paleciekomponentw(kartaSystem,sidmyz kolei - MediaPlayer). Klikamy na niego mysz/, nastpnie jeszcze raz na nasz formularz - i ju1 jest-mamydrugiobiektwnaszymprojekcie.ZInspektoraObiektwmo1emybez truduodczyta@, 1e nazywasi onMediaPlayerl- i tejnazwybdziemyu1ywa@ do jego identyfikacji. Wida@, 1e posiada on interfejs bardzo podobny do zwyk=ego odtwarzacza - szeregprzyciskws=u1/cychr1nymfunkcjom.Midzyinnymipierwszyzlewej,ten, ktry nas interesuje najbardziej -odtwarzanie. 5. Jednak1e samo odtwarzanie to nie wszystko. Przyda=oby si, 1eby u1ytkownik mg= nam wskaza@, gdzie znajduje si plik, ktry program ma odtworzy@. WWindows s=u1/ do tego specjalneokienkadialogowe.Jednoznichbdzienampotrzebne.ZkartyDialogs wybieramy komponent pierwszy z brzegu - OpenDialog i tak jak poprzednio klikamy na naszformularz.Pojawiasi ma=y kwadracik,ktrysymbolizowa= bdzieokienko dialogowe. Rzut oka na Inspektora Obiektw -jego nazwa (identyfikator) to OpenDialogl (zaczynamyju1 chybarozumie@ zasadytworzenianazwdomylnychprzezC++ Buildera). 6. Dope=nieniem kompletu listy potrzebnych obiektw bdzie przycisk, czyli Button (szsty na karcieStandard).Chcemy,abywmomencie,wktrymu1ytkowniknacinienasz przyciskButtonl,otwiera=o si okienkodialogoweOpenDialoglpozwalaj/cu1ytkownikowi na wybr pliku do odtwarzania przez MediaPlayerl. 7.Musimyterazjeszczezmodyfikowa@ OpenDialogl,takabywywietla= tylkotepliki, ktre nas interesuj/ - czyli *.avi. Mo1na to wykona@ modyfikuj/c w=aciwo@ Filter, czyli mask plikw.NajpierwzaznaczymynaszOpenDialoglklikaj/c na niego.Inspektor Obiektw bdzie teraz wywietla@ jego w=aciwoci. 8. W InspektorzeObiektwodszukujemypozycj Filter.Obokniemajednakzwy-czajnegopolaedycji,wktremo1na bywpisa@ mask pliku.Jesttow=aciwo@nieco bardziej skomplikowana - sk=ada si z etykiety maski i jej w=aciwej wartoci. Kliknijmy w ma=y przycisk z czterema kropkami - pojawi si specjalne okienko dialogowe. 9.Wpierwsz/ pozycj w poluFilternamewpisujemyAnimacje(*.avi)".Obokwpolu Filter- wpisujemy*.avi".NaciskamyOK-itoju1 wszystko.Odtejporynasz OpenDialogl bdzie wywietla= tylko pliki *.avi.10.Zajmiemysi terazstron/ operacyjn/" ca=ejaplikacji-awic cosi mawydarzy@,gdy...".Chcemy,abyprogramreagowa= na nacinicieprzyciskuButtonlotwarciem okienkadialogowegoOpenDialogli otwarciemwybranegoplikudoodtwarzaniaprzez MediaPlayerl.Jeliudanamsi zakodowa@ to,oczympowiedzielimyprzedchwil/ wformie zrozumia=ej dla C++ Buildera - to otrzymamy gotow/ aplikacj!11.Jedn/ z metodobiektuOpenDialogljestExecute(),czyliWykonaj"-oznaczatoni mniejniwicejtylkootwarcieoknadialogowego.Listametodzwi/zanychzdanym komponentemjestdostpna poprzezzaznaczeniego(kliknicie),nacinicieFI",anastpniewybrzlistwygrnejpodwietlonegos=owaMethods".Nieprzera1ajciesiliczb/ w=asnociimetodzwi/zanychzobiektami.Nawetjelinieznacieangielskiego, wartokorzysta/ z plikupomocykontekstowej,cho/bypoto,abyprzeglEdnE/ listFw(asno.ci i metod zwiEzanych z obiektami VCL. 12.WybieramyobiektButtonl.Chcemy,abyreagowa= on na kliknicieotwarciem OpenDialogl.W InspektorzeObiektwwybieramywic kart Events,a nastpnie klikamy dwukrotnie w bia=e pole obok zdarzenia OnClick. 13.Po prawej stronie otworzy nam si edytor gotowy do wpisania kodu. Wpiszemy tam trzy linie, ktrych znaczenie bdziemy sobie rwnoczenie [email protected](otwarcie)OpenDialogl.Wpisujemy wic wywo=anie metody (funkcji), ktra to wykona: OpenDialogl->Execute(); PoleceniajzykaC++koAczymyrednikiem.PustenawiasyobokExecuteoznaczaj/, i1metodataniewymaga1adnychparametrw.Jejwykonaniespowodujeotwarcieokna dialogowego i ustawienie w=aciwoci FileName na plik, ktry wybierze u1ytkownik.15.Musimy jeszcze teraz da@ o tym zna@ MediaPlayerl. Wpiszmyponi1ej: MediaPlayerl->FileName=0penDi alogl->FileName;16.Teraz rozkazujemy" obiektowi MediaPlayerl, 1eby otworzy= nasz plik:Media PIayerl->Open(); Ostatecznie funkcja bdzie wygl/da@ tak: void __fastcall TForml::ButtonlClickCTObject *Sender) }OpenDialogl->Execute(); MediaPlayerl->Fi leName=OpenDialogl->FileName; MediaPlayerl->Open(); }17. I to ju1 wszystko. Reszta, czyli nacinicie play", nale1e@ bdzie do u1ytkownika.18.Terazjeszczezapiszemy(folderzadl51"),uruchomimyaplikacj (naciskamyF9")i gotowe! 19.Jelis/ problemyzeznalezieniemplikw*.avi(prosz si niemia@ - sammia=em k=opoty...),nale1y poszuka@ w kataloguWindows\Helplubjeszczelepiej-FunstuffWideos na CD instalacyjnym Win95. Zycz dobrej zabawy. Podsumowanie:w ci/gu kilkupierwszychchwilspdzonychzC++Builderemnapisalimy w pe=ni funkcjonaln/ aplikacj! Cowicejwymaga=a onajedynietrzechrcznie wprowadzonychliniikodu!Tuw=anietkwisi=a C++Buildera-zestawgotowych wyspecjalizowanychkomponentworazelastycznenarzdziadooperowaniananich zwalniaj/ nasztroskioszeregskomplikowanychelementwinterfejsuWindows.Pozostaje namjedyniesednoproblemu",czylisamalgorytmprogramu.Interfejsu1ytkownika za=atwiaj/ za nas obiekty zaprojektowane przez specjalistw firmy Borland. Przy czym wa1nejest,1e listakomponentwniejestzamknita.Jelizaprojektujemyobiekt,codoktrego mamypodejrzenie,1e nadajesi do powtrnegowykorzystania,mo1emypolekkiej modyfikacji do=/czy@ go do biblioteki komponentw. W dalszej czci ksi/1ki zostanie to omwione dok=adniej. W tym miejscu chcia=bym sprowadzi@ nieco na ziemi ogarnitych na pewno eufori/ wie1oupieczonych programistw. Rzeczywisto@, Panie i Panowie, jest nieco bardziej przyziemna. ]le(lub niedok=adnie ) zaprojektowana aplikacjapotrafi p=ata@ nam r1ne figle.Zanim wicpobiegnieciepochwali@ si znajomymswoimosi/gniciem,przejdEmydozadania1.5.2i sprbujmy przyjrze@ si bli1ej naszemu programowi. Zadanie1.5.2:przetestowa@ programzzadania1.5.1przyu1yciuwewntrznegodebuggera C++ Buildera. Wykonanie: 1.WyjdEmyzoknaOtwrzniepoprzezwybraniepliku,aprzezanuluj".Cosi dzieje? Aplikacjazg=osi=a b=/d! MediaPlayerlniemg= otworzy@ pliku.Dlaczego?C1, przed takimpytaniemstaniecienierazprojektuj/c programy.Wtakichsytuacjachwyjcias/trzy:zrezygnowa@ (wnaszymwypadkuodpada),zacz/@odnowa(wnaszymwypadku niczego nie rozwi/zuje) i wreszcie - przeledzi@, co si w=aciwie dzieje. 2.PodC++Builderemdostpnyjestspecjalniedotegoceluprzeznaczonydebugger,czyli odpluskwiacz". Tym razem zanim uruchomimy aplikacj, za=o1ymy tzw. pu=apk. Jest to miejsce,wktrymprogrambdzieprzerywa= swojewykonanie,abyda@ namokazj dodok=adnegoprzyjrzeniasi algorytmowi.WoknieedycjipodjedEmykursorempodlini,,OpenDialogl->Execute();"i nacinijmyF5".Pojawi= si czerwonypasek?Jelinie, oznaczato,1e macieinneni1 domylneustawieniaskrtwklawiaturowych.Mo1nawtedynacisn/@prawyklawiszmyszyiwybra@ ToggleBreakpoint(prze=/czpunkt przerwania).Innymsposobemustawieniapu=apki"jestklikniciemysz/ na lewym marginesie.Odtejporyprogrambdziesi zawszezatrzymywa= w tymmiejscu,aby umo1liwi@ nam analiz kodu. 3.Uruchamiamy aplikacj (F9). Wydawa=oby si, 1e wszystko przebiega normalnie - pojawi=o si okienkoiprogramoczekujenaakcj z naszejstrony.NacinijmywicprzyciskButtonl.Programprzeszed= do okna edycji!Natymw=aniepolegapraca krokowa.Poka1dejliniikoduC++Builderbdzieprzerywa@ wykonanieprogramu podwietlaj/c instrukcje,ktremaj/ by@ wykonanewnastpnymkroku.Podwietlenie znajdujesi na linii,,OpenDiaIogl->Execute()"- C++Builderrozpoczynarealizacjodpowiedziprzyciskunaklikniciemysz/. W nastpnymkrokuwykonasi (otworzy) okienko OpenDialogl. 4.F8"(nastpnykrok)-iwidzimy,1e takjestrzeczywicie:pojawi=o si okienko dialogowe. Nacinijmy tak jak poprzednio Anuluj". Podwietlenie jest teraz na linii MediaPlayerl->FileName=OpenDi alogl->FileName; 5.Tuzatrzymamysi niecod=u1ej.Jesttoinstrukcjapodstawieniakomputeroblicza wyra1eniepoprawejstronieiwstawiaobliczon/ [email protected] wypadku powinien nazw pliku z OpenDialogl wstawi@ w nazw pliku z MediaPlayerl. Zaraz, zaraz -jak/ nazw pliku? Przecie1 nic nie wybralimy - przyjrzyjmy si temu bli1ej. 6. PodjedEmy kursorem pod OpenDialogl->FileName", nacinijmy prawy klawisz myszy i wybierzmy pozycj Evaluate/Modify. 7.Pojawi si okienko Evaluate/Modify", czyli podgl/d i modyfikacja. Chodzi oczywicie o podgl/d obiektwizmiennych.Namzale1y na podgl/dniciuw=aciwociFileName obiektu OpenDialogl. Wpiszmy wic w pole oznaczone etykiet/ Expression (wyra1enie): OpenDialogl->FileName" . 8. W polu poni1ej pojawi si zawarto@ w=aciwoci FileName obiektu. Co widzimy? Tylko dwaapostrofy.Oznaczato,1e sk=adowaFilenamejestpusta.Toby=o zreszt/ doprzewidzenia,skoroniewybralimy1adnegopliku.MediaPlayerlnieotrzymuje w=aciwejnazwyplikudootwarcia.Nicwic dziwnego,1e prbawykonaniajegometody Open() (otwrz plik) wywo=uje b=/d. Nale1a=oby zatem tak zorganizowa@ nasze 3 linie kodu, aby ostatniedwieznichwykonywa=y si tylkowtedy,gdyu1ytkownikrzeczywiciewskaza= jakiplik. Mo1na to bardzo =atwo osi/gn/@ poprzez wykorzystanie instrukcji warunkowej if (jeli). 9. Modyfikujemy wic nasz/ funkcj nastpuj/co: void__fastcall TForml::ButtonlClickCTObject *Sender) {OpenDialogl->Execute(); if (OpenDialogl->FileName!="") //jeli sk=adowa FileName"nie jest //pusta (jej zawarto@ jestr1na//od"")towykonajinstrukcjemidzy// {" a }" {Medi aPlayerl->Fi 1 eName=OpenDi al ogl->Fi 1 eName; MediaPlayerl->Open(); }}10. Pozostaje nam jeszcze dokonanie kosmetycznych zmian rozmiarw formularza, napisu na przycisku itp. Ostatecznie nasza aplikacja mo1e wygl/da@ na przyk=ad tak: Podsumowanie:czytoju1 wszystko?Oczywicie,1e nie!Sprbujcierozda@ tenprogram znajomym.Za=o1si, 1e natkn/ si nadziesi/tkir1negotypuniedoci/gni@. Niemo1emy wszystkiegoprzewidzie@. Nale1y jednakuwzgldnia@ sytuacjenajbardziejprawdopodobne- wtedy nasza aplikacja ma szans na bezproblemowe dzia=anie. 2. Biblioteka VCL - przegl/d najwa1niejszych komponentw Wprowadzenie:w poni1szych@wiczeniachzaznajomimysi skrtowoztym,costanowio sile pakietu C++ Builder - komponentami wizualnymi.VCLtoskrtodVisualComponentLibrary(bibliotekakomponentwwizualnych). Sk=adasi ona z gotowychobiektw.Dziki nimprojektowanieinterfejsuu1ytkownikajest du1o prostsze.Mamyrwnie1 =atwydostp do najbardziejnawetskomplikowanych mechanizmw Windows. W(asno.ci komponentw Wygl/d,rozmiary,styliwieleinnychw=aciwociobiektumo1emyzmienia@ za pomoc/ Inspektora Obiektw. Sk=ada si on z dwch czci: karty w=aciwoci (Properties) ikarty zdarzeA (Events). W kodzieprogramudow=aciwociodwo=ujemysi zapomoc/ nazwyobiektui oddzielonej strza=k/" (operatorem wskazania) nazwy w=aciwoci tego obiektu, na przyk=ad: OpenDia"logl->FilenName;Naw=asnociachmo1emydokonywa@ operacjizapisu(podstawienia)iodczytu,lub tylko odczytu w zale1noci od rodzaju elementu. Metody komponentw Ka1dyzkomponentwmazestawswoichwewntrznychmetod,czylimo1liwychdo wykonanianadanymobiekcieoperacji.Itaknaprzyk=adwewntrznametodakomponentu OpenDialogl - Execute() otwiera=a okienko dialogowe i czeka=a na potwierdzony wybr lub anulowanie operacji: OpenDialogl->Execute(); Zdarzenia zwiEzane z komponentem Ostatni/ z trzechg=wnychcechzwi/zanychz ka1dymkomponentemjestjego mo1liwo@reakcjinar1ne zdarzenia.Zdarzenias/ powi/zanezdostpnymidoedycji funkcjami,wktrychzakodowa@ nale1y reakcjenanie.Gdybymychcielinaprzyk=ad,aby poklikniciuwprzyciskButon1otwiera=o si okienkodialogoweDialomusielibymy dokona@ edycjifunkcjiobs=uguj/cejzdarzenieMouseClickprzyciskuButtonl(Inspektor Obiektw - karta Events pozycja OnMouseClick) i zapisa@ tam kod, ktry ma si wykona@ wrazie zajcia zdarzenia: OpenDialogl->Execute(); Komponentzawierazwyklezestawstandardowoobs=ugiwanychzdarzeA, takichjak klikniciemysz/ (nadanymkomponencie),przesuniciemyszynadkomponentem, nacinicie klawisza itp. Pomoc on line" Borlanda Stanowczo zachcam do studiowania pomocy on lin"! Nawet osoby, ktre nie znaj/(lubwydajeimsi, 1e nieznaj/) jzykaangielskiego,wynios/ z jejprzegl/dniciawa1nedowiadczenia. Wystarczy zaznaczy@ odpowiednio obiekt, nacisn/@ FI i ju1 mamy na ekranie jegodokumentacj! Mimobrakuznajomocijzykaangielskiego,niewolnonamsi [email protected]/dniciezestawuw=aciwoci(properties)i metod(methods)zwi/zanychz danym komponentem mo1e podsun/@ mas nowych pomys=w! Karta Standard" Rysunek 2.1. Komponenty karty Standard MainMenu- projektowaniemenuzwi/zanegozformularzem.Niewidoczne.Wystarczy przeci/gn/@naformularz,klikn/@dwukrotnieipos=uguj/c si klawiszeminsert"oraz prawym przyciskiem myszy zaprojektowa@ je wed=ug w=asnego uznania. PopupMenu - to menu podrczne, ktre pojawia si po naciniciu prawego przycisku myszy nadzwi/zanymznimkomponentem(wnaszymprzyk=adzie-Label").Edycja-podobnie jak dla poprzedniego komponentu. Label - statyczny tekst na formularzu. Edit - pozwala na edycj jednego wiersza tekstu. Memo i Button - edycja wielu wierszy tekstu oraz przycisk. CheckBox - pole wyboru; dwa mo1liwe stany - w=/czony, wy=/czony. ListBox - lista elementw, ktre mo1na zaznacza@ lub [email protected] komponentpodobnydopoprzedniego.Posiadadodatkowomo1liwo@ wprowadzenia tekstu. ScrollBar - pasek przewijania. GroupBox, RadioGroup i Panel - obiekty grupuj/ce inne obiekty. Karta Additional" Rysunek 2.2. Karta Additional BitBtn - przycisk rozszerzony o mo1liwo@ zamieszczenia rysunku (w=asno@ Glyph). SpeedButton - przycisk u1ywany w paskach narzdziowych. MaskEdit- formatowanepoleedycji.Wielepredefiniowanychformatwnumerycznychi znakowych. StringGrid - arkusz z elementami bd/cymi =aAcuchami znakw. DrawGrid - podobnie jak wy1ej, lecz dla grafiki. Image - wywietlenie pliku graficznego (bitmapa, ikona lub metaplik). Shape -jedna z kilku prostych figur geometrycznych. Bevel- pomocnyprzyuzyskiwaniuefektutrjwymiarowoci(wybrzuszonylubwkls=yprostok/t).ScrollBox - przewijane okienko. Karta ,,Win95' Rysunek 2.3. Karta Win95 TabControI - tworzenie zak=adek. PageControl - zak=adki powi/zane z kartami. TreeView - element u=atwiaj/cy wywietlanie drzewiastych" struktur. ListView - wywietlanie etykiet wraz z ikonami. ImageList - obiekt bd/cy list/ elementw graficznych. Header - nag=wek. RichEdit - pole dla tekstu w formacie (*.rtf). StatusBar - linia stanu. TrackBar - suwak. ProgresBar - wskaEnik postpu.UpDown - zmniejszanie lub zwikszanie wartoci. HotKey - tworzenie gor/cych" klawiszy. Karta Data Access" Rysunek 2.4. Karta Data Access Na karcie tej znajduj/ si komponenty organizuj/ce wsp=prac z bazami danych. DataSource, Table - Erd=o danych i reprezentacja tabeli danych. Query - komunikacja z baz/ danych oparta na jzyku SQL. StoredProc - wywo=ywanie procedur zapamitanych na serwerze bazy danych. Database - komunikacja z serwerem danych. Sesion - globalne zarz/dzanie po=/czeniami z bazami danych realizowanymi przez aplikacj.BatchMove - operacje na grupach rekordw lub ca=ych bazach danych. UpdateSQL - aktualizacja danych. Karta Data Controls"Rysunek 2.5. Karta Data Controls Komponenty s=u1/ce do edycji baz danych.DBGrid - arkusz edycji tabel. DBNavigator - organizuje poruszanie si w tabeli danych.DBText - komponent wywietla zawarto@ pola danych, z ktrym jest zwi/zany. DBEdit - jak wy1ej plus mo1liwo@ edycji pola.DBMemo - jak wy1ej - edycja w wielu wierszach. DBImage- obiektzwi/zanyzpolemgraficznymtabelidanych(wywietlenierysunku zawartego w bazie danych). DBListBox - zwi/zane z tabelami pole listy. DBComboBox - obiekt ,,ComboBox" zwi/zany z bazami danych. DBCheckBox - obiekt ,,CheckBox" zwi/zany z bazami danych. DBRadioGroup - obiekt ComboBox" zmodyfikowany do wsp=pracy z bazami danych. DBLookupListBox - obiekt ListBox" zmodyfikowany do wsp=pracy z bazami danych. DBLookupComboBox- obiektComboBox"zmodyfikowanydowsp=pracyzbazami danych. Tabela szczeg=owa. Karta Win 3.1" Rysunek 2.6. Karta Win31 Obiekty na tej karcie maj/ zwykle swe odpowiedniki na innych kartach. Pozostawiono je, aby utrzyma@ zgodno@ z wczeniejszymi (16- bitowymi) wersjami projektw. DBLookupList - obiekt ListBox" zmodyfikowany do wsp=pracy z bazami danych.Tabela szczeg=owa. DBLookupCombo- obiektComboBox"zmodyfikowanydowsp=pracyzbazamidanych. Tabela szczeg=owa. TabSet - zak=adki. Outline - wywietlanie struktur drzewiastych". Header - nag=wek sk=adaj/cy si z wielu sekcji. TabbedNoteBook - zak=adki plus karty. NoteBook - zestaw kart. wiczenie 2.1. Komponenty z karty Standard" Zadanie2.1.1:zapomoc/ komponentuMainMenuwyposa1y@ aplikacj w menu umo1liwiaj/ce zmian koloru formularza. Wykonanie: 1. Otwieramy nowy projekt i z karty Standard pobieramy komponent MainMenu. 2. Aby dokona@ modyfikacji menu, musimy klikn/@ podwjnie w komponent Ma-inMenul na naszym formularzu lub wybra@ jego w=asno@ Items. 3.Naekraniepojawisi projektpustegojeszczemenu(Forml->MainMenu).Teraz wystarczywpisa@ nazw pierwszejopcjinaszegomenu-Kolor"(wInspektorze Obiektw zauwa1ymy zmian w=asnoci Caption). 4.Pos=uguj/c si klawiszamikursora,Enter,Inserti Deletemo1emydowolniemo-dyfikowa@ wygl/d menu. Dodajmy do opcji Kolor trzy podpozycje - ,Bia7y", Niebieski" i Czerwony". Teraz jeszcze obok do=1my opcj Pomoc". 5. Mo1emy przyst/pi@ do przypisywania operacji do naszego menu. Ustawmy si na pozycji Bia(y. Podwukrotnymklikniciuwpozycj menu(mo1na te1 wybra@ z kartyEvents Inspektora Obiektw zdarzenie OnCIick), pojawi si puste cia=ofunkcji. Odpowiada@ ona bdzie na wybr pozycji Bia=y, musi zatem odpowiednio zmienia@ kolor formularza (je8 w=asno@ Color). Wpisujemy wic ,Forml->Color=clWhite". 6. Podobnie postpujemy z pozycjami Niebieski i Czerwony wpisuj/c odpowiednio ,forml->Color=clBlue;" i ,Forml->Color=clRed". 7. Pozosta=a nam do oprogramowania opcja Wiadomo@. Wjej w=asno@ OnClick wpiszemy wywo=anie okienka z informacj/ o programie: HessageBox(0."Program zmienia kolor formularza","Wiadomosc".0); 8. Zapisujemy projekt (zad211) i mo1emy uruchomi@ nasze nowe dzie=o.Podsumowanie: nauczylimy si, jak w prosty sposb doda@ do formularza menu g=wne,a nastpnie przypisa@ r1ne operacje jego kolejnym pozycjom. Je1eli chcemy w naszej aplikacji korzysta@ jednoczenie z wielu r1nych opcji - komponent Main-Menu jest niezast/piony. Zadanie 2.1.2: wykona@ menu podrczne za pomoc/ komponentu PopupMenu.Wykonanie: 1. Potrzebna nam bdzie etykieta (Label), na ktrej umiecimy napis (Caption) z informacj/dla u1ytkownika (Wcinij prawy klawisz myszy"). 2.TerazpobieramyzkartyStandarddwaobiektyPopupMenu. Modyfikacj menupodrcznego (PopupMenu) przeprowadza si tak samo, jak w wypadkumenu g=wnego (MainMenu).W PopupMenu1dodajemypozycje,Niebieski"i Zielony"wpisuj/c wodpowiednie zdarzenia OnClick,Labell->Color=clBlue;" i Labell->Color=clGreen;. 3. Jak wida@ zmienialimy kolor etykiety - bdzie to wic podrczne menu etykiety Label 1. Zagl/dnijmy w jej w=asno@ PopupMenu i wybierzmy z listy PopupMe-nul. 4.Poniewa1 naszaetykietawygl/da niecorachitycznie,zmieAmyjejw=asno@Font->Height (Font->Wysoko@) na 25.5.Terazzabierzemysi zamenupodrczneformularza,ktrymzostaniePopupMenu2. Dodajemypozycje,Biia7y"i ,Szary"wpisuj/c odpowiedniowichzdarzeniuOnClick ,Forml->Color=ctWhite;" i ,Forml->Color=clGray;". 6.Pozostajenampodpi/@" menupodrcznePopupMenu2doformularza(w=asno@ PopupMenu formularza) i po zapisaniu projektu mo1emy uruchamia@ aplikacj.Podsumowanie:jaknapewnozauwa1ylimy,kliknicieprawymklawiszemmyszyna danym obiekcie powoduje pojawienie si jego menu podrcznego. Zadanie2.1.3:przyu1yciukomponentwEditzaprojektowa@ aplikacj wykonuj/c/ cztery podstawowe dzia=ania arytmetyczne (+-*/). Wykonanie: 1. Potrzebne nam bd/ cztery pola edycji (Edit) i sze@ etykiet(Label). 2.Polaedycjiustawiamyoboksiebienadaj/c imkolejnonazwy(w=asno@Name):JJT, Op", ,J2ni Wn". 3.Nadnimiustawiamykolejneetykietynadaj/c imnapisy(Caption):,,iczbal", operatori+-'*/)", ,JJczba2" i S". 4.Pozosta=ychetykietu1yjemydoumieszczeniaznaku="pomidzywynikiemadrug/liczb/ oraz umieszczenia tytu=u programu (Operacje arytmetyczne"). 5.Teraz strona operacyjna - zaczniemy od kodu g=wnego, czyli wyliczenia zawartoci pola edycjiWn(wynik)wzale1nociodwartociplLI,L2iOp.Naszewyliczeniebdzie odpowiedzi/ naklikniciewobiektWn.Podw=asno@OnClickpolaedycjiWnpodpinamy wic: void__f ast cal lTForml::WnClick(T0bject *Sender) {// pod zmienne SI i S2 pobieramy rozmiar tekstw w polach edycji LI i L2 int S1 - Ll->GetTextLen(); int S2 - L2->GetTextLen(); char buf[10]; // 10-cio znakowy bufor pomocniczy // tworzymy $a(cuchy znakowe C1.C2.C3 na Liczbe.1, Liczb2i operator char *C1 - new char[++Sl]; char *C2 - new char[++S2]; char *C3 - new char[2]; // do $a(cuchw znakowych Cl i C2 pobieramy tekst w polach LI i L2 // o d$ugoci SI i S2 Ll->GetTextBuf(Cl. SD; L2->GetTextBuf(C2, S2); Op->GetTextBuf(C3.2); // interesuje nas tylko pierwszy znak w polu Op // w zale1noci od pierwszego znaku $a(cucha C3 ([0]) // wykonywane bd2 r1ne warianty (case '+', case '-' itd.) switch (C3C03) {case '+': // dodawanie itoa(atoi(Cl)+atoi(C2),buf.10);// konwersja suma Cl i C2 - tekst break; case '-': //odejmowanie itoa(atoi(Cl)-atoi(C2),buf.10);//konwersja C1-C2 - tekst break; case '*': //mno1enie itoa(atoi(Cl)*atoi(C2).buf.l0);// C1*C2 - tekst (buf) break; case '/': //dzielenie itoa(atoi(Cl)/atoi(C2).buf,10);// C1/C2 - tekst break; default: // domylnie - dodawanie itoa(atoi (CD+atoi (C2) .buf .10); }// niezale1nieod wariantu -na koniecustawiamy tekst w polu edycji Wn // na nasz buforpomocniczy buf, czyli wynik operacji Wn->SetTextBuf(buf); } 6. Program jest ju1 gotw. Mo1emy nawet uruchomi@ go w celu obejrzenia efektw. 7.Naszaaplikacjajestjeszczezbytniewygodnawdzia=aniu-u1ytkownikmusiklikn/@w wynik,abyuzyska@ jakiekolwiekefekty.Jakzrobi@, abywyniksamliczy= si we w=aciwymmomencie?Musimybada@ stanpledycjiL1,L2i Opi w raziejakiej kolwiekichzmianyoblicza@ wynikzapomoc/ funkcjiWnClick(powy1ej).Wykonanie tegojestwbrewpozorombardzoproste-wystarczywykorzysta@ zdarzenieOnChange (zmiana) pl L1 L2 i Op i umieci@ tam wywo=anie funkcji WnClick (WnClick(this)"). 8.Zauwa1ylimyju1 na pewno,1e ka1da metoda(funkcja)bd/caodpowiedzi/ na zdarzenie(np.tawpunkcie5)wymagaparametru,ktrymjestwskaEnikdoobiektu wywo=uj/cegot funkcj (TObject*Sender).Wywo=uj/c j/ wic rcznie"wpunkcie7 (bo przecie1 nie nast/pi=o kliknicie w pole Wn) musimy za=/czy@ wskaEnik do jakiegoobiektu.Najlepiejjestnieoszukiwa@ i zgodniezprawd/ poda@ wskaEnikdoaktualnego obiektu, czyli this. Wten sam sposb postpujemy dla wszystkich pl, na ktrych zmiany chcemy reagowa@ (L1,L2 i Op) 9.Zapisujemyprojektiuruchamiamygodlasprawdzeniaefektw.Podsumowanie: nauczylimysi wykorzystywa@ polaedycji(Edit),a tak1e reagowa@ na ichzmiany (OnChange).Napodkreleniezas=ugujefakt,1e metody(takiejakWnClick)bd/ce odpowiedziami na zdarzenia, niczym nie r1ni/ si od innych metod obiektu (mo1e poza ichspecjalnymiparametrami).Mo1emywic jewywo=ywa@ z kodu naszegoprogramu niezale1nie od tego, czy zdarzenie, ktre obs=uguj/ zasz=o, czy nie! Zadanie2.1.4:zbudowa@ programoperuj/cynaschowkuzwykorzystaniemkomponentu Memo. Wykonanie: 1. Potrzebne komponenty to dwa przyciski (Button) i komponent Memo. 2.Zapomoc/ jednegozprzyciskwbdziemykopiowa@ zawarto@Memoldo schowka. Ustawiamyjegow=asno@Captionna ,JCopiuf\a w=asnociOnClick przyporz/dkowujemy funkcj:void__fastcall TForml::ButtonlClick(TObject *Sender) {// wykorzystujemy metod CopyToClipboard, aby skopiowa3// zawarto3 Memol do schowka Memol->CopyToClipboard();}3. Teraz drugiemu przyciskowi nadajemy napis (Caption) Wklej i w=asno@ OnClick: void_ f ast cal lTForml::Button2Click(TObject *Sender) {// wklejenie ze schowka - metoda PasteFromClipboard Memol->PasteFromCli pboardC); }4.Dlaniezdecydowanychu1ytkownikwmo1emyterazjeszczeprzypisa@ przyci-skom.w=asno@ Hint (podpowiedz) odpowiednio ,JKopiowanie do schowka zaznaczonego tekstu"i WklejeniezawartoFcischowka".Ustawiamyjeszczew=asnociShowHint (poka1 podpowiedz) obu przyciskw na true. Podsumowanie:nauczylimysi korzysta@ z komponentuMemo.Jegocharakterystyczn/cech/ jestmo1liwo@zapamitaniawieluliniitekstuwew=asnociLinesklasyTStrings. Dowiedzielimy si rwnie1, w jaki sposb korzysta@ ze schowka w naszych programach. Na uwag zas=ugujemo1liwo@[email protected] w=aciwoci-ShowHintna tnie,nakierowaniewskaEnikamyszynaprzyciskspowoduje pojawienie si podpowiedzi. JelichodzioTMemo- niemamiejscawtejksi/1ce,abydok=adnieopisa@ wszystkie w=asnociimetodytegoiinnychkomponentw.Jeszczerazzachcamwic do ekspe-rymentw.Niebjciesi prbowa@ wciemno"-cho@byciestawalinag=owach,dymyz komputerw nie pjd/! Przy u1yciu standardowej pomocy w C++ Builderze mo1ecie zdzia=a@bardzowiele!Nawetnieznaj/c angielskiegomo1na przecie1 wywietli@ list w=asnocii metod danego obiektu, a potem eksperymentalnie ich u1ywa@, orientuj/c si co do ich typu i typuichparametrw.Jelinaprzyk=adchcemyprzekona@ si, cowykonametodaClear obiektu klasy TMemo, wystarczy zajrze@ w plik pomocy i obejrze@ jej definicj:void _ f ast cal lCl ear ( voi d) ;Niemusimyzna@ angielskiego,abysi przekona@, 1e jesttometoda,ktraniewymaga 1adnych parametrw { (void) }, ani nie zwraca 1adnych wartoci |void przed nazw/ metody}. Jeju1yciebdziewic bardzoproste-,Memol->Clear{);".A cozjejdzia=aniem?Otym przekonamysi w praktyce!Dodajemynastpnyprzyciskdopowy1szegoprojektu,wjego w=asno@ OnCIick podpinamy wywo=anie ,JMemol ->Clear();" i - niech si co chce dzieje - uruchamiamyaplikacj. Dzia=a?Wiecieju1 jak?Otow=aniechodzi.Wszystkiegonie dowieciesi z ksi/1ek.Najbardziejwartociowedowiadczeniawyniesieciez eksperymentw!Pamitajcieotymbrn/c przezdalszezadania.Starajciesi zawsze pogrzeba@" troch przyka1dymzadaniu, uzupe=ni@ jeoto,coWasinteresuje,czyte1zwrci=o Wasz/ uwag.Zadanie2.1.5:przyu1yciuobiektwRadioButtonskonstruowa@ programzmieniaj/cykolor formularza. Wykonanie: 1.Bd/ nampotrzebnetrzyobiektyRadioButtoni jednaetykieta,zapomoc/ ktrej poinformujemy u1ytkownika, co te1 takiego wykonuje program. 2.Etykiecienadajemynapis(Caption)Wybierzkolort7a formularza",a kolejnymRadioButton Zielony, H7ty", Czerwony"'. 3.Terazw=asnociomOnClickkolejnychRadioButtonprzypisujemyfunkcjezmieniaj/cekolor formularza: void __fastcall TForml::RadioButtonlClick(TObject *Sender) {// u1ytkownikklikn/= w "Zielony" if (RadioButtonl->Checked)//jeli zaznaczony Forml->Color=clGreen; //zmieniamykolorFormlna zielony }void _fastcall TForml::RadioButton2Click(TObject *Sender) {if (RadioButton2->Checked) Forml->Color=clYelIow; // 1=ty }void__fastcall TForml::RadioButton3Click(T0bject*Sender) {if (RadioButton3->Checked) Forml->Color-clRed; //czerwony }Podsumowanie: obiektami RadioButton najlepiej pos=u1y@ si, gdy chcemy u1ytkownikowi udostpni@ kilkaokrelonychwariantwjakiej operacjiczydanych.Bardziejoglne zastosowaniezyskujetukomponentRadioGroup,ktrywspanialenadajesi doeksperymentw. Zadanie 2,1.6: komponent LislBox.Wykonanie: 1. Pobieramy pole listy (ListBox). 2.Zaczniemyodpolaedycji(Edit),zapomoc/ ktregobdziemywpisywa@ kolejne elementydoListBoxl.Nadnimumieszczamyetykiet z napisemTuwpiszkolejny element listy". 3. Teraz jeszcze przycisk z napisem ,Dodaj element". W jego w=asno@ OnClick wpiszmy funkcj dodaj/c/ nowy element do ListBoxl: void__fastcall TForml;:ButtonlClicktTObject *Sender) {// dodajemy tekst z Editl do istBoxl ListBoxl->Items->AddText); }4. Aby urozmaici@ nasz program, mo1emy pod w=asno@ OnClick ListBoxl przypisa@ jeszcze jedn/funkcj:void__fastcall TForml::ListBoxlClicktTObject *Sender) {//ustawiamyzawarto@polaedycji naaktywny elementpolalistyEditl->Text=l.istBoxl->Items->Strings[ListBox1->ItemIndex];}5.Pozostaje nam zapis projektu, kompilacja i ocena dzia=ania. Podsumowanie: obiekt ListBox jest przydatny, gdy chcemy udostpni@ zmieniaj/ca si listopcji u1ytkownikowi. Jeli chodzi o nasz projekt, mo1na doda@ kolejny przycisk do usuwania elementw i pos=u1y@ si metod/ Delete. Zadanie 2.1.7: komponent ScrollBar, Wykonanie: 1.BdzienamoczywiciepotrzebnyScrollBar,orazprzyciskzjakim zachcaj/cym napisem, na przyk=ad PrzesuK mnie". 2.ScroIlBarlumieszczamyudo=u formularza,ajegow=asnociOnChangeprzypo-rz/dkowujemy funkcj:void __fastcall TForml::ScrollBarlChangelTObject*Sender) {intMargines=10; // zak)adamy margines int PKrawedz,LKrawedz;//sk0d dok0d ma si1 przesuwa4 przycisk PKrawedz-Foniil->Width-Buttonl->Width-Margines; // wyliczamy prawe // skrajnepo)o8enie LKrawedz=Margines: // lewe skrajnepo)o8enieintZakres-PKrawedz-LKrawedz; //zakres //ustawiamypo)o8enieprzyciskuwzale8no:ci odpo)o8eniaScroIlBarl Button1>Left=ScrollBarl->Position*(Zakres)/(ScrollBarl->Max)+LKrawedz;}Podsumowaniu:1artobliwiespraw okreliwszy:obiektScrollBarmo1emyu1y@ doprzesuwaniawszystkichiwszystkiego.Jelijestnampotrzebneprzesuniciewodniesieniu dokonkretnegoelementuu1yjmyScrollBar,je1elitychelementwjestwicejz pewnoci/ lepszy bdzie ScrollBox (omwiony dalej). wiczenie 2.2. Komponenty rozszerzone (karta Additional") Zadanie 2.2.1: skonstruowa@ program demonstruj/cy mo1liwoci komponentu Mask-Edit. Wykonanie: 1. Pobieramy etykiet i wpisujemy w niej (Caption) Przyk7ady uLycia w7asnoFci EditMask obiektuMaskEdit".Abyby=a widoczna,ustawiamyFont->IIeight(czcionka wysoko@) na 20.2.TerazpobieramykolejneetykietyikomponentyMaskEditustawiaj/c kolejnoich w=asnoci Caption i EditMask: Caption etykietyEditMask obiektu MaskEdiI ..Tu mo1eszwpisa3 tylkodo 10-ciucyfr9999999999 :1;_" od 1do 9", S$owo zaczynaj2ca siezdu1ej litery ..>L111 11111111 ; 1 ; " (np.nazwisko)", ,.6-cyfrowy nr tel. wraz z 3-cyfrowym numerem ! \ ( \099\ )00-00-00; 1 ;__" kierunkowym", 3. Zapisujemy projekt i uruchamiamy aplikacj.Podsumowanie:komponentMaskEditjestu1ywanydozaw1eniazakresudanych,ktre mog/ hycwpisywanedopolaedycji.W=asno@EditMaskniedopuszczadowprowadzenia przez u1ytkownika nieprawid=owych (niezgodnych z mask/) znakw Jeliu1ytkowniksprbujewpisa@ nieprawid=owyznak,maskowanepoleedycjinicprzyjmie go.Doodrzucenialubprzyjciaca=ejwprowadzonejwartocimo1na u1y@ zdarzenia OnValidate. Maska(EditMask)sk=adasi 7 trzechczcirozdzielonychrednikami.Pierwszatosama maska.Drugajestznakiemokrelaj/cym,czyznakiliteralnesamejmaskizostan/ zapisane jako cz@ danych. Cz@ trzecia to znak u1ywany dla reprezentacji nic wype=nionego jeszcze miejsca. Poni1ej podane s/ znaki specjalne u1ywane do utworzenia pierwszej czci maski. Znak Znaczenie ! Jeli ten znak pojawi si w masce, wiod/ce puste miejsca nie zostan/uwzgldnione. Jeli nie - koAcowe ptisie miejsca nie zostan/ uwzgldnione. > Wszystkie nastpne znaki bd/ pisane du1ymi literami a1 do koAca maski lub do znaku "". Od tego miejsca nic bdzie sprawdzana wielko@ liter. \ Znak nastpny po tym znaku nie bdzie interpretowany (mo1na to wyko- rzysta@ do wstawienia znaku specjalnego bezporednio w dane). L Wmiejscu tego znaku przyjmowane bd/ tylko litery alfabetu (A-Z, a-z). l Zezwala tylko na znaki jw., ale nie wymaga ich.A Tylko znaki alfanumeryczne (A-Z, a-z, 0-9). a Zezwala na znaki jw. ale ich nie wymaga C Wymagany dowolny znak w tej pozycji, c Zezwala na znak jw., nie wymagaj/c go. 0 Tylko znak numeryczny. Znak Znaczenie 9 Zezwala na znak jw. # Zezwala na znak numeryczny lub +/-", ale nie wymaga ich. : U1ywany do rozdzielania godzin, minut i sekund. Znak, ktry pojawi siw danych zale1y od ustawieA W95. / U1ywany do rozdzielenia dni, miesicy i lat w datach. ; U1ywany do rozdzielenia kolejnych czci maski. Automatycznie wstawia puste miejsce. Przy w prowadzaniu danych kursor ominie puste pole. Wdrugiej czci maski mo1emy wpisa@:0 - znaki maski zostan/ pominite w danych; kaTdy inny znak - znaki literalne maski zostan/ w danych uwzgldnione. Wczci trzeciej wpisujemy zwykle znak podkrelenia(_") lub spacj.Zadanie2.2.2: utworzy@ przegl/dark doplikwBMPdowolnychrozmiarwzapomoc/komponentw ScroIlBox i Image. Wykonanie: 1. Prczpowy1szychkomponentw(kartaAdditional)bdziemypotrzebowa@ rwnie1okienkaOpenDialog(kartaDialogs)do wybieraniaplikwBMP(ustawiamyw=asno@ Filter na Pliki BMP" i *.bmp"). 2. Komponent Image 1 pobierzmy tak, aby znalaz= si wewn/trz obiektu ScrwllBoxl. 3.Ustawiamyw=asno@AutoSize(automatycznyrozmiar)obiektuImagelna true. Nastpniepobieramyprzycisknadaj/c munapisOtwrzobrazek".Jegozdarzenie OnClick zapisujemy: void__fastcall TForml::ButtonlClick{TObject *Sender) {If (OpenDialogl->Execitte()) //jeli potwierdzenie Imagel->Picture->LoadFromFile{OpenDialogl->FileName>; }4.Wystarczyterazuruchomi@ aplikacj i otworzy@ jaki wikszyobrazek,abyprzekona@si, jak wygl/da ScroIlBox w dzia=aniu (rysunek 2.7). Podsumowanie:obiektScrolIBoxbdziedlanaspomocnywsytuacjach,gdymamyzbyt ma=o miejsca na formularzu do przedstawieniawszystkich danych jednoczenie. Pozwala on nastworzeniewirtualnej"powierzchni,poktrejmamymo1liwo@przesuwa@ okienko. Wartoprzyjrze@ si bli1ejtakimjegow=asnociom,jakAutoScroll,HorzScruIIBar, YertScrllBar. Rysunek 2.7. ScrollBox w dzia=aniu wiczenie 2.3. Okna dialogowe (karta Dialogs") Wprowadzenie: umiemy ju1 korzysta@ z okienka dialogowego OpenDialog. C++ Builder ma w swoimarsenalewieleinnychstandardowychokienekdialogowych.Dwaznich przedstawiamy w poni1szym zadaniu. Zadanie 2.3.1: utworzy@ okienka dialogowe FontDialog i ColorDialog. Wykonanie: 1. Potrzebnenambd/ dwa przyciskiznapisamiWybierz kolor"iWybierz czcionk". 2. Dodajemy do formularza ColorDialog i FontDialog z karty Dialogs. 3. W zdarzeniu OnClick pierwszego przycisku wpisujemy: void__fastcall TForml::ButtonlClick(TObject *Sender) {// korzystamyz tego, 1e metoda Execute() zwracatrue. jeli // u1ytkownikzamknie okno dialogowez potwierdzeniem // (jest to lepszy sposb ni1 w 3wiczeniu z odtwarzaczem) if (ColorDialogl->Execute()) // jeli potwierdzono Forml ->Color-ColorDialogl->Color; }4. W=asno@ OnClick drugiego przycisku pod=/czymy pod funkcj:void _fastcall TForml::Button2Click(TObject *Sender){if (FontDialogl->Execute()) Fonyil->Font=FontDialogl->Font: }5.Gotowe! Po zapisaniu projektu (zad231) mo1emy uruchamia@ program. Rysunek 2.8. Okno dialogowe ColorDialog wiczenie 2.4. Obiekty z karty Win95" Zadanie: 2.4.1: utworzy@ komponenty PageControl, StatusBar, ProgresBar. Wykonanie: 1.ZaczniemyodkomponentuPageControl.PobierzmygozkartyWin95.Poniewa1 wnaszym przyk=adzie bdzie on mia= dwie strony, dodajmy jeszcze jedna, naciskaj/c prawy klawisz myszy i wybieraj/c Add Page. Na pierwszej z nich umiecimyetykiet To jest pierwsza strona", a na drugiej - To jest strona druga". 2.DodajemyStatusBar(kartaYVin95)modyfikuj/c jegow=asno@Panels(wybieramy New i wpisujemy w pozycji Text ,Aktywna strona" naciskaj/c Enter). 3.W zdarzeniu OnChange (zmiana) obieklu PageControll wpisujemy: void__fastcall TForml::PageControlIChangefTObject *Sender){// ustawiamy tekst pierwszej rubryki StatusBarl na nazw aktywnej // strony w PageControll Status Barl->Panel s->ItemsLO]->Text="Aktywnastrona: "+PageControl1- >ActivePaqe->Caption; }4. Bd/c na stronic pierwszej pobieramy etykiet, ktra pos=u1y nam za licznik. Ustawiamy jej napis (Caption) nu .,1". w=asno@ AutoSize ustawiamy na false i poszerzamy. Aby nie zostawa=y na ekranie jej stare wartoci, ustawiamy w=asno@ Aligmet na inRiglitJitstify" (dosunicie do prawej). Mo1na tak1e ustawi@ Font->Height na 20.5.Nastpnyelementnaszejuk=adankitoMaskEdit.U1yjemygodowskazaniakoAcowej wartoci,doktrejbdziezwiksza= si licznik.Interesuj/ naszatemtylkoliczby-we [email protected]".Wew=asnociTextpozostawiamy: 100". Obok umie@my etykiet ,Licz do:". 6. Przejdziemy teraz do komponentu ProgressBar. Pobieramy go z karty Win95 ustawiaj/cjego w=asno@ Max na 100. 7.Jeszczeprzycisk,ktryzapocz/tkujeliczenie(Caption- ,Licz").Wew=asno@OnClick wk=adamy: void _fastcall TForml: :ButtonlCl ick(T0bject*Sender) {char BuforLlO]; //jakzwyklebuforna tekst int i; // nasz w$aciwylicznik // ptlai=od; i Min;iMax; i++) {itoa(i.Bufor,10); // konwersja liczba - tekst AnsiStringLicznik(Bufor); // w zmiennej Licznik otrzymujemy tekst // we w$aciwym formacie Label4->Caption=Licznik; //ustawiamy etykiet natekstow2'// reprezentacj licznika ProgressBarl->Position=i; //aktualizujemy pozycj w ProgressBar1 Label4->Repaint(); //odwie1amyLabel4 (inaczej u1ytkownik //nic nie zobaczy) ) }8.Jeszczejedenszczeg=, o ktrymniewolnonamzapomnie@ - na zmian Mask-Editl (p. 5) musimy zareagowa@ zmiana, zakresu ProgressBar1: void __fastcall TForml::MaskEditlChange(TObject*Sender) {char BuforCIO];// buforna liczbMaskEditl->GetTextBuf(Bufor.10);//pobieramy10znakw zMAskEdit1 //dobuforaProgressBarl->Max-atoi(Bufor); //nowa maksymalna warto3 dla //ProgressBar1 }Podsumowanie:wyjanieniawymagakonstrukcjafor({l};{2};{3}).Instrukcja{1}jest wykonywana przy wejciu do ptli, {2} jest warunkiem powtrzenia ptli, a (3) to instrukcja wykonywanaprzypowtarzaniuptli.Naszefor(i=PrBar->Min;iMax;i++){) oznaczawic,1e przywejciudoptlipodzmienn/ i zostaniewstawionawarto@zPrBar->Min(i=PrBar->Min;),anastpniebdzieonazwikszanaprzyka1dymwykonaniu instrukcjimidzyklamrami{}"(i++;)a1 i osi/gniewarto@PrBar->Max(iMax). Wartoodr1ni@ ca=y obiektPageControlod jegokart(TabSheet).Kliknicie(wfazie projektowania)wobszarzak=adekaktywizujeobiektPageControl,natomiastklikniciew obszar karty (TabSheet) aktywizuje t kart (PageControl->ActivePage). Gdybymy chcieli zmieni@ nag=wekkonkretnejkarty,musielibymyklikn/@wjejobszar,adopieropotem szuka@ w Inspektorze Obiektw jej w=asnoci Caption. wiczenie 2.5. Obiekty z karty System" Zadanie 2.5.1: przy u1yciu komponentu Timer sporz/dzi@ stoper. Wykonanie: 1.Z kartySystempobieramyobiektTimer.Z kartyStandardpobieramyetykiet, ktrabdzie naszymlicznikiem.Podobniejakwpoprzednimzadaniumusimywic ustawi@ odpowiedniojej w=asnoci. Ustawiamy AutoSize na false, Aligment na taRightJustify", Caption na 0". 2.ObiektTimerposiadatylkojednozdarzenie-OnTime,czylitykniciezegara".Przypisujemy mu: void __fastcall TForml::T1merlTimer(T0bject *Sender) {//kolejne "tyknicie" zegara - czas zwikszy3 nasz licznik. char Bufor[6]; //bufor tekstowy nalicznik int1; // zmienna pomocnicza Labell->GetTextBuf(Bufor,6); //pobieramy zawarto3 etykietydo Bufor i=atoi(Bufor);//kowersja tekst-liczba i++; //zwikszamy"i"o jeden itoa(1.Bufor,10); //kowersjaliczba- tekst (10 oznaczasystem //dziesitny) AnsiStringLicz(Bufor);//kowersja na format tekstowy u1ywany przez //Label->Caption Labell->Gaption-L1cz;// podstawiamy Labell->Repaint(): // malowanie etykiety,aby by$o wida3 zmiany}3. Z karty Standard pobieramy dwa przyciski nadaj/c im napisy ,Stop/Start" i ,Z.eruj". Ich zdarzeniom OnCIick przypisujemy:void _fastcall TForml::Button1Click(T0bject *Sender){if(Timer1->Enabled) //jeli zegar jest "w$2czony" Timer1->Enabled=false; //"wy$2czamy"zegar else//w innym wypadku- "w$2czamy" Timer1->Enabled=true; }void __fastcall TForml::Button2ClickCTObject *Sender) {// Nast2pi$o kliknicie w przycisk"Zeruj" - u1ytkownikchce wyzerowa3/ / licznik Label1->Caption="0";//zerujemylicznik }4.Uzupe=nimyteraznaszStoperomo1liwo@zmianyinterwa=u czasowegopomidzy kolejnymitykniciami"zegaraTimer1.Odpowiedzialnazatojestjegow=asno@ Interval,w ktrejprzechowywanajestliczbamilisekund.Pobieramymaskowalnepole edycji MaskEdit1 z karty Additional, zaopatruj/c je w etykiet interwa7(ms)". 5. Jego w=asno@ EditMask ustawiamy na 99999", a Text na 1000". 6. Teraz musimy jeszcze odpowiednio zareagowa@ na jego zmian... void __fastcall TForml::MaskEditlChange(TObject *Sender) {// Nast2pi$a zmiana interwa$u w polu "edycji -musimy wic zaktualizowa3// w$asno3"Interval" komponentu Timerl char BuforC63; //jak zwykle-bufornatekst int i; //zmiennapomocnicza MaskEditl->GetTextBuf(Bufor,6); //pobieramydobuforazawarto3//MaskEditli-atoi(Bufor);// konwersjatekst-liczba Timer1->Interval -i;//ustawiamynowyi nterwa$}7....imo1emyzczystymsumieniemnada@ naszemuformularzowi(Forml)nag=wek (Caption) Stoper**. Podsumowanie: po zachcaj/cej rozgrzewce, jak/ zapewne by=o zapoznanie si z obiektami bibliotekiVCL,czasnaniecobardziejzaawansowan/ zabaw. Osadzimywformularzu arkuszprogramuExcelwykorzystuj/c technik OLE(ObjectLinking&Embedding),a nastpnie sprbujemy wykona@ na nim par interesuj/cych operacji... Zadanie 2.5.2: przy u1yciu komponentu OleContainer osadzi@ w formularzu arkusz Excela. Wykonanie: 1. Potrzebne nam bd/ trzy komponenty - OleContainer (karta System), Button i ListBox. 2.WybieramyOleContainerl,naciskamyprawyklawiszmyszyiwybieramyzmenu InsertObject",a nastpniezlistyArkuszMicrosoftExcei"(mo1na totak1e zrobi@dynamicznie za pomoc/ metody CreateObject lub CreateObject-FromFile komponentu OleContainer). 3. Przyciskowi nadajemy napis pobierz w7asnoF ObjectVerbs komponentu Ole-Containerl". Zgodnie z tym, co umiecilimy na przycisku, w=asnoci OnClick przypisujemy: void __fastcall TForml::ButtonlClick(TObject *Sender) {// u1ytkownik nacisn2$ przycisk - pobieramy w$asno3 ObjectVerbs ListBoxl->Items-01eContainerl->0bjectVerbs; }4.Zdaniez punktu1.jestniezbytprawdziwe-bd/ nampotrzebnejeszczedwieetykiety wyjaniaj/cefunkcj ListBoxl:W7asnoFObjectVerbskomponentuOleContainerl"iKliknij, aby wykona odpowiedniS operacjT". 5.W jego zdarzenie OnClick wstawiamy: void __fastcall TForml::ListBoxlClick(TObject *Sender) }// u1ytkownik klikn2$ w ListBox - uruchamiamy wic odpowiedni2// operacj... 01eContainerl->DoVerb(ListBoxl->ItemIndex); }6.Nadesz=a pora na test umiejtnoci naszej nowej aplikacji. Tylko nie wpadajmy w zbytni/eufori - to nie my napisalimy Excela! Rysunek 2.9. OLE! Podsumowanie:i toju1 wszystko!NiechniezwiedzieWaspozornaprostotategozadania.Obiekty OLE to pot1ne narzdzia z ca=/ mas/ metod i w=asnoci (warto z nimi poeksperymentowa@!). W tym zadaniu dotknlimy jedynie powierzchni tematu. Nadszed= czas,abyods=oni@ nastpnepot1ne narzdziezbezdennegoarsena=u Bor-landa-Debug Inspektor. Zadanie2.5.3:pos=uguj/c si narzdziemDebugInspectorprzegl/dn/@w=aciwoci(Properties), dane prywatne (Data) i metody (Methods) komponentu OleContainerl z poprzedniego zadania. Wykonanie: 1. Otwieramy projekt z zadania 2.5.2 (File\Open Project). 2.Zak=adamypu=apk"(F5lubprawyklawiszmyszyiTogglebreakpoint)w zdarzeniuOnClick przycisku (Button1). 3. Uruchamiamy program (F9). 4.Ponaciniciuprzyciskuwykonaniezatrzymasi na naszejpu=apce".PodjedEmykursoremna napis (..)OleContainerl(..)" i nacinijmy Alt-F5 (lub prawy klawisz myszy i Inspect). 5.Widzimyokienkobardzopodobnedoznanegonamju1 InspektoraObiektw.Je1elijednak przyjrzymy si bli1ej, zauwa1ymy dyskretne (!) r1nice: mamy mo1liwo@ przegl/da@ prywatne dane obiektu mamy mo1liwo@ przegl/da@ wszystkie metody obiektu informacje dotycz/ nie tylko aktualnego obiektu, ale i jego klas bazowych mo1emy zagnie1d1a@"' przegl/danie wchodz/c dowolnie g=boko w szczeg=y. Rysunek 2.10. Debug Inspektor - narzdzie, z ktrego warto korzysta@Podsumowanie:takotozaznajomilimysi (wtelegraficznymskrcie)zjednymz najlepszychnarzdziBorlanda.Przyznamszczerze,1e nierazzaoszczdzi=o mionowrcz godzinszperaniawdokumentacji.DebugInspectortopot1nyprogram.Nauczciesi zniego korzysta@, a zaoszczdzi Wam to wiele pracy. 3. Programowanie obiektowe w C++ Builderze Wprowadzenie: w poni1szych @wiczeniach zapoznamy si bli1ej z projektowaniem obiektw w C++ Builderze.Nauczymysi, jakwprostysposbutworzy@ komponent(obiekt),poznamyobs=ugzdarzeA i mechanizm dziedziczenia. C++ definiuje s=owo kluczowe class, ktre pozwala na budowanie obiektw. Zajrzyjmy w plik nag=wkowynowegoprojektu(wedytorzenaciskamyCtrl-F6,cho@ mo1na te1 nacisn/@prawy klawiszmyszy,anastpniewybra@ opcj OpenSource/HeaderFile).Znajdziemytamkod definiuj/cy klas formularza: class TForml: public TForm{__published://identyfikator sekcji__published // tu mo1na doda@ w=asnocipublikowane private:// sekcja w=asnociprywatnych obiektu // tutaj mo1emy umieci@ w=asnoci widziane" tylko wewn/trz obiektu public: //publiczne w=asnoci obiektu //miejsce na w=asnoci publiczne (dostpne z dowolnego innegoobiektu) __fastcall TForm1(TComponent* Owner); // konstruktor obiektu }Tak wygl/da definicja klasy, na bazie ktrej mo1emytworzy@ obiekty. Nie nale1y myli@ tych dwch [email protected](wzorcem)obiektu.Obiektjestza konkretnym egzemplarzemklasy.Okreleniedom"zawierawsobietakiepojciajakokno,drzwi,pitra,jest jednak pewnym wzorcem oglnym. Dopiero gdy okrelimy konkretny jego egzemplarz (np. budynek przy ul. Jasnej 14"), mamy do czynienia z obiektem. Przyk=adowaklasaTFormldziedziczyodklasyTForm, czylibazowejklasyformularzy(do oznaczenia klasy bazowej s=u1y s=owo kluczowe public - class TForml: public TForm). Dziedziczenie jest przejmowaniemw=asnociklasbazowychprzezklasypochodne.Inaczej- jelizaprojektowalimyju1 klas samochd",wrazzewszystkimiw=asnociami,jakpojemno@ silnika,kolorkaroseriiitp.,todlazbudowaniaklasyMercedesBenz"niemusimyczyni@ tego wszystkiegoodpocz/tku.Wystarczy,1e jakoklas bazow/ w stosunkudoMercedesBenz" okrelimyklas samochd".Dodajemytylkojedn/ w=asno@producent"-igotowe.Dziedziczenie tobardzoefektywnymechanizm,zapomoc/ ktregomo1emystopniowobudowa@ corazbardziej skomplikowane klasy i ich egzemplarze - obiekty. DefinicjanaszejklasyTForm1podzielonajestnakilkasekcji.Wsekcjiprivatemamy mo1liwo@deklaracjiw=asnociimetodprzewidzianychdou1ytkutylkowewn/trzdanejklasy.Ten sposb postpowania mo1na porwna@ do konstruowania telewizora. Wszystkim na pewno wiadomo, 1e telewizor sk=ada si z ca=ej masy specjalistycznych czci. Do jego obs=ugi jednak nie potrzeba nam 1adnej zaawansowanej wiedzy. Dzieje si tak dlatego, 1e wszystkie szczeg=y konstrukcyjne s/ ukryte (sekcjaprivate)przedu1ytkownikiem.Wefekciewystarczy,1ebymywiedzieli,gdziewcisn/@ w=/cznik.Doudostpnieniatakiegow=/cznika"u1ytkownikowis=u1y sekcjapublic.Mo1emytutaj zdeklarowa@ metodyiw=asnoci,ktrebd/ s=u1y=y do sterowanianaszymobiektemzzewn/trz. Sekcjipublishedmo1emyu1y@ dozdeklarowaniaw=asnoci,ktrebd/ dodatkowowywietlane przez Inspektora Obiektw (mo1na te1 elastyczniej operowa@ na danych w niej zawartych - ale o tym pEniej). Sekcji published mo1emy u1y@ tylko w pochodnych klasy Tob ject. Wszystkie komponenty z bibliotekiVCLs/ pochodnymiTobject.Funkcj poredni/ midzyprivatea publicpe=ni sekcja protected. Mo1emy w niej zdeklarowa@ w=asnoci, ktre bd/ widziane tylko przez klasy pochodne w stosunku do naszej klasy. Ostatniapozycjatokonstruktor-funkcjaonazwieidentycznejznazw/ klasy(TForm1) tworz/cainstancj (egzemplarz)obiektu.Mo1emymie@ rwnie1 do czynieniazdestruktorem- funkcj/ usuwaj/c/ obiektzpamici.Nazw destruktoratworzymyodnazwyklasydodaj/cprzedrostek ~". Jeszcze jedno - obowi/zuje umowa, i1 nazw klasy poprzedzamy du1/ liter/ T (TForm1). Nazwy jej egzemplarzy(obiektw)s/ tejliterypozbawione(domyln/ nazw/ obiektuklasyTForm1bdzie Forml). wiczenie 3.1. Utworzenie prostej klasy i odpowiadaj*cego jej komponentu (obiektu) Zadanie3.1.1:utworzy@ klas o nazwieTLicznikjakopochodn/ klasyTEdit,a nastpnie zdefiniowa@ w=asno@ prywatn/ FLiczba i metody publiczne ZwiFksz, Zmniejsz i Ustaw. Wykonanie: 1.Dla uproszczenia pEniejszego procesu kompilacji dodajmy w Menu Options, opcjiEnvironment, karcie Library, pozycji Include path: $(BCB)\Projects\Komp; Uwaga!Powy1szytekstdopisujemynakoAcuistniej/cychcie1ek!Wszystkietecie1ki umo1liwiaj/ dostp do standardowychplikwnag=wkowych.(BCB)oznaczacie1k, pod ktr/zainstalowanyjestC++Builder.DlakomponentuLicznikwybra=emjejpodkatalog Projects\Komp, ale mg=by to by@ tak1e dowolny inny. 2.Tensamtekstumieszczamytak1e na koAcupozycjiLibrarypathi naciskamyOK.WC++ Builderze wybieramy z menu Component opcj New. 3. Pojawi si okienko, w ktrym wpisujemy kolejno: nazw klasy (TLicznik), nazw klasy bazowej (TEdit), nazw karty, do ktrej chcemy doda@ nasz nowy komponent (pozostawmy Samples). 4. Naciskamy OK. C++ Builder generuje kod szkieletowy klasy komponentu o nazwie TLicznik. class TLicznik: public TEdit {private: // tu wpiszemy zawarto@ sekcji private(*) protected: //tu wpiszemy zawarto@ sekcjiprotected (**) public: //tu wpiszemy zawarto@ sekcjipublic (***) __fastcall TLicznikCTComponent* Owner); __published: }; 5.ZapiszmynaszkomponentwfolderzeProjects\Komp"z nazw/ Licznik.Musitoby@ tensam katalog, ktry dopisalimy do cie1ek przeszukiwaA w punkcie 1. 6.Deklaracjanaszejklasyznajdujesi w plikunag=wkowym(Ctrl-F6).Widzimyznajom/konstrukcj class(...).Wystarczyterazdoda@ w odpowiednichsekcjachw=asnociimetody zwi/zane z naszym licznikiem. 7.Wtymmiejscuumwimysi, 1e dlaodr1nieniaw=asnociprywatnych,bdziemyichnazwy poprzedza@ przedrostkiemF".WsekcjiprivatedodajemyintFLiczba;(patrz(*))(zmienna ca=kowita(int),wktrejprzechowywa@ bdziemyaktualn/ warto@licznika),char*FBufor, (wskaEnik na bufor tekstowy (char *) do przechowywania zawartoci okienka edycji). 8. W sekcji protected (patrz(**)) umieszczamy int FRozmiarBuf; (rozmiar bufora tekstowego). 9. W sekcji public (patrz (***)) dodajemy deklaracje metod obs=uguj/cych licznik oraz konstruktor i destruktor: void__fastcallZwieksz(int o_ile);// deklaracja funkcjipublicznej // zwikszaj/cej licznik void__fastcallZmniejsz(int o_ile):// deklaracja funkcjipublicznej // zmniejszaj/cej licznik void __fastcall UstawOnt nowa_wartosc);// deklaracja funkcji // publicznejustawiaj/cejnow/ // warto@ licznika _fastcall TLicznikCTComponent* Owner): //konstruktor. Tapozycja // powinna ju1 tu by@!virtual__fastcall ~TLicznik(); // destruktor S/ todeklaracjemetodnaszegokomponentu,czylioperacji,[email protected]=owokluczowevoidoznacza,1e funkcjaniezwraca1adnejwartoci,przez__fastcall zaznaczamysposbwywo=aniafunkcji.Deklaracjakonstruktora(__fastcallTLicznik)powinna ju1 by@ w sekcjipublic(niemusimywic jejdopisywa@).Standardowojesttamumieszczana przez program, ktry wytworzy= dla nas szkielet projektu. 10.Przechodzimy w edytorze do karty Licznik.cpp, aby zbudowa@ zawarto@ zdeklarowanych przed chwil/ metod.Deklaracjeumieszczajmyzawszewplikachnag=wkowych,natomiast implementacja (zawarto@, algorytm) - to rzecz pliku programu (*.cpp). 11.Sprbujmyzastanowi@ si, jakpowinnawygl/da@ funkcjaUstaw.Musionawiedzie@",oile zwikszy@ licznik(ju1 toza=atwilimydeklaruj/c argumentnowawarto./).Musimynada@ tnow/ warto@w=asnociFLiczba,atak1e zatroszczy@ si o to,byzosta=a onawywietlonana ekranie 12.Ostateczniewpisujemy(wplikuLicznik.cpp"przedkonstruktorem_fastcall TTLicznik::TTLicznik(...)"): void __fastcall TLicznlk::Ustaw(1nt nowa_wartosc) //metoda ustawiaj/ca //now/ warto@licznika FLiczba-nowa_wartosc; //ustawiamy w=asno@FLiczbananow/ warto@ itoa(FLiczba,FBufor,l0); //konwersjaliczba - tekst przy podstawie10 SetTextBuf(FBufor);// ustawiamy tekst pola edycjina nasz bufor }; //tu miejsce nadalsze metody Tekst komentarza (po znakach //) mo1emy oczywicie sobie [email protected] stosunkudodeklaracjimetodyUstawwplikunag=wkowym,dopisalimydojejnazwy identyfikatorobiektu-TLicznik::Ustaw.Chodziowskazaniekompilatorowi,1e jestto wewntrzna metoda klasy TLicznik. 13.Teraz pjdzie nam ju1 szybko - wpisujemy poni1ej poprzedniej metody: void __fastcall TLicznik::Zwieksz(int o_ile) // kod metody publicznej //zwikszaj/cej licznik {Ustaw(FLiczba+o_ile);// wykorzystujemy metod Ustaw do zwikszenia // 1icznika o o_ile" }; void __fastcall TLicznik::Zmniejsz(int o_ile) // kod metody publicznej // zmniejszaj/cej licznik{Ustaw(FLiczba-o_ile); // wykorzystujemy metod Ustaw}: __fastcall TLicznik::TLicznik(TComponent* Owner) // konstruktor - kod // buduj/cy nasz obiekt: TEdit(Owner) // konstruktor klasy bazowej{FRozmiarBuf=30; // domylny rozmiar bufora Bufor = new char(FWielkoscBuf); // tworzymy bufor tekstowy dla pola // edycji Ustaw(O); // ustawiamy licznik na warto@ domyln/ 0}_fastcall TLicznik::~TL1cznik() // "sprz/tamy" po sobie u1ywaj/c// destruktora{delete(FBufor): // zwalniamy bufor tekstowy }14. Gotowe! Zapiszmy jeszcze zmiany i mo1emy instalowa@ nasz nowy komponent! 15. W menu Component wybieramy opcje Install. W okienku, ktre si pojawi, wybieramy Add. WnastpnymokienkuwpisujemyLicznik.TerazjeszczedwarazyOK.C++Builderkompiluje zmodyfikowan/ bibliotek komponentw (VCL) i jeli wszystko wpisalimy bezb=dnie, na karcie Samples pojawi si nowy komponent - nasz Licznik. Rysunek 3.1. Instalacja komponentw 16.Mo1emyterazzniegoskorzysta@ w takisamsposb,wjakiczynilimytoju1 z innymi komponentami. Zamknijmy wszystkie pliki (menu File\CIose Ali). 17. Teraz otwieramy nowy projekt (File\New\AppIication). Wybierzmy nasz licznik z karty Samples i umie@my go na formularzu. 18.Dosterowanialicznikiempotrzebnenambd/ dwaprzyciski-Zmniejszlicznik"i.Zwiksz licznik"(kartaStandard\Button).W InspektorzeObiektwustawiamyw=asno@Caption jednego z nich na Zwiksz licznik", drugiego na Zmniejsz licznik". przetw_kl(Key,Shift); // wywo=anie naszejfunkcji interpretuj/cej //stanklawiatury}5.Jak =atwo si domyle@, odpowiedE na zdarzenie OnKeyUp jest identyczna: void __fastcali TForml:: FormKeyUpdObject *Sender,WORD &Key, TShiftState Shift) {przetw_kl (Key .Shift);}Podsumowanie: zdarzenia OnKeyPress, OnKeyDown i OnKeyUp mog/ by@ bardzo praktycznym i przydatnymuzupe=nieniemaplikacji.Zw=aszczawsytuacjach,wktrychchcemyniezw=ocznie zareagowa@ na pewn/ kombinacj klawiszynacinitychprzezu1ytkownika(klawiszeskrtu). WyobraEmysobiechocia1by edytortekstu,ktrydlazmianyjakiejkolwiekopcjiwymaga,aby u1ytkownikszpera= z mysz/ i klika= bezumiaruwniekoAcz/cesi rozwijanemenu,karty,opcjeitp. Dobrze napisana aplikacja powinna udostpnia@ najczciej u1ywane opcje w jak najprostszy sposb. wiczenie 4.2. Pliki tekstowe i operacje na nich Zadanie4.2.1:wykorzystuj/c klas TFileStreamskonstruowa@ przegl/dark do plikw wywietlaj/c/ zadan/ przez u1ytkownika liczb bajtw pliku. Wykonanie: 1. Zaczniemy od utworzenia nowego projektu (File\New Application). 2. Teraz z karty System wybieramy potrzebne komponenty - DriveComboBox, DirectoryListBox iFileListBox. 3.Komponentytes/ zaprojektowanedowsp=pracyzesob/. Wystarczyustawi@ w=asno@DirList komponentuDriveComboBoxlnaDirectoryListBoxl,a w=asno@FileListkomponentu DirectoryListBoxl na FileListBoxl. 4.Mo1emyju1 terazzapisa@ projekt(zad421)i nacieszy@ oczypierwszymiefektamiuruchamiaj/cnasz nowy program (F9). 5.DodajmyterazdonaszegoprojektukomponentMemo(kartaStandard),w ktrymbdziemy wywietla@ zawarto@plikw,atak1e poleedycji,wktrympozwolimyu1ytkownikowiokreli@liczb odczytywanych bajtw. 6.G=wnymzadaniemnaszegoprogramuborziereakcjanaklikniciewFileList-Boxl.Program powinienwtedyotworzy@ wybranyplik,odczyta@ zadan/ liczb bajtwiwywietli@ w polu Memol.Wszystkotowykonafunkcja,ktr/ przypiszemyw=asnociOnCIickobiektu FileListBoxl: void __fastcall TForml::Fi 1eListBoxlClick(TObject *Sender) {int RozmiarBuf=Editl->GetTextLen(); // pobieramy informacj o rozmiarze //tekstu w Editl// tworzymy w pamicibufor o odpowiednim rozmiarze char *Bufor=new char[++RozmiarBuf]; Editl->GetTextBuf(Bufor,RozmiarBuf);//pobieramy dobuforazawarto@ //EditlintLiczbaBajtow=atoi(Bufor); //konwersjatekst-liczba//tworzymynowyobiekt TFileStream nadaj/c muidentyfikator"Plik" //'i otwieraj/c jednoczenie do odczytu(fmOpenRead)plik wybrany //wFileListBoxl TFileStream*PIik=new TFi1eStream(File ListBoxl->Fi 1 eName,fmOpenRead);//tworzymy jeszcze jedenbufor -tym razem natekst pliku char *TekstBuf=new charCLiczbaBajtow]; // teraz odczyt zadanejliczby bajtw...PI ik->Read(TekstBuf,LiczbaBajtow); //... i jeszcze tylko ustawmy Memolaby"zobaczy=o" odczytany tekstMemol->SetTextBuf(TekstBuf); //teraz jeszcze posprz/tamy po sobie...PIik->Free(); // metodaniszczy obiekti zwalniazajmowan/ przez niego //pami@ delete Bufor; // w stosunku do prostszych struktur alokowanychprzez //new"deTete TekstBuf; //lepiejjest u1y@ operatoradelete" }7. Zadanie zosta=o wykonane. Uwa1ajmy jednak, ktre pliki prbujemy otwiera@, gdy1 nasz programnie jest zbyt odporny na b=dy... Rysunek 4.1. Przegl/darka plikw tekstowych Podsumowanie:tenprostyprzyk=admia= na celujedyniewskazanie,wjakisposbmo1nawykorzysta@ standardoweobiektyC++Buildera.Wartozwrci@ uwag nawywo=aniekonstruktora klasy TFileStream. Otwiera on plik o nazwie zawartej w pierw- szymparametrzewtrybieokrelonymprzezparametrdrugi.Jelichodziotrybotwarcia,mamydo wyboru kilka predefiniowanych wartoci: fmCreate - utworzenie pliku o podanej nazwie. Jeli plik ju1 istnieje, jest otwierany do zapisu; FmOpenRead - otwarcie pliku tylko do odczytu; FmOpenWrite - otwarcie tylko do zapisu (zapis spowoduje zast/pienie starej zawartoci pliku); fmOpenReadWrite - otwarcie dla modyfikacji zawartoci pliku. Jeli otwarcie pliku nie powiedzie si, klasa TFileStream wywo=a wyj/tek. W TFileStreammamyrwnie1 do dyspozycjimetod Writeumo1liwiaj/c/ zapisimodyfikacjpliku.Najlepiejpoeksperymentowa@. Mypjdziemyniecodalej.Sprbujemyza=o1y@ w=asn/ klasjakopochodn/ odTFileStream,a potemposzerzy@ niecojejmo1liwociwstosunkudo pierwowzoru... Zadanie4.2.2: zaprojektowa@ klas pochodn/ w stosunkudoTFileStream,ktra(prcz odziedziczonych mo1liwoci) bdzie w stanie udzieli@ nam dodatkowych informacji o pliku (rozmiar, atrybutyitp.).Douzyskaniadodatkowychinformacjiu1y@ funkcjiAPI- GetFileAttributesByHandle. Utworzy@ testow/ aplikacj wykorzystuj/c/ mo1liwoci nowej klasy. Wykonanie: 1. Jak zwykle otwieramy nowy projekt. 2.Tworzonaprzeznasklasabdziepowa1n/" prac/. Wypada=obywic zapisa@ j/ w osobnym module(ang.Unit),takabymo1na by=o j/ potemwielokrotniewykorzystywa@. Utworzymyw tym celu nowy modu= (FiIe\New Unit) i zapiszemy go jako MFile.cpp". 3.Wtymmodule(orazjegoplikunag=wkowym)utworzymynow/ klas o nazwieTMFile. Zaczniemy od definicji (deklaracji) klasy. W pliku nag=wkowym wpisujemy: classTMFile: public TFileStream //klas wyprowadzamy od TFileStream {private: // sekcja "prywatna", tu znajduj/ si chronione dane obiektu bool FFAArchive; // czy posiada atrybut Archive? bool FFAHidden; // czy jest ukryty? bool FFAReadOnly; // czy tylko do odczytu? DWORD FFSize; // rozmiar pliku (tylko "m=odsza" cz@)public: // sekcja "publiczna" - tu udostpnimy informacje o pliku// w za pomoc/ metod bool __fastcall FAArchive(); // metoda udostpniaj/ca informacje // o atrybucie Archive bool __fastcall FAHiddenO; // jw., dla praw dostpubool __fastcall FAReadOnly(); // metoda udostpniaj/ca informacje, czy // mamy do czynienia z plikiem DWORD __fastcall FSizeO; // zwraca rozmiar pliku // konstruktor __fastcall TMFile(const System::AnsiString NazwaPLiku, unsigned short Tryb);}; 4.Zajmiemysi zawartoci/ operacyjn/" naszejklasy.WplikuTMFile.cpp"wpisujemycia=azdeklarowanych przed chwil/ metod: //#include-dolaczenieplikunaglwkowegoopodanejnazwie #include//API-funkcjaGetFilelnformationByHandle //orazdefinicjastrukturyBY_HANDLE_FILE_INFORMATION-warto tam // zajrzec... __fastcall TMFile::TMFile(const System::AnsiStringNazwaPLiku, unsignedshortTryb)//konstruktor :TFileStream(NazwaPLiku,Tryb)//konstruktorklasy bazowej{BY_HANDLE_FILE_INFORMATION Filelnf; //strukturazdeklarowana w pliku winbase.h" //Handle-wlasnoscTFileStreamokreslajacauchwytplikudlaWin API if(GetFi 1 elnformationByHandle((HANDLE)Handle.&Fi1elnf)) {// jesli pobranie danych o pliku do Filelnf przebieglo w porzadku, // ustawimy nowe wlasnosci naszej klasy. // Poniewaz wszystkie atrybuty zawarte sa w kolejnych bitach // elementu dwFileAttributes - posluzymy sie operatorem "&", aby // "wyluskac" to, co nas interesuje: // urzadzenie? FFAArchive=(Filelnf.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE); // czy ukryty? FFAHidden=(FileInf.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN); // tylko do odczytu? FFAReadOnly=(FileInf.dwFileAttributes&FILE_ATTRIBUTE_READONLY); //informacje orozmiarze pliku znajduje sie w innym elemencie //strukturyFilelnf FFSize=Fi1elnf.nFileSizeLow; // mozemyuzyc prostego podstawienia // jak widac poslugujemy sie struktura Filelnf, //aby uzyskac kolejneinformacjeo pliku }else// w innym wypadku(bledny uchwyt pliku) {MessageBox(0,"PLik nie zostal poprawnie otwarty!"."Blad!",0); }}// reszta metod jest wzglednie prosta - zwracaja po prostu zawartosc // odpowiedniej wlasnosci bool__fastcallTMFile::FAArchive()//metodaudostepniajaca informacje // o atrybucie Archive{ return FFAArchive;}// zwracamy wartosc odpowiedniego pola obiektu bool__fastcallTMFile::FAHiddenC)//metodaudostepniajacainformacje //oatrybucieHidden{ returnFFAHidden;}//zwracamywartoscodpowiedniegopolaobiektu bool__fastcallTMFi1e::FAReadOnlyC)//metodaudostepniajacainformacje //o atrybucie ReadOnly {returnFFAReadOnly;3//zwracamywartoscodpowiedniegopolaobiektu DWORD__fastcallTMFi1e::FSize()//metodaudostepniajacainformacje // orozmiarze pliku{returnFFSize;3//zwracamy wartosc odpowiedniego polaobiektu 5.Nadszed= czasnazbudowanieprogramutestuj/cegonasz/ klas. Umiecimygowmodule g=wnym (Unitl.cpp"). 6.Przechodzimydoprojektuformularza.Mo1nadotegoceluu1y@ mened1eraprojektu (View\Project Manager). Do szybkiego poruszania si wrd wielu modu=w przydadz/ si nam tak1e gor/ce klawisze:CtrIF12, Shift-F12. 7.Podobnie,jakwpoprzednimzadaniu,osadzamywformularzukomponentyDriveComboBox, DirectoryListBox i FileListBox. 8.Interakcjemidzytymitrzemaobiektamirealizujemytaksamo,jakwzadaniupoprzednim (punkt3).AbyFileListBoxlwywietla= wszystkiepliki,ktrenasinteresuj/, ustawiamyopcje jego w=asnoci FileType (ftReadOnly, ftHidden, ftSystem, ftArchive) na tnie. 9.Do wywietlenia informacji o pliku w formie zrozumia=ej dla przecitnego miertelnika u1yjemy zwyczajnego ListBox + jaka etykietka (Label) z napisem Wybrane atrybuty pliku:" - 1eby by=ojasne, co zawiera lista. 10. Teraz musimy odpowiednio zareagowa@ na kliknicie w obiekt FileListBoxl (u1ytkownik wybiera plik). W zdarzeniu OnCIick obiektu FiIeListBoxl wpisujemy: void __fastcall TForml::FileListBoxlClick(T0bject *Sender) {// tworzymy nowy obiekt TMFile nadajac mu identyfikator "Plik" // otwierajac jednoczesnie do odczytu (fmOpenRead) plik wybrany // w FileListBoxl TMFile* Plik=new TMFi1e(Fi 1eListBoxl->Fi1eName,fmOpenRead); // tu zajmiemy sie ustawieniem zawartosci ListBoxl ListBoxl->Clear(); //usuwamy poprzednia zawartosc if (PI ik->FAArchive()) // jesli metoda zwrci wartosc true ListBoxl->Items->Add("Ustawiony atrybut Archive"); else // w innym wypadku... ListBoxl->Items->Add("Atrybut Archive nieustawiony"); if(Plik->FAHidden())// jeslimetodazwrciwartosc true ListBoxl->Items->Add("Zaznaczony jakoukryty"); else //w innym wypadku... ListBoxl->Items->Add("Nie jestukryty"); if(PI ik->FAReadOnly()) // jeslimetoda zwrciwartosc true ListBoxl->Items->Add("Tylko do odczytu!"); else // w innym wypadku... ListBoxl->Items->Add("Zapisdo pliku mozliwy"); //teraz zajmiemy sie odczytem rozmiaru pliku char Bufor[20]; ltoa(Plik->FSize(),Bufor,10); AnsiStringRozmiar(Bufor); ListBoxl->Items->Add("Rozmiar: "+Rozmiar); 11 teraz jeszcze posprzatamy po sobie...Plik->Free();}11.Wpowy1szymkodzieu1ylimyklasyTMFile.Abyby=a ona widoczna"dlakompilatora(aby przeanalizowa= jej kod), musimy do=/czy@ plik nag=wkowy tej klasy do modu=u Unitl.cpp". Do tego celu wykorzystamy dyrektyw kompilatora #include" (do=/cz). Wpiszmy na pocz/tku pliku Unitl.cpp" pod innymi dyrektywami #include": #include"MFile.h"//do=/czamy definicj/ klasy TMFile do modu=u //g=wnego 12. Nasz projekt jest gotowy do kompilacji. Zapiszmy go teraz (wszystkie modu=y) w odpowiedniego katalogu (zad422"). Rysunek 4.2. Przegl/darka atrybutw plikw Podsumowanie: jeszcze raz wykorzystalimy mechanizm dziedziczenia do zbudowania klasy bardziej wszechstronnejodswojej poprzedniczki.Warto jednakzwrci@ uwag na co jeszcze.Abyosi/gn/@ zamierzonycel,wykorzystalimyfunkcj niskiegopoziomu,pochodz/c/ z pow=okisystemowej Windows(WindowsAPI)-GetFilelnformationByHandle.Gor/cozachcamczytelnikwdo zagl/dnicia do pliku winbase.h", a tak1e innych plikw podkatalogu include\win32". Odkry@ tam mo1na wielefunkcjidaj/cychnowemo1liwoci.Icho@ wykorzystaniefunkcjiAPIniejest=atwe, nieraz mo1e si okaza@ jedyn/ drog/ do osi/gnicia zamierzonego celu. Dokumentacja(niestety-niezawszeaktualna)natematfunkcjiWin32APIznajdujesi w pliku pomocy win32.hlp" w podkatalogu HELP\MSHELP C++ Buildera. Warto tam zajrze/!5.Grafika i multimedia w C++ Builderze Wprowadzenie: trudno przeceni@ znaczenie strony wizualnej aplikacji. Wystarczy uwiadomi@ sobie, czemuw=aciwieWindowszawdziczaj/ swjsukces...WC++Buildermamydodyspozycjiwiele komponentwimetodukrywaj/cychca=y szeregnieistotnychzpunktuwidzeniazastosowaAszczeg=w.WefekcieprogramowaniedEwikuigrafikista=o si w tympakiecietakproste,jak jeszcze nigdy. Naszespotkaniezgrafik/ i multimediamiwC++BuilderzezaczniemyodobiektuCanvas(p=tno). Reprezentuje on obszar roboczy komponentu. Mo1emy na nim wykonywa@ r1ne operacje graficzne. Operuj/c natymobiekciemamydodyspozycjiwielemetodiw=asnoci,ktreupraszczaj/ znacznie wikszo@ wykonywanych operacji graficznych. wiczenie 5.1. Obiekt Canvas Zadanie5.1.1:zbudowa@ programdorysowaniapopowierzchniformularzaopartynaklasie TCanvas. Wykonanie: 1.Otwieramy jak zwykle nowy projekt. 2.W pliku nag=wkowym w sekcji public wstawimy deklaracj znacznika ry/owa- I nia bool Rysuj; 3.Zajmiemy si teraz trzonem" naszego programu, czyli odpowiednim zakodowaniem odpowiedzi formularza na nacinicia myszy. Pod zdarzenie OnMouseDown formularza podpinamy: //podjedziemyz"pirem"domiejsca,wktrymnacisnietoklawisz myszy Canvas->MoveTo(X,Y); // ustawiamy znacznik rysowania, aby mysz zostawiala slad Rysuj=true; 4.Teraz jeszcze reakcja na ruch myszy nad formularzem (OnMouseMove): if(Rysuj)//jesliustawionyznacznikrysowaniaCanvas->LineTo(X,Y); //rysujemy linie w kierunku poruszaniasie// myszy (X,Y) 5.Wrazie puszczenia klawisza myszy (OnMouseUp) ustawiamy odpowiednio znacznik rysowania: //puszczonoklawisz-koniecrysowania Rysuj=false; 6.Moglibymy uzna@, 1e to ju1 koniec! Zapiszmy projekt (zad511). Po uruchomieniu (F9) program dzia=a!Myl jednak,1e nieusatysfakcjonujenastakprostaaplikacja.Sprbujmydo=o1y@ parbajerw". 7.Udostpnimy mo1liwo@ rysowania w dowolnym kolorze. Bd/ nam potrzebne trzy komponenty ScroIlBari trzyetykiety(Label).Etykietomnadajmykolejnow=asnociCaption:Czerwony", Zielony",Niebieski"iustawmyjeobokkolejnychobiektwScroIlBar.W=asnociMax wszystkich obiektw ScroIlBar ustawmy na 255 (0-255 daje 256 odcieni ka1dego koloru). 8. Teraz musimy jeszcze zdeklarowa@ funkcj, ktra bdzie na podstawie pozycji suwakw ustawia=aodpowiednikolorpira(Pen).Nazwijmyj/ UstKoIor.Zdeklarujemyj/ w plikunag=wkowym wewn/trz obiektu TForml w sekcji public: //funkcja"zajmie"sie ustawieniem odpowiedniegokolorunapodstawie //pozycji suwakw __fastcall UstKolor(void); 9.Teraz w module g=wnym umieszczamy cia=o nowej funkcji: __fastcal1 TForml::UstKolor(void) {intNowyKolor;//w tejzmiennejwyliczymy nowykolor NowyKolor=ScrollBarl->Position;//Zaczynamyodkoloru czerwonego NowyKolor+=Scrol1Bar2->PositionExecute()) //dodajemy nazwe wybranego pliku do elementwListBoxl ListBoxl->Items->Add(OpenDialogl->FileName); }4.Teraz zajmiemy si stron/ wizualno-dEwikow/. Jako powierzchni do wywietlania ewentualnych obrazwu1yjemykomponentuPanel(kartaStandard- ostatni).Rozci/gnijmygoodpowiednio naformularzu.TerazkomponentMediaPlayer(System).Ustawmyjegow=asno@Display (wywietlanie)naPaneli.Poniewa1 niechcemy,abyby= widoczny,ustawiamyjegow=asno@ Visible na false. 5.Pozosta=o namodpowiedniozareagowa@ na klikniciemysz/ w ListBoxl(u1ytkownikwybiera inny plik). W=asnoci OnClick obiektu ListBoxl przypisujemy: void __fastcall TForml::ListBoxlClick(TObject *Sender) {// wstawiamy w nazwe pliku w MediaPlayer aktualny elementListBoxl MediaPlayerl->FileName=ListBoxl->Items->Strings[ListBoxl->ItemIndex]; //otwieramy plik Media PIayerl->Open(); // odtwarzanie MediaPlayerl->Play(); }6. Gratuluj nastpnej aplikacji! Po zapisaniu projektu mo1emy zaczyna@ zabaw. Poogl/dajmy sobie na przyk=ad pliki z katalogu FUNSTUFF CD Win95. Rysunek 5.2. Multimedialna aplikacja Podsumowanie: warto poeksperymentowa@ z tym komponentem i jego metodami, takimi jak Pause iStop,czyzdarzeniamijakOnClicki OnPost(!)CIick.Zastanwciesi, w jakisposbzrealizowano odtwarzaniewkomponencieMediaplayer,1e mo1liwyjestjednoczesnywybrinnegopliku.Od siebie przypomn tylko: zadanie 3.6.1... wiczenie 5.6. Animacja przy uyciu komponentu TPaintBox Zadanie 5.6.1: zrealizowa@ prost/ animacj przy u1yciu komponentu PaintBox. Wykonanie: 1. Wykorzystamy dwa komponenty PaintBox - pierwszy jako bufor, w ktrym bdziemy rysowa@, adrugi jako w=aciwe pole animacji. Pozwoli nam to unikn/@ dra1ni/cego efektu migotania. 2. Do kompletu potrzebny jest nam jeszcze przycisk, ktrym u1ytkownik zapocz/tkuje animacj. Pod w=asno@ OnClick przycisku podepniemy funkcj realizuj/c/ wywietlanie: void __fastcall TForml::ButtonlClick(TObject *Sender) {intwysPBl=PaintBoxl->Height;//niewiemjakWy,alejawolepolskie //nazwy... int szerPBl=PaintBoxl->Width; //Liczymy wsplrzedne srodka PaintBoxl int Y=wysPBl/2; // Y- wysokosc II int X=szerPBl/2; // X- szerokosc II int i,j,r[3]=C0,10,203;// inicjujemy tablice 3 promieni klTCanvas *PBlCanv,*PB2Canv; // uzyjemy wskaznikw, aby prosciej sie// kodowaloPBlCanv=PaintBoxl->Canvas;//wskazujemynaPaintBoxl PB2Canv=PaintBox2->Canvas; // wskazujemy na PaintBox2for (i=0;iBrush->Style=bsSolid;//stylwypelnienia-pelne PBlCanv->Brush->Color=clWhite;//wypelnienie biale//wymazujemypoprzednia zawartoscrysujac prostokatwypelniony na bialoPBlCanv->Rectangle(0.0,szerPBl,wysPBl);PBlCanv->Brush->Style=bsClear;//stylwypelnienia-brak for(j-0;jEllipse(X-r[j],Y-r[j],X+r[j],Y+rCj]);}//teraz kopiujemy to, co narysowalismy do PaintBox2 PB2Canv->CopyRect(Rect(0,0.szerPBl,wysPBl),PBlCanv,Rect (0,0,szerPB.l,wysPBD); }}}3. Zapisawszy projekt mo1emy przyst/pi@ do testw. Podsumowanie:obrazwPaintBoxlmigocze,alezatowPaintBox2widzimybardzop=ynn/animacj. Dlaporwnaniaefektwu1ylimyjakobuforaroboczegoobiektuPaintBoxl.Wprawdziwych"aplikacjachmo1na dotegoceluu1y@ obiektuklasyTBitmapstworzonego dynamiczniewpamici(operatornew)bezreprezentacjinaekranie.Jakzwyklepolecamto eksperymentom. 6.Bazy danych w C++ Builderze wiczenie 6.1. Database Form Wizard Wprowadzenie:bazydanychtoszerokaibardzowa1na dziedzinazastosowaA komputerw. W=aciwiemo1na by rzec,1e w dzisiejszychczasachka1dy powa1ny programwmniejszymczy wikszymstopniuopierasi na bardziejlubmniejzaawansowanychstrukturachdanych.W poni1szych @wiczeniach zapoznamy si ze sposobami budowy i obs=ugi baz danych w C++ Builderze. Rozpoczniemyodrzeczynajprostszej-budowyprzegl/darkidanychzapomoc/ DatabaseForm Wizard.Omwimynastpnienormalizacj (optymalizacj) strukturdanych,abywkoAcuprzej@do omwienia kolejnych mechanizmw usprawniaj/cych obs=ug baz danych. Zadanie6.1.1:zaprojektowa@ formularzdanych Zwierzaki"przyu1yciuDatabase FormWizardiprzyk=adowej tabeli ,,exampIes\animaIs.dbf'. Wykonanie: 1.Otwieramy nowy projekt (Application). 2.OtwieramyponowniemenuFileopcjaNew,a nastpniewybieramyzkartyFormsDatabase Form. 3.Wokienku,ktresi pojawi,pozostawiamydomylneopcjeCreateasimpleform"iCreatea form using TTable objects". 4. Naciskamy Next. 5. Wybieramy katalog ...\Examples\DATA\ANIMALS.DBF". 6. Znw Next. 7.Teraz klikamy w przycisk >" przenosz/c kolejne pola tabeli animals" do naszego formularza. 8.Next,Next,Finish- i otonaszymoczomukazujesi gotowyformularzpod=/czony"dotabeli, ktr/ wskazalimy, czyli animals". 9. Zapisujemy tradycyjnie w katalogu (Projects\zad611") i uruchamiamy program (F9).' 10.Widzimy wyraEnie, 1e naszej aplikacji czego brakuje. Zauwa1ylimy na pewno pole BMP" - co niechybnie oznacza rysunek - a my tymczasem niczego nie widzimy. 11.PrzejdEmy z powrotem do projektu (zamknicie aplikacji - X" w prawym grnym rogu okna). 12.Pora na par wskazwek jak to dzia=a". Otwrzmy kart Data Access palety komponentw. Czy widzimykomponentTTable- drugizlewej?Identycznykomponentznajdujesi u nasna formularzuForm2.Nazywasi Tableli reprezentujetabel animals"(rzu@myokiemnajego w=aciwo@ TableName). 13.Jakoporednik"midzyTablel(tabel/) a polamiedycjis=u1y komponentData-Sourcel0eg odpowiednikznajdujesi jakopierwszyzlewejnakarcieDataAc-cess'tabelikomponentw). Przyjrzyjmy si jego w=aciwoci DataSet. Czy nie jest to Tablel? 14.Na koAcu tego =aAcuszka" znajduj/ si tzw. kontrolki danych", czyli obiekty takie jak DBEdit, DBGrid,DBMemo,DBImagei innezkartyDataControls.Je1elipodejrzymyw=aciwo@ DataSourceobiektwDBEditz naszego


Top Related