Eine pfannenfertige Lösung im Stil von gwbasic2vb6.exe ist mir bisher noch keine bekannt, daher folgt eine schrittweise aufgebaute Anleitung. Vergleichen Sie diese Anleitung mit einem Eurocity-Zug; Sie fahren vermutlich auch nur selten die gesamte Strecke, beispielsweise von Zürich nach Venedig, stattdessem steigen Sie vielleicht erst bei Arth-Goldau ein und verlassen den Zug in Bellinzona bereits wieder. Im selben Sinne sollten Sie auch diese Anleitung benützen! Gleichzeitig werden Sie aber auf diese Weise die doch immerhin bald 20-jährige Entstehungsgeschichte von Microsoft BASIC ein bisschen kennenlernen, begonnen bei BASICA.COM bei DOS Version 2 bis und mit Visual BASIC 6 wie es heute auf vielen unter Windows NT laufenden Webserver im Zusammenhang mit ASP (Active Server Pages) zur Anwendung kommt. Letzteres kenne ich allerdings nicht mehr so detailliert, so dass ich Ihnen dort nur theoretische Hinweise geben kann. Ergänzungen Ihrerseits sind also willkommen!
Zuerst muss die .BAS-Datei ins ASCII-Format gebracht werden. Dazu sind folgende Schritte mit GWBASIC.EXE nötig (Unter Windows genügt eine MS-DOS-Eingabeaufforderung):
C:\BASICPRG>gwbasic GW-BASIC 3.23 (C) Copyright Microsoft 1983,1984,1985,1986,1987,1988 60300 Byte frei Ok load "meinprog" Ok save "\qbasic\schritt1",a Ok system C:\BASICPRG>cd \qbasic C:\QBASIC>_
Wichtig ist hierbei die Option ,a beim save-Befehl.
Microsoft hat zu diesem Zweck REMLINE.BAS herausgegeben. Falls Sie dieses Programm nicht besitzen, finden Sie unter Bezug von QuickBASIC weiterführende Hinweise. Mit QBASIC.EXE sind folgende Schritte nötig:
C:\QBASIC>qbasic /run \windows\command\remline Microsoft RemLine: Line Number Removal Utility (.BAS assumed if no extension given) Input file name (ENTER to terminate): schritt1 Output file name (ENTER to print to screen): schritt2 Working . . .
=> Datei, Beenden
C:\QBASIC>_
Anstelle von \windows\command setzen Sie natürlich den bei Ihrer Installation gültigen Pfad ein, wo sich REMLINE.BAS befindet (häufig auch unter C:\DOS zu finden).
Jetzt kommt reine Handarbeit: Laden Sie Ihr Programm von vorher in QBASIC.EXE hinein:
C:\QBASIC>qbasic schritt2 Datei Bearbeiten Ansicht Suchen Ausführen Debug +------------------------------- SCHRITT2.BAS --------- | PRINT "Hallo" | I% = 26 |30 PRINT I% | PRINT "Welt" | GOTO 30 |
REMLINE.BAS hat nämlich nur diejenigen Zeilennummern
entfernt, welche kein Sprungziel für ein
GOTO
/GOSUB
dargestellt haben. Sie
sollten also die gesamte Programmstruktur etwas überarbeiten.
Zuerst sollten Sie die verbliebenen Zeilennummern durch sprechende Sprungmarken ersetzen und gleichzeitig zweckmässiger einrücken.
PRINT "Weiter mit Taste" 430 T$ = INKEY$ IF T$="" THEN 430
sollten Sie besser zu
PRINT "Weiter mit Taste" Taste: T$ = INKEY$ IF T$="" THEN Taste
umwandeln. Viel besser und schöner :-) ist es, sämtliche Sprungmarken durch strukturierte Bedingungen und Schleifen zu ersetzen.
PRINT "Start" IF B$ <> "Andy" THEN 1730 PRINT "Müller" PRINT "Fritz" GOTO 1760 1730 T$ = INKEY$ IF T$ = "" THEN 1730 1760 PRINT "Weiter"
sollte man zu
PRINT "Start" IF B$ = "Andy" THEN PRINT "Müller" PRINT "Fritz" ELSE DO T$ = INKEY$ LOOP WHILE T$ = "" END IF PRINT "Weiter"
umwandeln.
GWBASIC.EXE machte Ihnen früher alle Variablennamen grossbuchstabig => Verschönern Sie diese! Aus:
A$ = MID$(NAMEFAM$, 5, I%)
ergibt sich:
a$ = MID$(NameFam$, 5, i%)
Sie brauchen dabei nur an einem Ort die Gross/Kleinschreibung ändern, danach passt es der QuickBASIC-Editor überall noch automatisch an.
Nutzen Sie den Vorteil der lokalen Variablen und Übersicht, in dem Sie
Ihre GOSUB
-Unterprogramme zu SUB
- und
FUNCTION
-Prozeduren umbauen. Statt:
A% = 5: GOSUB 1000 A% = 7: GOSUB 1000 1000 ' Sterne ausgeben FOR I%=1 TO A%: PRINT "*";: NEXT I%:PRINT RETURN
machen Sie daraus viel besser
DECLARE SUB ZeichneSterne(a%) ZeichneSterne 5 ZeichneSterne 7 SUB ZeichneSterne(a%) FOR i%=1 TO a% PRINT "*"; NEXT i% PRINT END SUB
Der gesamten objektorientierten Software-Entwicklung liegen Verbundvariablen (sog. Records) zugrunde. Wo Sie also früher noch haufenweise Einzelvariablen als »Familien« verwendet haben, können Sie die Übersicht erhöhen. Beispiel aus einem CAD-Programm:
X1A! = 320!: Y1A! = 200!: X1E! = 50!: Y1E! = 20! X2A! = 60!: Y2A! = 180!: X2E! = 250!: Y2E! = 15! GOSUB 5000 PRINT "Schnittpunkt: ("; XS!; ","; YS!; ")" 5000 ' Unterprogramm Schnittpunkt ' Eingangsparameter: X1A! = X-Koordinate des Anfangspkt. der 1. Linie ' Y1A! = Y-Koordinate des Anfangspkt. der 1. Linie ' X1E! = X-Koordinate des Endpunktes der 1. Linie ' Y1E! = Y-Koordinate des Endpunktes der 1. Linie ' X2A! = X-Koordinate des Anfangspkt. der 2. Linie ' Y2A! = Y-Koordinate des Anfangspkt. der 2. Linie ' X2E! = X-Koordinate des Endpunktes der 2. Linie ' Y2E! = Y-Koordinate des Endpunktes der 2. Linie ' Ausgabeparameter: XS! = X-Koordinate des Schnittpunktes ' YS! = Y-Koordinate des Schnittpunktes ' (hier Algorithmus) RETURN
Linien und Punkte sind zusammenhängende Objekte, also definiert man besser
TYPE Punkt x AS SINGLE y AS SINGLE END TYPE TYPE Linie p1 AS Punkt p2 AS Punkt END TYPE
worauf unser Unterprogramm von vorher übersichtlich zu
DECLARE SUB BerechneSchnittpunkt(l1 AS Linie, l2 AS Linie, s AS Punkt) DIM lin1 AS Linie, lin2 AS linie, sp AS Punkt Lin1.p1.x = 320!: Lin1.p1.y = 200! Lin1.p2.x = 50!: Lin1.p2.y = 20! Lin2.p1.x = 60!: Lin2.p1.y = 180! Lin2.p2.x = 250!: Lin2.p2.y = 15! BerechneSchnittpunkt Lin1, Lin2, sp PRINT "Schnittpunkt: ("; sp.x; ","; sp.y; ")" SUB BerechneSchnittpunkt(l1 AS Linie, l2 AS Linie, s AS Punkt) ' (hier Algorithmus) END SUB
wird.
Es hängt ganz davon ab, was Sie mit Ihrem alten GW-BASIC-Programm schlussendlich machen wollen. Als Minimum würde ich wenigstens aussagekräftige Labels verpassen. Ideal :-) ist es aber schon, das gesamte Design Ihres Programms wie oben illustriert zu überarbeiten, damit Sie die Vorteile von QuickBASIC voll nutzen können!
Speichern Sie Ihre überarbeitete Version z.B. als MEINP_QB.BAS ab. Damit ist die Umwandlung nach QBASIC.EXE abgeschlossen.
Microsoft hat mit QuickBASIC auch ihr bisheriges MBF-Gleitkommaformat auf IEEE
754 geändert, so dass Sie in Dateien, wo Sie mit MKS$()
,
MKD$()
, CVS()
und CVD()
gearbeitet
haben, diese entweder konvertieren (Hilfsprogramm schreiben!) oder die vorhin
genannten Funktionen durch MKSMBF$()
, MKDMBF$()
,
CVSMBF()
und CVDMBF()
ersetzen müssen. Siehe
dazu Alles über Gleitkommazahlen.
Diese Übernahme stellt einen wesentlich grösseren Schritt als der bisherige Schritt dar, weil Windows einen komplett von DOS verschiedenen Grundaufbau aufweist.
QuickBASIC speichert seine ASCII-Quelltextdateien im IBM-Zeichensatz, während Windows auf dem heutzutage üblichen ISO-8859-1-Zeichensatz oder sogar neuerdings Unicode aufbaut, welche sich speziell bei den Sonderzeichen wie deutsche Umlaute (ä, ö, ü, Ä, Ö, Ü und ß) unterscheiden. Für die Umwandlung eignet sich Word für Windows aus Microsoft Office, ebenso eignet sich auch WordPad von Windows selber. Die folgende Beschreibung bezieht sich auf Word Version 6.0a für Windows 3.1x.
Zuerst wie gewohnt Datei, Öffnen aufrufen, dabei Kästchen bei Konvertierungen bestätigen aktivieren (im folgenden sehr wichtig!), als Dateityp *.* (alle Dateien) und Ihr Programm C:\QBASIC\MEINP_QB.BAS wählen. Jetzt fragt Sie Word, welcher Filter verwendet werden soll: Wählen Sie MS-DOS-Text anstelle des vorgeschlagenen Nur Text, worauf die Umlaute werden korrekt übernommen werden, so dass Sie eben
PRINT "Äußere Ölbüchsen töten den Übeltäter."
anstatt
PRINT "uáere ™lbchsen t”ten den šbelt"ter."
zu sehen bekommen. Speichern Sie dies nun mit Speichern unter... als C:\VB6_Projekte\MeinProjekt\MeinProgramm.bas (verpassen Sie einen schönen :-), Windows 95-mässigen Namen!) ab, wobei Sie als Dateityp Nur Text anstelle von MS-DOS-Text einstellen. Damit ist Ihre Datei Windows-kompatibel.
Alternative zu Word für Windows und WordPad: Verwendung des
dos2unix-Kommandos von Linux/UNIX. Schwierigkeit hierbei: Bei den
Zeilenenden fehlt das CHR$(13)
, welches Sie aber mit dem Kommando
awk
wieder einfügen können:
$ dos2unix <meinpdos.bas|awk '{ print $0 "\r"; }' >meinpwin.bas $ _
Sie können nun Ihre Visual Basic-Entwicklungsumgebung starten, bei Bedarf ein neues Projekt erzeugen und dort die soeben erzeugte Datei in Ihr Software-Projekt einfügen.
Wie in der Einleitung bereits erwähnt, bestehen zwischen DOS und Windows erhebliche Unterschiede. Es folgen daher einige Tips, worauf Sie achten sollten:
SCREEN
-Aufruf müssen Sie daher durch
einen geeigneten CreateNewWindow
-Aufruf ersetzen, der Ihnen ein
ebenso grosses Ausgabefenster erzeugt sowie die nötigen Farbpens
allozieren (ersetzt PALETTE
!). Weitere Details kann ich Ihnen
keine mehr geben, da ich nicht mit Visual Basic 6 arbeite.SOUND
-Befehle müssen Sie entsprechend durch
MIDI-Töne, ggf. als
.WAV-Dateien über Ihre Soundkarte umleitenLOCATE
und COLOR
zusammenstellenINKEY$
-Schleifen,
wie ich sie zum Thema Ereignisschleifen
noch selber darlege, und leere
FOR
-NEXT
-Pausenschleifen, die CPU-Rechenzeit
verheizen, haben nichts mehr zu suchen! Sie müssen daher
ereignisorientiert arbeiten mit WaitEvent
. Dasselbe
auch für Pausen: Nutzen Sie die Betriebssystemroutinen, um den Prozess
solange suspendieren zu können. Ihr Endanwender wird Ihnen dankbar sein,
wenn die übrigen, parallel laufenden Anwendungen nicht unnötig
ausgebremst werden.Die gesamte Komplexität steigt natürlich noch zusätzlich, sobald Parallelprogrammierung in Form von Threads ins Spiel kommen.