Programowanie Wizualne WYKŁAD 4 Wojciech Pieprzyca
Pola i metody składowe klas Każdy program napisany w środowisku BCB składa się z co najmniej jednej klasy, która odzwierciedla zawartość i metody obsługujące komponenty formularza głównego. Klasa dla każdego formularza zdefiniowana jest w pliku nagłówkowym (rozszerzenie .h). Do pliku nagłówkowego można przejść z poziomu edytora kody naciskając sekwencję klawiszy Ctrl+F6. Wszystkie klasy dotyczące formularzy dziedziczą po klasie nadrzędnej TForm. class TForm1 : public TForm {…};
Pola i metody składowe klas Definicja klasy związanej z formularzem domyślnie zawiera 3 sekcje: __Published – zawiera deklarację obiektów (komponentów) umieszczonych na formularzu, ta sekcja jest rozszerzana automatycznie w miarę wstawiania na formularz kolejnych komponentów i nie powinna być zmieniana ręcznie przez programistę, Private – sekcja zawierająca prywatne pola i metody klasy, Public – sekcja zawierająca publiczne pola i metody klasy,domyślnie w tej sekcji umieszczane są wszystkie metody obsługi zdarzeń związanych z komponentami.
Pola i metody składowe klas Przykład definicji pól i metod składowych klasy formularza TForm1: class TForm1 : public TForm { __published: // IDE-managed Components TButton *Button1; TEdit *Edit1; private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner); };
Dystrybucja aplikacji Po utworzeniu programu zazwyczaj chcemy przekazać go końcowemu użytkownikowi. Do prawidłowego działania programu oprócz plików wykonywalnych, aplikacja musi mieć dostęp do tzw. bibliotek dynamicznych. W BCB biblioteki dynamiczne dostarczane są w formie pakietów – plików z rozszerzeniem BPL. Wyróżniamy pakiety zewnętrzne oraz pakiety wewnętrzne.
Rodzaje pakietów Pakiety zewnętrzne – zawierają kod wykonywalny niezbędny do pracy aplikacji. Jednym z takich pakietów jest pakiet VCL50.BPL zawierający kod biblioteki VCL potrzebny do prawidłowego działania komponentów. Pakiety wewnętrzne – to pakiety zawierające kod dotyczący prezentacji i działania komponentów w fazie projektowania aplikacji. Są one niezbędne tylko na etapie projektowania aplikacji, nie muszą być dołączane do finalnego programu.
Łączenie elementów aplikacji przez linker Łączenie statyczne - aplikacja łączona statycznie nie wykorzystuje pakietów. Wszystkie elementy bibliotek potrzebne do pracy aplikacji umieszczane są w jedenym pliku wykonywalnym. Uruchomienie takiego programu nie wymaga obecności żadnych dodatkowych plików (wyjątkiem od tej reguły są aplikacje bazodanowe oraz aplikacje wykorzystujące technologię ActiveX). Łączenie dynamiczne – aplikacja łączona w ten sposób w czasie uruchomienia, dynamicznie ładuje niezbędny kod z plików bibliotecznych (pakietów). Zazwyczaj w mniejszych aplikacjach stosuje się łączenie statyczne generujące jeden plik, a w większych programach łączenie dynamiczne.
Łączenie elementów aplikacji przez linker Domyślnie w Borland Builder C++ włączone jest łączenie dynamiczne tzn. stworzone aplikacje wymagają zewnętrznych bibliotek. Zmiana łączenia na statyczne wymaga poczynienia kilku zmian w opcjach projektu danej aplikacji. Zmian tych dokonujemy wybierając z menu Projects opcję Options. Następnie wybieramy zakładkę Compiler i klikamy na przycisk Release. Spowoduje to zmianę niektórych opcji. W następnym kroku należy przejść do zakładki Packages i odznaczyć opcję „Build with runtime packages”. Ostatniej zmiany dokonujemy w zakładce Linker, gdzie odznaczamy opcję „Use dynamic RTL”.
Łączenie elementów aplikacji przez linker
Debugger – punkty wstrzymania Debugger to narzędzie diagnostyczne będące częścią systemu BCB, służące do obserwowania poszczególnych instrukcji wykonywanego programu co może być przydatne w procesie wyszukiwania błędów w programie. Jedną z możliwości debuggera są punkty wstrzymania. Punkt wstrzymania powoduje chwilowe przerwanie wykonania programu w określonym miejscu kodu. W szczególności zatrzymanie programu może być uzależnione od ustalonego warunkowego punktu wstrzymania.
Debugger – punkty wstrzymania W celu ustawienia punktu wstrzymania należy w danym wierszu kodu programu kliknąć myszą w odpowiednim miejscu lewego marginesu. Spowoduje to pojawienie się na marginesie symbolu czerwonej kropki i wyróżnienie zaznaczonego wiersza kolorem czerwonym. Ponowne kliknięcie na ustawionym punkcie wstrzymania powoduje jego usunięcie. Alternatywnie do ustawienia/usunięcia punktu wstrzymania można użyć klawisza F5.
Debugger – punkty wstrzymania Uruchomienie programu z ustalonym punktem wstrzymania powoduje jego wykonanie do momentu osiągnięcia zaznaczonej instrukcji (punktu wstrzymania). Zazwyczaj po zatrzymaniu programu w ustalonym miejscu bada się zawartość zmiennych i stosu wywołań funkcji. Można także wywołać okno inspektora danych lub rozpocząć wykonywanie pracy w trybie krokowym (instrukcja po instrukcji). W celu kontynuacji wykonania programu po zajściu punktu wstrzymania należy kliknąć przycisk uruchomienia lub klawisz F9.
Debugger – punkty wstrzymania Aby zobaczyć listę wszystkich punktów wstrzymania ustalonych w całej aplikacji można wybrać z menu View/Debug Windows opcję Breakpoints FileName – nazwa pliku w którym ustalono przerwanie Line – numer linii z ustalonym przerwaniem Condition – warunek wystąpienia punktu przerwania Action – wykonywana akcja (Break – przerwanie)
Debugger – warunkowe punkty wstrzymania W przypadku warunkowych punktów wstrzymania, wykonywanie programu zostaje przerwane na danej instrukcji, dopiero wówczas gdy spełniony jest określony warunek (może on być związany z wartością określonej zmiennej lub liczbą przejść przez dany wiersz kodu np. w przypadku pętli). W celu ustalenia warunkowego punktu wstrzymania należy najpierw utworzyć zwykły punkt wstrzymania w pożądanym miejscu, a następnie zmodyfikować parametry punktu wstrzymania (klikając na symbolu wstrzymania i wybierając opcję Breakpoint properties).
Debugger – warunkowe punkty wstrzymania Warunek (Condition) jest zwykłym wyrażeniem np. y==0, y>2, itp. lub jest określony przez liczbą przejść (Pass count). Przykładowo wpisanie jako warunku y<2 spowoduje, że punkty wstrzymania będzie aktywny tylko dla wartości zmiennej y mniejszej od 2. W przeciwnym przypadku nie będzie żadnych efektów działania punktu wstrzymania.
Debugger – Run to Cursor, Watch list Polecenie Run to Cursor (dostępne z menu Run lub poprzez naciśnięcie klawisza F4) powoduje wykonanie programu do momentu osiągnięcia instrukcji wskazanej w kodzie programu. Za pomocą narzędzia Watch list (opcja View/Debug Windows/Watches) można śledzić zawartość zmiennych. Pozwala to na bieżącą obserwację wartości zawartych w zmiennych w trakcie wykonywania kolejnych instrukcji programu.
Debugger – Watch list Zmienną można dodać do listy obserwowanych zmiennych w oknie Watch list poprzez naciśnięcie prawego klawiszy myszy i wybranie opcji Add watch.
Debugger - Podgląd zmiennych W czasie wykonania programu możliwe jest także podglądanie zawartości zmiennych poprzez najechanie na daną zmienną kursorem i zatrzymanie się nad nią. Na poniższym rysunku, widać, że obliczona zmienna z ma wartość 15. Podgląd działa także dla typów złożonych np. tablic:
Debugger - Inspektor danych Inspektor danych pozwala na podgląd nie tylko zmiennych podstawowych, ale również właściwości komponentów i pól obiektów. Możemy w ten sposób podglądnąć aktualne właściwości np. formularza. W celu aktywacji Inspektora danych, w czasie uruchomienia programu, należy zaznaczyć odpowiedni komponent (obiekt) w kodzie, a następnie wybrać z menu Run opcję Inspect lub też nacisnąć sekwencję klawiszy Alt+F5.
Debugger - Praca krokowa Praca krokowa umożliwia obserwowanie wykonywanego programu instrukcja po instrukcji. Pozwala to m.in. zobaczyć jaka jest kolejność wykonywania instrukcji i które instrukcje są faktycznie wykonywane (przy bardziej skomplikowanych sekwencjach warunkowych i pętlach wcale nie musi to być takie oczywiste). Do wykonania kolejnego kroku służą polecenia Step Over (F8) lub Trace Into (F7). Różnica widoczna jest w przypadku instrukcji wywołania funkcji. W przypadku Step Over, funkcja wywoływana jest w całości i nie analizujemy jej zawartości krokowo, w przypadku Trace Into, również sama funkcja jest analizowana krok po kroku.