FoxPro-Anwendungen Modul für Modul nach Silverlight migrieren bzw. integrieren

by wmn 7. June 2011 19:30

Viele FoxPro-Entwickler stehen vor dem Problem große Anwendungen in die schöne neue Welt <G> zu migrieren. Häufig steht schon fest, daß die neue Entwicklungsumgebung .NET und damit Silverlight oder WPF oder ASP.NET sein wird. Aber auch für jede andere Web-Technologie ist der hier beschriebene Weg verwendbar.

Soweit so gut. In den meisten Fällen steht man aber vor der fast unlösbaren Aufgabe eine große Anwendung umzustellen. Meist hat man dafür weder die Entwicklungs- noch die Testkapazität geschweige denn das notwendige Budget. Somit bleibt nur, diese Umstellung Schritt für Schritt vorzunehmen. Da sich die Umstellungsphase auch über einen sehr langen Zeitraum hinziehen kann, sind Ideen für eine nahtlose Integration zwischen alten und neuen Systemteilen dringend gefragt.

Vor etwa zwei Jahren habe ich hierzu schon einmal das Windows Messaging im Rahmen eines Vortrags gezeigt. Dabei “kommunizieren” eine FoxPro-Anwendung und eine .NET-WPF-Anwendung über das Windows-Messaging miteinander. Der Anwender springt dabei - kaum merklich – zwischen alter und neuer Welt hin und her.

Heute stelle ich hier eine noch reibungslosere Integrationsmöglichkeit zwischen FoxPro-Anwendungen und Silverlight vor.

Die FoxPro-Beispielmaske:

image

Den Kern der Idee bildet das Internet-Explorer-Control (Active-X-Control!). Dieses Steuerelement bietet uns alle entscheidenden Funktionen um Silverlight-Masken anzuzeigen. Ein Beispielaufruf ist hinter dem Click-Event der Buttons implementiert:

this.olecontrol1.navigate2(“http://localhost:58226/slFoxIntegrationTestPage.aspx#/home”)

 

Die Silverlight Anwendung

Der Trick für eine nahtlose Integration von Silverlight in eine FoxPro-Anwendung liegt im sogenannten “Deep-Linking”, das Silverlight seit der Version 3.5. bietet. Hierbei kann man eine Silverlightanwendung direkt mit einem Aufruf einer bestimmten Maske starten. Am einfachsten kann man sich eine solche Anwendung über das “Silverlight Navigation Application”-Projekttemplate im Visual-Studio anlegen.

Ich habe die Optik der Startseite etwas angepasst sodaß man hier die Kopfzeile nicht mehr sieht. Diese brauchen wir für unser Beispiel einfach nicht mehr, da FoxPro für die Navigation in der Anwendung verantwortlich sein soll. Die Mainpage der Silverlight-Anwendung sieht dann so aus:

image

Nicht gerade spannend aber für unsere Zwecke völlig ausreichend. Kern dieser Seite ist jetzt nur noch das Frame-Control, das unsere Masken “hostet”, die wir von FoxPro aus direkt starten wollen. Hier der Auszug aus dem XAML der MainPage.xaml-Datei:

 

image

Damit sind die wesentlichsten Komponenten fertig gestellt. Wenn man jetzt die Silverlight-Anwendung startet bekommt man im Internetexplorer auch die korrekte Adresse der Silverlight-Anwendung auf seinem eigenen Rechner angezeigt. Diese kann man für den ersten Test einfach kopieren und nach FoxPro übertragen.

Wie kann man nun von FoxPro aus bestimmte Seiten direkt starten? Nun das geht direkt über die Startseite, die man mit entsprechenden Parametern aufrufen kann:

http://localhost:58226/slFoxIntegrationTestPage.aspx#/about?CustNo=1

Hierbei wird der Parameter “/about” über den URI-Mapper der MainPage in die Silverlightseite “/Views/About.xaml” umgemappt und dieses Control wird dann in dem obigen Frame-Control angezeigt.

Wie kann man dieser Maske nun von FoxPro aus Parameter übergeben? Auch das sieht man in der oben angebenen Adresse. Das “?” ist der Marker an dem Parameter intern unterschieden werden. In dem angezeigten Beispiel wird die CustNo mit dem Wert 1 übergeben. Auslesen kann man diesen Parameter dann auf der Silverlightseite z.B. im Codebehind der Maske über folgenden Aufruf:

image

Der Zugriff auf den Parameterwert ist sehr einfach, da VisualStudio uns hier ganz bequem zugreifen lässt:

image

Stellt sich natürlich noch die Frage, wie man Ergebniswerte von Silverlight nach FoxPro zurückgeben kann. Auch das ist eigentlich recht einfach solange es sich um wenige einzelne Informationen handelt. Der Trick ist hierbei eine Dummy-URl zu der man von Silverlight aus navigiert, um zurück zur FoxPro-Anwendung zu kommen. In folgendem Beispiel werden gefundene Daten zu einer URL zusammengesetzt und dann dorthin navigiert:

image

  Natürlich gibt es diese Webseite nicht wirklich. Hier sollte jetzt eigentlich auch ein entsprechender Fehler im Explorer-Control erscheinen. Damit das nicht passiert “fangen” wir diese Dummy-URL im Inernet-Explorer-Control in der FoxPro-Maske ab.

image

 

 

 

 

 

 

Hierzu habe ich am OCX-Control die Methode BeforeNavigate2 überschrieben. In diese wird die Dummy-URL als Parameter hereingegeben. Dadurch, daß ich den Parameter Cancel auf .t. gesetzt habe, wird die Navigation abgebrochen und der Aufruf der Seite quasi beendet.

Was aber tun, wenn man eine ganze Ergebnisliste von Silverlight nach FoxPro übergeben will? Die Übergabe per URL ist dafür sicher nicht geeignet. In diesem Fall muss man etwas mehr Aufwand betreiben. Der einfachste Weg hierfür geht sicherlich über XML-Dateien, die man im Isolated-Storage ablegt und deren Dateiname man als Parameter an Foxpro zurückgibt.

Der hier beschriebene Weg ermöglicht es - auch große Anwendungen - Stück für Stück umzustellen ohne dass der Anwender davon etwas merkt. Wenn Farben und Schriftarten sowie die Maskengestaltung angepasst wird, ist es für den Benutzer kaum auseinander zu halten, ob er sich in FoxPro oder in Silverlight bewegt. Wenn man sich die Implementierung der Serviceschnittstelle sparen will, kann man sicherlich auch WPF-Anwendungen auf die gleiche Art integrieren. Hierzu muss lediglich WPF als Browseranwendung laufen. Auch ASP.NET oder andere WEB-Anwendungen kann man auf diesem Weg nahtlos integrieren.

Vielleicht hilft das hier beschriebene Beispiel dem ein oder anderen auf dem Weg seine Anwendung auf eine neue Version zu migrieren.