ROZDZIAŁ 9
Teraz dokończę omawiany ostatnio temat komponentu MediaPlayer. W tabeli poniżej przedstawiłem właściwości tegoż komponentu.
AutoRewid Określa, czy po zakończeniu odtwarzania wzkaznik pozycji ma być przesunięty na sam początek. Dzieje się tak gdy wartością będzie True.
DeviceType Wartość bsAutoSelect powoduje automatyczny wybór urządzenia na podst. rozszerzenia pliku.
Display Służy do określenia komponentu, które będzie służyć jako okno podczas wyświetlania (tak jak np. program który pisaliśmy ostatni, razem - w tym wypadku oknem jest Panel).
DisplayRect Służy do dopasowania rozmiaru okna na którym wyświetlany będzie np. film (tak jak w poprzednim programie).
EnabledButtons Określa, które przyciski powinny być dostępne podczas odtwarzania.
EndPos Końcowy punkt plików multimedialnych. Dane takiego pliku odtwarzanie są od punktu StartPos do punktu oznaczonego EndPos.
Frames Liczba klatego jaka będzie przesunięta po naciśnięciu przycisku Next lub Back.
Mode Stan aktualny urządzenia. mbNotReady, mpStopped, mpPlaying, mpRecording, mpSeeking, mpPaused, mpOpen. Możesz wykorzystywać to w procedurach do badania w jakim stanie znajduje się urządzenie i ew. do zapobiegania błędom.
Notify Jeżeli wartością jest True to z zakończeniem odtwarzania generowana będzie procedura właśnie OnNotify.
NotifyValue Możliwe są wartości: nvSuccessful, nvSupersed, nvAborted, nvFailure. Możesz wykorzystywać te metody do badania z jakim skutkiem zakończone zostało odtwarzanie.
Position Aktualna pozycja odtwarzanych danych multimedialnych.
StartPos Patrz: EndPos.
Wait Właściwość tę omawaiłem w poprzednim rozdziale. Gdy wartościąj est True - kolejny utwór odtwarzany będzie po kolejnym w pewnym odstępie czasu. Gdy wartością jest False kolejny utwór odtwarzany będzie natychmiast.
Przy odtwarzaniu filmu lub/i muzyki ważną rzeczą może być odgrywanie utworu w pętli.
1. Otwórz program, który pisaliśmy ostatnio. Kliknij na komponencie MediaPlayer i z Inspektora Obiektów wybierz zakładkę Events
2. Kliknij na procedurze OnNotify i najedź kursorem obok. Powinien pojawić się kursor tekstowy - kliknij wówczas dwukrotnie. Procedurę tą uzupełnij następująco:
procedure TForm1.playerNotify(Sender: TObject);
begin
if player.NotifyValue= nvSuccessful then //gdy odtwarzanie dobiegnie końca.....
Player.Position:=0; //...przewiń do początku....
Player.Play; //... i zacznij odtwarzać.
end;
To nie koniec unowocześniania programu. Wyobraź sobie, że chciałbyś, aby użytkownik mógł powiększać lub pomniejszać twój panel w zależności od jego zachcianek. Zrób to tak:
1. Na formularzu umieść dwa przyciski SpeedButton (na palecie Additional).
2. Możesz umieścić na nich jakieś bitmapy. W Inspektorze Obiektów odszukaj właściwość Glyph i kliknij na symbol trzykropka zamieszczony obok. Naciśnij przycisk 'Load' i wybierz jakąś bitmapę.
3. Wartość GroupIndex obu przycisków zmień na 1. Oznacza to, że tylko jeden przycisk w dane chwili może być wciśnięty.
4. Kliknij dwukrotnie na pierwszym przycisku i treść procedury uzupełnij tak:
procedure TForm1.ButtonClick(Sender: TObject);
begin
if Button.Down=True then begin //Jezeli 1 przycisk jest wcisniety...
Panel1.Cursor:=crDrag; //to panelowi przypisz kursor - drag
end else //jezeli nie...
Panel1.Cursor:=crArrow; //pozotaw taki jak byl
end;
W tej procedurze następuje przypisanie Panelowi kursora - w tym wypadku o nazwie Drag. Istnieje możliwość załadowania własnego kursora, ale o tym kiedy indziej. Jeżeli przycisk jest "normalny" to kursor jest standardowy - Arrow.
5. Idziemy dalej - kliknij dwukrotnie na przycisku drugim i treść jego procedury uzupełnij następująco:
procedure TForm1.Button1Click(Sender: TObject);
begin
if Button1.Down=True then begin //j/w
Button1.Down:=False;
Panel1.Cursor:=crCross;
end else
Panel1.Cursor:=crArrow;
end;
W tym wypadku procedura ma bardzo podobną postać z tym, że tym razem panelowi przypisywany jest kursor o nazwie Cross.
6. Z polecenia File wybierz New Form. Umieść na nim Panel i jego właściwość Align zmień na alClient. Spowoduje to rozciągnięcie Panelu na cały obszar formularza. Po co tworzymy kolejny formularz? Gdy urzytkownik będzie powiększał Panel i przybierze on taki duży rozmiar w tedy ukazywany będzie formularz drugi i to właśnie na nim wyświetlany będzie film.
7. Kliknij teraz dwukrotnie na Panelu 1 naszego głównego formularza. Treść procedury uzupełnij następująco:
procedure TForm1.Panel1Click(Sender: TObject);
begin
//W przypadku klikniecia na panel...
//Jezeli nastapi klikniecie, a kursor to drag...
if Panel1.Cursor=crDrag then begin
Panel1.Width:=Pred(Panel1.Width - 5); //...zmniejsz szerokosc Panelu...
Panel1.Height:=Pred(Panel1.Height - 5); //... i wysokosc panelu.
Player.DisplayRect:=Panel1.ClientRect; //dostosuj roamiar filmu do rozmiaru Panelu
if ((Panel1.Width<=90) or (Panel1.Height<=80)) then //Jezeli wymiary sa mniejsze niz tu podane...
//...nastepuje wyswietlenie komunikatu:
ShowMessage('Cholera, jak jeszcze bardziej zmniejszysz to okno to nic nie zobaczysz :)');
end;
//Jezeli kursor to Cross...
if Panel1.Cursor=crCross then begin
//Nastepuje powiekszenie szerokosci...
Panel1.Width:=Succ(Panel1.Width + 5);
Panel1.Height:=Succ(Panel1.Height + 5); //...i wysokosci
Player.DisplayRect:=Panel1.ClientRect; //dostosowanie szerokosci Panlu do rozmiaru filmu
//Jezeli wymiary sa wieksze od tych tutaj podanych...
if ((Panel1.Height>=241) or (Panel1.Width>=345)) then
begin
//Wtedy nastepuje przypisanie okna wyswietlania
//Panelowi w oknie Form2
Player.Display:=Form2.Panel1;
Player.DisplayRect:=Form2.Panel1.ClientRect;
//no i w koncu wyswietlenie okna Form2
form2.Showmodal;
end;
end;
end;
OBJAŚNIENIE:
Trochę długa ta procedura, nie? N samym początku "badany" zostaje kursor. Jeżeli jest to Drag - wysokość i szerokość Panelu zostaje pomniejszona. Funkcję Pred omawiałem w poprzednich rozdziałach, ale mała powtórka nie zaszkodzi. Otóż ta funkcja pomniejsza w tym wypadku rozmiar Panelu o jeden. Czyli: Pred(100) daje liczbę 99 itd. Jako że rozmiar Panelu zmniejszał by się tylko o jeden (żeby zmniejszyć Panel należałoby się nieźle naklikac :)) odejmujemy od rozmiarów jeszcze 5 punktów.
Kolejny warunek (if ((Panel1.Width<=90) or (Panel1.Height<=80)) then) "sprawdza", czy rozmiary nie są zbyt małe. Jeżeli osiągną wymiary mniejsze od tych tutaj podanych - wtedy wyświetla się komunikat. (O komunikatach w następnym rozdziale.).
Jeżeli kursor to Cross - wtedy rozmiar Panelu powiększa się. Funkcja Succ powiększa o jeden, czyli: Succ(100) daje 101 itd. Do rozmiaru dodawane są jeszcze 5 punktów. I tak samo, gdy Panel będzie większy od podanych rozmiarów wtedy otwiera się okno Form2 i to właśnie na nim odtwarzany jest film.
ROZDZIAŁ 10
W poprzednim rozdziel zastosowałem komunikat ShowMessage. Możesz stosować taki komunikaty w zapobieganiu ew. błędów jakie wykona użytkownik programu. Konstrukcja jest prosta - najpierw słówko ShowMessage, a później treść komunikatu.
Istnieją jeszcze dwa typy komunikatów.
1. Umieść na formularzu dwa przyciski. W treści procedury pierwszego wpisz takie oto polecenie:
MessageDlg('To jest komunikat pierwszy :)', mtInformation, [mbOK], 0);
Ten komunikat wydaje Ci się trudniejszy? W pierwszym parametrze podawana jest treść komunikatu, w kolejnym jego typ (może być także mtError - wtedy obok komunikatu wyświetli się znana ikona Windowsa informująca o błędzie) - w tym wypadku mtInformation - obok komunikatu pojawi się "dymek". Parametr [mbOK] informuje, że pojawi się przycisk OK.
2. W treści drugiej procedury umieść taki oto kod:
Application.MessageBox('To jest komunikat 2', 'Błąd programu.',MB_OK);
W tym komunikacie masz możliwość ustalenia napisu jaki pojawi się w oknie komunikatu na pasku. Możesz też zrobić coś takiego:
var
Odp : Integer;
begin
Odp:= Application.MessageBox(
'Wystąpił błąd w programie. Czy chcesz poczytać Help'a?','Błąd',
MB_YESNOCANCEL);
if Odp=IDYES then
{treść procedury}
if Odp=IDNO then
Close; {zakończenie programu}
if Odp=IDCANCEL then
Exit; {zamknięcie okna komunikatu}
To by było na tyle jeśli chodzi o komunikaty. Teraz zajmijmy się wyjątkami.
Pisząc program, a później oddając go do użytku nie jesteś w stanie przewidzieć zachowania osoby korzystającej z tego programu. Zawsze przecież taka osoba może zrobić coś, co nie jest tolerowane przez program. Wtedy ażeby zapobiec takim przypadkom powinieneś stosować wyjątki. Powróćmy do programu pisanego w Rozdziale 8. Procedura, która otwierała plik video wyglądała następująco:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
if OpenDialog.Execute then //wywołanie okna "Otwórz"
Player.FileName:=OpenDialog.FileName;
PLayer.Open;
Player.Display:=Panel1; //Panel1 będzie wyświetlaczem filmu
Player.DisplayRect:=Panel1.ClientRect; //Dostosowanie rozmiarów filmu do rozmiaru Panelu
end;
Zmodyfikujmy tę procedurę to takiej oto postaci:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
try
if OpenDialog.Execute then //wywołanie okna "Otwórz"
Player.FileName:=OpenDialog.FileName;
PLayer.Open;
Player.Display:=Panel1; //Panel1 będzie wyświetlaczem filmu
Player.DisplayRect:=Panel1.ClientRect; //Dostosowanie rozmiarów filmu do rozmiaru Panelu
except
ShowMessage('To nie jest plik video lub wystąpił jakikolwiek inny bląd');
end;
OBJAŚNIENIE: Słówko try oznacza "spróbuj". Program wykonuje instrukcje zawarte po tym słowie. Jeżeli operacja się nie powiedzie następuje wykonanie instrukcji zawartych pod słowem except.
Istnieje jeszcze słowo finally, które wykorzystuje się wraz ze słowem try. Instrukcje zawarte po słowie finally zostaną wykonane niezależnie od czy operacja powiodła się, czy też nie. Zapytasz zapewne "Jaki jest sens stosowania tego słowa skoro instrukcje po nim zawarte wykonane będą niezależnie, czy operacja się powiedzie?". Słowo to stosuje się, aby upewnić się, że zostanie zwolniona pamięć jaka została przydzielona. Np:
var
Pamiec : Pointer;
begin
try
Pamiec:=AllocMem(1024);
finally
FreeMem(Pamiec);
end;
end;
W tym przypadku zostaje przydzielona pamięć, która zostanie zwolniona po zakończeniu działania procedury. To już wszystko tym razem. Już niebawem kolejny kurs. Odwiedzajcie tę stronę częściej lub wpiszcie się, aby być informowany emailem o uaktualnieniach.