BETA
Aby się zalogować, najpiew wybierz portal.
Aby się zarejestrować, najpiew wybierz portal.
Podaj słowa kluczowe
Słowa kluczowe muszą mieć co najmniej 3 sąsiadujące znaki alfanumeryczne
Pole zawiera niedozwolone znaki

Baza wiedzy











Visual Studio .NET 2003

03-10-2003 12:46 | User 107543

W Visual Studio .NET 2003 można także tworzyć aplikacje przeznaczone dla urządzeń przenośnych – takich jak urządzenia PDA czy „inteligentne” telefony. Mogą to być albo aplikacje Web, oparte na ASP.NET i specjalnych kontrolkach, albo rozbudowane aplikacje typu SDA (Smart Device Application).

W tym artykule przedstawiony zostanie rozwiązanie, gdzie współpracować będą ze sobą projekty wykorzystujące różne platformy. Zaprojektowany zostanie prosty system do „rozmówek” internetowych (a raczej – do przesyłania komunikatów).

W pierwszym kroku należy stworzyć usługę Web, która będzie pełnić rolę „centralnego” repozytorium wiadomości. Do przechowywania można zastosować różne strategie. Może to być zapisywane w bazie danych (np. Microsoft SQL Server 2000 czy MSDE), można też wykorzystać plik – np. XML.

Jednak w tym przypadku zostało zastosowane inne rozwiązanie. W momencie uruchamiania aplikacji ASP.NET tworzony jest globalny obiekt – DataSet, przechowywany w pamięci (istnieje on tak długo jak dana aplikacja (usługa Web) działa). Pełni on rolę centralnego repozytorium, do którego klienci dopisują nowe „wiadomości”. Usługa Web musi zawierać także metodę do zwracania może „na życzenie” zwrócić listę przechowywanych komunikatów.

Klientami „rozmówek” będą przykładowe aplikacje – dla PocketPC (typu SDA), aplikacja Web Forms która może działać na dowolnym urządzeniu przenośnym, normalny klient WinForms i Web Forms, a także program napisany w C++, korzystający z możliwości jakie daje managed extension (i nowe narzędzia do projektowania interfejsu użytkownika w Visual C++).

Przykład zakłada, że dostępny jest serwer IIS (najlepiej – jeżeli będzie on zainstalowany lokalnie na tej samej maszynie co Visual Studio 2003). Pełny kod rozwiązania jest dostępny na stronach Microsoft.

Implementacja usługi Web

Aby stworzyć nową usługę Web w Visual Studio 2003, należy otworzyć okno New Project (np. wchodząc w menu FileNew). Następnie wybrać Visual C# Projects i wzorzec ASP.NET Web Services. W polu Location należy podać ścieżkę do serwera WWW gdzie usługa ma być utworzona. Może to być np. adres localhost (jeżeli serwer jest zainstalowany lokalnie), adres IP, lub też adres innego serwera IIS gdzie użytkownik ma prawo tworzenia nowych aplikacji WWW. Usługę należy nazwać EveretKiKWebService.

Rysunek 1 Nowy projekt Usługi Web

Po naciśnięciu OK zostanie utworzona usługa Web w katalogu wirtualnym IIS o nazwie EveretKiKWebService.

W kolejnym kroku należy utworzyć DataSet, który będzie używany do przechowywania komunikatów. Z menu podręcznego przy projekcie, należy wybrać pozycję Add, a potem Add New Item

Rysunek 2 Dodanie nowego elementu do projektu

Następnie należy wybrać element Data Set i wpisać nazwę dsData.xsd.

Rysunek 3 Dodanie Data Set

Po dodaniu nowego Data Set zostanie od razu otworzony projektant. W naszym przypadku projektowany obiekt będzie bardzo prosty. Należy dodać nowy element (przeciągając go z paska narzędziowego Toolbox) i dodać składową Info typu string (będzie ona przechowywać komunikaty)

Rysunek 4 Projektowanie Data Set

Aby utworzyć trwałą instancję tego obiektu Data Set, należy zmodyfikować kod w pliku Global.asax zawierający procedury uruchamiane m. innymi w momencie startu aplikacji (czy też – otworzenia sesji).

W tym celu z menu podręcznego należy wybrać polecenie View Code, które spowoduje, że zostanie otworzony edytor tekstowy.

Rysunek 5 Otworzenie okna do edycji kodu

Zmianę należy wprowadzić tylko w funkcji Application_Start, zgodnie ze wzorem pokazanym poniżej:

namespace EveretKiKWebService

{

[...]

     public class Global : System.Web.HttpApplication

     {

[...]

          protected void Application_Start(Object sender, EventArgs e)

          {

              Application["DS"]=new dsData();

          }

[...]

     }

}

Obiekt Application w ASP.NET jest globalnym obiektem wspólnym dla wszystkich sesji. Można w nim przechowywać niewielkie „globalne” obiekty. Przechowywanie w nim dużej ilości informacji zmniejsza wydajność aplikacji – chociażby z powodu konieczności synchronizowania dostępu do tego obiektu. W naszym przypadku w Application, w kluczu o nazwie DS została umieszczona instancja Data Set dsData.

W kolejnym kroku można już zaimplementować właściwą usługę Web. Do rozwiązania należy dodać nowy składnik typu Web Service o nazwie Repository.asmx (z menu podręcznego wybrać AddAdd New Item). Będzie to główny plik, w którym zaimplementowana zostanie właściwa funkcjonalność usługi Web. Po otworzeniu okna z kodem, należy wprowadzić dwie metody, zgodnie z poniższym wzorcem:

using System;

using System.Collections;

using System.ComponentModel;

using System.Data;

using System.Diagnostics;

using System.Web;

using System.Web.Services;

 

namespace EveretKiKWebService

{

   public class Repository : System.Web.Services.WebService

   {

[...]

 

      [WebMethod]

      public DataSet Append(string from,string tekst) {

       dsData ds=(dsData) Application["DS"];

       ds.MyData.AddMyDataRow(from + " - " + tekst);

       ///Ogranieczenie wielkości

       if(ds.MyData.Rows.Count>20) ds.MyData.Rows[0].Delete();

       return ds;

     }

 

     [WebMethod]

     public DataSet Get() {

       return (DataSet)Application["DS"];

     }

  }

}

[...]

Przekształcenie funkcji w Visual Studio 2003 w usługę Web sprowadza się do dodania atrybutu [WebMethod]. W tym przypadku wystarczą dwie usługi Web. Get zwraca Data Set zawierający wszystkie komunikaty. Append dodaje nowy komunikat i także zwraca Data Set. Dodatkowo, Append ogranicza maksymalną liczbę elementów znajdujących się w Data Set. Jeżeli przekroczą 20 – najstarszy zostanie usunięty. Dzięki temu obiekt przechowywany w Application nie będzie nadmiernie rósł.

Po skompilowaniu projektu można już przetestować działanie usługi Web. Najprościej jest ustawić stronę startową na Repository.asmx (jeżeli w danym rozwiązaniu znajduje się więcej projektów, warto sprawdzić, czy. Wtedy wystarczy nacisnąć klawisz F5, by rozpocząć śledzenie usługi Web.

 

Rysunek 6 Ustawianie projektu i strony startowej do testowania usługi Web

Rysunek 7 Automatycznie generowana przez .NET strona pozwalająca przetestować usługi Web

Rysunek 8 Testowanie usługi Append

Rysunek 9 Wynik działania usługi

Aplikacja Windows Forms

Pierwszą aplikacją kliencką, która będzie korzystać z usługi Web będzie program wykorzystujący Windows Forms.

W pierwszym kroku stworzyć odpowiedni projekt. Tak samo jak w przypadku usługi Web, należy wejść w menu FileNewProject. Następnie wybrać typ projektu Visual C#, oraz wzorzec Windows Application i wpisać nazwę aplikacji WinKiK.

Zostanie otworzony nowa formatka, gdzie można zacząć tworzyć interfejs użytkownika pozwalający skorzystać z usługi Web. Należy dodać kilka kontrolek:

  • Kontrolkę listy (ListBox), o nazwie listMsg. Będzie ona wyświetlać komunikaty pobrane z usługi Web

  • Dwie kontrolki do wprowadzania tekstu (TextBox), o nazwach txtFrom oraz txtText. Będą one służyć do wpisywania treści komunikatów wysyłanych do usługi Web.

  • Przycisk (Button) o nazwie cmdSend, który wysyła nowy komunikat.

  • Przycisk (Button) o nazwie cmdRefresh, który ma „odświeżać” listę komunikatów z serwera.

  • Wszystkie elementy należy przeciągnąć na formatkę i ułożyć na przykład tak jak na poniższym rysunku.

    Rysunek 10 Gotowy projekt formatki

    Następnie należy dodać usługę Web. W tym celu należy w Solution Explorer kliknąć na Web Reference i z menu podręcznego pod prawym przyciskiem wybrać Add Web Reference.

    Rysunek 11 Dodawanie nowej usługi Web

W następnym kroku należy wskazać adres serwera i ścieżkę do usługi Web. W Visual Studio 2003 programista ma do wyboru następujące sposoby wyszukiwania usług Web:

  • Przeglądanie usług zainstalowanych na lokalnym serwerze. Pozwala to łatwo połączyć się z usługą która np. obecnie jest tworzona na tej samej maszynie. Tak jest w przypadku usługi EveretKiKWebService.  

  • Wyszukanie serwerów UDDI w lokalnej sieci.

  • Skorzystanie z ogólnoświatowych repozytoriów.

Rysunek 12 Wyszukiwanie usług Web

Można także wpisać adres usługi Web. Należy tylko pamiętać, że adres usługi Web powinien mieć taką postać, by program klient mógł go znaleźć. Podanie np. http://localhost spowoduje, że do danej usługi może odwołać się tylko program działający na lokalnym komputerze, a nie np. uruchomiony gdzieś w sieci.

Oczywiście w trakcie działania programu można dynamicznie podmienić adres, pod którym znajduje się dana usługa (a adres np. wczytać z pliku konfiguracyjnego). Jednak w naszym przypadku najprościej jest podać adres posługując się lokalną nazwą komputera. Pozwoli to na swobodne korzystanie z aplikacji w sieci lokalnej.

Rysunek 13 Dodanie usługi Web

Po kliknięciu na przycisk Add Reference, do projektu zostanie dodana usługa Web. Wygenerowana zostanie klasa o nazwie podanej w polu Web reference name (w tym przypadku MyWebService).

Ostatnią operacją, jaką należy wykonać, jest oprogramowanie dwu przycisków do wysyłania i odświeżania listy komunikatów. Jeżeli czytelnik dwa razy kliknie na przycisk cmdSend, zostanie automatycznie otworzone okno do wprowadzania kodu, z utworzoną funkcją cmdSend_Click.

Wywołanie usługi Web jest bardzo proste. Najpierw należy stworzyć instancję klasy MyWebService:

     MyWebService.Repository ws=new MyWebService.Repository();

Następnie można już wywoływać poszczególne metody – co odpowiada wywołaniu usługi Web:

     ws.Append("Przykładowy tekst","Przykładowy tekst");

W naszym przypadku warto wykonać jeszcze kilka operacji. Po pierwsze, usługa zwraca kolekcję komunikatów, które powinny być wyświetlone w liście. Należy je przechować i wyświetlić w listMsg. W tym celu w klasie dodana została zmienna typu DataSet (o nazwie dataSet1). Dodatkowa funkcja MyBind „związuje” tabelę DataSet z listą. Dzięki temu komunikaty pobrane z DataSet są prawidłowo wyświetlane. Można by oczywiście stworzyć ponownie DataSet z mocną kontrolą typów (czy – przekazać typ z usługi Web), jednak w tym przypadku prościej jest użyć Data Set bez mocnej kontroli typów.

namespace WinKiK

{

[...]

 

   DataSet dataSet1=new DataSet();

 

   private void MyBind() {

     listMsg.DataSource=dataSet1.Tables[0];

     listMsg.DisplayMember="Info";

   }

[...]

 

}

Ostatecznie funkcja obsługująca „kliknięcie” na przycisk cmdSend ma postać:

   private void cmdSend_Click(object sender, System.EventArgs e) {

     MyWebService.Repository ws=new MyWebService.Repository();

     dataSet1=ws.Append(txtFrom.Text,txtText.Text);

     MyBind();

   }

Wywoływana jest usługa Web Append, do której przekazywane są wartości wprowadzone w dwa okna tekstowe. Funkcja Append dodatkowo zwraca Data Set, który przypisywany jest do dataSet1 i przy użyciu pomocniczej funkcji MyBind związywany z listą.

W analogiczny sposób można dodać procedurę obsługi przycisku cmdRefresh. Tym razem wykorzystywana jest metoda Get z usługi EveretKiKWebService:

   private void cmdRefresh_Click(object sender, System.EventArgs e) {

     MyWebService.Repository ws=new MyWebService.Repository();

     dataSet1=ws.Get();

     MyBind();

   }

}

Po wprowadzeniu takich zmian w kodzie, pierwszy program kliencki jest gotowy i można go uruchomić. Po naciśnięciu F5, powinno się ukazać okno podobne do poniższego:

Rysunek 14 Działająca aplikacja

Śledzenie usług Web

W Visual Studio 2003 łatwo można śledzić wywołanie usług Web, i samo wykonanie danej usługi. Można, wykonując program krok po kroku przenieść się z kodu aplikacji klienckiej do kodu usługi Web i zobaczyć kolejno wykonywane operacje na serwerze.

Aby to przetestować, najlepiej ustawić pułapkę w kodzie funkcji cmdSend_Click. Po uruchomieniu programu i próbie wysłania komunikatu, aplikacja zostanie wstrzymana w linii wskazywanej przez punkt przerwania. Następnie można nacisnąć F11 by przejść do kodu usługi Web – i tam dalej wykonywać program krok po kroku.

Rysunek 15 Śledzenie krok po kroku wywołanej usługi Web

Aplikacja SDA – program dla PocketPC

Jako drugi przykład zbudujemy aplikację typu SDA przeznaczoną dla komputerów PocketPC (2000 i 2002), oraz ew. innych urządzeń wyposażonych w Windows CE. Aplikacje takie korzystają z motoru .NET Compact Framework, który pozwala uruchamiać na komputerach typu PDA programy .NET.

Tym razem tworząc nowy projekt, należy wybrać wzorzec Smart Device Application, i podać nazwę projektu SdaKiK.

 

Rysunek 16 Tworzenie projektu SDA

W kolejnym kroku kreatora należy określić docelowe urządzenie – w naszym przypadku należy wybrać platformę Pocket PC i typ projektu Windows Application. Platforma PocketPC jest „klasyczną” platformą PDA. Windows CE obejmuje znacznie szerszą gamę rozwiązań (w tym – systemów osadzonych). Oczywiście – po utworzeniu projektu można zmienić platformę (czy – urządzenie wykorzystywane do testowania danego rozwiązania).

Rysunek 17 Określenie platformy docelowej

Podobnie jak w przypadku projektów Windows Forms, po utworzeniu projektu od razu otwierana jest formatka w której należy zaprojektować interfejs użytkownika. Interfejs użytkownika jest analogiczny do tego, opracowanego w projekcie Windows Forms. Na formatce należy umieścić:

  • Kontrolkę listy (ListBox), o nazwie listMsg. Będzie ona wyświetlać komunikaty pobrane z usługi Web

  • Dwie kontrolki do wprowadzania tekstu (TextBox), o nazwach txtFrom oraz txtText. Będą one służyć do wpisywania treści komunikatów wysyłanych do usługi Web.

  • Przycisk (Button) o nazwie cmdSend, który wysyła nowy komunikat.

  • Przycisk (Button) o nazwie cmdRefresh, który ma „odświeżać” listę komunikatów z serwera.

  • Proszę zauważyć, że sposób umieszczania, czy zestaw kontrolek w aplikacjach typu SDA i Windows Forms jest analogiczny – różnią się one w zasadzie tylko wyglądem oraz – pewnymi ograniczeniami wynikającymi z limitów nakładanych przez PDA.

    Dodawanie usługi Web odbywa się w taki sam sposób jak w przypadku aplikacji Windows Forms. W Solution Explorer należy kliknąć na Web Reference i z menu podręcznego pod prawym przyciskiem wybrać Add Web Reference. Następnie należy wskazać adres serwera i ścieżkę do usługi Web (lub wyszukać ją używając mechanizmu UDDI). Warto też pamiętać o tym, że urządzenie PDA musi „widzieć” usługę – znowu najwygodniej jest wskazać usługę posługując się lokalną nazwą komputera.

    Po kliknięciu na przycisk Add Reference, do projektu zostanie dodana usługa Web. Wygenerowana zostanie klasa o nazwie podanej w polu Web reference name (w tym przypadku zakładamy, że będzie to MyWebService).

    Ostatnią operacją, jaką należy wykonać, jest oprogramowanie dwu przycisków do wysyłania i odświeżania listy komunikatów.

    Proszę kliknąć dwa razy na przycisk cmdSend. Zostanie automatycznie otworzone okno do wprowadzania kodu, z utworzoną funkcją cmdSend_Click – tak samo jak to działo się w przypadku programu wykorzystującego Windows Forms. W analogiczny sposób można wygenerować szkielet kodu obsługującego drugi przycisk cmdRefresh. Dzięki temu, że API .NET Compact Framework jest niemal takie samo jak w „dużym” .NET, nawet kod uruchamiany na urządzeniu PDA będzie identyczny. Poniżej pokazany jest pełny kod klienta dla tego typu „komputerków”:

    namespace SdaKiK

    {

         public class Form1 : System.Windows.Forms.Form

         {

    [...]

       private DataSet dataSet1;

     

       private void MyBind() {

         listMsg.DataSource=dataSet1.Tables[0];

         listMsg.DisplayMember="Info";

       }

       private void cmdSend_Click(object sender, System.EventArgs e) {

         MyWebService.Repository ws=new MyWebService.Repository();

         dataSet1=ws.Append(txtFrom.Text,txtText.Text);

         MyBind();

       }

       private void cmdRefresh_Click(object sender, System.EventArgs e) {

         MyWebService.Repository ws=new MyWebService.Repository();

         dataSet1=ws.Get();

         MyBind();

       }

    [...]

    }

    Dokładnie w taki sam sposób wywoływana jest usługa Web, tak samo odczytywany jest tekst wprowadzony w pola tekstowe. Co więcej – dokładnie w taki sam sposób obsługiwany jest DataSet. Praktycznie (poza wyglądem) nie ma różnic pomiędzy Windows Forms działającym na dużym PC-cie a programem przeznaczonym dla PDA.

    Po wprowadzeniu powyższych zmian w kodzie, program można wystartować. Domyślnie zostanie on uruchomiony w emulatorze instalowanym razem z Visual Studio 2003:

    Uruchamianie aplikacji na PocketPC i w emulatorze

    Programista może traktować emulator jako swoją główną platformę, na której testuje rozwiązanie. Działa on dosyć szybko – a co więcej, szybko „wgrywany” jest zmodyfikowany program na emulowane urządzenie. Jeżeli trzeba jednak przetestować aplikację na realnym urządzeniu, wystarczy zmienić właściwość Deployment Device danego rozwiązania.

     

    Rysunek 18 Zmiana docelowego urządzenia

     

    Wszystkie opcje związane z komunikacją z urządzeniem określa się w specjalnym oknie, otwieranym po wejściu w ToolsOptions, i wyborze gałęzi Device Tools.

    Rysunek 19 Konfiguracja sposobu komunikacji z urządzeniem

    Aplikacja w C++

    Trzecim typem klienta dla usługi EveretKiKWebService będzie aplikacja w C++, wykorzystująca tzw. Managed Extension. W tego typu aplikacji można łączyć „normalny” kod w C/C++ z tzw. kodem zarządzalnym, który wymaga stosowania specjalnych, dodatkowych słów kluczowych, ale za to pozwala skorzystać z wygodnego API .NET Framework.

    Po otworzeniu okna New Project, należy wybrać typ projektu Visual C++ Projects – .NET, i wskazać wzorzec Windows Forms Application. Tworzone będzie rozwiązanie o nazwie CPPWinForm, gdzie (tak jak w przypadku poprzednich projektów) na jednej formatce znajdować się będzie lista oraz przyciski do wysyłania komunikatów.  

    Rysunek 20 Tworzenie projektu w Managed C++

    Po utworzeniu projektu, Visual Studio 2003 od razu otwiera domyślną formatkę (wygląd formatki zdefiniowany jest w pliku nagłówkowym (z rozszerzeniem .h) i aby przejść do edycji formatki – wystarczy w Solution Explorer dwukrotnie kliknąć na odpowiedni plik .h).

    Interfejs projektowania okien w Managed C++ jest dokładnie taki sam jak w C# czy w VB.NET. Po lewej stronie programista ma znany pasek z dostępnymi narzędziami. Dodanie kontrolki na formatce polega na przeciągnięciu odpowiedniej ikony na obszar projektanta. Tak samo dodawane są procedury obsługi zdarzeń – można je wybrać z okna właściwości. Po dwukrotnym kliknięciu na daną kontrolkę Visual Studio 2003 automatycznie doda obsługę domyślnego zdarzenia. Innymi słowy – IDE dla C++ zachowuje się dokładnie tak samo jak to dla C# czy VB.NET.

    W tym projekcie na formatce należy umieścić następujące elementy:

  • Kontrolkę listy (ListBox), o nazwie listMsg. Będzie ona wyświetlać komunikaty pobrane z usługi Web

  • Dwie kontrolki do wprowadzania tekstu (TextBox), o nazwach txtFrom oraz txtText. Będą one służyć do wpisywania treści komunikatów wysyłanych do usługi Web.

  • Przycisk (Button) o nazwie cmdSend, który wysyła nowy komunikat.

  • Przycisk (Button) o nazwie cmdRefresh, który ma „odświeżać” listę komunikatów z serwera.

  • Dodatkowy przycisk (Button) o nazwie cmdSpecial, który będzie wywoływał „natywną” klasę C++ która wykona pewne „obliczenia”. Wynik ma zostać umieszczony w komunikacie wysyłanym do usługi Web.

  • Dodawanie referencji do usługi Web odbywa się dokładnie w taki sam sposób jak w innych projektach. W Solution Explorer należy kliknąć na nazwę projektu, a potem wybrać Add Web Reference. Następnie należy wskazać adres serwera i ścieżkę do usługi Web (lub wyszukać ją używając mechanizmu UDDI), posługując się znanym już kreatorem. Tak samo jak poprzednio warto nazwać usługę Web MyWebService.  

    Aby dodać obsługę zdarzenia wyzwalanego po kliknięciu na przycisk, wystarczy 2 razy kliknąć na dany element (w tym przypadku – przyciski o nazwach cmdSend, cmdRefresh i cmdSpecial). Otworzony zostanie edytor z utworzonym schematem obsługi zdarzenia:

    [...]

    private: System::Void cmdSend_Click(System::Object *  sender, System::EventArgs *  e)

            {

              MyWebService::Repository *ws=new MyWebService::Repository();

              dataSet1=ws->Append(txtFrom->Text,txtText->Text);

              MyBind();

            }

    [...]

    Kod wywołania usługi Web ma analogiczną strukturę jak w C# - tyle że „zapisany” jest przy użyciu składni C++.

    Trochę inaczej wygląda tworzenie instancji DataSet. W C# można od razu przy deklaracji określić, że ma być utworzony nowy egzemplarz obiektu. W C++ możliwe jest to tylko w przypadku składowych statycznych. Aby zainicjować obiekt, można albo wprowadzić zmiany w konstruktorze, albo – dodać procedurę obsługi zdarzenia Load (klikając dwa razy gdzieś na formatkę lub wybierając odpowiednią pozycję w oknie Properties, po przełączeniu się na widok zdarzeń).

    [...]

    private: System::Data::DataSet *  dataSet1;

     

    private: System::Void Form1_Load(System::Object *  sender, System::EventArgs *  e)

            {

             dataSet1 = new System::Data::DataSet();

            }

    [...]

    W kodzie obsługi Load należy utworzyć instancję DataSet. Kod „związujący” element z listą listMsg jest analogiczny. Jednak warto pamiętać, że tam gdzie w C# można było skorzystać z indeksatorów, tu trzeba używać odpowiednich metod „pobierających” dany element. W tym przypadku musimy pobrać tablicę o indeksie 0 (by z nią związać listę). Natomiast „łańcuchy” C++ są bez problemu tłumaczone na String w .NET:

    [...]

    private: System::Void MyBind(void) {

              listMsg->DataSource=dataSet1->Tables->get_Item(0);

              listMsg->DisplayMember="Info";

            }

    [...]

    Dodatkowo w projekcie w C++ dodana została nowa klasa – która nie zawiera żadnych rozszerzeń .NET, a która może wykonywać dowolne operacje – już tylko w C++. W tym przypadku klasa CNativeCalc będzie zawierała jedną metodę – która wykona pewne „obliczenia”.

    Aby dodać nową klasę można skorzystać  z odpowiedniego kreatora. Po kliknięciu prawym przyciskiem na danym projekcie, należy wybrać wzorzec Generic C++ Class.

    Rysunek 21 Dodawanie nowej klasy

    Następnie trzeba podać nazwę klasy – po wpisaniu w pole Class Name tekstu CNativeCalc , pozostałe elementy zostaną automatycznie wypełnione.

    Rysunek 22 Parametry klasy

    Aby dodać nową funkcję, najlepiej jest przełączyć się z widoku Solution Explorer na Class View., i po wybraniu menu podręcznego z CNativeCalc wybrać opcję Add Function

    Rysunek 23 Dodawanie funkcji

    W kreatorze dodawania nowych funkcji należy określić, że funkcja zwraca double (pole Return type), ma nazwę Calc (pole Function Name), oraz ma dwa parametry – p1 i p2 typu double.

    Po naciśnięciu Finish utworzona zostanie odpowiednia funkcja w klasie CNativeCalc.

    Warto tu podkreślić, że są to bardzo podobne mechanizmy, jakie są dostępne w VB.NET, C# czy też J#. Oczywiście programista ma wybór – zamiast używać kreatorów może zmiany wprowadzać ręcznie – w zależności od swoich preferencji.

    Poniżej pokazany jest pełny kod pliku NativeCalc.h

    #pragma once

    namespace CPPWinForm

    {

    class CNativeCalc

    {

    public:

     CNativeCalc(void);

     ~CNativeCalc(void);

     double Calc(double P1, double P2);

    };

    };

    Przykładowa funkcja Calc mnoży przez siebie dwa parametry i zwraca wynik. Poniżej pokazany jest pełny kod pliku NativeCalc.CPP:

    #include "StdAfx.h"

    #include ".\nativecalc.h"

    #using <mscorlib.dll>

     

    namespace CPPWinForm

    {

    CNativeCalc::CNativeCalc(void)

    {

    }

     

    CNativeCalc::~CNativeCalc(void)

    {

    }

     

    double CNativeCalc::Calc(double p1, double p2)

    {

    return p1*p2;

    }

    }

    Wywołanie „normalnej” klasy w C++ z poziomu kodu zarządzalnego nie sprawia żadnych problemów. Można na stosie stworzyć instancję CNativeCalc i normalnie wywołać odpowiednią metodę.

    W poniższym przykładzie wywołania do formatowania komunikatu została wykorzystana specjalna klasa .NET StringBuilder (przeznaczona do szybkiej manipulacji łańcuchami). Ostatecznie wynik jest przesyłany do usługi Web.

    private: System::Void cmdSpecial_Click(System::Object *  sender, System::EventArgs *  e)

            {

              CNativeCalc cn; //Stworzenie na stosie

              double ret=cn.Calc(5,3);

              MyWebService::Repository *ws=new MyWebService::Repository();

              System::Text::StringBuilder *sb=new System::Text::StringBuilder();

              sb->Append("Wyliczone: ");

              sb->Append(ret);

              dataSet1=ws->Append(txtFrom->Text,sb->ToString());

              MyBind();

            }

    };

    Na poniższym wydruku przedstawione zostały istotne elementy kodu. Warto podkreślić, że aby zdefiniować klasę jako obiekt „zarządzalny”.NET, wystarczy przy deklaracji podać dodatkowe słowo kluczowe __gc. Wtedy m. innymi za usuwanie klasy odpowiada automatyczny odśmiecacz z .NET. Plik nagłówkowy NativeCalc.h zawiera deklarację „klasy obliczeniowej”.

    #pragma once

    #include "NativeCalc.h"

     

    namespace CPPWinForm

    {

         using namespace System;

         using namespace System::ComponentModel;

         using namespace System::Collections;

         using namespace System::Windows::Forms;

         using namespace System::Data;

         using namespace System::Drawing;

     

         public __gc class Form1 : public System::Windows::Forms::Form

         {     

         public:

    [...]

     private: System::Windows::Forms::Button *  cmdSend;

     private: System::Windows::Forms::Button *  cmdRefresh;

     private: System::Windows::Forms::Label *  label1;

     private: System::Windows::Forms::Label *  label2;

     private: System::Windows::Forms::Button *  cmdSpecial;

     private: System::Windows::Forms::ListBox *  listMsg;

     private: System::Windows::Forms::TextBox *  txtFrom;

     private: System::Windows::Forms::TextBox *  txtText;

     

    [...]

     

    private: System::Data::DataSet *  dataSet1;

     

    private: System::Void Form1_Load(System::Object *  sender, System::EventArgs *  e)

            {

             dataSet1 = new System::Data::DataSet();

            }

     

    private: System::Void MyBind(void) {

              listMsg->DataSource=dataSet1->Tables->get_Item(0);

              listMsg->DisplayMember="Info";

            }

     

    private: System::Void cmdSend_Click(System::Object *  sender, System::EventArgs *  e)

            {

              MyWebService::Repository *ws=new MyWebService::Repository();

              dataSet1=ws->Append(txtFrom->Text,txtText->Text);

              MyBind();

            }

     

    private: System::Void cmdRefresh_Click(System::Object *  sender, System::EventArgs *  e)

            {

              MyWebService::Repository *ws=new MyWebService::Repository();

              dataSet1=ws->Get();

              MyBind();

            }

     

    private: System::Void cmdSpecial_Click(System::Object *  sender, System::EventArgs *  e)

            {

              CNativeCalc cn; //Stworzenie na stosie

              double ret=cn.Calc(5,3);

              MyWebService::Repository *ws=new MyWebService::Repository();

              System::Text::StringBuilder *sb=new System::Text::StringBuilder();

              sb->Append("Wyliczone: ");

              sb->Append(ret);

              dataSet1=ws->Append(txtFrom->Text,sb->ToString());

              MyBind();

            }

    };

    }

    [...]

    Po wprowadzeniu tych zmian, można uruchomić projekt (po naciśnięciu F5).

    Rysunek 24 Działająca aplikacja w Managed C++ korzystająca z usługi Web

    Aplikacja Web Forms

    Z usługi Web może także korzystać aplikacja Web Forms – nic nie stoi na przeszkodzie by na stronie WWW wyświetlić listę i przyciski do wysyłania komunikatów.

    Tym razem proszę dodać nowy projekt ASP.NET Web Application o nazwie WebKiK.

    Rysunek 25 Tworzenie nowej aplikacji ASP.NET wykorzystującej Web Forms

    Po utworzeniu projektu otwierana jest domyślna strona startowa. Tak jak w poprzednich projektach, należy dodać kilka kontrolek (tym razem są to kontrolki należące do biblioteki Web Forms – proszę zauważyć, że mają nawet nazwy podobne do odpowiednich kontrolek Windows Forms):

  • Kontrolkę listy (ListBox), o nazwie listMsg. Będzie ona wyświetlać komunikaty pobrane z usługi Web

  • Dwie kontrolki do wprowadzania tekstu (TextBox), o nazwach txtFrom oraz txtText. Będą one służyć do wpisywania treści komunikatów wysyłanych do usługi Web.

  • Przycisk (Button) o nazwie cmdSend, który wysyła nowy komunikat.

  • Przycisk (Button) o nazwie cmdRefresh, który ma „odświeżać” listę komunikatów z serwera.

  • Dodawanie usługi Web odbywa się w taki sam sposób jak w przypadku aplikacji Windows Forms. W Solution Explorer należy kliknąć na Web Reference i z menu podręcznego pod prawym przyciskiem wybrać Add Web Reference. Następnie należy wskazać adres serwera i ścieżkę do usługi Web (lub wyszukać ją używając mechanizmu UDDI).

    Dodawanie kodu obsługi zdarzenia dla aplikacji Web wygląda dokładnie tak samo jak w przypadku innych projektów – np. wystarczy 2 razy kliknąć na dany element by utworzyć szkielet obsługi domyślnego zdarzenia – w tym przypadku „kliknięcia” na dany element. Proszę kliknąć 2 razy na przyciski cmdSend i cmdRefresh.

    Kod wywołania usługi Web jest dokładnie taki sam jak w przypadku aplikacji Windows Forms. Dzięki temu że API .NET jest spójne – większość operacji jest wykonywanych dokładnie tak samo – niezależnie od „typu” projektu:

    [...]

       private void cmdSend_Click(object sender, System.EventArgs e) {

         MyWebService.Repository ws=new MyWebService.Repository();

         dataSet1=ws.Append(txtFrom.Text,txtText.Text);

         MyBind();

       }

    [...]

    Pewne różnice występują w przypadku „związywania” kontrolki z DataSet. Procedura MyBind dla Web Forms musi uwzględnić specyfikę kontrolek HTML..

    [...]

       DataSet dataSet1 = new DataSet();

     

       private void MyBind() {

         listMsg.DataSource=dataSet1.Tables[0];

         listMsg.DataTextField="Info";

         listMsg.DataBind();

       }

    [...]

    Właściwość DataTextField określa nazwę pola z DataSet skąd pobierane są informacje do wyświetlenia w listMsg. Metoda DataBind powoduje, że kontrolka jest wypełniana (tak by po przesłaniu informacji do klienta były widoczne wszystkie komunikaty).

    Poniżej pokazane są istotne elementy kodu całego rozwiązania w gotowej aplikacji Web Forms.

    using System;

    using System.Collections;

    using System.ComponentModel;

    using System.Data;

    using System.Drawing;

    using System.Web;

    using System.Web.SessionState;

    using System.Web.UI;

    using System.Web.UI.WebControls;

    using System.Web.UI.HtmlControls;

     

    namespace WebKiK

    {

         public class Dialog : System.Web.UI.Page

         {

    [...]

     

       DataSet dataSet1 = new DataSet();

     

       private void MyBind() {

         listMsg.DataSource=dataSet1.Tables[0];

         listMsg.DataTextField="Info";

         listMsg.DataBind();

       }

     

       private void cmdSend_Click(object sender, System.EventArgs e) {

         MyWebService.Repository ws=new MyWebService.Repository();

         dataSet1=ws.Append(txtFrom.Text,txtText.Text);

         MyBind();

       }

     

       private void cmdRefresh_Click(object sender, System.EventArgs e) {

         MyWebService.Repository ws=new MyWebService.Repository();

         dataSet1=ws.Get();

         MyBind();

       }

         }

    }

    Po skompilowaniu projektu, można go uruchomić. W Internet Explorer zostanie otworzona nowa strona intranetowa, która może pełnić rolę klienta usługi Web EveretKiKWebService.

    Rysunek 26 Działająca aplikacja Web Forms

    Aplikacja Web Forms dla urządzeń mobilnych

    Visual Studio 2003 pozwala na tworzenie 2 typów rozwiązań mobilnych. Jedne, wykorzystują .NET Compact Framweork i pozwalają tworzyć normalne „aplikacje okienkowe” działające na komputerach PDA. Można także pisać specjalne strony internetowe, które będą prawidłowo wyświetlane na szerokiej gamie urządzeń przenośnych.  Webmaster konstruując witryny internetowe, które mają być przeglądane na komputerach typu „desktop” używa ASP.NET i kontrolek Web. Jeżeli ma to być także witryna, która poprawnie wyświetla się na urządzeniach, rozumiejących tylko WML (WAP), czy cHTML (takie jak np. telefony komórkowe), wtedy projektuje strony wykorzystując ASP.NET Mobile Web Controls. Dzięki ASP.NET Mobile Designer tworzenie stron odbywa się dokładnie tak samo jak pisanie „zwykłych” stron ASP.NET.

    Ponieważ przeglądarki internetowe dostępne na urządzenia mobilne w różny sposób wyświetlają nawet poprawne strony WML czy HTML, bardzo ważne jest by witryna potrafiła się „dostosować” do wymagań danego urządzenia klienckiego. Odpowiednio konfigurując ASP.NET po stronie serwera można określić, w jaki sposób będzie wykrywany typ przeglądarki, i jak dokładnie będą renderowane strony. Jednak – można zostawić domyślne ustawienia a Mobile Web Control „same” dostosują się do konkretnej sytuacji. Dzięki temu programista może w ogóle nie troszczyć się o różne zachowania konkretnych przeglądarek.

    Aby dodać nowy projekt wykorzystujący Mobile Web Controls, w oknie New Project należy wybrać pozycję ASP.NET Mobile Web Application.

    Rysunek 27 Tworzenie nowej aplikacji ASP.NET wykorzystującej Mobile Web Forms

    Po utworzeniu projektu otwierana jest domyślna strona startowa. Tak jak w poprzednich projektach, należy dodać kilka kontrolek (tym razem są to kontrolki należące do biblioteki Mobile Web Forms – bardzo podobne do tych, z Web Forms):

  • Kontrolkę listy (ListBox), o nazwie listMsg. Będzie ona wyświetlać komunikaty pobrane z usługi Web

  • Dwie kontrolki do wprowadzania tekstu (TextBox), o nazwach txtFrom oraz txtText. Będą one służyć do wpisywania treści komunikatów wysyłanych do usługi Web.

  • Przycisk (Command) o nazwie cmdSend, który wysyła nowy komunikat.

  • Przycisk (Command) o nazwie cmdRefresh, który ma „odświeżać” listę komunikatów z serwera.

  • Dodawanie usługi Web odbywa się w taki sam sposób jak w przypadku innych typów aplikacji. W Solution Explorer należy kliknąć na Web Reference i z menu podręcznego pod prawym przyciskiem wybrać Add Web Reference. Następnie należy wskazać adres serwera i ścieżkę do usługi Web (lub wyszukać ją używając mechanizmu UDDI).

    Dodawanie kodu obsługi zdarzenia dla aplikacji Web przeznaczonej dla urządzeń mobilnych wygląda dokładnie tak samo jak w przypadku „dużej” strony ASP.NET – np. wystarczy 2 razy kliknąć na dany element by utworzyć szkielet obsługi domyślnego zdarzenia – w tym przypadku „kliknięcia” na dany element (proszę kliknąć 2 razy na przyciski cmdSend i cmdRefresh).

    Tu warto dodać, że kod rozwiązania dla ASP.NET i ten, gdzie wykorzystywane są kontrolki „mobilne” jest identyczny. Tak samo wywołujemy usługę Web, tak samo odwołujemy się do właściwości itp. Model obiektowy Mobile Web Forms i Web Forms jest bardzo zbliżony.

    Poniżej pokazany są istotne elementy kodu rozwiązania pełny kod rozwiązania wykorzystujący Mobile Web Forms:

    namespace MobWebKiK

    {

         public class MobileWebForm1 : System.Web.UI.MobileControls.MobilePage

         {

    [...]

       DataSet dataSet1 = new DataSet();

       private void MyBind() {

         listMsg.DataSource=dataSet1.Tables[0];

         listMsg.DataTextField="Info";

         listMsg.DataBind();

       }

     

       private void cmdSend_Click(object sender, System.EventArgs e) {

         MyWebService.Repository ws=new MyWebService.Repository();

         dataSet1=ws.Append(txtFrom.Text,txtText.Text);

         MyBind();

       }

     

       private void cmdRefresh_Click(object sender, System.EventArgs e) {

         MyWebService.Repository ws=new MyWebService.Repository();

         dataSet1=ws.Get();

         MyBind();

       }

         }

    }

    Testowanie i uruchamianie

    Po skompilowaniu programu można go uruchomić. Standardowo, strony wykorzystujące Mobile Web Forms są uruchamiane w Internet Explorer (tak jak „normalne” strony ASP.NET).

    Aby je przetestować, można je np. uruchomić w emulatorze PocketPC. Ze stron Microsoftu ściągnąć plik MME30.exe zawierający emulator mobilnej wersji Internet Explorer. Pozwala on wygodnie przetestować rozwiązanie z poziomu komputera „desktop” – programista widzi dosyć dokładnie ograniczenia „przenośnej” przeglądarki.

    Rysunek 28 Działająca aplikacja internetowa wykorzystująca Mobile Internet Web Controls

    Podsumowanie

    Dzięki Visual Studio .NET 2003 programiści otrzymali kompletny zestaw narzędzi do: tworzenia usług Web, implementacji logiki biznesowej, programowania dynamicznych stron WWW czy rozbudowanych aplikacji desktop. Równocześnie otrzymali też kompletny pakiet do tworzenia rozwiązań dla urządzeń mobilnych. Korzystając z tych samych technik programowania i posiadanej już wiedzy, developer może tworzyć systemy obejmujące nową klasę urządzeń – systemy PDA, urządzenia „osadzone” czy inteligentne telefony. Wszystko to sprawia, że jest to dobre narzędzie do pisania nowoczesnych aplikacji, które są łatwe w użyciu, wydajne oraz usprawniają pracę użytkowników.

    W tym artykule zostało pokazane rozwiązanie, gdzie jedna usługa Web pełni rolę „centralnego” repozytorium komunikatów. Dzięki Visual Studio 2003, używają takich samych metod programowania można było napisać szeroką gamę klientów obejmujących praktycznie wszystkie popularne „urządzenia” klienckie:

    • Aplikację Windows wykorzystującą Windows Forms – powstały 2 wersje takiej aplikacji. Jedna w C# i .NET, a druga – w C++ (z wykorzystaniem Managed Extension)

    • Aplikacja dla urządzenia PDA – program typu SDA wykorzystujący .NET Compact Framework

    • Aplikacja Web wykorzystująca Web Forms (która działa na każdej przeglądarce uruchamianej na komputerach typu „desktop”)

    • Aplikacja Web przeznaczona dla urządzeń mobilnych – którą mogą wykorzystywać klienci bez względu na to czy używają WAP czy też inne „małe” przeglądarki.

    Rysunek 29 Pełna gama rozwiązań wykorzystujących przykładową usługę Web

    Po ściągnięciu plików przykładowych proszę nie zapomnieć utworzyć odpowiednich katalogów wirtualnych na serwerze IIS. Należy tak postąpić dla następujących folderów: WebKiK, MobWebKiK i najważniejszego, zawierającego usługę Web – EveretKiKWebService. Nazwa katalogu wirtualnego powinna odpowiadać nazwie katalogu. Proszę także pamiętać, że w kodzie programu, przy odwoływaniu się do usługi Web, wykorzystywana jest nazwa komputera – w kodzie przykładowym jest to „niezapominajka – czytelnik musi odpowiednio zmienić adres URL wskazujący na usługę Web w każdym z projektów.

    Rysunek 30 Tworzenie katalogu wirtualnego na lokalnym IIS w Windows XP

    Załączniki:

    Komentarze 2

    klingon
    klingon
    0 pkt.
    Nowicjusz
    08-04-2011
    oceń pozytywnie 0

    ... gdzie podziały się rysunki !!! :@

    Ziemek Borowski
    Ziemek Borowski
    08-04-2011
    oceń pozytywnie 0

    Zgineły w czasie migracji. I raczej już nie wrócą (być może zostaną przywrócone przy QA następnej, ale nie możemy nic zawarantować).

     

    Ziemek Borowski - bywam na spotkaniach PEPUG i PInG, redaktor WSS.pl

     

    pkt.

    Zaloguj się lub Zarejestruj się aby wykonać tę czynność.