59
Zaawansowane programowanie w (pakiecie) Delphi Andrzej Marciniak Prezentacja multimedialna przygotowana za pomoc¹ systemu Corel® Presentations 11 i X3 Copyright © 2004 - 2010 by Andrzej Marciniak DEL420 DEL-7(1 z 59)

Zaawansowane programowanie w (pakiecie) Delphi · Piktogramy (ang. icons) Piktogramy s¹ zasobami œrodowiska Windows i s ... w tym formacie zeskanowanego rysunku. DEL-7(20 z 59)

  • Upload
    buiminh

  • View
    227

  • Download
    0

Embed Size (px)

Citation preview

Zaawansowane programowanie w (pakiecie) Delphi

Andrzej Marciniak

Prezentacja multimedialna przygotowana za pomoc¹ systemu Corel® Presentations 11 i X3Copyright © 2004 - 2010 by Andrzej Marciniak

DEL420

DEL-7(1 z 59)

� elementy jêzyka Delphi Pascal zwi¹zane z grafik¹�funkcje GDI�typ TCanvas�w³asnoœci typu TCanvas

(Brush, ClipRect, CopyMode, Font, Pen, PenPos,Pixels)

�metody typu TCanvas (Arc, Chord, CopyRect, Draw, Ellipse, FillRect,FloodFill, FrameRect, LineTo, MoveTo, Pie,PolyBezier, PolyBezierTo, Polygon, Polyline,Rectangle, RoundRect, StretchDraw, TextHeight,TextOut, TextRect, TextWidth)

Na poprzednim wyk³adzie ...

DEL-7(2 z 59)

� elementy jêzyka Delphi Pascal zwi¹zane z grafik¹(cd.)

�typ TColor�komponent Shape (typ TShape)�komponent Image (typ TImage)�komponent Chart (typ TChart)

� formaty zbiorów z rysunkami (mapy bitowe,piktogramy, metazbiory)

� komponenty dotycz¹ce obs³ugi multimediów�komponent Animate (typ TAnimate)�komponent MediaPlayer (typ TMediaPlayer)

� rysowanie wykresów funkcji

Na tym wyk³adzie ...

DEL-7(3 z 59)

Elementy ... zwi¹zane z grafik¹Typ TColor

Typ ten jest u¿ywany do okreœlenia koloru obiektu. Jest zdefiniowany w module Graphics:

type TColor = !(COLOR_ENDCOLORS+1) .. $02FFFFFF;

przy czym sta³a

const COLOR_ENDCOLORS = 28;

jest zdefiniowana w module Windows .

DEL-7(4 z 59)

Elementy ... zwi¹zane z grafik¹Typ TColor

W module Graphics zdefiniowano kilkanaœcie sta³ychdo oznaczania kolorów.

Sta³e te odnosz¹ siê

# albo do najbli¿szego koloru w palecie systemowej(np. clBlue oznacza kolor niebieski palety),

# albo do odpowiedniego elementu ekranuzdefiniowanego w œrodowisku Windows (np.clBtnFace okreœla kolor przyjêty w œrodowiskuWindows dla przycisku).

DEL-7(5 z 59)

� trzy mniej znacz¹ce bajty oznaczaj¹ intensywnoœci kolorówRGB: niebieskiego, zielonego i czerwonego (np.$00FF0000 oznacza kolor niebieski, $0000FF00 – zielony,$000000FF – czerwony, $00000000 – czarny, a wartoœæ$00FFFFFF – kolor bia³y),

� bajt najbardziej znacz¹cy mo¿e przyj¹æ trzy wartoœci: $00 – kolor jest pobierany z palety systemowej, $01 – kolor jest pobierany z bie¿¹cej palety, $02 – pobranie koloru z logicznej palety bie¿¹cego kontekstu urz¹dzenia.

Elementy ... zwi¹zane z grafik¹Typ TColor

Kolor mo¿na tak¿e okreœlaæ za pomoc¹ czterobajtowychwartoœci szesnastkowych:

DEL-7(6 z 59)

Elementy ... zwi¹zane z grafik¹Komponent Shape (typ TShape)

Komponent ten znajduje siê na stronie Additionalpalety komponentów, a definiuj¹cy go typ opisano w module ExtCtrls .

Reprezentuje figury geometryczne, które mo¿nabezpoœrednio narysowaæ na formatce.

Podstawowe w³asnoœci:

Brush (typu TBrush) – wzorzec i kolor wype³niania,Pen (typu TPen) – rodzaj i kolor obrysu,Shape (typu TShapeType) – rodzaj figury, przy czym

type TShapeType = (stRectangle, stSquare, stCirle, stEllipse, stRoundRect, stRoundSquare);DEL-7(7 z 59)

Elementy ... zwi¹zane z grafik¹Komponent Image (typ TImage)

Komponent Image znajduje siê na stronie Additionalpalety komponentów. Opisuj¹cy go typ TImage jestzdefiniowany w module ExtCtrls.

S³u¿y do wyœwietlania rysunków przygotowanych w ró¿nych formatach: JPG (JPEG), BMP, ICO orazWMF (EWF).

Podstawowe w³asnoœci:

Canvas (typu TCanvas) – w³asnoœæ dostêpna tylko, gdy w³asnoœæ Picture (zob. dalej) okreœla mapê bitow¹ (za jej pomoc¹ mo¿na np. dodaæ teskt do rysunku – metoda TextOut),

DEL-7(8 z 59)

Elementy ... zwi¹zane z grafik¹Komponent Image (typ TImage)

Podstawowe w³asnoœci (cd.):

Center (typu Boolean) – przy wartoœci True oznacza centrowanie rysunku (wzglêdem komponentu Image );

wartoœæ tej w³asnoœci nie ma ¿adnego znaczenia, gdywartoœci¹ w³asnoœci AutoSize jest True lub wartoœci¹w³asnoœci Stretch (zob. dalej) jest True, a w³asnoœæPicture nie okreœla piktogramu;

Picture (typu TPicture) – okreœla obiekt zawieraj¹cy piktogram, mapê bitow¹, metazbiór lub rysunek o klasie zdefiniowanej przez u¿ytkownika,

DEL-7(9 z 59)

Elementy ... zwi¹zane z grafik¹Komponent Image (typ TImage)

Stretch (typu Boolean) – przy wartoœci True okreœla takie przeskalowanie rysunku, ¿e bêdzie on dok³adnie dopasowany do komponentu Image;

Podstawowe w³asnoœci (cd.):

jeœli w³asnoœæ Picture okreœla piktogram, to wartoœæ tejw³asnoœci jest bez znaczenia.

DEL-7(10 z 59)

Elementy ... zwi¹zane z grafik¹Komponent Chart (typ TChart)

Komponent ten znajduje siê na stronie Additional paletykomponentów i s³u¿y do wykonywania wykresów.

Do okreœlania ró¿nych charakterystyk wykresów s³u¿yEdytor Wykresów (ang. Chart Editor), który ustalawartoœci odpowiednich w³asnoœci.

Wartoœci te mog¹ byæ zmieniane podczas wykonywaniaprogramu przez bezpoœrednie przypisanie nowychwartoœci do w³asnoœci lub za pomoc¹ metod typuTChart.

Dane do wykresu generuje siê podczas wykonywaniaprogramu. DEL-7(11 z 59)

� umieœciæ komponent na formatce,

� umiejscowiæ kursor myszki na tym komponencie i nacisn¹æ prawy klawisz myszki,

� w wyœwietlonym menu kotekstowym wybraæpolecenie Edit Chart, co spowoduje ukzanie siêna ekranie wielostronicowego okna EdytoraWykresów,

Elementy ... zwi¹zane z grafik¹Komponent Chart (typ TChart)

Podstawowe czynnoœci zwi¹zane z u¿yciemkomponentu Chart:

DEL-7(12 z 59)

� uworzyæ seriê danych dowykresu, tj.

�wybraæ przycisk Add nastronie Chart, co spowodujewyœwietlenie galerii rodzajówwykresów,

�wybraæ jeden rodzaj (póŸniejmo¿na go zmieniæ).

Elementy ... zwi¹zane z grafik¹Komponent Chart (typ TChart)

Podstawowe czynnoœci zwi¹zane z u¿yciemkomponentu Chart:

wybraæ ten przycisk

DEL-7(13 z 59)

Elementy ... zwi¹zane z grafik¹Komponent Chart (typ TChart)

Rodzaje wykresów

DEL-7(14 z 59)

Elementy ... zwi¹zane z grafik¹Komponent Chart (typ TChart)

Edytor wykresówautomatyczniewygeneruje dlawybranegorodzaju wykresulosow¹ seriêdanych, dziêkiczemu wykresbêdzie widocznyna etapieprojektowaniaprogramu.

DEL-7(15 z 59)

Elementy ... zwi¹zane z grafik¹Komponent Chart (typ TChart)

Uwaga: Losowe wartoœci wygenerowane przez EdytorWykresów obowi¹zuj¹ tylko w fazieprojektowania (próba wykonania programuspowoduje wyœwietlenie „pustego” wykresu).

Wartoœci, dla których ma byæ wykonany wykres mo¿naustaliæ w Edytorze Wykresów przez okreœlenie Ÿród³adanych (zob. system pomocy) lub przez dodanieodpowiednich instrukcji w tekœcie Ÿród³owym.

DEL-7(16 z 59)

� umieœciæ przycisk na formatce,

� napisaæ nastêpuj¹ce instrukcje obs³ugi zdarzenia OnClick dla tegoprzycisku:

Elementy ... zwi¹zane z grafik¹Komponent Chart (typ TChart)

with Series1 do begin Add (40, ’2000’, clRed); Add (60, ’2002’, clBlue); Add (80, ’2004’, clGreen) end;

Series1 – domyœlna nazwa serii danych. Pierwszy parametr metody Addokreœla wartoœæ wspó³rzêdnej Y (wspó³rzêdna X jest obliczona automatycznie)dodawanego punktu. Drugi parametr opisuje ten punkt (mo¿e byæ ³añcuchempustym). Trzeci parametr jest opcjonalny (mo¿e byæ clTeeColor – kolorwykresu).

Przyk³ad (dodanie wartoœci danych w tekœcie)

DEL-7(17 z 59)

Formaty zbiorów z rysunkamiMapy bitowe

Mapa bitowa jest binarn¹ reprezentacj¹ rysunku i sk³ada siê z dwu czêœci:

# rekordu typu TBitmapInfo opisuj¹cego wymiaryrysunku oraz paletê kolorów, któr¹ systemWindows bêdzie u¿ywaæ do jego wyœwietlenia,

# tablicy bajtów definiuj¹cej ka¿dy piksel mapybitowej.

Mapy bitowe s¹ zapisywane w zbiorach .bmp.

DEL-7(18 z 59)

Formaty zbiorów z rysunkamiPiktogramy (ang. icons)

Piktogramy s¹ zasobami œrodowiska Windows i s¹zapisywane w zbiorach .ico.

Na ogó³ piktogramy maj¹ dwa rozmiary:

# du¿y – 32×32 piksele (reprezentuj¹ np. program napulpicie),

# ma³y – 16×16 pikseli (stosowane np. w naro¿nikachokienek i paskach menu),

Piktogramy mo¿na przygotowaæ za pomoc¹programu Image Editor, a w jêzyku Delphi Pascal s¹reprezentowane przez obiekty typu TIcon.

DEL-7(19 z 59)

Formaty zbiorów z rysunkamiMetazbiory

Metazbiory zawieraj¹ zestaw funkcji GDI, którychwykonanie powoduje narysowanie obrazu.

G³ówne zalety:

# ma³y kod wynikowy,

# mo¿liwoœæ dok³adnego redagowania zawartoœcirysunku.

G³ówna wada:

# brak mo¿liwoœci bezpoœredniego zapamiêtania w tym formacie zeskanowanego rysunku.

DEL-7(20 z 59)

Obs³uga multimediówKomponent Animate (typ TAnimate)

Komponent ten znajduje siê na stronie Win32 paletykomponentów, a definicja typu jest umieszczona w module ComCtrls .

Jest ³¹czem do elementu steruj¹cego œrodowiskaWindows obs³uguj¹cego animacje w formacie AVI (skr. ang. Audio Video Interleaved).

Uwagi: 1)Animacja w formacie AVI jest ci¹giem map bitowych i chocia¿ mo¿e zawieraæ „œcie¿kê dŸwiêkow¹”, tokomponent wyœwietla tylko animacjê bez dŸwiêku.

2)Komponent mo¿e wyœwietlaæ zwyk³e (bez kompresji)zbiory .avi lub skompresowane w systemie RLE (skr.ang. run-length encoding). DEL-7(21 z 59)

Obs³uga multimediówKomponent Animate (typ TAnimate)

G³ówne w³asnoœci:

FileName (typu TFileName) – okreœla nazwê zbioru z animacj¹ AVI,

StartFrame (typu SmallInt) – okreœla pierwsz¹ wyœwietlan¹ klatkê (klatki s¹ numerowane od 1),

StopFrame (typu SmallInt) – okreœla ostatni¹ wyœwietlan¹ klatkê.

Uwaga: Metoda Play (zob. dalej) pokrywa wartoœci w³asnoœciStartFrame i StopFrame wartoœciami parametrówFromFrame i ToFrame.

DEL-7(22 z 59)

Obs³uga multimediówKomponent Animate (typ TAnimate)

G³ówne metody:

Play – wyœwietlenie sekwencji klatek z animacj¹ AVI

procedure Play (FromFrame, ToFrame : Word; Count : Integer);

(parametr Count okreœla liczbê powtórzeñ sekwencji),

Stop – zatrzymanie wyœwietlenia (metoda bezparametrowa),

Seek – wyœwietlenie okreœlonej klatki

procedure Seek (Frame : SmallInt);

DEL-7(23 z 59)

Obs³uga multimediówKomponent MediaPlayer (typ TMediaPlayer)

Typ TMediaPlayer jest „paskalowym pokryciem”mechanizmu obs³ugi multimediów w œrodowiskuWindows (ang. MCI – skrót od Media Control Interface).Jest zdefiniowany w module MPlayer.

Komponent tego typu, znajduj¹cy siê na stronie Systempalety komponentów, zawiera zestaw przyciskówumo¿liwiaj¹cych sterowanie takimi urz¹dzeniami, jaknapêd CD-ROM, odtwarzacz MIDI lub VCR.

Urz¹dzenie multimedialne mo¿e byæ sprzêtowe lubprogramowe. DEL-7(24 z 59)

Obs³uga multimediówKomponent MediaPlayer (typ TMediaPlayer)

Znaczenia przycisków:

przycisk „wartoœæ” funkcja

btPlay odtwarzaniebtPause przerwanie odtwarzania (gdy

odtwarzanie jest ju¿ przerwane– wznowienie odtwarzania)

btStop zatrzymanie odtwarzania lubnagrywania

btNext przejœcie do nastêpnej œcie¿ki (lub dokoñca, gdy œrodek przekazu nie maœcie¿ek)

DEL-7(25 z 59)

Obs³uga multimediówKomponent MediaPlayer (typ TMediaPlayer)

Znaczenia przycisków:

przycisk „wartoœæ” funkcja

btPrev przejœcie do poprzedniej œcie¿ki (lub dopocz¹tku, gdy œrodek przekazu nie maœcie¿ek)

btStep przejœcie w przód pewn¹ liczbê „ramek”btBack przejœcie w ty³ pewn¹ liczbê „ramek”btRecord rozpoczêcie nagrywaniabtEject „wyrzucenie” noœnika (np. wysuniêcie

szuflady napêdu CD-ROM)

DEL-7(26 z 59)

Obs³uga multimediówKomponent MediaPlayer (typ TMediaPlayer)

Podstawowe w³asnoœci:

DeviceType (typu TMPDeviceTypes)

– okreœlenie rodzaju urz¹dzenia multimedialnego,które powinno byæ otwarte przez odtwarzacz

type TMPDeviceTypes = (dtAutoSelect,dtAVIVideo, dtCDAudio, dtDAT,dtDigitalVideo , dtMMMovie , dtOther,dtOverlay, dtScanner, dtSequencer,dtVCR, dtVideodisc, dtWaveAudio);

DEL-7(27 z 59)

Obs³uga multimediówKomponent MediaPlayer (typ TMediaPlayer)

Podstawowe w³asnoœci:

DeviceType (typu TMPDeviceTypes)

Uwagi: 1) Domyœlnie przyjmuje siê dtAutoSelect i wówczasrodzaj urz¹dzenia jest okreœlany automatycznie napodstawie rozszerzenia nazwy zbioru podanego we w³asnoœci FileName (zob. dalej).

2) Aby podczas wykonywania programu odtwarzaczotworzy³ automatycznie urz¹dzenie okreœloneprzez wartoœæ w³asnoœci DeviceType, wartoœci¹w³asnoœci AutoOpen musi byæ True.

DEL-7(28 z 59)

Obs³uga multimediówKomponent MediaPlayer (typ TMediaPlayer)

Podstawowe w³asnoœci:

FileName (typu string)

– okreœla nazwê zbioru otwieranego za pomoc¹metody Open (bêdzie dalej) lub zapisywanego zapomoc¹ metody Save (te¿ bêdzie dalej)

Mode (typu TMPModes)

– okreœla stan urz¹dzenia medialnego

type TMPModes = (mpNotReady, mpStopped,mpPlaying, mpRecording, mpSeeking,mpPaused, mpOpen);

DEL-7(29 z 59)

Obs³uga multimediówKomponent MediaPlayer (typ TMediaPlayer)

Podstawowe w³asnoœci:

EnabledButtons (typu TButtonSet)

– okreœla przyciski odtwarzacza

type TMPBtnType = (btPlay, btPause, btStop,btNext, btPrev, btStep, btBack,btRecord, btEject);

TButtonSet = set of TMPBtnType;

DEL-7(30 z 59)

Obs³uga multimediówKomponent MediaPlayer (typ TMediaPlayer)

Podstawowe w³asnoœci:

StartPos i EndPos (typu Longint)

– okreœla pozycjê pocz¹tku i koñca odtwarzaniabie¿¹cego noœnika (pozycje te s¹ okreœlone zapomoc¹ aktualnego formatu czasu – zob. w³asnoœæTimeFormat dalej)

Uwaga: Zmiana wartoœci w³asnoœci StartPosobowi¹zuje dopiero przy nastêpnymwywo³aniu metody Play lub StartRecording(zob. dalej).

DEL-7(31 z 59)

Obs³uga multimediówKomponent MediaPlayer (typ TMediaPlayer)

Podstawowe w³asnoœci:

TimeFormat (typu TMPTimeFormats )

– okreœla format u¿ywany do okreœlenia pozycji (m. in. pocz¹tkowej, koñcowej, bie¿¹cej) orazinterpretacji wartoœci w³asnoœci StartPos, Length,Position i EndPos

type TMPTimeFormats = (tfMilliseconds ,tfHMS, tfMSF, tfFrames, tfSMPTE24,tfSMPTE25, tfSMPTE30, tfSMPTE30Drop,tfBytes, tfSamples, tfTMSF);

DEL-7(32 z 59)

Obs³uga multimediówKomponent MediaPlayer (typ TMediaPlayer)

TimeFormat (typu TMPTimeFormats )

Uwagi: 1) Nie wszystkie formaty s¹ dozwolone dla ka¿degourz¹dzenia.

Podstawowe w³asnoœci:

2) W ka¿dym formacie odpowiednie wartoœci s¹pamiêtane jako czterobajtowe liczby ca³kowite.

Znaczenia elementów typu TMPTimeFormats:

tfMilliseconds – milisekundy,tfHMS – godziny, minuty i sekundy (najmniej znacz¹cy

bajt okreœla liczbê godzin, a najbardziejznacz¹cy bajt nie jest u¿ywany),

DEL-7(33 z 59)

Obs³uga multimediówKomponent MediaPlayer (typ TMediaPlayer)

Znaczenia elementów typu TMPTimeFormats (cd.):tfMSF – minuty, sekundy i ramki (ang. frames)

(najmniej znacz¹cy bajt okreœla liczbê minut, a najbardziej znacz¹cy bajt nie jest u¿ywany),

tfFrames – ramki,tfSMPTE24 – 24-ramkowy format SMPTE (skr. ang. Society

of Motion Picture and Television Engineers), w którym najmniej znacz¹cy bajt zwiera liczbêgodzin, nastêpny – minut, dalej – sekund, a bajt najbardziej znacz¹cy – liczbê ramek (w standardzie tym wystêpuj¹ 24 ramki nasekundê),

tfSMPTE25 – 25-ramkowy format SMPTE,DEL-7(34 z 59)

Obs³uga multimediówKomponent MediaPlayer (typ TMediaPlayer)

Znaczenia elementów typu TMPTimeFormats (cd.):tfSMPTE30 – 30-ramkowy format SMPTE,tfSMPTE30Drop – jak tfSMPTE24,tfBytes – bajty,tfSamples – ?,tfTMSF – œcie¿ki, minuty, sekundy i ramki (od bajtu

najmniej znacz¹cego).

DEL-7(35 z 59)

Obs³uga multimediówKomponent MediaPlayer (typ TMediaPlayer)

Wa¿niejsze metody (wszystkie bezparametrowe):

Back – przesuniêcie bie¿¹cego noœnika wstecz o liczbê ramek okreœlon¹ przez wartoœæw³asnoœci Frames,

Close – zamkniêcie urz¹dzenia multimedialnego,

Eject – „wyrzucenie” noœnika (np. wysuniêcieszuflady napêdu CD-ROM),

Next – przejœcie do nastêpnej œcie¿ki bie¿¹cegourz¹dzenia multimedialnego,

Pause – przerwanie odtwarzania (gdy odtwarzanie jestprzerwane – wznowienie odtwarzania), DEL-7(36 z 59)

Obs³uga multimediówKomponent MediaPlayer (typ TMediaPlayer)

Wa¿niejsze metody (wszystkie bezparametrowe):

Play – odtwarzanie,Previous – przejœcie do poprzedniej œcie¿ki

bie¿¹cego urz¹dzenia multimedialnego,Rewind – ustalenie bie¿¹cej pozycji na pocz¹tku

noœnika (pamiêtanym we w³asnoœci Start),Step – przesuniêcie do przodu o liczbê ramek

okreœlon¹ wartoœci¹ w³asnoœci Frames,StartRecording

– rozpoczêcie nagrywania,

DEL-7(37 z 59)Stop – zatrzymanie odtwarzania lub nagrywania.

� funkcje paskalowe obliczaj¹ce (przybli¿one) wartoœciodpowiednich funkcji matematycznych powinny byæpobierane z biblioteki DLL (jej przygotowanie i skompilowanie bêdzie nale¿a³o do u¿ytkownika),

� funkcje te bêd¹ importowane do programu w sposóbdynamiczny,

� liczba tych funkcji nie powinna byæ ograniczona „nasztywno” w programie, a jedynym dla niej ograniczeniempowinna byæ pojemnoœæ dostêpnej pamiêci.

Rysowanie wykresów funkcji

(temat przedstawiony w oparciu o przyk³adprogramu okienkowego rysuj¹cego wykres jednejlub kilku funkcji jednej zmiennej)

Za³o¿enia dotycz¹ce funkcji:

DEL-7(38 z 59)

� rozmiary okienka (wysokoœæ i szerokoœæ), w którymbêd¹ przedstawiane wykresy, mog¹ ulegaæ zmianie(jak w przypadku ka¿dego niedialogowego okienkaœrodowiska Windows);

� ka¿dy wykres nale¿y skalowaæ wzglêdem rozmiarówokienka oraz wzglêdem innych wykresów.

Rysowanie wykresów funkcji

Za³o¿enia dotycz¹ce sposobu rysowania wykresów:

Lkoniecznoœæ przeskalowania wykresów po ka¿dej zmianie tych rozmiarów, czyli narysowanie ich od nowa, sk¹d wynika koniecznoœæ pamiêtania adresówwszystkich funkcji paskalowych (obliczaj¹cych wartoœciodpowiednich funkcji matematycznych) importowanychdynamicznie z biblioteki DLL, albo importowanie ich od nowaprzy ka¿dej zmianie rozmiarów okienka DEL-7(39 z 59)

Rysowanie wykresów funkcji(Najpierw) narysowanie wykresu jednej funkcji

Dla danej funkcji (matematycznej) y = f(x) nale¿yokreœliæ przedzia³ [ a, b] zmiennej x.1) Przyjmuj¹c, ¿e maksymalnej wspó³rzêdnej x obszaru

roboczego okienka (obszaru, w którym bêdziewykonany wykres) odpowiada wartoœæ b, a wspó³rzêdnej x tego obszaru o wartoœci 0 – wartoœæ a, znajdujemy najmniejsz¹ i najwiêksz¹wartoœæ funkcji w przedziale [ a, b].Wartoœæ tê wyznaczamy obliczaj¹c wartoœci yi funkcjiod x = a do x = b z krokiem odpowiadaj¹cym jednemupikselowi ekranu w kierunku osi x, tj. dla

DEL-7(40 z 59)

Rysowanie wykresów funkcjiNarysowanie wykresu jednej funkcji

przy czym k + 1 oznacza liczbê pikseli obszaruroboczego okienka w kierunku osi Ox (piksele s¹ponumerowane od zera).

Otrzymamy w ten sposób wartoœci yi.

DEL-7(41 z 59)

Rysowanie wykresów funkcjiNarysowanie wykresu jednej funkcji

2) Korzystaj¹c z wzorów:

wyznaczamy wspó³rzêdne kolejnych pikseli obszaruroboczego okienka, które ³¹czymy odcinkami.

gdzie symbol [.] oznacza czêœæ ca³kowit¹, a l + 1 – liczbê pikseli obszaru roboczego w kierunku osi Oy,

DEL-7(42 z 59)

Rysowanie wykresów funkcjiNarysowanie wykresu jednej funkcji

W podanych wzorach przyjêto, ¿e wspó³rzêdna yobszaru roboczego okienka o wartoœci 0 odpowiadawartoœci ymax, a l odpowiada wartoœci ymin, cospowoduje odwrócenie kierunku osi Oy ekranu(skierowanej w dó³), a wiêc otrzymanie wykresu w uk³adzie wspó³rzêdnych prostok¹tnych powszechnieprzyjmowanym (z osi¹ Oy skierowan¹ do góry).Uwaga: Dodatkowo mo¿na w obszarze roboczym okienka narysowaæ

uk³ad wspó³rzêdnych (przyjmuj¹c odpowiednie skalowanie).Osie liczbowe rysuje siê zwykle z lewej strony wspomnianegoobszaru (oœ Oy) i u jego do³u (oœ Ox). Punkt O przeciêcia siêobu osi nie musi byæ przy tym punktem o wspó³rzêdnych (0, 0) (wzglêdem wykresu funkcji). DEL-7(43 z 59)

Rysowanie wykresów funkcjiRysowanie wykresów kilku ( n) funkcji

1) Postêpujemy podobnie, tyle ¿e spoœród wszystkichprzedzia³ów [aj, bj] (j = 1, 2, ... , n) wybieramyprzedzia³ [amin, bmax], gdzie

a nastêpnie przyjmujemy, ¿e maksymalnejwspó³rzêdnej x obszaru roboczego okienkaodpowiada wartoœæ bmax, a wspó³rzêdnej x tegoobszaru o wartoœci 0 – wartoœæ amin.

DEL-7(44 z 59)

Rysowanie wykresów funkcjiRysowanie wykresów kilku ( n) funkcji

2) Dla j-tej funkcji ( j = 1, 2, ... , n) wyznaczamynajmniejsz¹ yj, min i najwiêksz¹ yj, max wartoœæ w przedziale [ aj, bj], obliczaj¹c w tym celu wartoœci yij

od x = aj do x . bj z krokiem odpowiadaj¹cymjednemu pikselowi, czyli dla

gdzie symbol [.] oznacza czêœæ ca³kowit¹, sk¹d

DEL-7(45 z 59)

Rysowanie wykresów funkcjiRysowanie wykresów kilku ( n) funkcji

3) Wykonujemy skalowania funkcji w kierunku osi Oy.W tym celu obliczamy najpierw wartoœci

DEL-7(46 z 59)

Rysowanie wykresów funkcjiRysowanie wykresów kilku ( n) funkcji

Wspó³rzêdne kolejnych pikseli wykresu j-tej funkcji, które ³¹czymy odcinkami, wyznaczamy z wzorów:

i przyjmujemy, ¿e wspó³rzêdna y obszaru roboczegookienka o wartoœci 0 odpowiada wartoœci ymax, a maksymalnej wspó³rzêdnej l tego obszaruodpowiada wartoœæ ymin.

DEL-7(47 z 59)

Rysowanie wykresów funkcjiKonstrukcja programu rysowania wykresów funkcji

Po uruchomieniu programu, ale jeszcze przedwczytaniem funkcji , których wykresy bêd¹ rysowane,czêœæ robocza okienka powinna zawieraæ osie uk³aduwspó³rzêdnych.

Narysowanie tych osi wymaga okreœlenia pewnychw³asnoœci pióra, które mo¿na opisaæ w metodzieobs³ugi zdarzenia OnActivate dotycz¹cego formatki:

DEL-7(48 z 59)

Rysowanie wykresów funkcjiKonstrukcja programu rysowania wykresów funkcji

procedure TForm1.FormActivate (Sender : TObject);begin with Canvas.Pen do begin Style:=psSolid; Width:=1; Mode:=pmCopy; Color:=clBlue end; f:=nil; a:=nil; b:=nil; kolor:=nil; grubosc:=nil; ...end;

Zmienne f, a, b, kolor i grubosc s¹ tablicamidynamicznymi s³u¿¹cymi do przechowywaniainformacji o funkcjach, koñcach przedzia³ówokreœlonoœci ka¿dej funkcji oraz kolorach i gruboœci linii u¿ytych do narysowania ichwykresów.

Zmienne te powinny byæ zadeklarowane jakoglobalne w czêœci implementacyjnej modu³uzwi¹zanego z formatk¹:

type funkcja = function (const x : Extended) : Extended;var f : array of funkcja;

a, b : array of Extended; kolor, grubosc : array of Integer;

DEL-7(49 z 59)

Rysowanie wykresów funkcjiKonstrukcja programu rysowania wykresów funkcji

Uk³ad wspó³rzêdnych rysujemy za pomoc¹ metody obs³ugi zdarzenia OnPaintzwi¹zanego z formatk¹ (zaprogramowanie narysowania tego uk³adu w meto-dzie obs³ugi innego zdarzenia, np. OnActivate lub OnCreate, nie jest popraw-ne, gdy¿ zostanie on wymazany i pokryty przez nastêpne zdarzenie OnPaint):

procedure TForm1.FormPaint (Sender : TObject);begin with Canvas do begin MoveTo (50, 10); LineTo (50, ClientHeight!20); MoveTo (45, 15); LineTo (50, 10); LineTo (55, 15); MoveTo (40, 20); LineTo (50, 20); MoveTo (40, (ClientHeight!10) div 2); LineTo (50, (ClientHeight!10) div 2); TextOut (60, 5, ’y’); MoveTo (40, ClientHeight!30); LineTo (ClientWidth!10, ClientHeight!30);

DEL-7(50 z 59)

Rysowanie wykresów funkcjiKonstrukcja programu rysowania wykresów funkcji

MoveTo (ClientWidth!15, ClientHeight!35); LineTo (ClientWidth!10, ClientHeight!30); LineTo (ClientWidth!15, ClientHeight!25); MoveTo ((ClientWidth+30) div 2, ClientHeight!30); LineTo ((ClientWidth+30) div 2, ClientHeight!20); MoveTo (ClientWidth!20, ClientHeight!30); LineTo (ClientWidth!20, ClientHeight!20); TextOut (ClientWidth!15, ClientHeight!55, ’x’) endend;

U¿ycie w³asnoœci ClientWidth i ClientHeight w wywo³aniach metodMoveTo, LineTo i TextOut zapewnia narysowanie uk³adu wspó³rzêdnychwzglêdem aktualnych rozmiarów okienka.

DEL-7(51 z 59)

Rysowanie wykresów funkcjiKonstrukcja programu rysowania wykresów funkcji

Aby uk³ad wspó³rzêdnych i wykresy funkcji (!) by³y narysowane poprawnie poka¿dej zmianie rozmiarów okienka, powinniœmy napisaæ metodê obs³ugizdarzenia OnResize:

procedure TForm1.FormResize (Sender : TObject);var prostokat : TRect;begin if Width<350 then Width:=350; if Height<250 then Height:=250; with prostokat do begin Left:=0; Top:=0; Right:=ClientWidth ; Bottom :=ClientHeight end; Canvas.FillRect (prostokat); FormPaint (Sender); if f<>nil then Rysuj (Sender)end;

Instrukcje warunkoweuniemo¿liwiaj¹ zbytniezmniejszenie okienka, przez couk³ad wspó³rzêdnych i wykresys¹ zawsze rysowanepoprawnie.Wyczyszczenies tarejzawartoœci okienka odbywa siêprzez wype³nienie jego ca³egoobszaru roboczego przy u¿yciudomyœlnego pêdzla o domyœlnym kolorze.

DEL-7(52 z 59)

Rysowanie wykresów funkcjiKonstrukcja programu rysowania wykresów funkcji

Rysowanie wykresów funkcji programuje siê zwykle w postaci metodyprywatnej (nazwiemy j¹ Rysuj). Do okreœlenia funkcji, przedzia³ów [aj, bj] orazkolorów i gruboœci linii dla poszczególnych wykresów w metodzie tej u¿ytonielokalnych zmiennych f, a, b, kolor i grubosc, które opisano bli¿ej.

Szkielet metody:procedure TForm1.Rysuj (Sender : TObject);var i, j, kj, n, xp, yp : Integer; amin, krokx, kroky, ymax : Extended;begin ... for j:=0 to n do begin with Canvas.Pen do begin Width:=grubosc[j]; Color:=kolor[j] end;

ustalenie wartoœci amin, ymax, krokx, kroky– zob. wzory

ustalenie gruboœci linii i koloru (j+1)-szego wykresu DEL-7(53 z 59)

Rysowanie wykresów funkcjiKonstrukcja programu rysowania wykresów funkcji

kj:=Floor((b[j]!a[j])/krokx); for i:=0 to kj do begin xp:=50+i+Floor((a[j]!amin)/krokx); yp:=20+Floor((ymax!y[j,i])/kroky); with Canvas do if i=0 then MoveTo (xp, yp) else LineTo (xp, yp) end; Canvas.TextOut (xp+5, yp!10, IntToStr(j+1)); end; ...end;

rysowanie (j+1)-szego wykresu

oznaczenie (j+1)-szego wykresuDEL-7(54 z 59)

Rysowanie wykresów funkcjiKonstrukcja programu rysowania wykresów funkcji

Nastêpne etapy konstrukcji programu:

# oprogramowanie dynamicznegowczytania biblioteki DLL (zapomoc¹ komponentuOpenDialog) i dynamicznegoimportowania funkcji (jednej lubkilku) z tej biblioteki (mo¿nautworzyæ oddzielne okienkos³u¿¹ce tak¿e do okreœlaniaprzedzia³ów [aj, bj]; powinno tuwyst¹piæ przydzielenie pamiêcitablicom dynamicznym), DEL-7(55 z 59)

Rysowanie wykresów funkcjiKonstrukcja programu rysowania wykresów funkcji

Nastêpne etapy konstrukcji programu:

# oprogramowanie zwalniania pamiêci przydzielonejbibliotece DLL i tablicom dynamicznym, np. zapomoc¹ metody obs³ugi zdarzenia OnClose,procedure TForm1.FormClose (Sender : TObject);begin if identDLL<>0 then FreeLibrary (identDLL); Finalize (f); Finalize (a); Finalize (b); Finalize (grubosc); Finalize (kolor); Closeend;

DEL-7(56 z 59)

Rysowanie wykresów funkcjiKonstrukcja programu rysowania wykresów funkcji

Nastêpne etapy konstrukcji programu:

# oprogramowanie zmiany kolorów wykresów, np. zapomoc¹ komponentu ColorDialog i w³asnego okienkado okreœlania numerów wykresów,

# oprogramowanie okreœlania gruboœci linii, np. zapomoc¹ w³asnego okienka z komponentamiRadioButton.

DEL-7(57 z 59)

Rysowanie wykresów funkcjiKonstrukcja programu rysowania wykresów funkcji

DEL-7(58 z 59)

... i po prezentacji

... alepo

wyk³adzietak¿e !!!

DEL-7(59 z 59)