Roland G. Hlsmann
Sinsheimerstr. 31
69226 Nuloch

rgh-soft@t-online.de
www.profan.de

Programmieren fr Anwender

=========================
P R O F A N    4.0
Spezialversion Prortfolio
=========================
EINFHRUNG
=========================


INHALT
======

1	Vorbemerkungen
6	Operatoren
7	Variablen - Datentypen - Typumwandlung
	7.1	Integer
	7.2 	LongInt
	7.4	String
	7.6 	Typumwandlung
9	Kontrollstrukturen
	9.1	Case / CaseNot
	9.2	If / IfNot - ElseIf - Else - EndIf
	9.3	While / WhileNot - EndWhile
	9.4	@If
10	Prozeduren
13	Programm-Aufbau
14	Befehle ber mehrere Zeilen
15	Fehlerbehandlung
16	Text- & Grafikmodus
	16.1	Der "Textmodus"
21	Dateien - Verzeichnisse - System
	21.1	Dateien - Verzeichnisse - System
	21.2	Textdateien
	21.3	binre Dateien

1 - EINFHRUNG
==============

PROFAN ist eine uerst mchtige Programmiersprache und Batchsprache in Einem!

Ziele der Entwicklung von PROFAN waren:

* Eine einfache - an BASIC angelehnte - Syntax auch fr den Anfnger
* Traditionelle prozedurale (nicht objektorientierte) Programmmierung
* umfangreiche Datei- und Verwaltungsfunktionen

Herausgekommen ist bisher "PROFAN 4.0". Eine komplette Programmiersprache.  Der Anfnger wird viele BASIC-Befehle in gewohnter Form wiederfinden, u.a.
PRINT, LOCATE, CLS, INPUT, IF, WHILE, WEND,  PRINT #n, INPUT #n, END, LET, ...

Auch die Variablen und Konstanten werden weitestgehend wie in BASIC gehandhabt, wenn auch mit dem Bereichs-Typ ein Datentyp eingefhrt wurde, der die Flexibilitt von Zeigern bietet, ohne deren Gefhrlichkeit in der Anwendung.

Bei den Dateioperationen wurde allerdings das etwas vielseitigere Konzept von PASCAL bernommen:

ASSIGN, RESET, REWRITE, APPEND, RENAME, ERASE, CLOSE, SETFATTR, ...
Mit COPY knnen Dateien kopiert werden und mit CHDIR, MKDIR und RMDIR knnen Verzeichnisse verwaltet werden. Spezielle Funktionen geben Auskunft ber das aktuelle Laufwerk, den aktuellen Pfad, Attribute, nderungsdatum und vieles mehr.

Strukturierte und bersichtliche Programmierung wird ermglicht, indem nur ein Befehl pro Zeile erlaubt ist und zahlreiche Kontrollstrukturen verfgbar sind:
IF ... ELSEIF ... ELSE ... ENDIF, CASE, WHILE ... WEND.
Mit PROC ... ENDPROC knnen - wie in Pascal - Prozeduren definiert werden. In Prozeduren gibt es lokale Variablen. Auerdem ist beliebiges Einrcken ebenso statthaft, wie komplett leere Zeilen.

Ach ja: Das berhmte "Hallo Welt"-Programm in Profan:

 Print "Hallo Welt"
 End

So einfach ist das.

6 - Operatoren
==============

Operatoren, wie man sie von anderen Sprachen her kennt, gibt es in PROFAN nicht. Alles wird mittels Funktionen erledigt. Es gibt fr alle gewohnten Operatoren entsprechende Funktionen. Statt

 LET A% = A% + 3

mu z.B. geschrieben werden:

 LET A% = @ADD(A%,3)

WICHTIG: Das LET darf nicht weggelassen werden.

Diese Philosophie wird auch konsequent bei Vergleichen und Bedingungen eingesetzt:

 IF A% = B%     wird zu   IF @EQU(A%,B%)
 IF A% AND B%   wird zu   IF @AND(A%,B%)

Lediglich fr schnelle Berechnungen mit Integer-Werten (z.B. in Schleifen, etc.) gibt es in PROFAN einige neue Befehle, die schneller und bersichtlicher sind:

 INC V%     erhht V% um 1
 DEC V%     erniedrigt V% um 1
 ADD V%,n   erhht V% um n
 SUB V%,n   erniedrigt V% um n

(Hierbei steht V% fr eine beliebige Integer-Variable und n fr einen beliebigen Ausdruck.)

Fr das Zusammenfgen von Strings (Zeichenketten) kann die Funktion @ADD$ verwandt werden. Es ist aber auch mglich, in einem LET-Befehl verschiedene Strings zusammenzufgen, indem die Stringausdrcke (wie beim PRINT-Befehl) durch Semikolon oder Komma getrennt, hintereinandergeschrieben werden. Beispiel:

 LET TEXT$ = "Du bist",Alter%,"Jahre alt."

Dabei fgt ein Semikolon die Strings direkt zusammen, whrend ein Komma ein Leerzeichen einfgt.

HINWEIS: Die automatische Typumwandlung funktioniert bei einfachen Variablen. Bei Funktionen, die einen numerischen Wert zurckggeben, wird nicht immer  automatisch umgewandelt, daher ist hier immer die Funktion @Str$ zu verwenden!

7 - Variablen, Datentypen und Typen-Umwandlung
==============================================

PROFAN fr PORTFOLIO kennt drei Datentypen: Integer, LongInt und String. Wie in PASCAL mssen Variablen vor ihrer Verwendung declariert werden. Das geschieht in PROFAN mit dem Befehl "Declare". Wenn der Befehl auch berall im Programm stehen darf, so empfiehlt es sich doch, alle Declare-Anweisungen am Anfang des Programmes oder der Prozedur zu stellen. Mehrere Variablen knnen durch Kommata getrennt mit einem Declare-Befehl declariert werden:

	Declare Zahl1%, Zahl2&, Text$
  	Declare Ergebnis&

Der Typ der Variable wird durch das Postfix (letztes Zeichen des Variablennamens festgelegt. Der Variablenname darf (inclusive Postfix) 32 Zeichen lang sein und auer dem Leerzeichen so ziemlich alle Zeichen enthalten. Trotzdem ist dringend zu empfehlen, nur Buchstaben, Ziffern, Unterstriche und Punkte zu verwenden. Sonst wirds unleserlich.

In einer Prozedur oder einem Unterprogramm definierte Variablen sind nur in der Prozedur bekannt. Hingegen sind in einer Prozedur oder einem Unterprogramm auch alle auerhalb declarierten Variablen bekannt. Hier verhlt sich PROFAN eher wie PASCAL. (Das aus BASIC bekannte SHARED wird nicht bentigt.)


7.1  Integer
------------

Integervariablen werden, wie in BASIC blich, durch ein % als Postfix gekennzeichnet. Integervariablen knnen Werte von -32768 bis + 32767 annehmen. Wird dieser Wert ber- oder unterschritten, erolgt zwar keine Fehlermeldung, aber die Ergebnisse werden ungewhnlich sein.

Integervariablen knnen auch hexadezimal darsgestellt werden. Hierzu wird wie in PASCAL ein "$" vorangestellt: LET A% = $2FB

Nur mit Integervariablen knnen auch die vier Rechenbefehle INC, DEC, ADD und SUB durchgefhrt werden.

7.2  LongInt
------------

LongInt-Variablen haben das & als Postfix. Im brigen gilt fr den Variablennamen das gleiche, wie fr Integer. Der Wertebereich geht von -2 Milliarden bis etwas ber +2 Milliarden.

Integervariablen knnen auch hexadezimal darsgestellt werden. Hierzu wird wie in PASCAL ein "$" vorangestellt: LET A& = $2FB00

7.4  String
-----------

Strings werden durch ein $ am Ende des Dateinamens gekennzeichnet und knnen maximal 255 Zeichen lang sein. Stringkonstanten werden durch Anfgrungszeichen eingeschlossen:

	LET Text$="Teststring"

Fr einige nicht direkt ber die Tastatur eingebbare Zeichen gibt es nun (hnlich wie in C) Ersatzzeichen. Dabei steht "\a" fr @Chr$(8),  "\t" fr @Chr$(9) und "\n" fr @Chr$(13). Das erleichtert z.B. die Formatierung von Messageboxen und Mens erheblich. Um z.B. die Anzeige von Funktionstasten in Mens auszurichten, reicht es jetzt zum Beispiel, folgende Zeile einzugeben:

    	APPENDMENU 124,"Hilfe\tF1"

Mit "\a" kann ein Menpunkt in der Menzeile ganz nach rechts positioniert werden, wie es hufig bei der Hilfe der Fall ist:

	APPENDMENUBAR "\aHilfe"

Mit "\n" erzielen Sie in Messageboxen einen Zeilenumbruch genau dort, wo Sie ihn haben wollen.

Will man aber nun wirklich z.B. die Zeichenfolge "\a" im String verwenden, mu man hinter dem Backslash einen "." angeben: "\.a". Um "\." wiederzugeben ist "\.." zu verwenden.

7.6 Typen-Umwandlung
--------------------

Die Umwandlung der verschiedenen Variablentypen in andere erfolgt zumeist automatisch. Bei einer Rechnung oder Zuweisung wird das Ergebnis automatisch in den Typ der Variable, der das Ergebnis zugewiesen wird, umgewandelt.

Die Funktion @STR$ verwandelt einen numerischen Wert in einen String, wobei bezglich der Formatierung die Einstellungen mittels DECIMALS und NUMWIDTH bercksichtigt werden. Die Funktion wird also hufig bei formatierter Zahlenausgabe Verwendung finden. Wird keine Formatierung gewnscht, kann das @STR$ auch weggelassen werden.

Die Funktion @VAL ermittelt den numerischen Wert eines Strings. Kann der String nicht komplett umgewandelt werden, wird der Wert 0 angenommen. Eine Fehlermeldung oder Warnung erfolgt nicht. Das @VAL kann oft auch weggelassen werden:

	LET Zahl% = Text$

Selbst eine Zeile

	LET Zahl% = Maier

wrde funktionieren. Die Zahl erhielte dann den Wert 0. Wenn die Warnungen mit "SETERRORLEVEL 1" eingeschaltet sind, wrde in diesem Fall jedoch eine Warnung darauf hinweisen, da "Maier" nicht als Zahl zu interpretieren ist. Diese Warnung erscheint immer dann, wenn Interpreter oder Runtime einen Ausdruck nicht interpretieren knnen, also auch dann, wenn ein String erwartet wird, aber etwas da steht, was weder String noch numerischer Wert ist. (Warum? Nun: Wenn kein String - erkennbar durch Anfhrungszeichen - gefunden wird, versucht PROFAN eine Zahl zu lesen, um diese dann intern in einen String umzuwandeln.)

Ich ziehe es vor, die Umwandlungen zwischen Strings und numerischen Werten immer mit  @VAL und @STR$ zu programmieren. Das macht die Programme lesbarer.

9 - Kontrollstrukturen
----------------------

PROFAN bietet im wesentlichen die aus anderen Sprachen bekannten Kontrollstrukturen:

	Case / CaseNot
	If / IfNot
	While / WhileNot
	@If


9.1  CASE / CASENOT
-------------------

Der CASE-Befehl stellt letztlich ein einzeiliges IF dar:

	CASE @Equ(A%,3) : PRINT "A hat den Wert 3"

Der hinter dem CASE stehende Befehl bzw. Prozeduraufruf wird nur ausgefhrt, wenn der Ausdruck vor dem Doppelpunkt einen von Null verschiedenen Wert hat, d.h. wenn die Bedingung erfllt wird. Ist die Bedingung nicht erfllt, geht es direkt mit der nchsten Zeile weiter. Eine Sonderform des CASE ist die Form CASENOT:

	CASENOT @Equ(A%,3) : PRINT "A ist ungleich drei"

Dies ist lediglich eine bequemere (und in der Ausfhrung schnellere) Schreibweise der Zeile

	CASE @Not(@Equ(A%,3)) : PRINT "A ist ungleich drei"


9.2  IF / IFNOT ...
-------------------

Mit Ausnahme der Sonderform IFNOT, die fr IF @Not steht, gilt hier das aus BASIC Bekannte: Die nach IF bzw. IFNOT stehenden Zeilen werden ausgefhrt, wenn der Bedingungsausdruck hinter dem IF bzw. IFNOT ungleich 0 ist. Lediglich das THEN gibt es in PROFAN nicht und wird weggelassen:

	IF @Equ(A%,1)
		PRINT "A ist gleich 1"
	ENDIF

WICHTIG: Hinter der Bedingung darf (auer einer Anmerkung mit ') kein Befehl stehen. Das in BASIC und PASCAL bekannte einzeilige IF wird in PROFAN durch CASE ersetzt. Zu jedem IF mu es ein entsprechendes ENDIF geben!

Natrlich gibt es in PROFAN auch den ELSE-Zweig, der ausgefhrt wird, wenn die Bedingung nicht erfllt wird:

	IF @Equ(A%,1)
		PRINT "A ist gleich 1"
		PRINT "--------------"
	ELSE
		PRINT "A ist ungleich 1"
	ENDIF

Auch eine Abfrage auf mehrere Bedingungen (z.B. bei der Auswertung eines Mens) ist mit ELSEIF mglich. Sobald eine Bedingung erfllt ist, wird der zugehrige Programmteil abgearbeitet und anschlieend mit der Zeile nach dem ENDIF fortgefahren. Die SELECT- und CASE-Strukturen anderer Sprachen lassen sich somit abbilden:

	IF @Lt(A%,1)
		PRINT "A ist kleiner als 1"
	ELSEIF @Equ(A%,1)
		COLOR 2,15
		PRINT "A ist gleich 1"
	ELSEIF @Equ(A%,2)
		PRINT "A ist gleich 2"
	ELSE
		PRINT "A ist grer als 2"
	ENDIF

Dieser Programmteil wre identisch mit folgender Struktur:

	IF @Lt(A%,1)
		PRINT "A ist kleiner als 1"
	ELSE
		IF @Equ(A%,1)
			PRINT "A ist gleich 1"
		ELSE
			IF @Equ(A%,2)
				PRINT "A ist gleich 2"
			ELSE
				PRINT "A ist grer als 2"
			ENDIF
		ENDIF
	ENDIF


9.3  WHILE / WHILENOT
---------------------

Selbstverstndlich gibt es auch Schleifen in PROFAN. Der zwischen WHILE und WEND stehende Programmteil wird solange ausgefhrt, solange die Bedingung erfllt ist. Auch bei WHILE ist die Zusammenziehung mit @Not zu WHILENOT erlaubt. Ebenso wie bei Unterprogrammen/Prozeduren ist eine Schachtelungstiefe von 10 erlaubt. In der Praxis drfte dieser Wert kaum erreicht werden. Ein Beispiel fr eine WHILE-Schleife:

	LET A%=0
	WHILENOT @Equ(A%,10)
		INC A%
		PRINT A%;" zum Quadrat ist ";@Squ(A%)
	ENDWHILE

Anstelle von ENDWHILE ist auch die von BASIC her gewohnte Schreibweise WEND erlaubt. Aber analog zu den Befehlspaaren IF - ENDIF und PROC - ENDPROC ist die Verwendung der Schreibweise ENDWHILE logischer und fr den nicht von BASIC her kommenden PROFAN-Programmierer leichter zu merken.

10 - Prozeduren
===============

Prozeduren sind Unterprogramme, die wie neue Befehle behandelt werden knnen.

Eine Prozedur wird einmal - vor ihrer ersten Verwendung - definiert und kann dann jederzeit wie ein neuer Befehl im Programm verwandt werden. Es ist sinnvoll, alle Prozedurdefinitionen vor dem Beginn des Programmes durchzufhren. Hufig verwandte Funktionen (s.u.) und Prozeduren kann man in einer Include-Datei (s.o.) zusammenfassen und sich so beliebige Spracherweiterungen selbst programmieren.

Eine Prozedur-Definition beginnt mit dem Befehl PROC, gefolgt vom Namen der Prozedur. Die Definition endet mit der Zeile ENDPROC. Eine Prozedur wird natrlich whrend Ihrer Definition nicht ausgefhrt, sondern erst, wenn Sie aufgerufen wird. Hier ein komplettes Mini-Programm als Beispiel fr eine sehr einfache Prozedur:

	'Testprogramm
	'------------
	PROC Titelzeile
		PRINT "Das ist der Titel"
	ENDPROC

	CLS
	PRINT "Das ist noch vor der Prozedur."
	TITELZEILE
	PRINT "Das ist nach der Prozedur."
	WAITKEY
	END

Einer Prozedur knnen auch Parameter bergeben werden. Diese werden mit dem Befehl PARAMETERS in die Prozedur bernommen: Dem Befehl folgen die Variablen, denen die Parameter zugewiesen werden. Diese Variablen - wie alle in der Prozedur declarierten Variablen - sind "LOKAL", d.h. sie sind nur in der Prozedur dem System bekannt. Alle auerhalb der Prozedur bekannten Variablen sind in der Prozedur auch bekannt (es sei denn, es gibt lokale Variablen mit gleichem Namen). Ein Beispiel, bei dem eine Prozedur definiert wird, die eine Text wiederholt ausgibt:

	Testprogramm 2
	'--------------
	PROC Wiederhole
		PARAMETERS Anzahl%, Text$
		DECLARE I%
		LET I% = 0
		WHILE @Lt(I%,Anzahl%)
			PRINT Text$
		ENDWHILE
	ENDPROC

	CLS
	PRINT "Das ist noch vor der Prozedur."
	WIEDERHOLE 5, "Testtext"
	PRINT "Das ist nach der Prozedur."
	WAITKEY
	END

Die Parameter, die der Prozedur bergeben werden, werden durch Kommata voneinander getrennt. Die Typen und die Anzahl der Parameter werden von PROFAN nicht berprft. Wegen der automatischen Typenumwandlung ist das auch nicht notwendig. Es sind maximal 8 Parameter erlaubt. Selbstverstndlich knnen in Prozeduren wieder neue Prozeduren definiert werden. Diese sind dann natrlich auch nur lokal bekannt. Hier gilt sinngem das Gleiche, wie fr Variablen.

Eine Prozedur kann in PROFAN auch einen Wert zurckgeben: Innerhalb der Prozedur darf der RETURN-Befehl vorkommen, wenn die Prozedur vor dem ENDPROC verlassen werden soll. Dem RETURN kann ein Parameter zurckgegeben werden, der je nach Typ mit der Funktion @%(0), @&(0) oder @$(0) gelesen werden kann. (Diese Funktionen sind der "Parameterstack" von PROFAN. Fr jeden Datentyp gibt es die Parameter 0 bis 8, wobei der 0. Parameter den Rckgabewert und die brigen die bergebenen Parameter enthalten. Im obigen Beispiel knnte also auch ber @$(2) auf den bergebenen Text zugegriffen werden.) Ein Beispiel fr die Rckgabe eines Wertes aus einer Prozedur:

	'Testprogramm 3
	'--------------
	PROC Titelzeile
		PRINT "Das ist der Titel"
		RETURN "Ok"
	ENDPROC

	CLS
	PRINT "Das ist noch vor der Prozedur."
	TITELZEILE
	PRINT "Das ist nach der Prozedur: ";@$(0)
	WAITKEY
	END

Auch wenn eine Prozedur mit RETURN verlassen wird, darf das ENDPROC nicht fehlen!


11 - Funktionen
===============

In PROFAN gibt es zahlreiche "eingebaute" Funktionen.

11.1  Funktionen - Grundlagen
-----------------------------

Eine Funktion gibt einen Wert zurck, der in der Regel von den Parametern der Funktion abhngig ist. berall da, wo in PROFAN Variablen oder konstante Werte (Literale) eingesetzt werden knnen, drfen auch Funktionen stehen. Der Rckgabewert der Funktion sollte der gleiche Typ sein, wie der erwartete Wert.

Alle Funktionsnamen in PROFAN beginnen mit einem @ (<AltGr><Q>).

Funktionen, deren Funktionsnamen mit dem $ endet, geben in vielen Fllen einen String zurck, die brigen Funktionen einen numerischen Wert. In einigen Fllen enden auch Vergleichsfunktionen, die entweder 1 oder 0 zurckgeben mit einem $, um deutlich zu machen, das hiermit Strings verglichen werden.

Wenn der Rckgabewert einer Funktion uninteressant ist, kann die Zuweisung auch weggelassen werden. Bis auf die immer noch notwendigen Klammern, wird die Funktion dann wie ein Befehl verwandt.

11.2  Allgemeine Funktionen
---------------------------

Neben den in PROFAN zahlreich vertretenen Spezialfunktionen, die in den jeweiligen Kapiteln Erwhnung finden, gibt es auch eine ganze Reihe allgemeiner Funktionen zur Bearbeitung von Zeichenketten (Strings) und zur Verarbeitung mathematiischer Formeln:

Mathematische Funktionen:

	@Abs		- Absolutwert
	@Add		- Addition (+)
	@And 		- logisches Und
	@Div& 		- ganzzahlige Division (\)
	@Div 		- Division (/)
	@Equ 		- Vergleich: Gleichheit
	@GT 		- Vergleich: Grer
	@Int 		- Integer (Ganzzahl)
	@LT 		- Vergleich: Kleiner
	@Mod 		- Modulo-Funktion
	@Mul 		- Multiplikation (*)
	@Neq		- Vergleich: Ungleichheit
	@Not 		- logisches Nicht
	@Or 		- logisches Oder
	@Rnd 		- Zufallszahl
	@Sqr 		- Quadrat
	@Sub 		- Subtraktion (-)

Zeichenketten-Funktionen:

	@Add$ 		- Zusammenfgen
	@Chr$ 		- Zeichen
	@Del$ 		- Teilstring lschen
	@Equ$ 		- Vergleich: Gleichheit
	@GT$ 		- Vergleich: Grer
	@Ins$ 		- Teilstring einfgen
	@InStr 		- Teilstringposition finden
	@Len 		- Lnge eines Strings
	@Lower$ 	- in Kleinbuchstaben wandeln
	@LT$ 		- Vergleich: Kleiner
	@Mid$ 		- Teilstring ermitteln
	@NEq$ 		- Vergleich: Ungleichheit
	@Ord 		- Zeichencode (ASC)
	@Str$ 		- Wert in String umwandeln
	@SubStr$ 	- String in Teilstrings zerlegen
	@Translate$ 	- Stringteile ersetzen
	@Trim$ 		- Leerzeichen entfernen
	@Upper$ 	- in Grobuchstaben wandeln
	@Val 		- in numerischen Wert umwandeln

Nhere Hinweise zur Syntax entnehmen Sie bitte der Referenz.

13 - Programm-Aufbau
====================

Alle Variablen in PROFAN mssen vorher (wie etwa in PASCAL) declariert werden. Die DECLARE- und DIM-Befehle sollten am Anfang des Programmes stehen. Lokale Variablen sollten am Anfang einer Prozedur definiert werden. Vor der ersten Bildschirmausgabe sollte immer ein CLS stehen, um das Bildschirmfenster zu ffnen.

BEISPIEL:

'DEKLARATIONSTEIL
'----------------

DECLARE ...
DIM% ...
DIM$ ...

'PROZEDUREN
'----------

PROC ...
	PARAMETERS ...
	DECLARE ...
	...
ENDPROC

'DAS HAUPTPROGRAMM
'-----------------

...
...
...
END

14 - Befehle ber mehrere Zeilen
================================

Der bersichtlichkeit wegen knnen Befehle (Programmzeilen) auch ber mehrere Bildschirmzeilen geschrieben werden. Ist das letzte Zeichen einer Zeile ein \ , so wird die nchste Zeile ab dem ersten Zeichen, das kein Leerzeichen ist, angehngt. Beispiele:

	MESSAGEBOX "berschrift",\
	       	    "Das ist ein Testtext, der \
       		     etwas lnger ist!",16

	PRINT "Das ist ein ziemlich lang\
              er Text!"

Beachten Sie: Auch eine Programmzeile ber mehrere Bildschirmzeilen darf nicht lnger als 127 Buchstaben sein. Fhrende und folgende Leerzeichen werden nicht gezhlt.

15 - Fehlerbehandlung
=====================

Fehlermeldungen und Warnungen werden in deutsch auf den Bildschirm gebracht. Nach einer Fehlermeldung bricht das Programm ab, nach einer Warnung luft es weiter, wenn Sie "OK" anklicken oder bricht ab, wenn Sie "Abbrechen" whlen. Neben der Fehlerbeschreibung wird beim Interpreter auch die fehlerhafte Zeile angegeben, soda der Fehler genau lokalisiert werden kann. Die Systemvariable %ErrNumber enthlt die Fehlernummer. Beim Auslesen wird sie auf Null zurckgesetzt. Eine Liste aller Fehlermeldungen befindet sich im Anhang.
Zustzlich wird (auch wenn der Fehler im compilierten Programm auftritt) die Zeilennummer angegeben. Da aber Includedateien mitgezhlt werden und andererseits mit dem Backslash "\" verbundene Zeilen als eine gezhlt werden, kann diese Zahl nur als Anhaltspunkt dienen. Auf alle Flle ist es sehr dringend anzuraten, jegliches Programm im Interpretermodus auf Herz und Nieren zu testen, bevor man es compilert startet.

Das Fehlerverhalten kann ber den Befehl SETERRORLEVEL gesteuert werden. Der Befehl hat folgende mgliche Parameter:

2 -	Fr ganz Vorsichtige: Warnungen werden wie Fehler behandelt und fhren zu
	einer Fehlermeldung mit Programmabbruch.
1 -	Fr die Programmentwicklung: Auch Warnungen werden ausgeben, aber das
	Programm luft auf Wunsch weiter.
0 -	Der Normalzustand: Warnungen werden nicht angezeigt. Diesen Errorlevel sollte
	man bei einem fertigen Programm verwenden.
-1 -	Fast schon kriminell: Auch Fehlermeldungen werden bergangen.Das kann unter
	Umstnden zu einem Windowsfehler oder Absturz desSystemes mit Datenverlust
	fhren.

Warnungen treten auf, wenn ein Ausdruck nicht als numerischer Wert zu interpretieren ist oder z.B. eine Bilddatei nicht gefunden wird oder BITMAP-Befehle wegen Speicherplatzmangels nicht ausgefhrt werden ... also immer dann, wenn keine ernstzunehmenden Folgen fr das restliche Programm zu erwarten sind.

Unabhngig vom gesetzten Errorlevel wird die Systemvariable %ERROR bei einer Warnung bzw. einem Fehler gesetzt. Auf diese Weise kann also der Programmierer die komplette Verantwortung zu Behandlung von Fehlern bernehmen. Wie auch %IORESULT wird %ERROR beim ersten Auslesen wieder auf 0 gesetzt. Die mglichen Error-Werte:

0 -	seit dem letzten Lesen von %ERROR ist kein Fehler aufgetreten
1 -	eine Warnung wird gemeldet
2 -	ein Fehler wird gemeldet

ACHTUNG: Bei Dateioperationen wird nicht %ERROR verwandt, sondern die Systemvariable %IORESULT gesetzt, das Programm aber in keinem Fall abgebrochen. Das Programm mu also diese Variable auswerten, da ansonsten Abstrze mglich sind.

Nach einer Dateioperation oder einer Directory-Suche enthlt diese Variable den entsprechenden Wert:

0 -	kein Fehler aufgetreten
2 -	Datei nicht gefunden
3 -	Pfad nicht gefunden
5 -	Zugriff verweigert (ReadOnly?)
12 -	Ungltiger Dateimodus
15 -	Laufwerksnummer unzuzulssig
16 -	Verzeichnis kann nicht gelscht werden (noch Dateien drin?)
17 -	RENAME nicht ber Laufwerksgrenzen mglich (siehe Rename)
18 -	Kein weiterer Eintrag (bei @FindFirst/@FindNext)
100 -	Lesefehler von Diskette/Platte
101 -	Schreibfehler auf Diskette/Platte
102 -	Dateinummer ist keiner Datei mit ASSIGN zugeordnet (siehe Assign)
103 -	Datei nicht offen (Reset, Rewrite oder Append fehlt)
104 -	Datei nicht zum Lesen geffnet (Reset fehlt)
105 -	Datei nicht zum Schreiben geffnet (Rewrite oder Append fehlt)
106 -	Falsches Format (bei Input #N,..)

16 -  Der "Textmodus"
=====================

Im Gegensatz zu den Windowsversionen knnen die Konsolenversionen - also auch PROFAN fr den Portfolio - nur den Textmodus. Im Textmodus funktionieren die von BASIC her bekannten Befehle, wie z.B. PRINT, LOCATE, INPUT, COLOR und CLS in gewohnter Weise. Zustzlich sind in diesem Modus Befehle wie TBOX verfgbar. Bei INPUT ist kein Prompt-Text erlaubt, sondern nur die Angabe einer Variable. Ein kleines Beispiel:

	Declare Zahl%, Text$
	Cls
	Locate 2,2
	Print "Das ist die berschrift"
	Font 2
	Locate 4,2
	Print "Bitte gebe einen Text ein: ";
	Input Text$
	Print "Bitte gebe eine Zahl ein: ";
	Input Zahl%
	Print
	Print "Du hast eingeben:",Zahl%,Text$
	WaitKey
	End

Das Semikolon nach einem Ausdruck beim Print-Befehl sorgt dafr, da die nchste Ausgabe in die gleiche Zeile geht und direkt an die vorherige anschliet. Bei einem Komma wird hingegen ein Leerzeichen gelassen. (Die von BASIC her bekannte Tabulatorfunktion gibt es nicht.) Der Befehl WAITKEY wartet auf einen Tastendruck. Mchte man wissen, welche Taste gedrckt wurde, kann man die Systemvariable %KEY abfragen.

21 - Dateien - Verzeichnisse - System - Zwischenablage
======================================================

Ein BASIC-Programmierer wird sich etwas umstellen mssen, da mir das Dateisystem von PASCAL flexibler erschien. In der aktuellen Version werden lediglich Textdateien untersttzt.

21.1  Dateien - Verzeichnisse - System
--------------------------------------

Dateien

Die meisten Befehle und Funktionen, die mit Dateien zu tun haben, erwarten als ersten Parameter die Dateikennung, quasi ein Handle auf die Datei. Mittels ASSIGN wird einer Dateikennung zwischen 1 und 8 der Name einer Datei zugewiesen. Bei den folgenden Befehlen darf die Datei nicht geffnet sein:

Um die Atrribute einer Datei zu ermitteln, gib es die Funktion @GETFATTR. Mit  SetFAttr knnen die Attribute einer Datei verndert werden. Das Datum der letzten nderung lt sich mit @GetFDate$ in Erfahrung bringen. Mit ERASE kann ich eine Datei lschen und mit RENAME umbenennen bzw.  innerhalb einer Festplatte verschieben.

Mit COPY kann eine Datei kopiert werden. Um herauszubekommen, welche Dateien berhaupt vorhanden sind, gibt es die Funktionen @FINDFIRST$ und @FINDNEXT$. In diesem Zusammenhang ist auch der Befehl ADDFILES interessant, mit dem der ListBoxListe eine Liste der Dateien hinzugefgt wird, die dem Suchstring entspricht.


Verzeichnisse

Das aktuelle Laufwerk ist in der Systemvaraiblen $DRIVE abgelegt und den aktuellen Pfad eines Laufwerkes ermittelt die Funktion @GETDIR$. Ebenso gibt es die Befehle MKDIR, CHDIR und RMDIR zum Anlegen, Wechseln und Lschen eines Verzeichnisses.


21.2  Textdateien (sequentielle Dateien)
----------------------------------------

In der Dateiverarbeitung werden grundstzlich zwei verschiedene Zugriffsmethoden unterschieden: Der sequentielle Zugriff auf Textdateien und der direkte (binre) Zugriff auf beliebige Dateien.

Das herausragende Merkmal des sequentiellen Zugriffs ist, da nicht auf einen beliebigen Datensatz zugegriffen werden kann, sondern immer nur - schn der Reihe nach - auf den nchsten. Dafr knnen die Datenstze - hier Zeilen genannt - unterschiedliche Lngen von 0 bis 255 Zeichen haben. Die einzelnen Datenstze sind durch ein Zelenende-Zeichen (@Chr$(13) und @Chr$(10)) voneinander getrennt. Sequentielle Dateien sind ideal, um Textdateien zu bearbeiten, Highscore-Tabellen abzulegen, Programmparameter zu verwalten etc. (Fr andere Aufgaben, wie etwa Adressverzeichnis, Videokatalog etc. wird man eher auf die Datenbankfunktionen von PROFAN zurckgreifen, denen ein eigenes Kapitel gewidmet ist.)

Um auf eine Datei zugreifen zu knnen, mu einer Dateinummer (Handle) eine physikalische Datei zugewiesen werden. Das geschieht mit dem Befehl ASSIGN:

	Assign #1,"C:\TEST.DAT"

Dateinummern von 1 bis 8 sind erlaubt. Mit dem ASSIGN-Befehl ist die Datei noch nicht geffnet. Dazu bentigen wir die Befehle RESET, REWRITE bzw APPEND. RESET ffnet die Datei zum Lesen. mit REWRITE wird sie zum Neuschreiben geffnet und mit APPEND zum Anfgen. Wenn ich eine existierende Datei mit REWRITE ffne, wird sie - ohne jede Warnung - gelscht. Mchte ich an eine Datei zustzlichen Text anhngen, ist APPEND zu verwenden:

	Assign #1,"C:\AUTOEXEC.BAT"
	Append #1
	Print #1,"REM Hinzufgen von Share"
	Print #1,"SHARE"
	Close #1

Eine Datei, die ich mit RESET ffne, kann ich mit INPUT# lesen:

	Print "AUTOEXEC.BAT"
	Print
	Assign #2,"C:\AUTOEXEC.BAT"
	Reset #2
	If %IOResult
		Print "Datei kann nicht geffnet werden."
	Else
		WhileNot @EOF(#2)
			Input #2, Zeile$
			Print Zeile$
		Wend
		Close #2
	EndIf
	WaitKey

HINWEIS: Standardmig wird beim ffnen einer Datei, egal ob es zum Lesen oder Schreiben geschieht, der FILEMODE 2 benutzt, d.h. dem Betriebssystem wird signalisiert, das die Datei zum Schreiben und Lesen geffnet werden soll. Ist die Datei nun schreibgeschtzt, wird das Betriebssystem sagen: Nein, das geht nicht! Damit auch eine schreibgeschtzte Datei (z.B,. auf CD-ROM) gelesen werden kann, mu vor dem RESET-Befehle der FILEMODE 0 (nur lesen) eingestellt werden.

Geschlossen wird eine sequentielle (Text-)Datei mit CLOSE. Mit @EOF frage ich das Ende einer Datei ab, die ich zum Lesen geffnet habe. Wird in eine Datei geschrieben und anschlieen der Befehl CLOSE vergessen, gehen die geschriebenen Daten und mglichweise der Inhalt der Datei verloren!

HINWEIS: Es solte nach Dateibefehlen immer mit %IOResult berprft werden, ob auch alles gut gegangen ist, da PROFAN (wie auch PASCAL mit der Direktive $I-) keine Fehlermeldung bringt, wenn etwas nicht funktioniert!


21.3  Binre Dateien
--------------------

PROFAN kann auch binr auf Dateien zugreifen, d.h. jedes einzelne Byte kann gelesen, verndert und geschrieben werden. Bevor eine Datei bearbeitet werden kann, mu ihr - wie auch bei den sequentiellen Dateien - mit ASSIGN ein Handle zugewiesen werden. Um die Datei zu ffnen, ist der Befehl OPENRW zu verwenden. Existiert die Datei bereits, wird sie zum Bearbeiten geffnet, anderenfalls wird sie erzeugt.

Soll eine bestehende Datei nur zum Lesen geffnet werden, ist vor dem OPENRW der  Befehl FILEMODE 0 zu verwenden.

Nach dem ffnen steht der Dateizeiger auf der ersten Position: auf 0, d.h. der nchste Schreib- oder Lesezugriff wrde das erste Byte in der Datei betreffen. Will man Daten an die Datei anhngen, mu erst der Dateizeiger mit SEEK auf die erste Position nach  dem Dateiende gesetzt werden. Das geschieht z.B. mit dem Befehl:

	SEEK #1,@GETFILESIZE(#1)

Mit @GETFILESIZE wird die augenblickliche Gre der Datei in Bytes zu ermittelt.  Dazu mu die Datei geffnet sein. (Hingegen kann mit @FILESIZE die Gre jeder ungeffneten Datei ermittelt werden.)

Mit @GETBYTE wird ein Byte aus einer mit OPENRW geffneten Datei gelesen.  Der Dateizeiger wird auf das nchste Byte positioniert, soda der nchste Lesezugriff mit @GETBYTE das nchste Byte liest. Wird das Dateiende erreicht,  ergibt @EOF den Wert 1 (fr WAHR).

Mit PUTBYTE kann ich in die Datei an der augeblicklichen Position des Dateizeigers schreiben. Auch hier wird der Dateizeiger automatisch hochgezhlt, soda das nchste Byte richtigerweise  an die nchste Position in der Datei geht. Wird durch hufige PUTBYTE-Befehle das Dateiende berschritten wird die Datei entsprechend vergrert.

Es kann jederzeit mit SEEK der Dateizeiger neu positioniert werden. Wird er dabei hinter das Ende der Datei gelegt, wird die Datei bis dorthin vergrert.

Um die augenblickliche Position des Dateizeigers zu ermitteln, ist die Funktion @FILEPOS zu verwenden.

WICHTIG: Nach der Bearbeitung mu die Datei mit CLOSERW wieder geschlossen werden, da ansonsten Daten verloren gehen, auch wenn nicht in die Datei geschrieben wurde! Zumeist findet man bei vergessenem CLOSERW nur noch eine 0 Byte groe Ruine der Datei auf der Festplatte vor! Eine mit OPENRW geffnete datei mu mit CLOSERW geschlossen werden, da ansonsten ein Fehler auftritt!  HINWEIS: Es solte nach Dateibefehlen immer mit %IOResult berprft werden, ob auch alles gut gegangen ist, da PROFAN (wie auch PASCAL mit der Direktive $I-) keine Fehlermeldung bringt, wenn etwas nicht funktioniert!

