Heim

Xbase++

Xbase++ ist eine Programmiersprache für 32-Bit-Plattformen der Alaska Software Inc., Germany & USA. Sie kann sowohl prozedural als auch objektorientiert benutzt werden, wobei die eindeutigen Stärken in der Objektorientierung liegen.

Inhaltsverzeichnis

Funktionsumfang

Xbase++ ist mit einem internen Befehlssatz für das Arbeiten mit dBASE oder FoxPro Datenbanken ausgerüstet, weshalb zur Arbeit mit DBF-Dateien keine weiteren Treiber (auch kein ODBC) oder DBMS erforderlich sind. Xbase++ bietet eine vollständige Integration aller gängigen Windows-Forms, die innerhalb des Programmcodes als Objekte gekapselt sind. In Xbase++ werden alle objektorientierten Ansätze unterstützt (Einfach- und Mehrfachvererbung, Abstrakte Klassen, abstrakte Methoden, …). Im Standardsprachumfang bzw. in den mitgelieferten Laufzeitbibliotheken fehlt eine Unterstützung für Standardnetzwerkprotokolle (außer NetBIOS), wie TCP/IP, was aber durch zahlreiche Zusatzprodukte ausgeglichen werden kann. Zudem gibt es eine Vielzahl weiterer Zusatzbibliotheken, mit denen beispielsweise E-Mail Funktionalität via SMTP und POP3 Protokoll genutzt werden kann. Des Weiteren kann man die OpenGL Schnittstelle nutzen oder via ODBC auf beliebige Datenbanken zugreifen. Die Integration von ActiveX Komponenten ist ebenso möglich wie das Benutzen von .Net Komponenten. Über einen so genannten WebApplicationAdapter ist es sogar möglich Geschäftsprozesse via Internet zu tätigen und direkt über das Internet auf dBASE-Datenbanken zuzugreifen. Das Ergebnis kann dann bequem in jedem beliebigen Browser dargestellt werden oder über ActiveX-Komponenten sogar in der eigenen Programmoberfläche.

Versionen

Position im Markt

Xbase++ findet keinen so großen Anklang wie andere Produkte, wie beispielsweise C++, Visual Basic oder C#, obwohl die Sprache gegenüber diesen einige deutliche Vorteile aufweist. So ist man bei Xbase++ nicht gezwungen Variablen zu deklarieren. Dynamische Variablen, die zur Laufzeit erzeugt werden, stellen für Xbase++ kein Problem dar. Auch die durch zugewiesene Datentypen weithin eingeschränkte Nutzbarkeit von Variablen ist in Xbase++ nicht vorhanden. So kann man prinzipiell in jede Variable während der Abarbeitung einer Funktion, Prozedur oder Methode jeden beliebigen Datentypen speichern. Dadurch kann man beispielsweise in einem Kontext die Variable "i" als numerischen Counter innerhalb einer "FOR … NEXT" Anweisung benutzen und die gleiche Variable unmittelbar nach Beendigung der Schleife mit einem Stringwert belegen oder ein Array darüber referenzieren. Ein großer Nachteil ergibt sich jedoch direkt aus der relativ geringen Durchdringung des Marktes mit Produkten dieser Sprache, was sich zwangsläufig bis zum Entwickler niederschlägt. Dem nämlich steht für seine Arbeit nicht in dem Umfang Informationsmaterial zur Verfügung, wie das bei den "großen" Sprachen der Fall ist und viele Dinge, wie oben beschriebene Zusatzfunktionalitäten, müssen bei Drittanbietern für oftmals viel Geld nachgekauft werden, während diese in den weit verbreiteten Sprachen bereits zur Grundausrüstung gehören. Bis vor einigen Jahren gab es für Xbase++ noch keine offiziell vom Hersteller der Sprache (Alaska Software) vertriebene IDE. Man musste sich also mit anderen Multilanguage-IDEs behelfen, was aber nicht unbedingt von Nachteil war. Seit einiger Zeit wird aber die IDE Visual Xbase angeboten, die mittlerweile in der Version 2.0 (Stand 24. September 2004) zu haben ist.

Ein Konkurrenzprojekt zu Xbase bietet der Hersteller xHarbour.

Xbase++ ist kompatibel zu Clipper, was eine Portierung von Clipperprogrammen in die 32-Bit Windowswelt ermöglicht.

Nachteil von Xbase

Es ist nicht möglich, komponentenbasiert und sprachübergreifend mit Xbase++ zu arbeiten. So kann man zwar in C++ oder Visual Basic geschriebene DLLs nutzen, umgekehrt jedoch kann man mit Xbase++ keine DLLs erstellen, die sich aus anderen Sprachen heraus nutzen lassen.

Ein weiterer Nachteil besteht darin, dass diese Sprache keinem international anerkannten Standard entspricht, sondern von einer einzelnen Firma spezifiziert und proprietär entwickelt wird (wie z. B. Visual Basic auch; C++ jedoch nicht). Mit XBase++ ist es weiterhin nicht möglich plattformübergreifend zu entwickeln, da als Plattform lediglich Windows (und hier außerdem nur 32-Bit-Versionen) unterstützt wird.

Syntaxbeispiel

Ein wesentlicher Punkt, warum man sich als Programmierer für oder gegen eine bestimmte Sprache entscheidet, ist sicher der Aufwand den es macht, diese zu erlernen. Xbase++ stellt dahingehend eine recht einfache Sprache dar, die starke Parallelen zu C++ zeigt. Folgender Beispielquellcode zeigt eine Klasse, deren Objektinstanzen nur eine Methode haben, mit der sie alle in einem angegebenen Verzeichnis vorhandenen Dateien eines bestimmten Typs sammeln, in einer Klassenvariable speichern und in einer einfachen Messagebox anzeigen.


#include "xbtsys.ch"
#include "directry.ch"
  // zuerst wird die Klasse definiert
  CLASS FolderScanner
     EXPORTED:
        VAR aFiles
        VAR cFileMask
        VAR aFileMask
        VAR cDirectory
  
        METHOD Init
        METHOD ListFilesFromFolder
  ENDCLASS
  
  // dann werden die Methoden definiert
  METHOD FolderScanner:Init( cMask, cDirectory )
     // die übergebenen Variablen cMask und cDirectory werden automatisch als LOCAL definiert
     IF VALTYPE( cMask ) == "C" .AND. ! EMPTY( ALLTRIM( cMask ) )
        ::cFileMask := ALLTRIM( cMask )
     ELSE
        ::cFileMask := ""
     ENDIF
  
     IF VALTYPE( cDirectory ) == "C" .AND. ! EMPTY( ALLTRIM( cDirectory ) )
        // es darf aber ohne weiteres Instanzvariablen mit dem gleichen Namen geben
        ::cDirectory := ALLTRIM( cDirectory )     
     ELSE
        MSGBOX( "Kein Pfad zum Durchsuchen angegeben. Programmabbruch", "Achtung" )
        QUIT
     ENDIF
     ::aFiles := {}
     ::aFileMask := {}
  RETURN self
  
  METHOD FolderScanner:ListFilesFromFolder()
     LOCAL aX, i   // eine strenge Typisierung ist nicht notwendig
     LOCAL cMessageString := ""   // bei der Deklaration können Werte zugewiesen werden
     
     IF ! DIRCHANGE( ::cDirectory ) == NO_DISK_ERR  
        //Konstanten wie NO_DISK_ERR können in Include-Dateien definiert werden, ähnlich den *.h-Dateien in C
        MSGBOX( "Das angegebene Verzeichnis existiert nicht. Programmabbruch", "Achtung" )
        QUIT
     ELSE
        aX := DIRECTORY( "*." + ::cFileMask )
     ENDIF
     
     FOR i:= 1 TO LEN(aX)
        IF RIGHT( aX[ i, F_NAME], LEN( ::cFileMask ) ) == ::cFileMask
           AADD( ::aFileMask, ::cDirectory + "\" + aX[ i, F_NAME ] )
           cMessageString += aX[ i, F_NAME ] + CHR(13) + CHR(10)
        ENDIF
     NEXT
     
     MSGBOX( "Zur Dateimaske " + ::cFileMask + ;
        " wurden folgende Dateien im angegebenen Verzeichnis gefunden : " + ;
        cMessageString, "Ergebnis" )
     
  RETURN self
     
  // So kann die Klasse verwendet werden
  PROCEDURE Main()
     LOCAL oFolderscanner
     oFolderscanner := Folderscanner():New( "EXE", "C:\TEMP" )
     oFolderscanner:ListFilesFromFolder()
  RETURN