Xbase++

Xbase++
Xbase++
Xbase++ "Hallo Welt":

PROCEDURE Main
msgbox("Hallo Welt!", version())
RETURN

Basisdaten
Paradigmen: Objektorientierte

und Prozedurale Sprache

Erscheinungsjahr: 1997
Entwickler: Alaska Software Inc.
Aktuelle Version: 2.0  (30. September 2014)
Typisierung: dynamisch
Beeinflusst von: Clipper, dBASE
Betriebssystem: Windows
Lizenz: proprietär
Alaska Software

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

Funktionsumfang

Xbase++-2.0-Workbench mit Beispielprojekt

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 (zum Beispiel Einfach- und Mehrfachvererbung, abstrakte Klassen, abstrakte Methoden). Im Standardsprachumfang beziehungsweise 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 sogenannten Web Application Adaptor ist es möglich, Geschäftsprozesse via Internet zu unterstützen und direkt über das Internet auf dBASE-Datenbanken zuzugreifen. Das Ergebnis kann dann bequem in jedem beliebigen Browser oder über ActiveX-Komponenten sogar in der eigenen Programmoberfläche dargestellt werden.

Mit Version 2.0 wurde das Web-Frontend um die Compiled-Xbase-Pages-Klasse (<CXP/>) erweitert, mit der die gewohnte Xbase++-Logik, eingebettet in HTML-Code für die Oberfläche, weiterverwendet werden kann. Diese Pages können dann mit jedem beliebigen Browser von einem Webserver abgerufen werden, lediglich die erstellten Programm-DLL müssen auf einem Windows-Server liegen.

Neben den Befehlszeilen-Kommandos stellt Alaska den Lizenznehmern zur Entwicklung bis einschließlich Version 1.9 SL1 das kostenfreie Tool Visual Xbase++ zur Verfügung. Ab Version 2.0 wird die IDE als zentrale Entwicklungsumgebung unter dem Namen Workbench zur Verfügung gestellt.

Versionen

  • Xbase++ 1.82, März 2003
  • Xbase++ 1.9, Mai 2006
  • Xbase++ 1.9 SL1 (build level 1.90.355), April 2009
  • Xbase++ 2.0, 30. September 2014, Updates im Rahmen der Continuous Delivery-Strategie am:
    • 30. September 2014 (Build 554)
    • 13. November 2015 (Build 656)
    • 15. Juni 2020 (Build 1255)
    • 6. Juli 2021 (Build 1461)

Position im Markt

Xbase++ findet keinen so großen Anklang wie andere Produkte, beispielsweise C++, Visual Basic oder C#. Ein großer Nachteil ergibt sich 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 anderen Sprachen der Fall ist. Funktionen, wie oben beschriebene Zusatzfunktionalitäten, müssen bei anderen Anbietern für oft viel Geld nachgekauft werden, während diese in den weit verbreiteten Sprachen bereits zur Grundausrüstung gehören.

Ein Konkurrenzprojekt zu Xbase++ bietet der Hersteller xHarbour.

Kompatibilität

Xbase++ ist kompatibel zu Clipper, was eine Portierung von Clipper-Programmen in die 32-Bit Windowswelt und in die Browserwelt ermöglicht. Mit Version 2.0 wird seit 2014 ebenfalls eine Migrationsmöglichkeit von Microsoft-Visual-FoxPro-Code angeboten. Dies ist jedoch nur ansatzweise umgesetzt, eine volle Übernahmemöglichkeit wird mit Xbase++ 3.0 angestrebt.

Nachteile

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 Web unterstützt wird.

Syntaxbeispiel

Folgender Xbase++-2.0-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 "directry.ch"
 // zuerst wird die Klasse definiert
 CLASS FolderScanner
    // Methoden und Member-Variablen global sichtbar machen
    EXPORTED:
       VAR cFilesString
       METHOD ListFilesFromFolder
    // Sichtbarkeit von Member-Variablen und Methoden auf Subklassen einschränken
    PROTECTED:
       VAR cFileExt
       VAR cDirectory
       VAR aFiles
       METHOD Init
       METHOD ShowMessage
 ENDCLASS
 // dann werden die Methoden definiert
 METHOD FolderScanner:Init( cExtension, cDirectory )
    // die bergebenen Variablen cExtension und cDirectory werden automatisch als LOCAL definiert
    LOCAL cErrorTxt := "" // bei der Deklaration können Werte zugewiesen werden
    ::cFileExt := ""
    IF VALTYPE( cExtension ) == "C" .AND. .NOT. EMPTY( ALLTRIM( cExtension ) )
       ::cFileExt := ALLTRIM( cExtension )
    ENDIF
    // Kontrollstruktur für Fehler-Management einleiten
    BEGIN SEQUENCE
    IF VALTYPE( cDirectory ) == "C" .AND. .NOT. EMPTY( ALLTRIM( cDirectory ) )
       // es darf ohne weiteres Instanzvariablen mit dem gleichen Namen geben
       ::cDirectory := ALLTRIM( cDirectory )
    ELSE
       break( "Kein Pfad zum Durchsuchen angegeben. Abbruch" )
    ENDIF
    IF .NOT. FILE( ::cDirectory, "D" )
       break( "Das Verzeichnis '"+ ::cDirectory + "' existiert nicht. Abbruch" )
    ENDIF
    ::aFiles := {}
    ::cFilesString := ""
    RECOVER USING cErrorTxt
       ::ShowMessage("Achtung", cErrorTxt ) // Problem anzeigen
       QUIT // und Schluss
    END SEQUENCE // Ende der Kontrollstruktur
 RETURN self
 METHOD FolderScanner:ListFilesFromFolder()
    ::aFiles := DIRECTORY( ::cDirectory+"\"+"*." + ::cFileExt )
    ::cFilesString := ""
    AEVAL( ::aFiles, { |aFile, i| ::cFilesString += CHR(13)+CHR(10) + aFile[F_NAME]} )
    ::ShowMessage("Ergebnis", ;
                "Zur Datei-Extension " + ::cFileExt +    ;
                " wurden folgende Dateien im Verzeichnis '"+ ;
                ::cDirectory +"' gefunden : " + ::cFilesString )
 RETURN self
 METHOD FolderScanner:ShowMessage(cCaption, cMessage)
    MSGBOX( cMessage, AppName()+": " + cCaption )
 RETURN self
 // So kann die Klasse verwendet werden
 PROCEDURE Main() // 'Main' ist der Standard-Bezeichner für die Haupt- bzw. Startroutine
    LOCAL oFolderscanner
    oFolderscanner := Folderscanner():New( "EXE", "E:\TEMP" )
    oFolderscanner:ListFilesFromFolder()
 RETURN

Weblinks