Aplikacje w DELPHI (cd..)

OBSŁUGA MULTIMEDIÓW

Dr inż. Paweł Mazurek

1

Dźwięk Do odtwarzania plików dźwiękowych *.wav służy funkcja PlaySound (moduł mmsystem) function PlaySound fdwSound:DWORD) :Boolean;

(pszSound:PChar,

hmod:HMODULE,

pszSound: nazwa pliku lub zasobu Hmod: uchwyt zasobu jeśli nie wykorzystuje się zasobu parametr ma wartość 0 fdwSound: flagi związane z odtwarzaniem wzorca (snd_Async – odtwarzanie w tle, snd_Sync – odwtwarzanie blokuje inne procesy) procedure TForm1.Button1Click(Sender: TObject); begin PlaySound('c:\windows\media\Chimes.wav',0,SND_SYNC); end; 2

Multimedia Typ TMediaPlayer jest „paskalowym pokryciem” mechanizmu obsługi multimediów w środowisku Windows (ang. MCI – skrót od Media Control Interface ). Komponent tego typu, znajdujący się na stronie System palety komponentów, zawiera zestaw przycisków umożliwiających sterowanie takimi urządzeniami, jak napęd CD-ROM, odtwarzacz MIDI lub VCR. Urządzenie multimedialne może być sprzętowe lub programowe.

Multimedia komponent MediaPlayer - Własciwości i metody: FileName ścieżka (typu string) – określa nazwę zbioru otwieranego za pomocą metody Open lub zapisywanego za pomocą metody Save Mode (typu TMPModes) – określa stan urządzenia medialnego type TMPModes = (mpNotReady, mpStopped, mpPlaying, mpRecording, mpSeeking, mpPaused, mpOpen); DeviceType - typ odtwarzanego pliku – wartość dtAutoSelect automatyczne wybieranie pliku AutoOpen - True oznacza automatyczne otwieranie odtwarzacza przy uruchamianiu aplikacji AutoRewind - True oznacza że po zakończeniu odtwarzania żądamy przewinięcia pliku do początku Enabled - True oznacza, że proces odrywania pliku może być sterowany klawiaturą lub myszą VisibleButtons - określa dostępność przycisków 4

Multimedia 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); Uwagi: 1) Domyślnie przyjmuje się dtAutoSelect i wówczas rodzaj urządzenia jest określany automatycznie na podstawie rozszerzenia nazwy zbioru podanego we własności FileName (zob. dalej). 2) Aby podczas wykonywania programu odtwarzacz otworzył automatycznie urządzenie określone przez wartość własności DeviceType, wartością własności AutoOpen musi być True.

Multimedia Komponent Odtwarzacz (MediaPlayer) Wybrane właściwości: VisibleButtons – które przyciski powinny być widoczne na pasku kontrolnym odtwarzacza (domyślnie wszystkie): btPlay, btRecord, btPause, btStop, btNext, btPrev, btStep, btBack, btEject,

EnabledButtons – które przyciski na pasku kontrolnym są dostępne, AutoEnable – automatyczne ustalenie, które przyciski są dostępne (True, False). Wait – odtwarzanie synchroniczne (True) lub niesynchroniczne (False), StartPos – punkt rozpoczęcia odtwarzania (ms, hms, klatki, bajty, próbki), EndPos – punkt zakończenia odtwarzania, Zmiana wartości własności StartPos obowiązuje dopiero przy następnym wywołaniu metody Play lub StartRecording Length – długość danych multimedialnych,

Multimedia

Podstawowe własności: TimeFormat (typu TMPTimeFormats) – określa format używany do określenia pozycji(m. in. początkowej, końcowej, bieżącej) oraz interpretacji wartości własności StartPos, Length,Position i EndPos type TMPTimeFormats = (tfMilliseconds,tfHMS, tfMSF, tfFrames, tfSMPTE24,tfSMPTE25, tfSMPTE30, tfSMPTE30Drop, tfBytes, tfSamples, tfTMSF);

Multimedia Wybrane metody (wszystkie bezparametrowe): � Open – otworzenie urządzenia multimedialnego, � Play – rozpoczęcie odtwarzania, � StartRecord – nagrywanie, � Stop – zatrzymanie odtwarzania (lub nagrywania), � Save – zapisanie danych do pliku (FileName), � Close – zamknięcie urządzenia, Back – przesunięcie bieżącego nośnika wstecz o liczbę ramek określoną przez wartość własności Frames, Eject – „wyrzucenie” nośnika (np. wysunięcie szuflady napędu CD-ROM), Next – przejście do następnej ścieżki bieżącego urządzenia multimedialnego, Pause – przerwanie odtwarzania (gdy odtwarzanie jest przerwane – wznowienie odtwarzania), 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,

Multimedia Komponent Odtwarzacz (MediaPlayer) Odtwarzanie plików w formacie Wave (*.wav) Player.Filename := 'c:\winnt\media\chord.wav'; Player.Open; Player.Wait := True; // jeśli synchronicznie Player.Play; Nagrywanie plików w formacie Wave (*.wav) Player.Filename := 'c:\pusty.wav'; Player.Open; Player.Wait:=False; Player.StartRecording; // nagrywamy Player.Stop; Player.Filename := 'c:\nagrany.wav'; Player.Save; Player.Close;

Multimedia Odtwarzanie plików w formacie Midi (*.mid lub *.rmi) Player.Filename := 'c:\winnt\media\canyon.mid'; Player.Open; Player.Wait:=False; Player.Play;

Odtwarzanie Audio CD Player.DeviceType := dtCDAudio; Player.Open; Player.Wait:=False; Player.Play; Player.Stop; // a kiedy trzeba skończyć

Odtwarzanie sekwencji audiowizualnych (*.avi) Player.Display:=Panel1; Player.Filename:='motor.avi'; Player.Open; Player.DisplayRect:=Panel1.ClientRect; (dopasowanie do „ekranu”) Player.Wait:=False; Player.Play;

Multimedia

11

Multimedia

12

Multimedia - Animacja Komponent Animate (typ TAnimate) Komponent ten znajduje się na stronie Win32 palety komponentów, a definicja typu jest umieszczona w module ComCtrls. Jest łączem do elementu sterującego środowiska Windows 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ą”, to komponent 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).

Multimedia - Animacja Wybrane właściwości: CommonAvi – typowe animacje Windows: aviNone, aviFindFolder, aviFindFile, aviFindComputer, aviCopyFiles, aviCopyFile, aviRecycleFile, aviEmptyRecycle, aviDeleteFile, FileName – nazwa pliku *.avi, Transparent – ustawienie przejrzystości tła (True, False), FrameCount – ilość ramek w animacji. Wybrane metody: Play(odRamki, doRamki, ileRazy) – odtwarza animację,(ileRazy=0 – odtwarzanie w pętli), przykład: Animacja.Play(1, Animacja.FrameCount, 3); Seek(nrRamki) – wyświetla określoną ramkę, Reset – przywrócenie stanu wyjściowego animacji, Stop – zatrzymanie animacji.

Wykresy w DELPHI

15

16

Instalacja komponentów

… lub typowy przebieg instalatora – programu z komponentami 17

Komponent Chart - wykresy Tchart TeeChart6Delphi7 TeeChart8.01Delphi2006

18

Komponent Chart - wykresy Komponent ten znajduje się na stronie Additional palety komponentów i służy do wykonywania wykresów. Do określania różnych charakterystyk wykresów służy Edytor Wykresów (ang. Chart Editor lub {{Editing Chart}} ), który ustala wartości odpowiednich własności. Wartości te mogą być zmieniane podczas wykonywania programu przez bezpośrednie przypisanie nowych wartości do własności lub za pomocą metod typu Tchart. Obiekt Tchart jest pochodną typu TPanel i jeśli nie dodamy do niego serii określonego typu, to nie będzie można na nim wyświetlić wykresu. Dane do wykresu generuje się podczas wykonywania programu. 19

Komponent Chart - wykresy Zmian właściwości wykresu można dokonać z poziomu Edytora Wykresów jak i programowo. {kolor, osie, opisy, tytuł, serie, marginesy, rysunki, legendy, 2D, 3D...} Podstawowe czynności związane z użyciem komponentu Chart: ● ●



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 Edytora Wykresów, (to samo daje podwójne kliknięcie na chart)

20

Komponent Chart - wykresy

21

Komponent Chart - wykresy Utworzenie serii danych do wykresu: ● wybrać przycisk Add na stronie Chart, co spowoduje wyświetlenie galerii rodzajów wykresów, ● wybrać jeden rodzaj (później można go zmienić). Edytor wykresów automatycznie wygeneruje dla wybranego rodzaju wykresu losową serię danych, dzięki czemu wykres będzie widoczny na etapie projektowania programu. Uwaga: Losowe wartości wygenerowane przez Edytor Wykresów obowiązują tylko w fazie projektowania (próba wykonania programu spowoduje wyświetlenie „pustego” wykresu). Wartości, dla których ma być wykonany wykres można ustalić w Edytorze Wykresów przez określenie źródła danych lub przez dodanie odpowiednich instrukcji w tekście źródłowym. 22

Komponent Chart - wykresy WYBRANE WŁAŚCIWOŚCI Title tytuł wykresu LeftAxis.Title.Caption Opis osi Y BottomAxis.Title.Caption Opis osi X AxisVisible wartośc true oznacza wyświetlenie standardowych osi współrzednych MarginLeft Rozmiar lewego marginesu oznaczajcego obszar kreślenia od lewej krawędzi całego komponentu Chart (..Right, ..Top, ..Bottom) Legend Właściwość obiektowa typu TchartLegend ma swoje włąściwości (Visible, Color, Font, Aligment) 23

Komponent Chart - wykresy WYBRANE WŁAŚCIWOŚCI BackImage właściwość obiektowa typu Tpicture – umożliwia załadowanie obrazu który stanowi tło wykresu Canvas właściwość obiektowa typu TCanvas umożliwia rysowanie na wykresie obiektów graficznych (trwałe rysowanie obsługa zdarzenia OnAfterDraw) Series[nr_serii] to tablica obiektów typu TchartSeries dla komponentu typu Tchart; nr_serii to wartość całkowita z przedziału [0,SeriesCount-1]

24

Komponent Chart - wykresy Podstawowe zdarzenia OnClick zdarzenie występuje po kliknięciu na komponencie OnCLickSeries zdarzenie występuje po kliknięciu lewym przyciskiem myszy na serii danych OnClickAxis kliknięcie osi współrzędnych OnAfterDraw zdarzenie występuje po narysowaniu serii na wykresie dostępne także: OnMouseDown, OnMouseMove, OnMouseUp

25

Komponent Chart - wykresy Klasy wykresów TLineSeries TBarSeries THorizBarSeries TAreaSeries TPointSeries TPieSeries TFastLineSeries TArrowsSeries TBubbleSeries TGanttSeries TChartSeries

wykres liniowy wykres kolumnowy wykres kolumnowy – poziomy wykres powierzchniowy wykres punktowy wykres kołowy wykres liniowy “szybki” (do animacji) wykres strzałkowy wykres bąbelkowy wykres Gantta (poziome paski) wykres z figurą, każda seria to figura

26

Komponent Chart - wykresy

Galeria wykresów 27

Komponent Chart - wykresy

Galeria wykresów 28

Komponent Chart - wykresy

Galeria wykresów 29

Komponent Chart - wykresy

Galeria wykresów 30

Komponent Chart - wykresy Wybrane właściwości klasy TChartSeries Title tytuł serii danych widoczny w legendzie XValue[nr_punktu] wartość x punktu wykresu YValue[nr_punktu] wartość y punktu wykresu Xlabe[nr_punktu] etykieta punktu wykresu ValueColor[nr_punktu] kolor punktu wykresu (dla FastLine ten sam kolor wszystkich punktów)

31

Komponent Chart - wykresy Wybrane metody klas serii danych FillSampleValues(n) procedura generuje przykładową serie danych Count funkcja zwraca liczbę punktów wykresu Clear procedura powoduje wykasanie wszystkich serii Delete(nr_punktu) procedura kasuje jeden punkt serii danych Rotate(kąt) procedura powoduje obrót wykresu kołowego o kąt Add funkcja używana do wstawiania nowych wartości do wykresu, jeśli nie jest istotna wartośc X (kołowe, kolumnowe) AddXY funkcja stosowana do rysowania wykresów funkcji matematycznych 32 np. y=x^2

PRZYKŁADY wykresów

33

Stały wykres

34

Wykres klumnowy procedure TForm1.Button1Click(Sender: TObject); begin Series1.Clear; with Series1 do begin Add(2000, 'I kwartał',clRed); Add(1500, 'II kwartał',clYellow); Add(3000, 'III kwartał',clGreen); end; end;

35

type Chart1: TChart;

Wykres klumnowy z danych z tabeli

StringGrid1: TStringGrid; Series1: TBarSeries; ..... procedure TForm1.Button1Click; var i:integer; begin //wypełnianie tabeli with StringGrid1 do begin Cells[0,0]:='Imię'; Cells[1,0]:='Średnia ocen'; for i:=1 to 4 do

//rysowanie wykresu with StringGrid1 do begin Series1.Clear; Series1.Title:=Cells[1,0]; //tytuł serii danych - w legendzie Chart1.LeftAxis.Title.Caption:=Cells[1,0]; //nazwa osi y Chart1.BottomAxis.Title.Caption:=Cells[0,0]; //nazwa osi x for i:=1 to 4 do Series1.Add(StrToFloat(Cells[1,i]),Cells[0,i]); end; end;

begin Cells[0,i]:='Ala'+IntToStr(i); Cells[1,i]:=FloatToStrF(i*1.5,ffFixed,4,2); end; end;

36

Wykres klumnowy

37

Series1: TPieSeries;

Wykres kołowy

procedure TForm1.Button1Click(Sender: TObject); Series1.Add(1+Random(10)); procedure TForm1.Button2Click(Sender: TObject); if Series1.Count>0 then Series1.Delete(0); procedure TForm1.Button3Click(Sender: TObject); Series1.Clear; //zerowanie wszystkich danych dla Series1

38

Series1: TFastLineSeries; Series2: TFastLineSeries;

Wykres funkcji matematycznych

procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin for i:=0 to 360 do if i mod 10=0 then begin Series1.AddXY(i,sin(i*Pi/180) ); Series2.AddXY(i,cos(i*Pi/180) ); end;

39

type Series1: TLineSeries;

Wykres funkcji matematycznych

procedure TForm1.Button1Click(Sender: TObject); var i:single; begin i:=-4; repeat Series1.AddXY(i,i*i*i,'',clTeeColor); i:=i+0.1; until i>=4; end; end.

40

Wykres funkcji matematycznych Narysowanie wykresu funkcji y=2x*(sinx) dla x (w radianach) z przedziału [-10,10] co 0,4.

procedure TForm1.Button1Click(Sender: TObject); var x:single; begin Series1.Clear; x:=-10; repeat Series1.AddXY(x, 2*x*sin(x) ); x:=x+0.4; until x>10; end

41

Wykres funkcji matematycznych – dodatkowe właściwosci procedure TForm1.Button2Click(Sender: TObject); var i:integer; begin with Series1 do begin for i:=0 to Count-2 do if YValue[i+1]>YValue[i] then //funkcja rosnąca ValueColor[i+1]:=clYellow else ValueColor[i+1]:=clRed; //funkcja malejąca Series1.Repaint; end; end;

42

procedure TForm1.ukladClick(Sender: TObject); begin uklad.Enabled:=false; Canvas.Pen.Color := clBlack; Canvas.Pen.Style := psSolid; Canvas.Brush.Style := bsClear; Canvas.Font.Color := clBlue; // uklad wspolrzednych Canvas.MoveTo(20, 100); // [ustawienie] góra "y" Canvas.LineTo(20, 300); // os "y" Canvas.MoveTo(20, 200); // srodek ukladu Canvas.LineTo(400, 200); // os "x"

Wykres funkcji sinus

Canvas.TextOut(19, 60, 'Wykres funkcji sinus!'); Canvas.TextOut(5, 100, 'y'); // napis "y" Canvas.TextOut(407, 200, 'x'); // napis "x" Canvas.TextOut(10, 200, '0'); // "0" Canvas.TextOut(95, 205, 'Pi/2'); // Pi/2 Canvas.TextOut(170, 205, 'Pi'); // Pi Canvas.TextOut(255, 205, '(3/2*Pi)'); // (3/2)*Pi Canvas.TextOut(334, 205, '2*Pi'); // 2*Pi canvas.pen.mode := pmblack; Canvas.Brush.Color := clRed; canvas.Polygon([point(400,200),point(390,195),Point(390,205)]); //strzalka "x" canvas.Polygon([point(20,100),point(15,110),Point(25,110)]); //strzalka "y" end;

43

var x,y:integer; y2,x2,i:real;

Wykres funkcji sinus

procedure TForm1.sinusClick(Sender: TObject); begin sinus.Enabled:=false; Canvas.Pen.Color := clblue; Canvas.Pen.Style := psSolid; Canvas.Brush.Style := bsClear; canvas.pen.mode := pmblack; Canvas.Brush.Color := clRed; // wykres sin(x) i:=0.0; REPEAT i:=i + 0.02; x2:=20+i*50; x:=round(x2); y2:=200-(sin(i)*50); y:=round(y2); {Funkcja Round zaokrągla podaną liczbę rzeczywistą (w górę lub w dół, w zależności od tego której wartości jest bliższa) i zwraca ją w postaci liczby całkowitej. Canvas.Pixels[x, y] := clRed; sleep(10); UNTIL i>=6.29; end;

44

Funkcja liniowa ze zmiennymi współczynnikami var a,b : integer; x : real; begin //Pobranie parametrow a := StrToint(Edit1.Text); b := StrToInt(Edit2.Text); //Rysowanie wykresu funkcji x := -200; repeat Image1.Canvas.Pixels[round(x)+100,(round(a * x + b)+100)]:=clblue; x := x + 0.01; until (x>200) end;

45

Tabelaryzacja danych Komponenty: - TDrawGrid - TStringGrid - TValueListEditor TDrawGrid – w komórkach siatki można wyświetlić elementy tekstowe lub graficzne. Tabela nie posiada właściwości Cells, która umożliwia odczyt lub zapis danych do komórki indeksowanej dwoma wskaźnikami. TValueListEditor - tabela posiadająca dwie kolumny. Pierwsza zawiera klucze, druga wartości (okno IO) 46

Tabelaryzacja danych - TDrawGrid Właściwości komponentu FixedCols {FixedRows} stałe kolumny {wiersze} nie można do nich nic wpisać po wywołaniu programu (można wyświetlić programowo tekst) ColCount liczba kolumn tabeli RowCount liczba wierszy tabeli Cells[kol,wiersz] nazwa komórki tabeli Row numer wiersza aktywnej (wybranej) komórki Col numer kolumny aktywnej (wybranej) komórki Rows[i] właściwość typu Tstrings, oznacza zawartośći-tego wiersza tabeli Cols[i] właściwość typu Tstrings, oznacza zawartość i-tej kolumny tabeli 47

Tabelaryzacja danych - TDrawGrid Właściwości komponentu ColWidths[i] szerokośćkolumny o numerze i RowHeights[i] wysokość wiersza o numerze i VisibleRowCount liczba wierszy tabeli widocznych na ekranie TopRow numer wiersza tabeli wyświetlany po wierszu stałym LeftCol numer kolumny wyświetlanej po kolumnie stałej Selection umożliwia odczyt zaznaczonego zakresu komórek Options właściwośc zbiorowa – opcje tabeli np. wygląd 48

Tabelaryzacja danych - TDrawGrid Właściwości Options goFixedVertLine rysowanie pionowych linii rozdzielajacych stałe wiersze .....

49

Tabelaryzacja danych - TDrawGrid Zdarzenia komponentu TStringGrid OnClick kliknięcie na tabeli OnGetEditMask zdarzenie umożliwia ustawienie maski dla okreśłonych komórek OnSelectCell zdarzenie po wybraniu komórek (myszka, strzałka) zwraca współrzedne OnKeyPress zdarzenie wystepuje po naciśnięciu klawisza alfanumerycznego 0255 OnDrawCell zdarzenie przy rysowaniu tabeli (umożliwia zmianę koloru tła, czcionki..) 50

Przykłady aplikacji z tabelami type TForm1 = class(TForm) StringGrid1: TStringGrid; Button1: TButton; procedure Button1Click(Sender: Tobject); .... procedure TForm1.Button1Click(Sender: TObject); begin StringGrid1.ColCount:=3; StringGrid1.RowCount:=6; end;

51

Przykłady aplikacji z tabelami (1) Stringgrid1.Rowcount:=Stringgrid1.Rowcount+1; (2) Stringgrid1.ColCount:=Stringgrid1.ColCount+1; (3) with StringGrid1 do if RowCount>VisibleRowCount then TopRow:=RowCount-VisibleRowCount; (4) var I, J : Integer; begin with StringGrid1 do for I := 0 to ColCount - 1 do for J:= 0 to RowCount - 1 do Cells[I,J] := IntToStr(Random(141)); end; 52

Przykłady aplikacji z tabelami procedure TForm1.Button1Click(Sender: TObject); begin Stringgrid1.Options:=Stringgrid1.Options+[goEditing]; end; procedure TForm1.Button2Click(Sender: TObject); begin Stringgrid1.Options:=Stringgrid1.Options-[goEditing]; end; end.

53

Przykłady aplikacji z tabelami

54

TDrawgrid

tekst=record wsp:TPoint; napis:shortstring; end; var Form1: TForm1; w:string; ind:integer; tab_txt: array[0..20]of tekst; //wypelnienie komorek tabeli Drawgrid2 roznymi obrazami z listy TImageList procedure TForm1.DrawGrid2DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); const index1: integer=0; lista:array[0..7]of string=('Ala','Ola','Jola','Adam','Piotr','Paweł','Anna','Michał'); begin index1 := ARow * Drawgrid2.Colcount + ACol; //komórki wypełniane wierszami po kolei case index1 of //ARow of 0..3: Drawgrid2.Canvas.TextRect(Rect,Rect.Left+2,Rect.Top+2,lista[index1]); 4..7: ImageList2.Draw(Drawgrid2.Canvas,Rect.Left,Rect.Top,index1-4); 8..11: Drawgrid2.Canvas.TextRect(Rect,Rect.Left+2,Rect.Top+2,lista[index1-4]); 12..15: ImageList2.Draw(Drawgrid2.Canvas,Rect.Left,Rect.Top,index1-8); end; label1.Caption:=Label1.Caption+#13+Inttostr(index1); end; end.

55

TValueListEditor

Tabela typu TValueListEditor to komponent z zakładki Additional. Tabela ta składa się z dwóch kolumn: pierwsza to klucz, czyli identyfikator wiersza, druga może zawierać dowolne dane. Ciekawa właściwością tego komponentu jest to , że posiada on metody służące do kasowania wierszy, dodawania i wstawiania. Dodatkowo w prawej komórce tabeli może pojawiac się listarozwijana lub przycisk (wlaściwość EditStyle).

56

TValueListEditor //zmiana komorek tytulowych procedure TForm1.Button1Click(Sender: TObject); begin Valuelisteditor1.TitleCaptions.Clear; Valuelisteditor1.TitleCaptions.Add('LP'); Valuelisteditor1.TitleCaptions.Add('wartosc'); Valuelisteditor1.Repaint; End; //dodaj wiersz na końcu, tylko w kolumnie wartości tekst aaa procedure TForm1.Button2Click(Sender: TObject); begin Valuelisteditor1.Strings.Add('aaa'); Repaint; end; //wykasuj wiersz o numerze 2 procedure TForm1.Button3Click(Sender: TObject); begin Valuelisteditor1.DeleteRow(2); End;

57

//lista w prawej komórce w wierszu 2 procedure TForm1.CheckBox1Click(Sender: TObject); begin if CheckBox1.Checked then begin Valuelisteditor1.ItemProps[1].EditStyle:=esPicklist; Valuelisteditor1.ItemProps[1].PickList.Add('100'); Valuelisteditor1.ItemProps[1].PickList.Add('200'); end else Valuelisteditor1.ItemProps[1].EditStyle:=esSimple; end; //przycisk w komórce w wierszu 3 procedure TForm1.CheckBox2Click(Sender: TObject); begin if CheckBox2.Checked then Valuelisteditor1.ItemProps[2].EditStyle:=esEllipsis else Valuelisteditor1.ItemProps[2].EditStyle:=esSimple; end; //po kliknieciu przycisku w komorce procedure TForm1.ValueListEditor1EditButtonClick(Sender: TObject); begin ShowMessage('Biezacy numer wiersza'+InttoStr(Valuelisteditor1.Row)); end;

TValueListEditor

58

Zbiory Danych

Zbiór danych (dataset) może być postrzegany jako dwuwymiarowa struktura kolumn (columns) i wierszy (rows). Każda kolumna, zwana też polem ( field) grupuje w sobie dane tego samego rodzaju, natomiast kolejne wiersze, zwane też rekordami (records), stanowią kolejne pozycje danych w zbiorze. Komponentem VCL, ujmującym w sposób abstrakcyjny ideę zbioru danych jest komponent TDataSet, zawierający właściwości i metody niezbędne do nawigowania wśród danych i manipulowania nimi, i stanowiący tym samym klasę bazową dla komponentów realizujących konkretne zbiory danych związane z różnorodnymi technologiami bazodanowymi.

59

Zbiory Danych Zbiór danych (dataset) jest uporządkowaną kolekcją rekordów; organizację każdego rekordu, taką samą dla wszystkich rekordów, określają jego pola, z których każde reprezentuje daną określonego typu (liczbę całkowitą, łańcuch znaków, liczbę w postaci znakowo-dziesiętnej, grafikę itp.). Tabela (table) jest specjalnym typem zbioru danych, najczęściej posiadającym fizyczną postać pliku dyskowego. Komponentami reprezentującymi różnorodne tabele są m.in. TTable, TADOTable, TSQLTable i TIBTable. Zapytanie (query) również stanowi konkretyzację zbioru danych, jednak nie „zmaterializowaną” w tak ścisły sposób jak tabela, lecz stanowiącą swego rodzaju „tabelę tymczasową”, która jest (zazwyczaj) wynikiem żądania skierowanego pod adresem serwera. Zapytanie reprezentowane jest m.in. przez komponenty TQuery, TADOQuery, TSQLQuery i TIBQuery.

60

Drukowanie W Delphi mamy do dyspozycji dwie metody drukowania:

obsługa drukarki jak pliku tekstowego – procedura Write, Writeln (dostęp sekwencyjny) obsługa drukarki jako ekranu graficznego który wypełniamy “treścią”, korzystając z funkcji i procedur graficznych właściwości Canvas obiektu Tprinter. Istnieje możliwość łączenia obu metod. Można również wykorzystać TRichEdit oraz program Rave Reports.

61

Drukowanie Właściwości i metody klasy TPrinter BeginDoc metoda zaczyna proces przygotowania wydruku EndDoc metoda kończy proces drukowania. Jej wywołanie powoduje wysłanie danych do drukarki Canvas właściwość obiektowa, na którym powstaje każda drukowana strona. PageHeight określa wysokośc strony w pikselachbez marginesów PageWidth określa szerokośc strony w pikselach NewPage metoda powoduje przejście do następnej stronyi ustawienie jej współrzędnych (0,0) PageNumber określa numer bieżącej strony

62

Dialog drukowania (PrintDialog) Wybrane właściwości: Collate – zaznaczenie sortowania kopii (True, False), Copies – liczba kopii wydruku, FromPage – od której strony, ToPage – do której strony, MaxPage – maksymalny dostępny numer strony, MinPage – minimalny dostępny numer strony, PrintRange – zakres drukowanych stron (prAllPages, prSelection, prPageNums), PrintToFile – zaznaczenie opcji druku do pliku (True, False), Options – opcje dialogu drukowania. Wybrane metody: Execute – uruchomienie okna dialogowego, metoda zwraca wartość logiczną True jeśli użytkownik wybrał parametry i nacisnął klawisz OK lub wartość False jeśli użytkownik anulował w dowolny sposób operację drukowania. Opcje dialogu: poDisablePrintToFile – blokuje pole wyboru ”Drukuj do pliku”, poHelp – wyświetla przycisk pomocy w dialogu, poPageNums – udostępnia przełącznik wyboru stron drukowania, poPrintToFile – wyświetla w dialogu pole wyboru drukowania do pliku, poSelection - udostępnia przełącznik wyboru drukowania zaznaczonego tekstu, poWarning – generuje ostrzeżenie jeśli użytkownik wybrał niezainstalowaną drukarkę. 63

Drukowanie

Dialog ustawień drukowania (PrinterSetupDialog) Zastosowanie: wybór drukarki i podstawowych parametrów drukarki i nośnika informacji (zawartość dialogu zależy od typu Drukarki). Wybrane metody: Execute – uruchomienie okna dialogowego, metoda konfiguruje drukarkę i zwraca wartość logiczną True jeśli użytkownik wybrał parametry i nacisnął klawisz OK lub wartość False jeśli użytkownik anulował w dowolny sposób operację drukowania.

64

Drukowanie

Obsługa drukarki Drukowanie informacji z aplikacji wizualnej: � wydruki z wykorzystaniem metod komponentów, � wydruki zaprojektowane przez użytkownika. Wydruki z wykorzystaniem metod komponentów Print - metoda formularza aplikacji (np. Form1.Print): o tworzy mapę bitową obszaru klienta formularza (GetFormImage) o przesyła mapę bitową do drukarki. PrintScale – właściwość formularza aplikacji kontroluje proporcje wydruku formularza: • poNone bez skalowania (najczęściej niewłaściwe proporcje), • poProportional w ekranowych rozmiarach i proporcjach, • poPrintToFit skalowanie do rozmiarów papieru z zachowaniem proporcji

65

Drukowanie Print – metoda edytora tekstu RichEdit: o wydruk zawartości komponentu na drukarce, o automatyczne numerowanie stron wydruku, o automatyczne zawijane długich wierszy tekstu, przykład: if PrintDialog1.Execute then Edytor.Print(’Dokument nr 1’); Print – metoda komponentu QuickReport: o wydruk raportu aplikacji bazodanowej, o duża elastyczność formatowania informacji, przykład: QuickReport1.Print; Projektowanie wydruków „Ręczne” tworzenie wydruków z aplikacji wizualnej: - nieograniczone możliwości, - pracochłonne. TPrinter – klasa obiektowa do obsługi wydruków. Printer – funkcja tworząca obiekt klasy TPrinter (zdefiniowana w module Printers). Etapy tworzenia wydruku: o zainicjowanie wydruku – Printer.BeginDoc; o wykonanie rysunku na płótnie drukarki (Printer.Canvas) o zakończenie wydruku – Printer.EndDoc;

66

Drukowanie – klasa TPrinter

Właściwości: � PrinterIndex – numer aktualnie wybranej drukarki (-1 oznacza domyślną), � Printers – lista dostępnych drukarek, � Canvas – płótno powierzchni wydruku � Fonts – lista czcionek możliwych do użycia, � Capabilities – bieżące ustawienia sterownika drukarki (pcCopies, pcOrientation, pcCollation), � Copies – liczba kopii, � Orientation – orientacja papieru (poPortrait, poLandscape). � PageHeight – wysokość strony w pikselach, � PageWidth – szerokość strony w pikselach, � PageNumber – numer drukowanej strony, � Title – tytuł wydruku, � Printing – czy drukarka aktualnie drukuje (True, False), � Aborted – czy użytkownik przerwał drukowanie metodą Abort (True, False), � Handle – kontekst drukarki (HDC), odwołania do funkcji API. Wybrane metody: � Abort – przerwanie drukowania, � BeginDoc – rozpoczęcie drukowania (przygotowanie drukarki do wydruku), � EndDoc – koniec drukowania (często rzeczywiste rozpoczęcie wydruku na drukarce), � NewPage – wydruk bieżącej strony i rozpoczęcie konstruowania następnej, � Refresh – odświeżenie informacji o drukarkach.

67

Drukowanie

Przykład – wydruk ramki wokół strony: if PrintDialog1.Execute then begin with Printer do begin BeginDoc; Canvas.Brush.Style:=bsClear; Canvas.Pen.Width:=10; Canvas.Rectangle(100, 100, PageWidth-100, PageHeight-100); EndDoc; end;

68

Drukowanie procedure TForm1.Button1Click(Sender: TObject); var f:textfile; begin AssignPrn(f); //skojarzenie zmiennej plikowej z drukarką Rewrite(f); Writeln(f, 'Ala ma kota'); //przesłanie tekstu na drukarkę CloseFile(f); end; procedure TForm1.Button2Click(Sender: TObject); begin Printer.BeginDoc; Printer.Canvas.TextOut(0,0,'Ala ma kota'); //wypisanie tekstu w obszarze roboczym Printer.EndDoc;

//wysłanie tekstu na drukarkę

end; 69

Drukowanie procedure TForm1.Button1Click(Sender: TObject); var Bmp: TBitmap; //do wczytania obrazka R:TRect; begin Bmp := TBitmap.Create; procedure TForm1.Button2Click(Sender: TObject); try var drukR, imageR: TRect; Bmp.LoadFromFile('androm.BMP'); begin with Printer do Printer.BeginDoc; begin Image1.Picture.LoadFromfile('ogien.bmp'); BeginDoc; drukR:=Rect(10,100,400,500); R:=Rect(10,100,400,500); imageR:=Rect(0,0, Image1.Width, Image1.Height); Canvas.StretchDraw(R, Bmp); Printer.Canvas.CopyRect(drukR, Image1.Canvas, EndDoc; ImageR); end; Printer.EndDoc; //wysłanie danych na drukarkę finally end; Bmp.Free; end; end;

70

Drukowanie

71