Borland C++ Builder_Cwiczenia.pdf

(661 KB) Pobierz
Podstawy programowania RAD z u¿yciem narzêdzi Borland Delphi/C++ Builder
Podstawy programowania RAD
z użyciem narzędzi
Borland Delphi/C++ Builder
Ćwiczenia
Toruń, 21 marca 2003
Najnowsza wersja tego dokumentu znajduje się pod adresem
Źrdła opisanych w tym dokumencie programw znajdują się pod adresem
I. Spis treści
2
II. Podstawy programowania RAD
1. Pojęcia podstawowe
RAD = Rapid Application Development (błyskawiczne tworzenie aplikacji)
C++ Builder Î zintegrowane środowisko programistyczne (edytor + kompilator + debugger) przeznaczone dla systemu
Microsoft Windows 9*/ME i NT/2000/XP oparte na języku C++
Delphi Î j.w., ale w oparciu o Object Pascal
komponenty Î obiekty (pochodne klasy TComponent) zarejestrowane w środowisku C++ Builder/Delphi i dostępne na
palecie komponentw w trakcie projektowania aplikacji
VCL = Visual Component Library Î biblioteka komponentw dostarczanych przez Borland
Microsoft Visual Basic Î konkurencja na rynku RAD.
2. Z czego składa się ápustyÑ projekt?
Funkcjonalność aplikacji stworzonej przez środowisko: Skompilować ápustyÑ projekt. Sprawdzić działanie aplikacji
(zmiana rozmiaru okna, przenoszenie, zamykanie, itp.)
Rodzaje form: BorderStyle, FormStyle, Caption, Arrow, itp.
3. Podstawy projektowania RAD
TLabel: Dodać do projektu formy obiektu klasy TLabel i edytować jego własności (Caption, Caption z accel char np.
&Zamknij, Color, Font, Visible).
TButton: Analogicznie umieścić na formie Button1 i edytować własności oraz metodę zdarzeniową związanej ze
zdarzeniem OnClick (zamknięcie aplikacji przez Close() i przez Application->Terminate() ). Zmiana
własności Label1 podczas działania programu.
4. TImage i TOpenDialog
TImage: Wrzucić na formę obiekt klasy TImage (zakładka VCL: Additional) i wczytać bitmapę. Dodać klawisz i w
metodzie zdarzeniowej obsłużyć czytanie obrazu z pliku funkcją
Image1->Picture->LoadFromFile() .
TOpenDialog: Poprawić projekt używając okna dialogowego do wyboru pliku (należy zadbać, aby pozwolić na
czytanie tylko z istniejącego pliku).
Zadanie: zastąpić TImage komponentem TMemo i korzystając z TOpenDialog i TSaveDialog przygotować aplikację
analogiczną do Notatnika w Windows.
7. Menu głwne, kontekstowe
Edytor menu głwnego i menu kontekstowego. Wielopoziomowe, złożone menu. Do poprzedniej aplikacji dodać menu
głwne (Plik\Wczytaj..., Zapisz.... oraz Zamknij).
5. Dodawanie form do projektu
Dodać formę do projektu. Pojęcie formy głwna . Własność TApplication->ShowMainForm . Rżnica między
efektami metod TForm->Show() i ShowModal() .
6. Komponenty sterujące
Na Form2 z poprzedniego punktu umieść dwa suwaki klasy TScrollBar sterujące rozmiarem Form1 oraz TForm2-
>Edit1 sterujący własnością TForm1->Caption . Określanie własności TScrollBar->Min , Max i korzystanie
z własności Position . Dołączenie ProgressBar odzwierciedlającego szerokość lub wysokość formy ( Form-
>OnResize )
3
8. Pliki projektu:
C++ Builder
Delphi
Opis
*.mak lub *.bpr
*.dpr
Głwny plik projektu (rozszerzenie zależy od wersji Buildera)
*.dfo
Informacje o opcjach projektu (w C++ Builderze informacje te
umieszczone są w pliku projektu)
*.cpp i *.h
*.pas
Pliki z kodem C++; osobny plik o tej samej nazwie, co projekt i
po jednym dla każdej formy; ponadto użytkownik może pisać i
dodawać do projektu własne moduły
*.dfm
*.dfm
Pliki, w ktrych Builder przechowuje informacje o
zaprojektowanych przez użytkownika elementach formy (w obu
środowiskach format tych plikw jest identyczny)
*.ilc, *.ild, *.ilf, *.ils,
*.tds
Pliki tworzone przez kompilator dla przyspieszenia kompilacji Î
można je bez straty skasować
*.obj
*.dcu
Skompilowane formy i inne objekty tworzone przez
użytkownika w oddzielnych plikach; można je skasować jeżeli
posiadamy źrdła
*.res
*.res, *.dcr
Pliki zasobw (format plikw *.res jest identyczny w obu
środowiskach); plik *.dcr przechowuje zasoby (bitmapy,
kursowy), ktrych wymaga tworzony przez użytkownika
komponent Î np. ikonę jaka pojawi się na palecie.
*.~*
*.~*
Backupy edytora Î można je rwnież kasować
Warto przygotować sobie plik wsadowy (C++ Builder):
@echo off
del *.~*
del *.bak
del *.ilc
del *.ild
del *.ilf
del *.ils
del *.obj
del *.tds
del *.dat
del *.exe
9. Owner vs. Parent
Konwencja: listingi zielone dotyczą C++ Buildera , a niebieskie Delphi .
Komponent1 . Owner Î wskazuje na właściciela, tj. komponent odpowiedzialny za zwolnienie pamięci zajmowanej
przez Komponent1 . Jest to zazwyczaj obiekt, w ktrego deklaracji znajduje się wskaźnik do Komponent1 (np.
Form1). Usunięcie z pamięci właściciela spowoduje usunięcie także wszystkich obiektw, ktrego jest właścicielem.
Komponent1 . Parent Î wskazuje na rodzica, tj. obiekt wewnątrz ktrego znajduje się (czyli po prostu ánarysowany
jestÑ) Komponent1 (mogą to być komponenty typu panel, grupa, forma i inne pochodne względem TWinControl).
Zmiana położenia rodzica spowoduje odpowiednią zmianę położenia dziecka.
Każdy komponent dziedziczący po TComponent zawiera listę wszystkich komponentw, ktrych jest właścicielem
Components (warto rwnież zwrcić uwagę na własność ComponentCount, ktra przechowuje informację o ilości
komponentw w tej liście), a komponent pochodny TWinControl posiada listę swoich dzieci Controls (i analogicznie
ControlCount).
Uwaga! Pewne zamieszanie wprowadza używanie terminu árodzicÑ przy opisie dziedziczenia klas. Ani Owner, ani
Parent nie ma z tym nic wsplnego.
4
384445513.001.png
Przykład dynamicznej zmiany własności Parent i wykorzystywania listy Components
Stwrzmy dwie formy wg wzoru:
Do przyciskw áCloseÑ i áFreeÑ na Form2 podłączmy metody wywołujące odpowiednio ukrycie formy i usunięcie
formy z pamięci.
Początkowo będą nas interesować dwa przyciski z wytłuszczonymi etykietami. Chcemy, aby kliknięcie formy, panelu i
groupboxa zmieniało właściciela tych przyciskw na kliknięte obiekty. W tym celu musimy ze zdarzeniem OnClick
każdego z tych obiektw związać metodę zawierającą polecenia typu (przykład dla Panel1Click):
Form1.Button1.Parent:=Panel1;
Form2.Button1.Parent:=Panel1;
Oczywiście w metodach odnoszących się do innych obiektw musi zmienić się wartość przypisana do własności
Parent. Po skompilowaniu możemy zobaczyć, że przyciski można przenosić nie tylko w obrębie formy, ale i pomiędzy
dwoma formami tej samej aplikacji. Przyciski zachowują swoją wielkość i relatywne położenie względem grnego
lewego rogu rodzica, więc jeżeli przycisk przenosimy np. z formy na mniejszy od niej panel może się zdarzyć, że
położenie przycisku spowoduje, że nie mieszcząc się w obrębie panelu nie będzie on w ogle widoczny.
Wykorzystując klawisz áFreeÑ można się przekonać, że przycisk áForm2.Button1Ñ zostanie usunięty wraz z Form2,
nawet jeżeli aktualnym rodzicem jest Form1. (Po usunięciu Form2 kliknięcie panelu, grupy lub Form2 spowoduje błąd,
gdyż nastąpi odwołanie do Form2.Button2, ktry już nie istnieje.)
Do klawisza áPodaj liczby dzieciÑ (osobno dla każdej z form) podłączmy metodę, ktra wyświetli na etykiecie formy
liczbę obiektw, ktrych każda z form jest właścicielem i rodzicem:
procedure TForm1.Button2Click(Sender: TObject);
var S :String;
begin
//Rodzic (Parent)
Str(Form1.ControlCount,S); Form1.Caption:='Parent:'+S;
Str(Form2.ControlCount,S); Form2.Caption:='Parent:'+S;
//Właściciel (Owner)
Str(Form1.ComponentCount,S); Form1.Caption:=Form1.Caption+', Owner:'+S;
Str(Form2.ComponentCount,S); Form2.Caption:=Form2.Caption+', Owner:'+S;
end;
Z kolei klawisz áKradnij dzieciÑ będzie służyć do zmiany rodzica komponentw, ktrych obecnym rodzicem jest
Form1:
procedure TForm2.Button4Click(Sender: TObject);
var i :Integer;
begin
for i:=0 to Form1.ControlCount-1 do Form1.Controls[0].Parent:=Form2;
//Ustawienie w tablicy Controls zmienia sie po kazdej
5
384445513.002.png 384445513.003.png
Zgłoś jeśli naruszono regulamin