Aplikacje w DELPHI (cd..) GRAFIKA, DATA, OKNA DIALOGOWE, MODUŁ dr inż. Paweł Mazurek 1
Grafika w Delphi komponent Shape Komponent Shape (na zakładce Additional Palety Komponentów) umożliwia dodawanie do formularza figur geometrycznych o różnych kształtach. Jego użycie jest proste, wystarczy umieścić go w formularzu i ustawić według własnych potrzeb właściwości pędzla (Brush), pióra (Pen) i kształtu (Shape). Teraz można przystąpić do rysowania okręgów, elips, kwadratów i prostokątów (również z zaokrąglonymi narożnikami). Właściwość Brush wpływa na kolor tła, właściwość Pen zmienia kolor i grubość krawędzi figur. 2
Grafika w Delphi komponent Shape 3
Grafika w Delphi komponent Shape uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; procedure TForm1.ComboBox1Change(Sender: TObject); begin Case Combobox1.ItemIndex of 0:Shape1.Shape:=stCircle; 1:Shape1.Shape:=stSquare; 2:Shape1.Shape:=stRoundSquare; end; end; procedure TForm1.ScrollBar1Change(Sender: TObject); begin Shape1.Width:= Scrollbar1.Position; Shape1.Height:= Scrollbar1.Position; end; 4
Grafika w Delphi obiekt TCanvas Niektóre komponenty posiadają właściwość typu obiektowego TCanvas (płótno). Są to m.in.: TForm, TImage, TPaintBox, TBitmap, TComboBox, TStringGrid, TlistBox, TPrinter. Właściwość Canvas zawiera metody, które pozwalają na rysowanie na tych komponentach za pomocą linii różnych figur, kolorowanie powierzchni oraz wyświetlanie tekstu. Możliwa jest również zmiana koloru i grubości linii, koloru i wzoru wypełnienia, atrybutów czcionki itd. Rysowanie za pomocą metod obiektu Canvas różnych obiektów może być przydatne do zmiany cech niektórych komponentów, np. TStringGrid czy TCTart, a także przy drukowaniu formularza i tekstu. 5
Grafika w Delphi obiekt TCanvas Wybrane właściwości obiektu Tcanvas: Brush określa wzór lub kolor wypełnienia figur (pędzel); Font krój czcionki dla wyświetlanych napisów; Pen opisuje cechy kreślonych linii: grubość, styl, kolor -pióro PenPos określa współrzędne kursora graficznego. Podstawowymi parametrami większości procedur i funkcji graficznych są współrzędne punktu na komponencie, po którym rysujemy. Lewy górny róg ma współrzędne (0, 0), a prawy dolny najczęściej (Width, Height). 6
Grafika w Delphi obiekt TCanvas Wyświetlanie prostych figur geometrycznych i tekstu Proste figury i tekst możemy wyświetlić na formularzu, korzystając z procedur i funkcji obiektu typu Tcanvas. Kolor:=Canvas.Pixels[x,y] Za pomocą funkcji Pixels można odczytać kolor piksela w miejscu o współrzędnych (x, y) zmienna Kolor jest typu Tcolor. Canvas.Pixels[10,20]:=clRed Ta sama funkcja wywołana w ten sposób powoduje wyświetlenie na formularzu czerwonego punktu w miejscu o współrzędnych [10, 20]. MoveTo(x,y: integer) Przenosi kursor graficzny do punktu o współrzędnych x, y. 7
Grafika w Delphi obiekt TCanvas LineTo(x,y:integer) Rysuje linię od bieżącej pozycji kursora graficznego do punktu o współrzędnych x, y. Rectangle(x1, y1, x2, y2: Integer) Procedura rysuje prostokąt wypełniony standardowym kolorem pędzla (Canvas.Brush.Color). Ellipse(x1, y1, x2, y2: Integer) Procedura rysuje elipsę (lub koło) parametrami są współrzędne dwóch przeciwległych wierzchołków prostokąta (kwadratu), w który elipsa jest wpisana. Polyline(Points: array of TPoint) Procedura rysuje linię łamaną lub wielokąt. Parametrami są współrzędne punktów, które zostaną połączone linią. Jeśli współrzędne punktu pierwszego i ostatniego są takie same, to rysowany jest wielokąt; w przeciwnym razie linia łamana. np. procedura: Polyline([Point(40, 10), Point(20, 60), Point(70, 30),Point(10, 30), Point(60, 60), Point(40, 10)]) narysuje gwiazdę pięcioramienną. 8
9
Rectangle(X1, Y1, X2, Y2: Integer) lub Rectangle(R: TRect) kreśli prostokąt, przykład: Canvas.Rectangle(50, 50, 150, 100); FillRect(R: TRect) prostokąt bez konturu, przykład: Canvas.FillRect(Rect(0,0,100,100)); FrameRect(R: TRect) kontur prostokąta, przykład: Canvas.FrameRect(Rect(0,0,100,100)); RoundRect(X1, Y1, X2, Y2, X3, Y3: Integer) kreśli prostokąt z zaokrąglonymi rogami: Canvas.RoundRect(50,50,150,100,30,30); Ellipse(X1, Y1, X2, Y2: Integer) lub Elipse(R: Trect) kreśli elipsę, przykład: Canvas.Ellipse(50, 50, 150, 100); Arc(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer) kreśli łuk na bazie elipsy, przykład: Canvas.Arc(0,0,200,100,200,0,0,50); Chord(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer) kreśli część elipsy ograniczoną cięciwą,np: Canvas.Chord(0,0,200,100,200,0,0,50); Pie(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer) kreśli wycinek elipsy, przykład: Canvas.Pie(0,0,200,100,200,0,0,50); TextOut(X, Y: Integer; Tekst: string) kreśli łańcuch tekstowy w określonych współrzędnych: Canvas.TextOut(50, 30, 'Łańcuch tekstowy jako grafika.'); TextRect(Prostokat: TRect; X, Y: Integer; Tekst: string) kreśli łańcuch tekstowy ograniczony obszarem prostokątnym, przykład: Prostokat:=Rect(20,20,100,80); 10 Canvas.TextRect(Prostokat,30,40,'Łańcuch tekstowy.');
Grafika w Delphi obiekt TCanvas Polygon(Points: array of TPoint) Procedura umożliwia narysowanie wielokąta wypełnionego bieżącym kolorem i stylem pędzla. Przykład: Canvas.Brush.Color = clred; Canvas.Polygon([Point(10,10), Point(30,10), Point(130,30), Point(240,120)]); narysowanie czworokąta wypełnionego kolorem czerwonym. Współrzędne punktu pierwszego i ostatniego nie muszą się pokrywać, ponieważ procedura i tak łączy na końcu punkt ostatni z punktem pierwszym. Refresh Odświeżanie formularza procedura kasuje wszystkie obiekty rysowane za pomocą metod obiektu Canvas i nieumieszczone w procedurze obsługi zdarzenia OnPaint. Draw(x, y:integer; Graphic:TGraphic) Rysuje obraz określony parametrem Graphic w miejscu o współrzędnych x i y. Arc(x1,y1, x2,y2, x3,y3, x4,y4: integer) Rysuje krzywą eliptyczną w prostokącie o współrzędnych (x1, y1; x2, y2), od punktu o współrz. (x3, y3) do punktu (x4, y4). 11
Grafika w Delphi obiekt TCanvas TextOut(x,y:integer; const Text:string) Wyświetla tekst od punktu o współrzędnych x, y lewy górny róg prostokąta zawierającego tekst; Text to parametr w postaci tekstu stałego w apostrofach, np. 'Ala ma kota', lub zmienna zawierająca łańcuch znaków, np. a:='ala ma kota' (const w nagłówku procedury oznacza podobne wywołanie jak w przypadku wartości, lecz umożliwia bardziej efektywne wykorzystanie pamięci). CopyRect(const Dest: TRect; Canvas: TCanvas; Source:TRect) Kopiuje część obrazu z jednego płótna na inne płótno. const FillRect(const Rect: Trect) Rysowanie prostokąta wypełnionego bieżącym kolorem i wzorem. FloodFill(X, Y: Integer; Color: TColor; FillStyle: TFillStyle) Wypełnianie tzw. powodziowe obiektów. FrameRect(const Rect: Trect) Rysowanie obwodu prostokąta. 12
Grafika w Delphi obiekt TCanvas Pie(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer); Rysowanie wycinka koła. RoundRect(X1, Y1, X2, Y2, X3, Y3: Integer) Rysowanie prostokąta z zaokrąglonymi narożnikami. StretchDraw(const Rect: TRect; Graphic: TGraphic) Dopasowanie rysunku do obszaru danego prostokąta. TextHeight(const Text: string):integer Funkcja zwraca wysokość tekstu w pikselach. TextOut(X, Y: Integer; const Text: string) Procedura wyświetla napis na komponencie posiadającym właściwość TCanvas. TextRect(Rect: TRect; X, Y:Integer; const Text: string) Procedura wyświetla napis w prostokącie, którego współrzędne są podane w postaci typu TRect (pierwszy parametr). Procedurę wykorzystywano przy formatowaniu komórek tabeli. TextTidth(const Text: string):integer Funkcja zwraca szerokość tekstu w pikselach. 13
Grafika w Delphi Pióro definiuje obiekt, którego przeznaczeniem jest rysowanie linii. Może to być prosta linia rysowana od jednego punktu do drugiego lub krawędź rysowana wokół prostokątów, elips i wielokątów. Dostęp do pióra, będącego obiektem klasy TPen, następuje poprzez właściwość Pen klasy TCanvas. Color - Ustala kolor linii. Handle - Zawiera kontekst urządzenia pióra (HDC). Stosowany podczas bezpośrednich odwołań do GDI. Mode - Określa sposób w jaki linia będzie rysowana w kontekście bieżącej zawartości obszaru (normalny, inwersyjny, xor, itd.). Style - Określa styl pióra. Może to być styl ciągły, kropkowy, kreskowy, kropkowo-kreskowy, czysty lub inny. Width - Zawiera grubość linii w pikselach. 14
Grafika w Delphi obiekt TCanvas Wyświetlenie na formularzu linii rysowanych różnymi stylami procedure TForm1.Button1Click(Seender: TObject); var x,y:integer; begin x := 210; y := y+10;//y - zmienna globalna Canvas.MoveTo(x,y); x := Random(ClientWidth - 10); y := Random(ClientHeight - 10); Canvas.Pen.Color := RGB(Random(256),Random(256),Random(256)); case Random(5) of 0: Canvas.Pen.Style := GsSolid; 1: Canvas.Pen.Style := GsDash; 2: Canvas.Pen.Style := GsDot; 3: Canvas.Pen.Style := GsDashDot; 4: Canvas.Pen.Style := GsDashDotDot; end; Canvas.LineTo(x+200, y); end; 15
Grafika w Delphi obiekt TCanvas Wyświetlenie na środku formularza punktu koloru czerwonego, (przy czym nie może w tym miejscu znajdować się inny obiekt (np. przycisk), bo wyświetlony piksel zostanie przez ten obiekt przesłonięty). procedure TForm1.Button1Click(Sender: TObject); begin Canvas.Pixels[ClientWidth div 2, ClientHeight div 2]:=clRed; end; 16
Grafika w Delphi obiekt TCanvas Wyświetlenie końcowych współrzędnych formularza procedure TForm1.Label1Click(Sender: TObject); begin Label1.Caption:=IntToStr(ClientWidth)','+IntToStr(ClientHeight); end; 17
Grafika w Delphi Pędzel jest obiektem służącym do wypełniania wnętrza obszarów wszystkie rysowane elipsy, prostokąty, wielokąty itp. zostaną wypełnione zgodnie z bieżącymi ustawieniami pędzla. Ustawienia te nie ograniczają się tylko do koloru (jak można by mniemać na podstawie potocznego znaczenia słowa pędzel ) lecz obejmują również wzór ( deseń ) wypełnienia, bądź to w jednej z predefiniowanych postaci, bądź też w postaci określonej przez wskazaną bitmapę. W ramach klasy TCanvas pędzel reprezentowany jest przez właściwość Brush klasy TBrush. 18
Grafika w Delphi Bitmap Bitmapa określająca wzór wypełnienia. W przypadku Windows 95 bitmapa ta nie może przekroczyć rozmiaru 8 8 pikseli. Color Kolor wypełnienia. Handle Kontekst urządzenia (HDC) pędzla. Stosowany przy bezpośrednich odwołaniach do GDI. Style Styl pędzla (jednolity, wymazujący (clear) lub jeden z predefiniowanym wzorów). 19
Grafika w Delphi obiekt TCanvas Wyświetlenie na formularzu trzech różnych prostokątów ramkę, prostokąt wypełniony kolorem BrusT.Color, prostokąt z zaokrąglonymi brzegami. procedure TForm1.Button3Click(Sender: TObject); var prost: TRect; begin prost:= Rect(200,10,300,100); Canvas.Brush.Color := clblack; Canvas.FrameRect(prost); Canvas.Brush.Color := clgreen; Canvas.Rectangle(200,120,300,210); Canvas.RoundRect(200,230,300,320,20,20); end; 20
Grafika w Delphi obiekt TCanvas Narysowanie na formularzu trójkąta o zielonym obwodzie i żółtym wypełnieniu. procedure TForm1.Button1Click(Sender: TObject); begin Canvas.Brush.Color:=clYellow; Canvas.Pen.Color:=clGreen; Canvas.Polygon([Point(20,20),Point(200,20),Point(110,100)]); end; 21
Grafika w Delphi obiekt TCanvas Przy wypełnianiu domyślną wartością właściwości Style jest bssolid, co oznacza styl jednolity. Wypełnianie obszarów wzorem wymaga nadania właściwości Style odpowiedniej wartości (bshorizontal, bsvertical, bsfdiagonal, bsbdiagonal, bscross, bsdiagcross). Poniższy przykład rysuje koło wypełnione wzorem w kratę obróconą o 45 stopni. Canvas.Brush.Color:= clblue; Canvas.Brush.Style:= bsdiagcross; Canvas.Ellipse(20,20,220,220); 22
Grafika w Delphi obiekt TCanvas Kolejną interesującą cechą pędzli jest opcja tła w postaci bitmapy. Najpierw przyjrzyj się poniższemu fragmentowi kodu: Canvas.Brush.Bitmap:=TBitmap.Create; Canvas.Brush.Bitmap.LoadFromFile('tlo.bmp'); Canvas.Ellipse(20, 20, 220, 220); Canvas.Brush.Bitmap.Free; Pierwsza linia kodu tworzy obiekt klasy TBitmap i przypisuje go do właściwości Bitmap pędzla. W drugiej linii następuje załadowanie bitmapy z pliku. Trzecia linia rysuje elipsę. Po jej narysowaniu bitmapa jest zwalniana jest to niezbędne, ponieważ czynność ta nie jest wykonywana przez bibliotekę VCL. Zaniedbanie tej operacji spowoduje zagubienie fragmentu pamięci w programie. 23
Grafika w Delphi Czcionki stosowane przez klasę TCanvas nie różnią się niczym od czcionek stosowanych w formularzach czy innych komponentach. Właściwość Font klasy TCanvas jest identyczna jak właściwość o tej nazwie należąca do dowolnego komponentu. Canvas.Font.Name:= 'Courier New'; Canvas.Font.Size:= 14; Canvas.Font.Style:= Canvas.Font.Style+ [fsbold]; Canvas.TextOut(20, 20, 'Test'); 24
Grafika w Delphi zdarzenie OnPaint Instrukcje zawierające metody obiektu Canvas można umieszczać w procedurach obsługi zdarzenia OnClick dla przycisków, dla formularza i innych komponentów. Można również korzystać z innych zdarzeń komponentów. Jednak tylko niektóre z nich umożliwiają tzw. trwałe rysowanie, czyli rysowanie odnawiane po każdej zmianie, np. po zmianie rozmiaru okna i przykryciu w ten sposób części obiektów graficznych. Dla okna formularza korzysta się w tym celu ze zdarzenia OnPaint. Dla innych komponentów podobne zdarzenia mają inne nazwy. 25
Grafika w Delphi zdarzenie OnPaint OnPaint Zdarzenie dla formularza generowane każdorazowo, gdy zawartość okna formularza wymaga odświeżenia. Sytuacja taka ma miejsce przy tworzeniu okna formularza, a także wtedy, gdy np. jedno okno zostanie przesłonięte innym oknem lub gdy następuje zmiana jego rozmiaru. PaintBoxPaint Odpowiednik zdarzenia OnPaint dla komponentu PaintBox. OnDrawCell Zdarzenie występujące dla komponentu typu TDrawGrid i TStringGrid umożliwia trwałe rysowanie obiektów i wyświetlanie tekstu w komórkach. OnAfterDraw Zdarzenie dla komponentu typu TChart, odpowiednik zdarzenia OnPaint. 26
Grafika w Delphi zdarzenie OnPaint Napisanie na formularzu tekstu Font (czcionka) krój czcionki do kreślenia tekstu: Charset zestaw znaków, Color kolor, Height wysokość w pikselach, Name nazwa, Pitch szerokość znaków (fpdefault, fpfixed, fpvariable), Size wielkość w punktach, Style styl (fsbold, fsitalic, fsunderline, fsstrikeout). 27
Edytor graficzny 28
Edytor graficzny Edytor Graficzny Delphi umożliwia tworzenie i edytowanie bitmap (.bmp), ikon (.ico) i kursorów (.cur). Oprócz tego można również tworzyć projekty zasobów, składające się z wielu bitmap, ikon i kursorów przechowywanych w pojedynczym pliku (.res). Plik taki może być następnie dodany do projektu Delphi, umożliwiając wykorzystanie zapisanych w nim zasobów. Edytor Graficzny umożliwia tworzenie rysunków dwu- i czterokolorowych, a w przypadku plików bitmap również 256kolorowych. Podczas rysowania można wybrać dowolny kolor spośród dostępnych. 29
Kolor przezroczysty i odwrócony W przypadku ikon i kursorów możliwe jest zastosowanie koloru przezroczystego (ang. transparent słowo kolor jest tu pojęciem umownym). Narysowanie piksela w kolorze przezroczystym równoważne jest z brakiem jego narysowania dzięki temu możliwe jest prześwitywanie spod ikony (lub kursora) fragmentów tła, na którym aktualnie się ona (on) znajduje. Niemal każda ikona i każdy kursor korzysta z koloru przezroczystego. Innym przykładem koloru umownego jest kolor odwrócony (ang. inverted) narysowanie w danym miejscu piksela w kolorze odwróconym jest równoważne odwróceniu (do koloru dopełniającego) piksela aktualnie znajdującego się w tym miejscu. 30
Komponent Image Do wyświetlenia bitmapy w formularzu służy komponent Image. Właściwość Picture klasy TImage jest obiektem klasy TPicture. Wyboru obrazu można dokonać na etapie projektowania poprzez Inspektor Obiektów lub poprzez ładowanie w trakcie pracy programu. Komponent PaintBox. Udostępnia on prostokątny obszar w postaci tzw. płótna (canvas), stanowiącego arenę wszelkich operacji graficznych. Płótno to reprezentowane jest przez jego właściwość Canvas, będącą obiektem klasy TCanvas; klasa ta odpowiedzialna jest za większość operacji graficznych wykonywanych przez Delphi. 31
Komponent Image Komponent Image służy do wyświetlania bitmap, metaplików i ikon. Sam komponent jest niewidoczny. Zmiana rozmiaru obrazu Obrazy wstawiane do komponentu są często zbyt małe lub zbyt duże w stosunku do komponentu. Można dopasować komponent do obrazu lub oraz do komponentu jedną z następujących metod: Użyj Image editor, aby zmienić rozmiary obrazka przed jego umieszczeniem. Dopasuj rozmiar grafiki do rozmiaru komponentu ustawiając właściwość Stretch komponentu Image na True. Zmień wielkość komponentu, aby dopasować go do grafiki ustawiając właściwość AutoSize na True zanim zostanie wstawiona grafika. Aby wyśrodkować rysunek w komponencie, ustaw właściwość Center na True. Aby przesunąć komponent na wierzch lub pod spód wybierz Edit Bring to Front lub Edit Send to Back. Wstawianie rysunku w kodzie programu metoda LoadFromFile - Image1.Picture.LoadFromFile( Rysunki/obrazek1.bmp ); 32
33
34
Komponent Rysunek (PaintBox) Komponent PaintBox zapewnia przestrzeń do ręcznego rysowania dowolnej grafiki (metodami klasy TCanvas). Wybrane właściwości: Canvas płótno do kreślenia obiektów graficznych. Wybrane zdarzenia: OnPaint zdarzenie zachodzi gdy zawartość komponentu wymaga przerysowania. 35
Proste operacje graficzne Wypisywanie tekstu Wypisywanie tekstu nie wydaje się być operacją trudną czy jest tak w rzeczywistości? Metody TextOut i TextRect Metoda TextOut jest najprostszym środkiem służącym wypisywaniu tekstu; tak naprawdę niewiele można powiedzieć na jej temat. Wystarczy przekazać jej współrzędne X i Y oraz tekst do wyświetlenia Canvas.TextOut(20,20, 'Joshua Reisdorph'); i gotowe powyższa instrukcja powoduje wyświetlenie napisu... 36
Proste operacje graficzne Metoda TextRect, również wypisująca podany tekst w podanym położeniu, umożliwia ponadto określenie prostokątnego obszaru ograniczającego każdy fragment tekstu, który wysunie się poza tę granicę, zostanie obcięty. Poniższy fragment kodu daje pewność, iż wyświetlonych zostanie nie więcej niż 100 pikseli tekstu: Canvas.TextRect( Rect(20,50,120,70), 20,50, 'To jest bardzo długi tekst, który może zostać obcięty,'); Obydwie metody TextOut i TextRect mogą wyświetlać jedynie pojedyncze linie tekstu. Nie są wykonywane żadne funkcje formatujące tekst. 37
Proste operacje graficzne Funkcja DrawText Funkcja biblioteki API Windows DrawText daje znacznie większe możliwości rysowania tekstu niż metoda TextOut. Klasa TCanvas nie posiada metody obudowującej tę funkcję, dlatego konieczne jest odwołanie się do nie w sposób bezpośredni. var R: TRect; begin R:=Rect(20,20,220,80); Canvas.Rectangle(20,20,220,80); DrawText(Canvas.Handle, 'Przykład użycia funkcji DrawText.', -1, R,DT_SINGLELINE or DT_VCENTER or DT_CENTER); end; 38
Rysowanie myszką Program ten pokazuje, jak rysować myszką po płótnie formatki. W programie można zmienić rozmiar pędzla, jego kolor oraz wyczyścić obraz. ComboBox. W pozycji Items definiujemy kilka liczb które będą rozmiarami pędzla. W pozycji Text wpisujemy przykładowo napis Rozmiar pędzla. Button W pozycjach Caption wprowadzić napisy (kolor, gumka, odświeżenie, zamknij). ColorDialog. Okno wyboru koloru. 39
W programie wykorzystujemy zdarzenia onmousedown, onmousemove i onmouseup zachodzące odpowiednio podczas: wciśnięcia lewego przycisku myszy, przesuwania z wciśniętym lewym przyciskiem i podczas puszczania lewego klawisza myszy, kiedy znajdujemy się nad danym komponentem. W tym przypadku będzie to formatka. W sekcji Implementation zadeklarujemy zmienną typu Boolean, której zadaniem będzie wykrycie faktu naciśnięcia i puszczenia lewego przycisku myszki. Opcja Gumki polega na rysowaniu kolorem domyślnym formy. 40
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, ToolWin, Buttons; type TForm1 = class(tform) Button1: Tbutton; ColorDialog1: TColorDialog; Button2: TButton; ComboBox1: TComboBox; Button3: TButton; Button4: TButton; procedure Button1Click(Sender: TObject); procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Button2Click(Sender: TObject); procedure ComboBox1Change(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); private { Private declarations } public { Public declarations } end; 41
var Form1: Tform1; implementation {$R *.dfm} Var rysuj:boolean; <- zmienna śledząca lewy przycisk procedure TForm1.Button1Click(Sender: TObject); begin Close; end; procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Canvas.MoveTo(x,y); rysuj:=true; end; (* W czasie wciskania lewego przycisku ustawiamy się w punkcie o współrzędnych X, Y, czy tam, gdzie klikniemy. *) procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); Begin if rysuj then Canvas.LineTo(x,y); End; (* jeśli zmienna rysuj ma wartość True to przesuń się do punktu X,Y, czyli tam gdzie, przesuwasz wskaźnik myszy *) 42
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin rysuj:=false; End; (*Jak puścimy lewy przycisk, przypisz zmiennej rysuj wartość False. *) procedure TForm1.Button2Click(Sender: TObject); begin if ColorDialog1.Execute Then Canvas.Pen.Color:=ColorDialog1.Color; End; (* Nadaj pędzlowi kolor wybrany w oknie ColorDialog1. *) procedure TForm1.ComboBox1Change(Sender: Tobject); begin Canvas.Pen.Width:=ComboBox1.ItemIndex; End; (* Szerokość (Width) pędzla równa się liczbie z ComboBox1. *) procedure TForm1.Button3Click(Sender: TObject); begin Repaint; End; (* odśwież, wyczyść *) procedure TForm1.Button4Click(Sender: TObject); begin Canvas.Pen.Color:=clBtnFace; end; End. (* Do pędzla (tutaj: Gumki) przypisz kolor formy. *) 43
Data i czas 44
Data i czas Data i czas są reprezentowane w komputerze za pomocą typu TdateTime. Zmienne typu <,>,<=,>=,=,<> daty porównujemy stosując operatory: Trunc liczba dni która dzieli dwie daty (część całkowita) Funkcje związane z datą (moduł SysUtils): function Date: TDateTime; - zwraca aktualna datę function DateToStr (Date:TDateTime):String; - zamienia datę na łańcuch function StrToDate (cons S:String):TDateTime; - zamienia datę [podaną w postaci łańcuch na typ TdateTime. Format daty: m/d/y lub y/m/d function DayOfWeek(Data: TDateTime): Integer zwraca numer dnia tygodnia. 45
Data i czas function DateTimeToString (var Wynik: String; const Format: String; Data:TDateTime); - procedura zwraca w parametrze Wynik datę podaną parametrami Data według formatu Format: d - wyświetla dzień jako liczbę dddd - wyswietal nazwę dnia tygodnia mmmm - wyświetla pełna nazwę miesiąca yyyy - wyświetla rok jako liczbę czterocyfrową. przykład DateTimeToString(wynik, 'dddd,d mmm d yyy r.',date); Label1.Caption:=wynik; 46
Data i czas Time - procedura zwraca bieżący czas systemowy Now zwraca datę I czas DecodeDate (data, rok,miesiąc,dzień) dzieli datę na rok... DecodeTime (czas, g,m,s,ms) dzieli czas EncodeDate(r,m,d) przekształca datę wyrażony w postaci roku... do postaci TdateTime EncodeTime(g,m,s,ms) przekształca czas wyrażony w postaci godzin... do postaci TdateTime 47
Data i czas Komponent DateTimePicker pozwala na wproadzeniedaty przez wybór kalendarza. Właściwości: DateFormat - format daty: dfshort, dflong Date - data ustawiana jako domyślna w oknie, standardowo - bieżąca MinDate - minimalna data możliwa do wyboru z kalendarza MaxDate - maksymalna data możliwa do wyboru z kalendarza Komponent UpDown to strzałki do przesuwania wartości skali z określonym krokiem. Właściwości: Associate, Min, Max, Position 48
Data i czas Aplikacja obliczająca ile dni dzieli datę od daty zadeklarowanej type TForm1 = class(tform) Label1: TLabel; DateTimePicker1: TDateTimePicker; procedure DateTimePicker1Change(Sender: TObject);... procedure TForm1.DateTimePicker1Change(Sender: TObject); var ile:real; begin ile:=datetimepicker1.date-date; Label1.Caption:='Liczba dni: '+IntToStr(Trunc(ile)); end; 49
Data i czas Odebranie z komponentu DateTimePicker wybranej przez użytkownika daty i wyświetlenie jej na etykiecie. 50
Data i czas Komponent TTimer umożliwia wykonanie jakiegoś działania z określonm opóźnieniem lub wykonac jakieś działanie cyklicznie w określonych odstępach czasu. 51
Okna dialogowe 52
Okienka Dialogowe Obsługę standardowych dialogów charakterystycznych dla środowiska Windows, takich jak wybór nazwy pliku do odczytu lub zapisu, określenie atrybutów czcionki, wydruku... umożliwiają komponenty zakładki DIALOGS. Komponenty niewizualne okna pojawiają się podczas wykonywania funkcji execute : true/false 53
Okienka dialogowe TopenDialog służy do wyświetlania okna Otwarcie pliku 54
Okienka dialogowe dla okna ustawiony filtr na wyświetlane pliki przez wykorzystanie właściwości Filter. 55
Okienka dialogowe 56
Właściwości komponentu TOpenDialogs Title Określa tytuł okna, domyślnie Wybierz nazwę pliku. InitialDir Określa folder, którego zawartość wyswietlana jest bezpośrednio po wywołaniu procedury. FileName Właściwość zawiera nazwę wybranego pliku wraz ze ścieżką. DefaultExt Określa domyślne rozszerzenie dla pliku 57
Komponenty Dialogs TSaveDialog umożliwia wyswietlenie okna wyboru nazwy pliku do zapisu. Ustawienie Options ofoverwriteprompt na true zapobiega nadpisywaniu. TOpenPictureDialog umożliwia wyswietlenie okna do wyboru nazwy pliku z ustawionym filtrem na pliki graficzne jest bezpośrednio po wywołaniu procedury. TSavePictureDialog -------//--------TFontDialog realizuje standardowy dialog określania rodzajów i atrybutów czcionki TColorDialog wyświetlenie okna do wyboru koloru 58
Komponenty Dialogs TPrintDialog wyswietlenie okna definiującego parametry wydruku poprzez określenie wartości: ProntRange Copies PrintToFile Options TPrinterSetupDialog skonfigurowanie drukarki (rozmiar strony, orientacja, właściwości wydruku..) TFindDialog wyświetlenie wyszukania tekstu okna TFontDialog okno dilaogowe wyszukanie i zamianę tekstu dialogowego które do umożliwia 59
60
MODUŁY 61
Moduły System StrUtils Types Dialogs Windows SysUtils DateUtils Classes Variants Math Moduł (ang. unit) jest plikiem tekstowym zawierającym polecenia przetwarzane przez kompilator. Inaczej mówiąc, jest to fragment kodu źródłowego. 62
Moduły Zastosowanie modułów pozwala na podział kodu na osobne pliki. Każdemu formularzowi odpowiada jeden moduł, ale z kolei moduł nie musi być zawsze formularzem. Jakie są zalety programowania strukturalnego (modularnego)? Otóż programista ma możliwość umieszczenia części kodu (np. paru procedur) w osobnych modułach. Wyobraźmy sobie, że tworzymy dość spory program i cały kod źródłowy jest zawarty w jednym pliku, podzielony na procedury. W takim pliku trudno się będzie później odnaleźć? przede wszystkim ze względu na jego długość. Koncepcja programowania modularnego polega na podzieleniu takiego programu na kilka plików i włączaniu ich po kolei do głównego pliku źródłowego. Dzięki temu możemy w jednym pliku, np. interfaces.pas, zawrzeć jedynie procedury związane z tworzeniem interfejsu użytkownika, a z kolei w pliku db.pas umieścić procedury związane z obsługą bazy danych. 63
Budowa modułu Zaraz po utworzeniu nowego modułu Delphi generuje potrzebne instrukcje, które są niezbędnym elementem tego modułu. unit MainUnit; interface implementation end. 64
Opis modułu 65
Opis modułu 66
Opis modułu 67
Opis modułu 68
Opis modułu 69
Opis modułu 70
Opis modułu 71
Opis modułu 72
Moduł Math W języku Object Pascal obliczamy wartości matematycznych przy użyciu operatorów + - * / wyrażeń Kolejność działań taka sama jak w matematyce Można korzystać z większej ilości funkcji modułu Math liczba dostępnych funkcji zależna od pakietu Delphi Nazwę Math należy dopisać do deklaracji uses w części interface lub implementation modułu aplikacji 73
Moduł Math Moduł Math zawiera funkcje i procedury arytmetyczne, trygonometryczne, logarytmiczne i statystyczne, będące uzupełnieniem funkcji zdefiniowanych w module System. Ponadto w module Math znajdują się definicje funkcji przeznaczonych do obliczeń finansowych, które przeniesiono z pakietu Quattro Pro firmy Borland. Część wykonawcza wielu funkcji i procedur modułu Math została zaprogramowana bezpośrednio w asemblerze, z wykorzystaniem instrukcji zmiennopozycyjnych, operujących bezpośrednio na jednostce arytmetyki zmiennopozycyjnej procesora. 74
Moduł Math Funkcje i procedury trygonometryczne ArcCos(x) arcus cosinus x ArcSin(x) arcus sinus x ArcTan2(x, y) arcus tangens ilorazu x przez y Cotan(x) cotangens x SinCos(x, s, c) sinus i cosinus x (oddzielne obliczenie sinusa i cosinusa za pomocą funkcji Sin i Cos modułu System trwa dwa razy dłużej) Tan(x) tangens x Przypomnienie:W module System są zdefiniowane funkcje ArcTan, Cos i Sin. 75
Moduł Math Funkcje i procedury trygonometryczne DegToRad(stopnie) zamiana stopni na radiany RadToDeg(radiany) zamiana radianów na stopnie Przykłady Obliczenie w stopniach przybliżonej wartości funkcji arcsin 0,5: RadToDeg(ArcSin(0.5)) 76
Moduł Math Funkcje hiperboliczne i area funkcje area funkcje funkcje odwrotne względem funkcji hiperbolicznych ArcCosh(x) area cosinus x ArcSinh(x) area sinus x ArcTanh(x) area tangens x Cosh(x) cosinus hiperboliczny x Sinh(x) sinus hiperboliczny x Tanh(x) tangens hiperboliczny x 77
Moduł Math Funkcje logarytmiczne LnXP1(x) logarytm naturalny z x+1 (funkcja zalecana do stosowania dla wartości x bliskich 0) Log10(x) logarytm dziesiętny z x Log2(x) logarytm o podstawie 2 z x LogN(p, x) logarytm o podstawie p z x Przypomnienie:W module System jest zdefiniowana funkcja Ln. 78
Moduł Math Funkcje wykładnicze i potęgowe IntPower (podstawa, wykładnik) argument podstawa podniesiony do potęgi całkowitej określonej przez wykładnik Power (podstawa, wykładnik) podniesienie liczby rzeczywistej do dowolnej potęgi (nie tylko całkowitej) czyli normy euklidesowej wektora w R2 Hypot (x, y) obliczenie wartości wyrażenia 79
Moduł Math Funkcje i procedury do obliczeń statystycznych funkcja Sum (dane) obliczanie sumy elementów (dane argument odpowiadający tablicowemu parametrowi otwartemu o elementach typu Double) funkcja SumOfSquares (dane) obliczenie sumy kwadratów elementów SumsAndSquares (dane, suma, suma-kwadratów) jednoczesne obliczenie sumy i sumy kwadratów elementów 80
Moduł Math Funkcje i procedury do obliczeń statystycznych funkcja PopnVariance (dane) wyznaczenie wariancji, tj. funkcja Mean (dane) obliczenie średniej arytmetycznej pewnej liczby elementów funkcja Norm (dane) obliczenie normy euklidesowej wektora (pierwiastek z sumy kwadratów jego składowych) 81
Moduł Math Funkcje i procedury do obliczeń statystycznych funkcja PopnStdDev (dane) wyznaczenie odchylenia standardowego, tj. pierwiastka kwadratowego z wariancji funkcja StdDev (dane) wyznaczenie pierwiastka kwadratowego z nieobciążonego estymatora wariancji MeanAndStdDev (dane, średnia, odchylenie) jednoczesne wyznaczenie średniej i pierwiastka kwadratowego z nieobciążonego estymatora wariancj 82
Moduł Math Funkcje i procedury do obliczeń statystycznych funkcja RandG (średnia, odchylenie) otrzymywanie liczb losowych o rozkładzie normalnym (Gaussa) funkcja RandomRange (i1, i2) otrzymywanie całkowitych liczb losowych z przedziału [i1, i2) Przypomnienie:Funkcja Random z modułu System generuje rzeczywiste liczby losowe z przedziału [0, 1) lub całkowite z przedziału [0, zakres). 83
Moduł Math Funkcje do wykonywania obliczeń finansowych do obliczania rat i płatności (FutureValue, InterestPayment, InterestRate, NumberOfPeriods, Payment, PeriodPayment, PresentValue), do wykonywania rachunków dyskontowych (InternalRateOfReturn, NetPresentValue), do obliczania amortyzacji (DoubleDecliningBalance, SLNDepreciation, SYDDepreciation) 84
Przykładowe deklaracje function ArcCosh(const X: Extended): Extended; function ArcTan2(Y, X: Extended): Extended; function Cos(const X: Extended): Extended; (Funkcja oblicza cosinus z liczby X. Wartość liczby X podajemy w radianach. Zwracana wartość zawiera się w zakresie [-1,1]) function Int(X: Real) : Real; (Funkcja zwraca część całkowitą z liczby rzeczywistej X. Do pobrania częsci ułamkowej z liczby rzeczywistej służy funkcja Frac.) function MaxValue(const Data: array of Double): Double; Funkcja wybiera, a następnie zwraca element z tablicy Data, posiadający największą wartość. Elementami tablicy mogą być liczby rzeczywiste (Double): function Pi: Extended; (Funkcja Pi zwraca wartość liczby, która wynosi w przybliżeniu 3,1415926535897932384626433832795028841971) function SumOfSquares(const Data: array of Double) : Extended; Funkcja zwraca sumę kwadratów wszystkich wartości tablicy Data. 85