Diese Dokumentation wurde archiviert und wird nicht länger gepflegt.

Eine Visual Basic 6.0-Anwendung um den MapPoint-Webdienst erweitern

Visual Studio 2005

Sales Support: Eine hybride Visual Basic 6.0- & Visual Basic 2005-Anwendung, Teil 2

Scott Swigart

Februar 2008

Zusammenfassung: Dieser Artikel, der zweite einer vierteiligen Serie, zeigt, wie Sie .NET-Funktionalität verwenden können, um eine Microsoft Visual Basic 6.0-Anwendung zu erweitern und zu modernisieren, indem Sie mit dem Microsoft MapPoint-Webdienst-API Kartenfunktionen ergänzen.

Klicken Sie hier, um das Setupprogramm für die Anwendung herunterzuladen.

Klicken Sie hier, um den Quellcode der Anwendung herunterzuladen.

Einführung

Die Anwendung "Sales Support"

Die Adresse von Kunden als Karte anzeigen

Anwendungsarchitektur

Visual Basic 2005-Implementierung

Interoperabilität mit Visual Basic 6.0

Schlussfolgerung

Weiterführende Informationen

Einführung

Wollen Sie Ihre Microsoft Visual Basic 6.0-Anwendungen modernisieren? Möchten Sie die Vorteile von Webdiensten, der Desktopsuche usw. nutzen und haben Sie nicht die Zeit oder die Ressourcen, Ihre produktiven Anwendungen nach Microsoft Visual Basic 2005 zu portieren?

Der erste Teil dieser Artikelserie, „Eine Visual Basic 6.0-Anwendung durch die Integration der Windows-Desktopsuche und von Office Outlook erweitern“ hat gezeigt, dass es nicht erforderlich ist, eine Visual Basic 6.0-Anwendung nach Visual Basic 2005 zu portieren, um die Vorteile der .NET-Funktionalität nutzen zu können. Stattdessen können Sie beispielsweise die Microsoft Windows-Desktopsuche in eine Visual Basic 6.0-Anwendung integrieren, indem Sie COM-Objekte verwenden, die mit Visual Basic 2005 erstellt wurden. Dieser Ansatz lässt Sie die Vorteile der Funktionalität von Microsoft .NET Framework nutzen, ohne dass Sie dazu Ihre Anwendung neu erstellen müssen.

Dieser Artikel zeigt an einem anderen praktischen Beispiel, wie Sie die .NET-Funktionalität verwenden können, um eine Visual Basic 6.0-Anwendung zu erweitern und zu modernisieren. Sie werden sehen, wie Sie mit dem Microsoft MapPoint-Webdienst-API Landkarten erstellen können.

Das Beispiel soll lediglich zeigen, wie Sie von Visual Basic 6.0 aus auf den MapPoint-Webdienst zugreifen, und nicht die zahlreichen Einsatzmöglichkeiten des MapPoint-Webdienstes vorstellen. Wie Sie den MapPoint-Webdienst in Ihren Anwendungen verwenden, ist Ihnen überlassen; hier ein paar Ideen:

  • Sie können eine Anwendung, die Ihre Vertriebsmitarbeiter unterstützt, um ein Feature erweitern, mit dem die Vertreter angeben können, welche Kunden sie an einem bestimmten Tag besuchen wollen. Anhand dieser Angaben können Sie dann eine Routenbeschreibung generieren lassen.
  • Vielleicht arbeiten Sie für ein Unternehmen, das neue Wohnhäuser baut, und verwenden eine Anwendung, die zukünftige Immobilieninvestitionen verwaltet. Sie können den MapPoint-Webdienst verwenden, um in Formularen und Berichten, die diese potenziellen Investitionen dokumentieren, eine Karte des betreffenden Gebiets, einschließlich Schulen, Geschäften usw., einzufügen.
  • Möglicherweise müssen Sie Adressen überprüfen. Sie können den MapPoint-Webdienst verwenden, um mögliche Treffer für eine Adresse zu finden, die Sie in Ihrer Anwendung eingegeben haben.

"Sales Support" ist eine sehr einfache Anwendung zur Unterstützung der Vertriebsmitarbeiter, mit der Kundenkonten, Kontaktinformationen und Umsatzprognosen abgerufen werden können. Diese Anwendung soll keine umfassende Lösung darstellen, sondern dient als Beispiel für eine vorhandene Geschäftslösung, die mit Visual Basic 6.0 erstellt wurde. Des Weiteren dient sie als Ausgangspunkt für eine Reihe von nützlichen Anwendungserweiterungen, die sich am besten mit Visual Basic 2005 implementieren lassen.

Installation

Der Installer für Sales Support wurde auf Microsoft Windows XP SP2 und Windows Vista getestet; er sollte aber auch mit älteren Betriebssystemversionen funktionieren. Da es sich um eine hybride Visual Basic 6.0- und Visual Basic 2005-Anwendung handelt, wird vom Installationsprogramm .NET Framework als Voraussetzung installiert. Diese Anwendung speichert die Daten in einer Backend-Datenbank. Aus diesem Grund installiert das Setupprogramm Microsoft SQL Server 2005 Express Edition, das Microsoft SQL Server 2000 Desktop Engine (MSDE 2000) ersetzt.

Wenn die benötigten Komponenten noch nicht installiert sind, werden sie vom Installer automatisch heruntergeladen. Eine vorhandene Installation wird automatisch erkannt; es wird dann mit der Installation der Anwendung weitergemacht.

Verwendung

Nachdem die Anwendung installiert wurde, können Sie sie im Startmenü aufrufen. Suchen Sie nach dem Eintrag Sales Support8_3. Die Anwendung fordert Sie auf, sich einzuloggen. Um die Nutzung zu vereinfachen, stehen in den Textfeldern bereits Standardwerte, was Abbildung 1 zeigt. Klicken Sie einfach auf die Schaltfläche Login, um fortzufahren.

Cc299495.55ea4d37-75bf-4609-a4c6-70cf0027f8eb(de-de,VS.80).gif

Abbildung 1: Das Anmeldeformular der Anwendung Sales Support

Nachdem Sie sich erfolgreich angemeldet haben, wird das Hauptfenster der Anwendung angezeigt, das Sie in Abbildung 2 sehen. Die Anwendung stellt drei verschiedene Sichten auf die Verkaufsinformationen zur Verfügung. Die Registerkarte Accounts zeigt alle Kunden sowie einige Umsatzdaten an. Diese Ansicht kann sortiert werden, indem man die gewünschte Spaltenüberschrift anklickt. Auf der Registerkarte Contacts finden Sie die zweite Ansicht; diese zeigt ausführlichere Informationen zu den einzelnen Kontakten an. Die Registerkarte Forecast bietet die dritte Ansicht und zeigt Informationen zu den prognostizierten Umsätzen an.

Cc299495.aabfcf5b-a4ba-4ff2-88db-f8ccb39fbdd0(de-de,VS.80).gif

Abbildung 2: Das Hauptfenster der Anwendung

Die Anwendung Sales Support soll keine fertige Lösung darstellen, sondern dient als Grundlage für realistische Erweiterungen einer Visual Basic 6-Anwendung.

Mappingmöglichkeiten und andere geografische Funktionen werden mehr und mehr zu Standardfeatures von Geschäftsanwendungen, sei es um Adressen zu überprüfen oder um Routenbeschreibungen für Kundenbesuche zu erstellen. Visual Basic 6.0 enthält keine integrierte Möglichkeit zum Erstellen von Karten. Microsoft stellt jedoch mit dem MapPoint-Webdienst umfangreiche Mappingmöglichkeiten zur Verfügung; allerdings gibt es keinen einfachen Weg, um diesen Dienst von Visual Basic 6.0 aus zu nutzen. Den MapPoint-Webdienst von Visual Basic 205 aus aufzurufen, ist hingegen fast trivial. Wenn Sie die in diesem Artikel beschriebene Erweiterung verwenden, können Sie die Adresse eines Kunden in einer Karte anzeigen lassen, wie es Abbildung 3 zeigt.

Cc299495.5cd98547-caa9-4283-865c-bca6f047860d(de-de,VS.80).gif

Abbildung 3: Die Adresse eines Kunden in einer Karte anzeigen

Den Kern der Anwendung bildet eine Visual Basic 6.0-Anwendung, die mit einer SQL Server 2005 Express-Datenbank kommuniziert. Wenn Sie die Schaltfläche Map anklicken, wird die Adresse des Kunden an ein Visual Basic 2005-Form übergeben. Das Visual Basic 2005-Form kommuniziert mit dem MapPoint-Webdienst und fordert eine Karte für diese Adresse an. Die Karte wird auf dem Visual Basic 2005-Form angezeigt, und der Anwender kann in der Karte zoomen.

Cc299495.d91df34f-23c0-4c0c-9d4e-2555760e8d62(de-de,VS.80).gif

Abbildung 4: Der Datenfluss der Anwendung

Seit einiger Zeit stehen Mappingfunktionen auf Websites zur Verfügung. Mit ihnen kann der Benutzer einfach eine Karte für eine bestimmte Adresse anzeigen lassen. Diese Karten in einer Anwendung selbst zu verwenden, ist ein wenig schwieriger. Wenn Sie hierfür eine der üblichen Websites verwenden, müssen Sie Code erstellen, um HTML herunterzuladen und zu parsen; wenn sich das Layout der Website ändert, kann es leicht passieren, dass Ihr Code nicht mehr funktioniert.

Webdienste stellen eine Alternative zum oben beschriebenen Verfahren dar. Sie sind nicht dafür vorgesehen, um von einem Menschen und einem Browser verwendet zu werden. Stattdessen erhalten Webdienste die Anforderungen als XML über HTTP und geben die Ergebnisse als XML zurück. Webdienste verwenden die gleiche Infrastruktur wie Websites, jedoch wurden sie speziell entworfen, um mit Anwendungen zu kommunizieren, und nicht mit Menschen.

Wenn Sie Visual Studio 2005 verwenden, ist die Kommunikation mit einem Webdienst noch einfacher. Visual Studio 2005 erstellt für Sie die Klassen, die sich um das Erstellen und das Parsen des XML kümmern. Sie erstellen lediglich eine Instanz einer Klasse, rufen eine Methode auf und erhalten ein Ergebnis.

Bei der Darstellung von Daten als Karte ist der Einsatz eines Webdienstes besonders sinnvoll, da Sie weder weltweite detaillierte Karten auf jedem Desktop bereitstellen noch sich darum kümmern wollen, dass die Daten und Karten immer auf dem aktuellen Stand sind. Stattdessen macht es mehr Sinn, die Karte für ein bestimmtes Gebiet dann anzufordern, wenn sie benötigt wird. Und genau diese Möglichkeit steht Ihnen mit dem Microsoft MapPoint-Webdienst zur Verfügung.

Bevor Sie den MapPoint-Webdienst verwenden können, müssen Sie Visual Studio 2005 die Definitionsdatei für den Webdienst herunterladen und clientseitige Proxyklassen erstellen lassen. Sie verwenden hierfür den Visual Studio 2005-Menübefehl Project | Add Web Reference (Projekt | Webverweis hinzufügen).

Cc299495.4f76fd89-8d46-4a6c-941f-052ad0769ede(de-de,VS.80).gif

Abbildung 5: Einen Webverweis hinzufügen

Die Definition eines Webdienstes befindet sich in einem Dokument, das in der Web Services Description Language (WSDL) verfasst ist. In unserem Fall befindet sich die Definition an der Webadresse http://staging.mappoint.net/standard-30/mappoint.wsdl. Visual Studio 2005 lädt dieses WSDL-Dokument herunter und erstellt unterhalb des Namespace MapPointService eine Proxyklasse.

Adressen mit dem MapPoint-Webdienst nachschlagen

Nachdem Sie den Webverweis eingefügt haben, können Sie den Code erstellen, um Abfragen an den Webdienst zu schicken und dessen Antworten zu verarbeiten.

Dim address As New MapPointService.Address()
address.FormattedAddress = Me.Address

Dim findOptions As New MapPointService.FindOptions()
findOptions.ThresholdScore = 0

Dim findAddressSpec As New MapPointService.FindAddressSpecification
With findAddressSpec
    .InputAddress = address
    .DataSourceName = "MapPoint.NA"
    .Options = findOptions
End With

findService.Credentials = credentials
findResults = findService.FindAddress(findAddressSpec)

Listing 1: Eine Adresse mit dem MapPoint-Webdienst nachschlagen

Der erste Schritt bei der Verwendung des MapPoint-Webdienstes besteht darin, den Längen- und den Breitengrad einer Adresse zu ermitteln. Hierzu erzeugen Sie eine Instanz der Klasse Address. Diese Klasse wurde automatisch erstellt, als Sie den Verweis auf den Webdienst in das Projekt eingefügt haben. Weisen Sie der Eigenschaft FormattedAddress die Adresse, die Sie nachschlagen wollen, als Text zu.

Wenn Sie nach einer Adresse suchen, ist es möglich, dass mehrere Treffer zurückgegeben werden, wenn die Adresse nicht eindeutig zugeordnet werden kann. Mit der Eigenschaft ThresholdScore der Klasse FindOptions können Sie festlegen, wie exakt der Treffer für eine Adresse sein muss, damit sie zurückgegeben wird. Unabhängig vom mit ThresholdScore festgelegten Wert sind die Adressen immer vom besten bis zum schlechtesten Treffer sortiert.

Die Adresse und die Optionen werden dann an eine Variable des Typs FindAddressSpecification. gebunden. Hierbei können Sie außerdem noch angeben, welche Datenquelle durchsucht werden soll. Sie können hier beispielsweise Nordamerika, Europa oder eine andere Datenquelle auswählen.

Um mit dem MapPoint-Webdienst kommunizieren zu können, müssen Sie sich anmelden. In unserem Beispiel verbindet sich die Anwendung mit dem MapPoint-Webdienst, der für Evaluierungs- und Entwicklungsaufgaben zur Verfügung steht, und nicht mit dem Produktionswebdienst; daher reichen Entwickleranmeldeinformationen aus. (Um es Ihnen einfacher zu machen, habe ich diese Anmeldeinformationen in die Anwendung codiert. Wenn diese Anmeldeinformationen zu einem späteren Zeitpunkt nicht mehr gültig sein sollten, können Sie Ihr eigenes Entwickler-Login bei folgender Website anfordern:https://mappoint-css.partners.extranet.microsoft.com/MwsSignup/Eval2.aspx.)

An diesem Punkt haben Sie alle Informationen konfiguriert, mit denen der MapPoint-Webdienst eine Adresse nachschlagen und deren Längen- und Breitengrad zurückgeben kann. Diese Angaben werden als Eingabeparameter für den Mappingdienst benötigt. Wenn die Methode FindAddress von findService aufgerufen wird, wird die Anforderung als XML verpackt und über das Internet an den MapPoint-Webdienst gesendet. Dann werden die Ergebnisse entgegengenommen, die als XML formatiert sind. Die Proxyklasse, die von Visual Studio 2005 erstellt wurde, parst das XML und gibt das Ergebnis im Objekt findResults zurück.

Eine Karte vom MapPoint-Webdienst anfordern

Nun können Sie für die Adresse eine Karte anfordern. Hierfür verwenden Sie den Code, den Sie in Listing 2 sehen.

' Legen Sie den Mittelpunkt und den Maßstab
' der Karte fest, die Sie anzeigen wollen
Dim mapViews(0) As ViewByScale
mapViews(0) = New ViewByScale
With mapViews(0)
    .CenterPoint = Me.findResults.Results(0).FoundLocation.LatLong
    .MapScale = ZoomScrollBar.Value * ZoomScrollBar.Value
End With

' Fügen Sie eine „Reißzwecke“ in die Karte ein
Dim pushPins(0) As Pushpin
pushPins(0) = New Pushpin
With pushPins(0)
    .PinID = "pin0"
    .Label = PushPinName
    .IconName = "0"
    .IconDataSource = "MapPoint.Icons"
    .LatLong = mapViews(0).CenterPoint
End With

' Passen Sie die Anzeigeoptionen der Karte an
Dim options As New MapOptions
With options
    .Format = New ImageFormat
    .Format.Height = PictureBox1.Height
    .Format.Width = PictureBox1.Width
End With

Dim mapSpec As New MapSpecification
With mapSpec
    .Views = mapViews
    .Options = options
    .DataSourceName = "MapPoint.NA"
    .Pushpins = pushPins
    .HideEntityTypes = New String() {"School"}
End With

' Fordern Sie die Grafik der Karte an
renderService.Credentials = credentials
Dim mapImages() As MapImage = renderService.GetMap(mapSpec)

PictureBox1.Image = New System.Drawing.Bitmap(New _
    System.IO.MemoryStream(mapImages(0).MimeData.Bits))

Listing 2: Eine Karte für die Adresse anfordern

Um die Grafik einer Karte anzufordern, müssen Sie eine Reihe von Objekten übergeben. Zuerst erstellen Sie ein Objekt des Typs ViewByScale Die Eigenschaft CenterPoint wird auf den für die angegebene Adresse erhaltenen Längen- und Breitengrad gesetzt. Anschließend weisen Sie der Eigenschaft MapScale einen Wert zu. Hiermit legen Sie fest, mit welchem Zoomfaktor die Karte angezeigt wird. In dieser Anwendung wird der Wert von einer Laufleiste gesteuert, wodurch der Endanwender den Zoomfaktor selbst einstellen kann. Außerdem ist es besser, diesen Wert logarithmisch und nicht linear zu verändern. Darum wird der Wert der Laufleiste zum Quadrat genommen, wenn Sie die Eigenschaft MapScale festlegen (anderenfalls würde das Herauszoomen relativ lange dauern).

Um die Karte um eine Beschriftung mit dem Namen der Firma zu ergänzen, verwenden Sie sogenannte Pushpins (virtuelle Reißzwecke). In der Eigenschaft Label geben Sie den Text an, der ausgegeben werden soll; mit der Eigenschaft Icon können Sie das Symbol, das auf der Karte erscheinen soll, auswählen. Anschließend erzeugen Sie eine Instanz der Klasse MapOptions und verwenden deren Eigenschaften, um die Höhe und Breite der Karte festzulegen, die Sie erhalten möchten. All diese Informationen werden in einem Objekt des Typs MapSpecification zusammengefasst und an die Methode RenderServicedes MapPoint-Webdienstes übergeben. RenderService erzeugt dann eine Grafik des angeforderten Bereichs und gibt diese Grafik (als XML codiert) an die Anwendung zurück.

Die Anwendung parst das XML und gibt die Daten zurück. Dann muss lediglich noch eine einfache Konvertierung vorgenommen werden, um die Bilddaten in den Datentyp BitMap umzuwandeln. Anschließend kann die Grafik in einer PictureBox angezeigt werden. Die Ergebnisse werden dann so gerendert, wie es Abbildung 3 zeigt.

Der .NET-Code zum Darstellen einer Adresse als Karte ist damit fertig. Wie verbinden Sie diesen Code nun mit Ihrer bestehenden Visual Basic 6.0-Anwendung? Die Antwort ist: Sie verwenden das Interop Forms Toolkit 2.0 (http://msdn2.microsoft.com/en-us/vbasic/aa701259.aspx), um ein Visual Basic 2005-Form zu erstellen, das einfach von Visual Basic 6.0 aus aufgerufen werden kann. Wenn Sie das Interop Forms Toolkit 2.0 installieren, finden Sie in Visual Studio 2005 eine neue Vorlage des Typs Visual Basic 6.0 InteropForm, das Sie dann in Ihre Projekte einfügen können. Hierbei handelt es sich um ein .NET-Form, das einfach von Visual Basic 6.0 aus verwendet werden kann.

Cc299495.17d2b368-1e64-491a-937d-5cc1d7f946ab(de-de,VS.80).gif

Abbildung 6: Ein Element des Typs Visual Basic 6.0 InteropForm einfügen

Beim InteropForm handelt es sich um ein Standard-.NET-Form, das eine Reihe von Attributen enthält, die festlegen, welche Teile des Forms über COM aufgerufen werden können. In Listing 3 sehen Sie einen Ausschnitt des Quellcodes des Forms.

Imports System.Windows.Forms
Imports Microsoft.InteropFormTools
Imports VBNET_Extensions.MapPointService

<InteropForm()> _
Public Class MapPointForm
    Private findResults As FindResults
    Private renderService As New RenderServiceSoap
    Private findService As New FindServiceSoap

    Private isInitialized As Boolean = False

    Private m_address As String
    <InteropFormProperty()> _
    Public Property Address() As String
        Get
            Return m_address
        End Get
        Set(ByVal value As String)
            If value <> m_address Then
                m_address = value
                findResults = Nothing
                RenderTimer.Enabled = True
            End If
        End Set
    End Property
    
    ...

End Class

Listing 3: Code eines Visual Basic 6.0-InteropForms

Das Form selbst besitzt das Attribut InteropForm. Alle Eigenschaften oder Methoden, die Sie Visual Basic 6.0 zur Verfügung stellen wollen, werden ebenfalls mit dem entsprechenden Attribut InteropFormProperty und InteropFormMethod versehen.

Zwei Schritte sind erforderlich, um Ihre Visual Basic 2005-COM-Objekte zu kompilieren. Zuerst wählen Sie den Menübefehl Tools | Generate InteropForm Wrapper Classes. Hierdurch wird anhand der im Code enthaltenen Attribute der COM-Wrappercode erstellt. Anschließend erstellen Sie wie gewohnt das Projekt und verwenden dazu den Menübefehl Build | Build Solution (Erstellen | Projektmappe erstellen).

Cc299495.8e6197f9-8bcc-424e-a3da-368b86d598a3(de-de,VS.80).gif

Abbildung 7: Die InteropForm-Wrapperklassen erstellen

Das .NET-Form von Visual Basic 6.0 aus aufrufen

Nachdem Sie das kompatible Form erstellt haben, können Sie es, wie jedes andere COM-Objekt auch, von Visual Basic 6.0 aus aufrufen. Hierzu fügen Sie in Visual Basic 6.0 einen Verweis auf Ihren Visual Basic 2005-Code ein.

Cc299495.aefdb95f-7a55-4cfd-9bc7-1af907d1757a(de-de,VS.80).gif

Abbildung 8: In Visual Basic 6.0 einen Verweis auf eine Visual Basic 2005-Komponente einfügen

Nachdem Sie die Komponente referenziert haben, können Sie eine Instanz Ihres Visual Basic 2005-Forms erstellen, Eigenschaften festlegen und andere Operationen durchführen.

Private Sub cmdMap_Click()
    Dim frmMap As VBNET_Extensions_MapPointForm
    Set frmMap = New VBNET_Extensions_MapPointForm
    
    frmMap.Address = rsAccount("Address") & ", " & _
        rsAccount("City") & ", " & _
        rsAccount("Region") & "  " & _
        rsAccount("PostalCode")
    
    frmMap.PushPinName = rsAccount("CompanyName")
    frmMap.Show
End Sub

Listing 4: Ein Visual Basic 2005-Form von Visual Basic 6.0 aus aufrufen

Hier werden die Kundendaten aus der Datenbank der Eigenschaft Address des Forms übergeben. Die Eigenschaft PushPinName wird auf den Namen der Firma gesetzt, was wiederum dafür sorgt, dass der Firmenname auf der Grafik der Karte erscheint. Abschließend wird das Form angezeigt, das die Karte enthält.

Wenn Sie Anwendungen besitzen, die in Visual Basic 6.0 erstellt wurden, können Sie Ihre Investitionen bewahren und die Anwendungen mit Visual Basic 2005-Code erweitern. In diesem Artikel habe ich gezeigt, wie Sie von Visual Basic 2005 aus einen Webdienst aufrufen und wie Sie eine Visual Basic 6.0-Anwendung um Mappingfunktionen, die den MapPoint-Webdienst verwenden, erweitern.

Weitere Informationen zum MapPoint-Webdienst finden Sie auf folgenden Websites:

Über den Autor

Scott Swigart verbringt seine Zeit mit Consulting, mit Autorentätigkeit und ist als Referent über sich entwickelnde und neu entstehende Technologien tätig. Dank seiner mehr als 15-jährigen Erfahrung als Programmierer und seines permanenten Kontakts mit zukünftigen Technologien im Bereich der Softwareentwicklung ist Scott Swigart in der Lage, Unternehmen dabei zu unterstützen, das Beste aus den heutigen Technologien herauszuholen und sich dabei gleichzeitig auf die Verwendung von zukünftigen Technologien vorzubereiten. Scott Swigart ist außerdem Autor von mehreren Büchern zu .NET, zertifizierter Microsoft Trainer (MCT) und Entwickler (MCSD) sowie Microsoft MVP. Nehmen Sie mit Scott Swigart Kontakt auf über scott@swigartconsulting.com oder lesen Sie seine aktuellen Grübeleien unter blog.swigartconsulting.com.

Anzeigen: