Szybko i bez błędów

Zwykle kursy programowania rozpoczyna się od żmudnego poznawania składni języka, pisania prostych aplikacji konsolowych ze sławnym ''Hello world!'' na czele. Dopiero w ostatnich częściach przechodzi się do bardziej atrakcyjnych przykładów, które zaczynają przypominać aplikacje, które chcielibyśmy pisać i dla których rozpoczynamy naukę danego języka. W prezentowanym kursie ten tradycyjny porządek zostanie odwrócony.

Zwykle kursy programowania rozpoczyna się od żmudnego poznawania składni języka, pisania prostych aplikacji konsolowych ze sławnym ''Hello world!'' na czele. Dopiero w ostatnich częściach przechodzi się do bardziej atrakcyjnych przykładów, które zaczynają przypominać aplikacje, które chcielibyśmy pisać i dla których rozpoczynamy naukę danego języka. W prezentowanym kursie ten tradycyjny porządek zostanie odwrócony.

Jest to możliwe dzięki zaletom zintegrowanych środowisk programistycznych IDE (Integrated Development Environment), które pozwalają szybko projektować interfejsy aplikacji metodą składania ich z gotowych komponentów za pomocą myszy nawet bez znajomości zawiłości programowania obiektowego. Nie jest to jedyna zaleta korzystania ze środowisk programistycznych. Oferują one także wygodny edytor wyróżniający słowa kluczowe, na bieżąco kontrolujący poprawność składni wpisywanego kodu i uzupełniający wyrażenia (własności i metody klas oraz argumenty metod). Nie do przecenienia są także wszelkiego typu kreatory, wbudowana pomoc i oczywiście możliwość kontrolowanego uruchamiania tworzonych projektów z debugerem współpracującym z edytorem. Te wszystkie cechy, a także narzędzia do projektowania aplikacji bazodanowych czynią nieracjonalnym alternatywny sposób pisania programów za pomocą zwykłego edytora i kompilatora uruchamianego z wiersza poleceń.

Pierwsza część kursu poświęcona jest środowiskom programistycznym C#, w szczególności środowisku Microsoft Visual C# 2003, będącym elementem Microsoft Visual Studio .NET 2003. Kilka słów poświęcę również konkurencyjnemu C# Builderowi firmy Borland i jego następcy, środowisku Delphi 2005. Wszystkie trzy środowiska łączy obsługa tej samej platformy .NET w wersji 1.1.4322. C# Builder ma tę wielką zaletę, że jego wersja Personal jest bezpłatna i nadal można ją ściągnąć ze strony http://www.borland.com/products/downloads/download_csharpbuilder.html .

Porównując oba środowiska, szybko dojdziemy do wniosku, że przy pierwszym kontakcie niewiele się one różnią. W obu znajdziemy te same elementy, także praktyka projektowania aplikacji jest ta sama. Nie jest to przypadek - rozwiązania platformy .NET wymuszają to podobieństwo. W szczególności oba środowiska korzystają z kompilatora platformy .NET, więc skompilowane aplikacje muszą być identyczne. Ponadto C# Builder potrafi odczytywać projekty konkurencji i eksportować plik projektu w tym formacie. Zapewniam, że bez względu na to, czy używasz Visual C#, czy C# Buildera, niniejszy kurs okaże się przydatny w równym stopniu. Na koniec warto jeszcze wspomnieć o projekcie Mono (już omówionym w tym dziale, w artykule "Nie NET, a Mono" z numeru 12/2004). Jest to nadal rozwijany projekt platformy uruchomieniowej .NET oraz środowiska programistycznego C# działającego w systemie Linux. Platforma osiągnęła już wysoką zgodność z pierwowzorem, ale IDE nadal daleko do funkcjonalności omawianych tu środowisk do Windows.

Tezę o wyższości stosowania zintegrowanych środowisk programistycznych do C# chciałbym poprzeć dwoma przykładami. W pierwszym utworzymy prostą aplikację, w której użytkownik będzie mógł ustalić kolor panelu za pomocą trzech suwaków kontrolujących składowe R, G oraz B. Na tym przykładzie krok po kroku omówimy tworzenie interfejsu aplikacji w widoku projektowania, korzystanie z palety komponentów, okna własności oraz określanie interakcji aplikacji z użytkownikiem. W pierwszym projekcie kod wpisywany "ręcznie" ograniczy się do jednego wiersza. Tylko nieco więcej będzie go w drugim przykładzie, w którym utworzymy aplikację wybijającą godziny. Mała ilość kodu jest jednak zamierzona, bo głównym celem tej części kursu jest oswojenie ze środowiskami programistycznymi. Natomiast poznawaniem tajników języka C# zajmiemy się już za miesiąc.

Pierwsza aplikacja C#. Poznajemy środowisko programistyczne

Przejdźmy do pierwszego projektu. Zgodnie z zapowiedzią, ma to być aplikacja, w której za pomocą trzech suwaków (komponentów TrackBar) określać będziemy kolor panelu (komponent Panel). Opis przygotowania, w tym jednym wypadku dość szczegółowy, będzie się odnosił do środowiska Microsoft Visual C# 2003, ale nie powinno być najmniejszych problemów, aby powtórzyć go także w Borland C# Builderze, Borland Delphi 2005, a nawet w najnowszej wersji Visual C# 2005 do .NET 2.0.

Tworzymy projekt aplikacji w Visual C#

Uruchamiamy środowisko Microsoft Visual Studio .NET 2003. Następnie naciskamy kombinację klawiszy [Ctrl Shift N], aby otworzyć okno New Project zawierające szablony projektów. Na karcie Visual C# Projects zaznaczamy ikonę Windows Application, wpisujemy w pole Name nazwę projektu, np. "Kolory", i klikamy przycisk OK.

Odpowiednia sekwencja czynności w C# Builderze wyglądałaby następująco: z menu File, podmenu New wybieramy pozycję C# Application. W oknie New Application w pole Name wpisujemy nazwę projektu, np. "Kolory", i klikamy OK.

Rysunek 1. Widok projektowania w środowisku Microsoft Visual C# 2003.

Rysunek 1. Widok projektowania w środowisku Microsoft Visual C# 2003.

Po chwili zobaczymy widok projektowania. Od tej pory sposób postępowania w poszczególnych środowiskach nie będzie się zasadniczo różnił (najbardziej kłopotliwa różnica to inne zdefiniowanie klawiszy skrótów). Aby ułatwić dalsze omawianie procedury projektowania aplikacji, nazwijmy poszczególne elementy środowiska w widoku projektowania (por. rysunki 1 i 2). Przede wszystkim mamy przed sobą podgląd formy (oznaczony na rysunkach numerem 1), w tej chwili jeszcze pustej. W Visual C# z prawej strony znajdują się dwa okna. Górne zawiera pliki projektu, jest to Solution Explorer (nr 2). W trakcie projektowania interfejsu szczególną rolę będzie odgrywało okno znajdujące się na dole prawego panelu (nr 3). Jest to okno własności, pozwalające na konfigurowanie własności formy i położonych na niej komponentów. Z lewej strony ukryte jest kolejne istotne okno, a mianowicie Toolbox (skrzynka narzędzi) (nr 4). Zawiera w tej chwili komponenty biblioteki Windows Forms, których możemy użyć do budowania interfejsu aplikacji. Jeżeli przez chwilę potrzymamy nad jego ikoną kursor myszy, rozwinie się. Natychmiast kliknijmy ikonę pinezki, aby nie pozwolić mu się schować. Wśród kart Toolbox na razie interesować będzie nas jedynie Windows Forms. W C# Builderze i Delphi 2005 zobaczymy bardzo podobny widok, tyle że inspektor obiektów (odpowiednik okna własności) znajduje się z lewej strony (por. cyfry na rysunkach), a paleta komponentów (odpowiednik Toolbox) - z prawej.

Budujemy interfejs aplikacji

Rysunek 2. Widok projektowania w środowisku Borland C# Builder
1.0. Niemal identycznie wygląda to w Delphi 2005.

Rysunek 2. Widok projektowania w środowisku Borland C# Builder

1.0. Niemal identycznie wygląda to w Delphi 2005.

W oknie Toolbox, na karcie Windows Forms zaznaczamy komponent Panel. Gdy przesuniemy kursor myszy nad podgląd formy, zobaczymy, że zawiera ikonę wybranego komponentu. Zaznaczamy obszar, który ma zająć wybrany komponent. Następnie z naciśniętym klawiszem [Ctrl] zaznaczamy komponent TrackBar (prawdopodobnie będzie trzeba przewinąć paletę, korzystając z ikony strzałki oznaczonej na rysunku jako 5).

Umieszczamy na formie trzy komponenty tego typu jeden pod drugim.

Proszę zwrócić uwagę, że symbol wybranego komponentu nie znika z kursora po umieszczeniu kontrolki na formie. To zasługa klawisza [Ctrl]. Aby usunąć zaznaczenie, należy kliknąć pozycję Pointer na palecie Visual C# lub strzałkę na pasku narzędzi palety w C# Builderze. Jeżeli mamy na formie za mało miejsca, możemy ją powiększyć. W tym celu wystarczy kliknąć niezajęty przez żaden komponent fragment okna w podglądzie i zmienić jego rozmiar, korzystając z charakterystycznych "łapek".

Zwróćmy uwagę na to, jak szybko powstał interfejs aplikacji. Ten sam efekt przy ręcznym tworzeniu kodu kosztowałby wprawionego programistę co najmniej pół godziny pracy. A projektując myszą, nie tylko możemy dowolnie cyzelować położenie każdego komponentu, ale także unikamy błędów, jakie zawsze powstają przy pisaniu kodu.

Rysunek 3. Edytor związany z własnościami typu Color pozwala na wybór jednego z predefiniowanych kolorów, w tym związanych z wybranym przez użytkownika zestawem kolorów systemowych.

Rysunek 3. Edytor związany z własnościami typu Color pozwala na wybór jednego z predefiniowanych kolorów, w tym związanych z wybranym przez użytkownika zestawem kolorów systemowych.

Przejdźmy do konfiguracji formy i umieszczonych na niej komponentów. Zaznaczamy formę. W oknie własności powinniśmy zobaczyć nazwę odpowiadającego jej obiektu Form1. W tym oknie odnajdujemy własność Text, odpowiadającą za napis na pasku tytułu okna, i zmieniamy go np. na "Kolory". Po naciśnięciu [Enter] zobaczymy nowy tytuł na podglądzie formy. Zaznaczamy wszystkie komponenty TrackBar. Można to zrobić, przytrzymując naciśnięty klawisz [Shift] lub [Ctrl]. Za pomocą okna własności ustalamy ich własności: Maximum na 255, TickFrequency na 15, SmallChange na 15 i LargeChange na 51. Następnie na podglądzie formy zaznaczamy komponent panel1. Jego własność BackColor zmieniamy na Black - kolor dostępny na karcie Web lub Custom edytora własności (zob. rysunek 3).

I w ten sposób interfejs naszej aplikacji jest już gotowy, przynajmniej jego statyczny aspekt. Kolejnym krokiem będzie zaprogramowanie reakcji aplikacji na manipulacje użytkownika elementami utworzonego interfejsu. Na zaprogramowanie tej "dynamiki" aplikacji pozwalają zdarzenia. Co to są zdarzenia? W skrócie: to wszelkie sytuacje wynikające z działania użytkownika, np. owo kliknięcie przycisku, ale także włożenie płyty CD do napędu. Może to być również sytuacja związana z działaniem systemu operacyjnego: zakończenie działania jakiegoś programu, włączenie wygaszacza ekranu lub niski poziom baterii w notebooku. Za pomocą okna własności możemy tworzyć metody zdarzeniowe, tj. metody, które będą automatycznie uruchamiane, gdy do naszej aplikacji dotrze informacja o zaistnieniu zdarzenia, np. o tym, że przesunięty został suwak.

W tym projekcie skupimy się na zdarzeniu ValueChanged, które zachodzi wówczas, gdy suwak TrackBar zmieni pozycję.


Zobacz również