Tutorial 1 - Odtwarzacz animacji AviPlayer wersja 1.0

Programowanie ostatnio staje siΩ coraz bardziej popularne, jednak nie ka┐dego staµ na zakup ksi▒┐ki za 100 z│otych i pr≤buje znale╝µ co╢ w Internecie. Czasami uda siΩ odszukaµ warto╢ciow▒ stronΩ, jednak wiΩkszo╢µ z nich ginie w przepastnych g│Ωbiach Internetu, dlatego postanowi│em podzieliµ siΩ z wami kursami programowania z mojej strony. Kursy te pozwol▒ wam nauczyµ siΩ podstaw programowania w Borland C++ Builderze, wiΩc je╢li nigdy nie programowa│e╢ to nic nie stoi na przeszkodzie, aby╢ zacz▒│, jednak od razu przestrzegam, ┐e to wci▒ga :).

Na pocz▒tku nale┐y zainstalowaµ na swoim komputerze ╢rodowisko programowania Borland C++ Builder, najlepiej wersjΩ nr 3. Mo┐na je znale╝µ na kompaktach do│▒czonych do nastΩpuj▒cych czasopism komputerowych:

Borland C++ Builder 3 Standard - pe│na wersja:

  • PC World Komputer 5/2000

Borland C++ Builder 4 - trial:

  • PC World Komputer 5/1999
  • Chip 6/1999

Borland C++ Builder 5 - trial:

  • Chip 6/2000
  • Software 5/2000
  • Software 10/2000

Najlepiej by│oby te┐ do ka┐dego tutoriala ╢ci▒gn▒µ z Internetu plik spakowany WinRAR'em (odno╢nik do strony na dole ka┐dego tutoriala). Znajduj▒ siΩ w nim dwa katalogi: Potrzebne pliki, gdzie umieszczone s▒ wszystkie pliki, kt≤re s▒ potrzebne do wykonania projektu (np. ikony, bitmapy, itp.) i katalog Gotowy projekt, gdzie umieszczone s▒ pliki z gotow▒ przyk│adow▒ aplikacj▒.

A wiΩc do dzie│a!

Zak│adamy na dysku katalog AviPlayer1. Uruchamiamy Borland C++ Buildera. W│▒czamy menu File->Save All, otwieramy nasz katalog AviPlayer1 i w okienku Save Unit1 As wpisujemy FormMain.cpp, a w okienku Save Project1 As wpisujemy AviPlayer1.bpr.

Nasze ╢rodowisko pracy wygl▒da mniej wiΩcej tak:

 

  • na ╢rodku ekranu widzimy szare okno, jest ono g│≤wnym oknem naszego programu (bΩdziemy je nazywaµ formularzem), na razie nic ono nie zawiera
  • po lewej stronie mamy okno Inspektora Obiekt≤w (Object Inspector), w kt≤rym mo┐na zmieniaµ w│a╢ciwo╢ci komponent≤w (na zak│adce Properties) i przypisywaµ im funkcje obs│ugi zdarze± (na zak│adce Events)
  • u g≤ry po lewej stronie jest kilka przydatnych przycisk≤w (np. otwieranie i zapisywanie plik≤w, uruchamianie programu)
  • u g≤ry po prawej stronie znajduje siΩ najwa┐niejsza rzecz, czyli zak│adki z komponentami

Klikamy na formularz, wtedy staje siΩ on aktywny (co widzimy po zmianie koloru paska tytu│u na niebieski). Teraz mo┐emy w oknie Inspektora Obiekt≤w zmieniµ opcje naszego formularza dotycz▒ce jego wygl▒du, zachowania, itp. (w lewej kolumnie Inspektora Obiekt≤w umieszczone s▒ nazwy w│a╢ciwo╢ci, natomiast w prawej kolumnie odpowiadaj▒ce im warto╢ci):

  • BorderIcons->iMaximize = false
  • BorderStyle = bsSingle
  • Caption = AviPlayer 1.0
  • Name = MainForm
  • Position = poScreenCenter

Znaczenie w│a╢ciwo╢ci:

  • BorderIcons okre╢la, kt≤re ikony w prawym g≤rnym rogu formularza bΩd▒ aktywne (dwukrotne klikniΩcie na nazwΩ tej w│a╢ciwo╢ci spowoduje pokazanie siΩ jej podw│a╢ciwo╢ci, poznajemy to po znaku plusa ko│o nazwy w│a╢ciwo╢ci), biMaximize dotyczy ikony maksymalizacji (zmiany widoczne bΩd▒ dopiero po uruchomieniu programu)
  • BorderStyle okre╢la rodzaj obramowania formularza (zmiany widoczne bΩd▒ dopiero po uruchomieniu programu)
  • Caption zawiera tekst wy╢wietlany na pasku tytu│u programu
  • Name przechowuje nazwΩ formularza identyfikuj▒c▒ ten formularz podczas programowania
  • Position okre╢la po│o┐enie formularza (zmiany widoczne bΩd▒ dopiero po uruchomieniu programu)

Zmiana tych kilku w│a╢ciwo╢ci formularza mia│a na celu dostosowanie jego zachowania tak, aby odpowiada│o naszym wymaganiom. Jest jeszcze wiele innych w│a╢ciwo╢ci, czΩ╢µ z nich wykorzystamy p≤╝niej. Mo┐emy teraz wcisn▒µ F9 i obejrzeµ nasz▒ dotychczasow▒ pracΩ.

Po zamkniΩciu programu z zak│adki komponent≤w System wybieramy MediaPlayer i klikamy na formularzu, co powoduje umieszczenie na nim tego komponentu. Mo┐emy teraz przyst▒piµ do zmiany jego w│a╢ciwo╢ci:

  • AutoOpen = true
  • DeviceType = dtAVIVideo
  • FileName = ╢cie┐ka dostΩpu
  • Name = MediaPlayer
  • VisibleButtons->btRecord = false
  • VisibleButtons->btReject = false

Znaczenie w│a╢ciwo╢ci:

  • AutoOpen powoduje po uruchomieniu programu wczytanie do komponentu MediaPlayer ╢cie┐ki dostΩpu do pliku animacji, kt≤r▒ bΩdziemy odtwarzaµ
  • ColoredButtons okre╢la, czy poszczeg≤lne przyciski bΩd▒ kolorowe, czy czarne
  • DeviceType pozwala na odtwarzanie tylko plik≤w *.avi
  • FileName zawiera ╢cie┐kΩ dostΩpu do pliku *.avi, kt≤ry bΩdziemy wy╢wietlaµ (np. c:\plik.avi)
  • VisibleButtons okre╢la, kt≤re przyciski bΩd▒ widoczne, a kt≤re nie

Uruchamiamy nasz program (F9) i wciskaj▒c przycisk play uruchamiamy odtwarzanie animacji z okre╢lonego przez nas pliku. Wy│▒czamy program.

Jestem pewien, ┐e wiΩkszo╢µ z was czuje w tym momencie pewien niedosyt. Mamy dzia│aj▒cy program, ale ┐eby wy╢wietliµ inny plik musimy wy│▒czyµ program, zmieniµ ╢cie┐kΩ dostΩpu i w│▒czyµ program. Czy nie da siΩ tego zrobiµ lepiej? Da siΩ! Zmieniamy w│a╢ciwo╢ci komponentu MediaPlayer:

  • AutoOpen = false
  • FileName = kasujemy zawarto╢µ

Z zak│adki Standard wybieramy Button i zmieniamy jego w│a╢ciwo╢ci:

  • Caption = &Otw≤rz
  • Name = OpenButton

Znaczenie w│a╢ciwo╢ci:

  • Caption znak & przed literk▒ O spowoduje, ┐e na przycisku bΩdzie wy╢wietlony tekst Otw≤rz, pozwala to na zastosowanie skr≤tu klawiszowego Alt+O

Z zak│adki Dialogs wybieramy OpenDialog i zmieniamy jego w│a╢ciwo╢ci:

  • Name = OpenDialog

Hmmm. Do dej pory nie wpisali╢my, ani jednej linijki kodu, a program jako╢ dzia│a│. Niestety nie da siΩ tak wiecznie. Chcemy, aby nasz program po wci╢niΩciu naszego klawisza Otw≤rz wywo│ywa│ okienko OpenDialog, gdzie bΩdziemy mogli wybraµ plik, kt≤ry chcieliby╢my ogl▒dn▒µ. WiΩc nasz program musi odpowiedzieµ na tzw. zdarzenie, kt≤rym bΩdzie klikniΩcie mysz▒ w przycisk Otw≤rz. Najprostszym sposobem utworzenia funkcji obs│uguj▒cej zdarzenie klikniΩcia w przycisk jest najechanie na niego mysz▒ i dwukrotne klikniΩcie. Poka┐e siΩ w≤wczas edytor kodu, kt≤ry do tej pory by│ ukryty pod formularzem. Zawiera on szkielet funkcji obs│uguj▒cej to zdarzenie:

void __fastcall TMainForm::OpenButtonClick(TObject *Sender)
{
}

Jest to funkcja obs│uguj▒ca nasze zdarzenie (klikniΩcia mysz▒ na przycisku), na razie jednak ona nic nie robi. Polecenia wpisuje siΩ miΩdzy klamrami { }. Dodajmy do naszej funkcji nastΩpuj▒c▒ linijkΩ (zaznaczon▒ czerwonym kolorem):

void __fastcall TMainForm::OpenButtonClick(TObject *Sender)
{
   OpenDialog->Execute();
}

co spowoduje, ┐e po wci╢niΩciu przycisku uruchomi siΩ okno wyboru pliku. Mo┐emy uruchomiµ program i sprawdziµ, ┐e to dzia│a, ale co z tego, ┐e wybieramy plik, a komputer nic p≤╝niej nie robi z wybranym przez nas plikiem. Trzeba mu nakazaµ, aby za│adowa│ do komponentu MediaPlayer ╢cie┐kΩ do pliku, kt≤ry wybrali╢my w oknie OpenDialog. Wcale to nie jest takie trudne, nasza funkcja bΩdzie wiΩc wygl▒daµ:

void __fastcall TMainForm::OpenButtonClick(TObject *Sender)
{
   OpenDialog->Execute();
   MediaPlayer->FileName = OpenDialog->FileName;
   MediaPlayer->Open();
}

Sprawdzamy program, dzia│a? Wydawa│oby siΩ, ┐e tak. Wciskamy przycisk Otw≤rz, wybieramy plik, wciskamy OK i dzia│a, ale spr≤bujcie sprawdziµ co siΩ stanie je╢li zamiast OK wci╢niecie Cancel? Program sygnalizuje b│▒d, dlaczego? Dzieje siΩ tak poniewa┐ nie wybrali╢my ┐adnego pliku, a program chcia│ go przypisaµ do w│a╢ciwo╢ci FileName!!! Oczywi╢cie da siΩ to naprawiµ. Zmie±my nasz▒ funkcjΩ, aby wygl▒da│a tak:

void __fastcall TMainForm::OpenButtonClick(TObject *Sender)
{
   if (OpenDialog->Execute())
   {
      MediaPlayer->FileName = OpenDialog->FileName;
      MediaPlayer->Open();
   }
}

Teraz na pocz▒tku funkcji sprawdzane jest czy zamkniΩcie okna OpenDialog zako±czy│o siΩ po wci╢niΩciu przycisku OK (czyli je╢li wybrano plik), a je╢li tak to wykonywane s▒ instrukcje miΩdzy klamrami, w przeciwnym wypadku, gdy okno OpenDialog zamkniΩto przyciskiem Cancel (nie wybrano pliku) ┐adna instrukcja nie jest wykonywana.

Aby nasza animacja by│a uruchamiana automatycznie po wybraniu pliku, wpisujemy do funkcji:

void __fastcall TMainForm::OpenButtonClick(TObject *Sender)
{
   if (OpenDialog->Execute())
   {
      MediaPlayer->FileName = OpenDialog->FileName;
      MediaPlayer->Open();
      MediaPlayer->Play();
   }
}

A wiΩc g│≤wne zadanie programu mamy ju┐ wykonane, teraz mo┐emy siΩ zaj▒µ jego wygl▒dem.

Na pocz▒tek proponujΩ wybranie ikonki programu. Wy╢wietlamy menu Project->Options (lub u┐ywaj▒c skr≤tu SHIFT+CTRL+F11), wybieramy zak│adkΩ Application, klikamy Load Icon... i wybieramy ikonΩ dla programu (np. aviplayer1.ico z plik≤w do│▒czonych do tutoriala). Klikamy OK i mo┐emy odpaliµ nasz program. Jak widaµ ikonka pojawia siΩ na pasku tytu│u programu i w pasku zada± Windowsa. NastΩpnie pozmieniamy kilka opcji naszych komponent≤w. Na pocz▒tek OpenDialog:

  • Filter = kliknij tu dwukrotnie
  • InitialDir = ╢cie┐ka dostΩpu
  • Title = Otw≤rz plik z animacj▒

Znaczenie w│a╢ciwo╢ci:

  • Filter okre╢la jakie pliki wy╢wietlane bΩd▒ w oknie OpenDialog (np. w lewej kolumnie wpisujemy Animacje (*.avi), a w prawej kolumnie *.avi)
  • InitialDir zawiera ╢cie┐kΩ dostΩpu do jakiego╢ katalogu, kt≤rego zawarto╢µ bΩdzie wy╢wietlana po uruchomieniu okna OpenDialog (np. c:\)
  • Title zawiera tekst, kt≤ry pojawi siΩ na pasku tytu│u okna OpenDialog

Nasza animacja mo┐e byµ wy╢wietlana bezpo╢rednio na formularzu, a nie w nowym oknie. W tym celu z zak│adki komponent≤w Standard wybieramy Panel i umieszczamy go na formularzu, zmieniaj▒c jego opcje:

  • Caption = kasujemy zawarto╢µ
  • Height = 200
  • Left = 0
  • Name = EkranPanel
  • Top = 0
  • Width = 200

Znaczenie w│a╢ciwo╢ci:

  • Left okre╢la po│o┐enie lewej krawΩdzi panelu wzglΩdem formularza, tutaj maksymalnie dosuniΩty do lewej
  • Top okre╢la po│o┐enie g≤rnej krawΩdzi panelu wzglΩdem formularza, tutaj maksymalnie dosuniΩty do g≤ry

Zmieniamy te┐ w│a╢ciwo╢ci komponentu MediaPlayer:

  • Display = EkranPanel
  • Visible = false

Znaczenie w│a╢ciwo╢ci:

  • Display ustawia wy╢wietlanie animacji na panelu EkranPanel
  • Visible okre╢la, czy MediaPlayer bΩdzie widoczny podczas dzia│ania programu

Zmieniamy te┐ w│a╢ciwo╢ci komponentu OpenButton:

  • Left = 0
  • Top = 200
  • Width = 200

i w│a╢ciwo╢ci MainForm:

  • ClientHeight = 225
  • ClientWidth = 200

Znaczenie w│a╢ciwo╢ci:

  • ClientHeight okre╢la wysoko╢µ formularza dostΩpnego dla u┐ytkownika
  • ClientWidth okre╢la szeroko╢µ formularza dostΩpnego dla u┐ytkownika

Nie widzimy teraz na formularzu komponentu MediaPlayer poniewa┐ znajduje siΩ on pod panelem EkranPanel. Czasami tak siΩ zdarza, ┐e jedne komponenty przys│aniaj▒ drugie. Aby zmieniµ wtedy ich w│a╢ciwo╢ci mo┐emy wybraµ ten komponent z rozwijanej listy znajduj▒cej siΩ na g≤rze Inspektora Obiekt≤w. Uruchamiamy aplikacjΩ i animacja jest wy╢wietlana na panelu tylko, ┐e animacje o rozmiarze wiΩkszym od rozmiaru panelu s▒ obcinane. Aby animacja by│a dopasowana do wielko╢ci naszego panelu EkranPanel, do naszej funkcji do│▒czamy linijkΩ:

void __fastcall TMainForm::OpenButtonClick(TObject *Sender)
{
   if (OpenDialog->Execute())
   {
      MediaPlayer->FileName = OpenDialog->FileName;
      MediaPlayer->Open();
      MediaPlayer->DisplayRect = Rect(0, 0, 200, 200);
      MediaPlayer->Play();
   }
}

Zapraszam wszystkich do drugiego tutoriala, gdzie rozbudujemy program AviPlayer.

Je╢li nie mo┐esz siΩ doczekaµ nastΩpnych tutoriali to zapraszam na moj▒ stronΩ: "Borland C++ Builder (nie tylko) dla pocz▒tkuj▒cych" pod adresem www.borland.prv.pl. Znajdziesz tam wszystko co jest zwi▒zane z Borland C++ Builderem.

autor: Piotr W≤jtowicz (Hetman)
www: http://www.borland.prv.pl
e-mail: thehetman@poczta.fm