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
==========================
REFERENZ
==========================

Hier finden Sie Syntax und Beispiele zu Systemvariablen, Funktionen und Befehlen von Profan.

Inhalt:
=======
	bersicht Systemvariablen
	bersicht Funktionen
	bersicht Befehle
1. 	Systemvariablen
2.	Funktionen
3.	Befehle

ANHANG A: Fehlermeldungen

bersicht Systemvariablen
=========================

$Drive
%Error
%ErrNumber
%GetCount
%GetCurSel
%IOResult
%Key
%ParCount
%ScanKey

bersicht Funktionen
====================
@$
@%
@&

@Abs
@Add$
@Add
@And

@Chr$

@Date$
@Del$
@DiskFree
@DiskSize
@Div&
@Div
@DToC$

@Eof
@Equ$
@Equ

@FilePos
@FileSize
@FindFirst$
@FindNext$

@GetByte
@GetDir$
@GetEnv$
@GetFAttr
@GetFDate$
@GetFileSize
@GetKey$
@GT
@GT$

@If
@Inkey$
@Input$
@Ins$
@InsertString
@InStr
@Int

@KeyIn

@Len
@ListBoxItem$
@Lower$
@LT
@LT$

@Mid$
@Mod
@Mul

@NEq
@NEq$
@Not

@Or
@Ord

@Par$

@Rnd

@ScanKey
@Sqr
@Str$
@Sub
@SubStr$

@Time$
@Translate$
@Trim$

@Upper$

@Val

bersicht Befehle

(Apostroph)

Add
AddFiles
AddString
Append
Assign

Beep

Case
CaseNot
ChDir
ClearList
Close
CloseRW
Cls
Color
Copy

Dec
Declare

Else
ElseIf
EndIf
End
EndProc
EndWhile
Erase

FileMode
Font

If ... ElseIf ... Else ... EndIf
IfNot ... Else ... EndIf
Inc
Input
Input#

Let
ListBoxItem$
Locate

MkDir

NumWidth

OpenRW

Parameters
Print
Print#
Proc ... EndProc
PutByte

Randomize
ReadText
Rem
Rename
Reset
Return
Rewrite
RmDir
Run

Seek
SetErrorLevel
SetFAttr
SetWindowPos
Shell
StrWidth
Sub

TBox

WaitInput
WaitKey
WaitScan
While ... EndWhile
WhileNot ... EndWhile
Window
WindowStyle
WindowTitle

1. Systemvariablen
==================

Systemvariablen geben Auskunft ber Zustnde des Systems, z.B. die aktuelle Position der Maus, das aktuelle Laufwerk, etc.

Es gibt zwei Typen von Systemvariablen:

 	$Name 		- Der Ergebnistyp ist ein String
 	%Name 	- Der Ergebnistyp ist ein Integer

$Drive
------
Das aktuelle Laufwerk (ohne Pfadangabe).


%Error
------
Der zuletzt aufgetretene Fehlercode. Wie %IOResult wird %Error beim Auslesen wieder auf 0 gesetzt. Die Error-Werte:

	0 -	kein Fehler
	1 -	Warnung
	2 -	Fehler

%ErrNumber
----------
enthlt die Nummer des zuletzt aufgetretenen Fehlers. Beim Auslesen wird %ERRNUMBER auf 0 zurckgesetzt.


%GetCount
---------
Die Anzahl der Eintrge in der ListBox-Liste. Beispiel:

ClearList
AddFiles "C:\WINDOWS\*.EXE"
Print %GetCount;" EXE-Dateien"


%GetCurSel
----------
Nummer des in einer Listbox gewhlten Eintrages.


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

Die Werte entsprechenden den von Turbo-Pascal her bekannten Ergebnissen:

	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,..)


%Key
----
Der ANSI-Code der zuletzt gedrckten Taste. Anwendung nach den Befehlen WAITKEY und WAITINPUT:

WaitInput
If @Equ(Key,90)
   Print "Du hast 'Z' gedrckt"
EndIf


%ParCount
---------
Die Anzahl der beim Programmaufruf bergebenen Kommandozeilen-Parameter.  Parameter 0 ist beim Interpreter der Interpreter selber, bei der Runtime das Runtime-Modul und bei einer EXE-Datei die EXE-Datei. Parameter 1 ist bei Interpreter und Runtime das ausgefhrte Programm. Da eine EXE-Datei auch als Runtime fungieren kann, ist er dort entweder der Name der PRC-Datei oder ein String, der mit einem der folgenden Zeichen beginnt: ! " # $ % & ' ( ) * + , - . /
Weitere Hinweise siehe unter @PAR$.


%ScanKey
--------
Der Scancode (virtueller Code) der zuletzt gedrckten Taste.  Wichtige Scancodes:

	16 -	Shift
	17 -	Strg
	27 -	Esc
	33 -	BildHoch
	34 -	BildRunter
	35 -	Ende
	36 -	Pos1
	37 -	Links
	38 -	Hoch
	39 -	Rechts
	40 -	Runter
	45 -	Einfg
	46 -	Entf
	112 -	F1
	... -	...
	123 -	F12


2. Funktionen
=============

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 @.

Funktionen, deren Funktionsnamen mit dem $ endet, geben in vielen Fllen einen String zurck, die brigen Funktionen einen numerischen Wert. In einigen Fllen enden auch Vergeleichsfunktionen, 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.

Beispiel:

  @LISTBOX$("Das ist die Liste",0)

In diesem Fall wird die Listbox nur zum Anschauen angezeigt oder aber das Ergebnis der Auswahl ber die Systemvariable $GETTEXT gelesen.


@$(N)
-----
N : Integer (0 ... 8)

Ergebnis: String

Der N-te bergebene Parameter in einer selbstdefinierten Funktion (oder Prozedur) als String.


@%(N)
-----
N : Integer (0 ... 8)

Ergebnis: Integer

Der N-te bergebene Parameter in einer selbstdefinierten Funktion (oder Prozedur) als Integer.


@&(N)
-----
N : Integer (0 ... 8)

Ergebnis: LongInt

Der N-te bergebene Parameter in einer selbstdefinierten Funktion (oder Prozedur) als LongInt.

Der 0. Parameter ist nach Aufruf einer Prozedur oder einem Unterprogramm mit RETURN <Wert>  zurckgegebene Wert.


@Abs(N)
-------
N : Wert

Ergebnis: Wert

Absolutwert der Zahl N.


@Add$(S1,S2)
------------
S1 : String
S2 : String

Ergebnis: String

Verknpfung der Strings S1 und S2. S2 wird an S1 angehngt.


@Add(N1,N2)
-----------
N1 : Wert - Summand
N2 : Wert - Summand

Ergebnis: Wert

Die Summe von N1 und N2.

Siehe auch: @Add$


@And(N1,N2)
-----------
N1 : Wert
N2 : Wert

Ergebnis: Wert

Die Werte von N1 und N2 werden mit der AND-Funktion verknpft. Das Ergebnis ist 0 wenn ein oder beide Werte 0 sind.

Vergleiche: @OR, @NOT


@Chr$(N)
--------
N : Wert (0 .. 255)

Ergebnis: String (1 Zeichen)

Das Zeichen mit dem ANSI-Code N.


@Date$(N)
---------
N : Integer - Ausgabeform

Ergebnis: String - Datum

Die Funktion ermittelt das aktuelle Datum in verschieden Formaten:

0 : Kurzform (z.B. "09.04.1993")
1 : Langform (z.B. "9. April 1993") *
2 : Langform mit Tag (z.B. "Freitag, der 9. April 1993") *


@Del$(S,N1,N2)
--------------
S  : String
N1 : Wert - Position
N2 : Wert - Zeichenzahl

Ergebnis: String

Ab der Position N1 werden N2 Zeichen aus dem String entfernt.


@DiskFree(S)
------------
S : String - Laufwerksbezeichnung

Ergebnis: LongInt

Das Ergebnis ist der freie Speicher auf Laufwerk S in kB. Ist das Ergebnis z.B.  430, so sind noch 430 kB frei. Ist das Laufwerk nicht vorhanden oder nicht lesbar, ist das Ergebnis 0. Beispiel:

Print @DiskFree("C:");" kB frei"


@DiskSize(S)
------------
S : String - Laufwerksbezeichnung

Ergebnis: Wert

Das Ergebnis ist der Gesamtspeicher auf  Laufwerk S in kB. Ist das Ergebnis z.B. 43000, so hat das Laufwerk 43000 kB bzw. 43 MB. Ist das Laufwerk nicht vorhanden oder nicht lesbar, ist das Ergebnis 0. Beispiel:

Print @DiskSize("C:");" kB"


@Div&(N1,N2)
------------
N1 : Wert
N2 : Wert

Ergebnis: Integer / LongInt

Ganzzahliges Ergebnis der Division von N1 durch N2.


@Div(N1,N2)
-----------
N1 : Wert
N2 : Wert

Ergebnis: Wert

Ergebnis der Division von N1 durch N2.


@Eof(#N)
--------
N : Integer - Dateinummer (1..8)

Ergebnis: Integer (0 oder 1)

Wenn mit dem letzten Lesen aus der Datei das Ende der Datei erreicht wurde, ergibt @Eof(#N) den Wert 1, ansonsten ist es 0.

(Wegen Kompatibilitt zu PROFAN 1.x kann das # auch weggelassen werden.)


@Equ$(S1,S2)
------------
S1 : String 1
S2 : String 2

Ergebnis: Integer (0 oder 1)

Das Ergebnis ist WAHR (1), wenn beide Strings gleich sind, UNWAHR (0), wenn die Strings verschieden sind.


@EQU(N1,N2)
-----------
N1 : Wert - Wert 1
N2 : Wert - Wert 2

Ergebnis: Integer (0 oder 1)

Das Ergebnis ist WAHR (1), wenn beide Werte gleich sind, UNWAHR (0), wenn die Werte verschieden sind.


@FilePos(#N)
------------
#N: Dateikennung

Ergebnis: LongInt - Aktuelle Position in der Datei

Die aktuelle Position des Dateizeigers einer mit OPENRW  geffneten Datei wird ermittelt, wobei 0 das erste Byte der Datei bezeichnet.


@FileSize(S)
------------
S : String - Dateiname (auch mit Pfad)

Ergebnis : LongInt - Gre der Datei in Bytes

Die Funktion ermittelt die Gre der angegebenen Datei in Bytes.


@FindFirst$(S)
--------------
S : String - Datei-Maske

Ergebnis: String

Die Funktion sucht die erste Datei im aktuellen Verzeichnis, die der Dateimaske entspricht. Das Ergebnis ist die gefundene Datei. Handelt es sich um ein Verzeichnis, steht es in eckigen Klammern.


@FindNext$()
------------
Ergebnis: String

Findet die nchste Datei, die zur mit @FINDFIRST$(S) gegebenen Maske pat. War die Suche erfolgreich, ist %IORESULT = 0! Beispiel:

Print @FindFirst$("*.PRF")
WhileNot %IOResult
  Print @FindNext$()
Wend


@GetByte(#N)
------------
#N: Dateikennung

Ergebnis: Integer - Wert (0...255)

Es wird ein Byte aus einer mit OPENRW geffneten Datei gelesen. Der Dateizeiger wird auf das nchste Byte positioniert. Zum Positionieren des Zeigers ist der Befehl SEEK zu verwenden.


@GetDir$(S)
-----------
S : Laufwerkskennzeichen

Ergebnis: String (Pfad)

Der Pfad des angegebenen Laufwerks wird ermittelt, wobei "@" fr das aktuelle Laufwerk steht. Beispiel:

Let CPfad$=@GetDir$("C:")
Let Pfad$=@GetDir$("@")


@GetEnv$(S)
-----------
S : String - Name der Variablen

Ergebnis : String - Inhalt der Variablen

Die Funktion liest die entsprechenden Environmentvariable aus. Beispiel:

LET Pfad$ = @GetEnv$("PATH")


@GetFAttr(#N)
-------------
#N: Dateikennung

Ergebnis: Integer - Attribut

Das Attribut einer Datei wird ermittelt. Der Dateikennung mu zuvor mit ASSIGN eine Datei zugewiesen worden sein. Die Datei darf nicht geffnet sein. Die Werte fr Attribute:

	$01 = ReadOnly
	$02 = Hidden
	$04 = SystemDatei
	$08 = Label
 	$10 = Directory-Eintrag
	$20 = Archiv

Werden mehrer Attribute verwandt, so sind sie zu addieren. Eine Systemdatei, die zustzlich versteckt (hidden) ist, hat demzufolge $06 als Attribut.


@GetFDate$(#N)
--------------
#N: Dateikennung

Ergebnis: String- Datum im Format "JJJJMMTT"

Das Datum der Datei wird ermittelt. Der Dateikennung mu zuvor mit ASSIGN eine Datei zugewiesen worden sein. Die Datei mu (z.B. mit RESET) geffnet sein.


@GetFileSize(#N)
----------------
#N: Dateikennung

Ergebnis: LongInt - Gre der Datei in Bytes

Die aktuelle Gre einer mit OPENRW geffneten (!) Datei in Bytes wird ermittelt. Um die Gre einer ungeffneten Datei zu ermitteln ist die Funktion @FileSize zu ermitteln. Der Vorteil von @GetFileSize liegt darin, da die Gre einer gerade zum Bearbeiten geffneten Datei ermittelt werden kann.


@GetKey$()
----------
Ergebnis: String (1 Zeichen)

Wartet auf einen Tastendruck und gibt das Ergebnis zurck.


@GT(N1,N2)
----------
N1 : Wert - Wert 1
N2 : Wert - Wert 2

Ergebnis: Wert (0 oder 1)

Das Ergebnis ist WAHR (1), wenn Wert 1 grer als (Greater Than) Wert 2 ist.


@GT$(S1,S2)
-----------
S1 : String 1
S2 : String 2

Ergebnis: Integer (0 oder 1)

Das Ergebnis ist WAHR (1), wenn String 1 grer als (Greater Than) String 2 ist.


@KeyIn(S)
---------
S : String

Ergebnis: Wert (0 oder 1)

Das Ergebnis ist dann 1, wenn die zuletzt gedrckte Taste im String S vorkommt. Beispiel:

WaitKey
Case @KeyIn("AaBb"):Print "A oder B"


@Len(S)
-------
S : String

Ergebnis: Wert

Lnge des Strings S


@ListBoxItem$(N)
----------------
N : Integer (0 ... 9999)

Ergebnis: String

Der N-te Eintrag der ListBox-Liste wird ermittelt.


@LT(N1,N2)
----------
N1 : Wert 1
N2 : Wert 2

Ergebnis: Wert (0 oder 1)

Das Ergebnis ist WAHR (1), wenn Wert 1 kleiner als (Less Than) Wert 2 ist.


@LT$(S1,S2)
-----------
S1 : String 1
S2 : String 2

Ergebnis: Integer (0 oder 1)

Das Ergebnis ist WAHR (1), wenn String 1 kleiner als (Less Than) String 2 ist.


@Mid$(S,N1,N2)
--------------
S  : String
N1 : Integer - Position
N2 : Integer - Anzahl

Ergebnis: String

Das Ergebnis ist ein String, der N2 Zeichen ab Position N1 aus String S enthlt.


@Mod(N1,N2)
-----------
N1 : Integer
N2 : Integer

Ergebnis: Integer

Das Ergebnis ist N1 modulo N2.


@Mul(N1,N2)
-----------
N1 : Wert
N2 : Wert

Ergebnis: Wert

Multiplikation von N1 mit N2.


@Neq(N1,N2)
-----------
N1 : Wert - Wert 1
N2 : Wert - Wert 2

Ergebnis: Integer (0 oder 1)

Das Ergebnis ist UNWAHR (0), wenn beide Werte gleich sind, WAHR (1), wenn die Werte verschieden sind.


@Neq$(S1,S2)
------------
S1 : String 1
S2 : String 2

Ergebnis: Integer (0 oder 1)

Das Ergebnis ist UNWAHR (0), wenn beide Strings gleich sind, WAHR (1), wenn die Strings verschieden sind.


@Not(N)
-------
N : Wert

Ergebnis: Integer (0 oder 1)

Das Ergebnis ist 1, wenn N den Wert 0 hat, ansonsten ist es 0.


@Or(N1,N2)
----------
N1 : Wert
N2 : Wert

Ergebnis: Integer

ODER-Funktion: Das Ergerbnis ist ungleich 0, wenn N1 ODER N2 (oder beide) ungleich 0 sind. Anders ausgedrckt: Es ist nur dann 0, wenn beide Argumente 0 sind.


@Ord(S)
-------
S : String

Ergebnis: Integer

Der ASCII-Code des ersten Zeichens von S.


@Par$(N)
--------
N : Integer - Parameter-Nummer

Ergebnis: String - Parameter

Die Kommandozeilenparameter werden ausgelesen. Die Anzahl wird mit %PARCOUNT festgestellt.


@Rnd(N)
-------
N : Wert

Ergebnis: Integer bzw. LongInt

Zufallszahl zwischen 0 und N-1.


@ScanKey(N)
-----------
N : Integer - Scancode

Ergebnis: Integer (1 oder 0)

Wenn der letzte Scancode (virtueller Tastencode) mit N (0 bis 254) bereinstimmt, ist das Ergebnis 1, anderenfalls ist es 0. Tabelle der Scancodes siehe unter %SCANKEY.


@Sqr(N)
-------
N : Wert

Ergebnis : Float

Das Quadrat von N (N).


@Str$(S)
--------
N : Wert

S : String

Der Wert von N wird in einen String ohne folgende Leerzeichen umgewandelt. Die Lnge des Strings und (bei Float) die Anzahl der Nachkommastellen werden durch die Befehle NUMWIDTH und DECIMALS eingestellt.


@Sub(N1,N2)
-----------
N1 : Wert
N2 : Wert

Ergebnis: Wert

N2 wird von N1 abgezogen (subtrahiert).


@SubStr$(S1,N,S2)
-----------------
S1 - String: Der zu bearbeitende String
N  - Integer: Nummer des Teilstrings
S2 - String: Trennzeichen

Ergebnis: Substring aus S1

Aus dem String S1 wird der N-te Teilstring herausgefiltert,  wobei S2 das Trennzeichen zwischen den Teilstrings ist. Beispiel:

	LET A$ = "eins,zwei,drei,vier,fnf"
	PRINT @SUBSTR$(A$,3,",")

Das Ergebnis wre der String "drei". Wird das Trennzeichen im String S1 nicht gefunden, ist das  Ergebnis fr den ersten Teilstring der gesamte String und fr  alle weiteren der Leerstring. Ist N kleiner als 1, erfolgt eine  Fehlermeldung. Ist N hingegen grer als die Anzahl der  vorhandenen Teilstrings, so ist das Ergebnis ein Leerstring.

HINWEIS: S2 darf auch aus mehreren Zeichen bestehen!


@Time$(N)
---------
N : Integer (0 .. 1) - Unterfunktion

Ergebnis: String

Die Funktion ermittelt die aktuelle Uhrzeit:

N = 0 : Sunden und Minuten (z.B. "23:45")
N = 1 : Sekunden und 100stel Sekunden (z.B. "39.67")


@Translate$(S1,S2,S3)
---------------------
S1: String - der zu bearbeitende String
S2: String - Suchtext
S3: String - Ersatztest

Ergebnis: String, in dem S2 durch S3 ersetzt wurde

Alle Vorkommen des Strings S2 werden in S1 durch S3 ersetzt.


@Trim$(S)
---------
S : String

Ergebnis: String

Die fhrenden und endenden Leerzeichen eines Strings werden abgeschnitten.


@Upper$(S)
----------
S : String

Ergebnis: String

Der String S wird komplett in Grobuchstaben umgewandelt, wobei die deutschen Umlaute korrekt bercksichtigt werden.


@Val(S)
-------
S : String

Ergebnis: Wert

Der String S wird in einen numerischen Wert umgewandelt. Das Ergebnis ist 0, wenn der String nichtnumerische Zeichen enthlt.


3. Befehle
==========

Jede Programmzeile beginnt mit einem Befehl, wobei auch Funktionen wie Befehle verwandt werden knnen. So darf also auf keinen Fall bei einer Zuweisung das LET weggelassen werden. Nach dem Befehlswort mu immer mindestens 1 Leerzeichen stehen, ansonsten wird der Befehl nicht als solcher erkannt.
In jeder Programmzeile darf auch immer nur ein Befehl stehen.  Mehrere Befehle in einer Zeile (wie z.B. in BASIC, PASCAL oder C)  sind nicht zulssig. Einige Ausnahme ist der CASE-Befehl.


' ... (Kommentarzeichen)
------------------------

Kommentarzeichen. Im Gegensatz zu REM kann (sollte) es auch hinter einem Befehl in einer Zeile stehen:

' Unterprogramm
Let X%=125  'X-Position zuweisen


Add VAR,N
---------
VAR - Variablenname (Integer)
N   - Integer

N wird zur Variablen VAR addiert. (Ist schneller und einfacher als die @ADD-Funktion.) Beispiel:

ADD Punkte%,10


AddFiles S
----------
S : String - Dateimaske

Mit diesem Befehl wird eine Dateiliste der Listbox-Liste hinzugefgt. Beispiel:

ClearList
AddFiles "*.RGH"


AddString S
-----------
S : String

Mit diesem Befehl wird der String der  Listbox-Liste hinzugefgt. Beispiel:

ClearList
AddString "Item 1"
AddString "Item 2"


Append #N
---------
N: Wert - Dateinummer (1 .. 8)

Die Datei #N wird geffnet, um Daten anzufgen. Tritt ein Fehler auf, ist %IoResult grer als 0. Beispiel:

Assign #1,"TEST.DAT"
Append #1
Case %IoResult:MessageBox "Fehler:",\
          "Kann Datei nicht ffnen!",16
Print #1,"Testdaten",56,Hugo$
Close #1


Assign #N,S
-----------
N : Wert - Dateinummer (1 .. 8)
S : String - Dateiname (+ Pfad)

Der Datei Nummer N wird die Datei S zugewiesen. Beispiel:

Assign #1,"DEMO.PRF"
Reset #1
WhileNot @Eof(#1)
   Input #1,Zeile$
   Print Zeile$
Wend
Close #1


Beep
----
Gibt einen Signalton aus. Zur Tonausgabe siehe auch unter SOUND und PLAY!


ChDir S
-------
S : String - Pfadangabe

Es wird zum Verzeichnis S gewechselt. Enthlt S eine Laufwerksangabe, so wird auch das aktuelle Laufwerk gewechselt!
Beispiel:

ChDir "D:\TABELLEN\GRAFIK"
LoadSizedBmp "Umsatz",10,30-400,600;1


ClearList
---------
Die ListBox-Liste wird gelscht, d.h. der Zeiger wird auf den Anfang gesetzt. Mit AddFiles oder AddString wird die Liste gefllt.


Close #N
--------
N : Wert - Dateinummer (1 .. 8)

Die mit RESET, APPEND oder REWRITE geffnete Datei mit der  Dateinummer N wird geschlossen. Beispiel:

Close #Nr%


CloseRW #N
----------
N: Dateikennung (1.. 8)

Eine im Binrmodus geffnete (OpenRW) Datei wird wieder geschlossen.  Hinweis: Wenn der Befehl auf eine mit RESET, APPEND oder  REWRITE geffnete Datei angwandt wird, erfolgt ein Fehler (%IOResult wird gesetzt), ebenso im umgekehrten Falle!


Cls
---
Lscht den Bildschirm.


Color C1,C2
-----------
C1 : Wert - Textfarbe (0 .. 15)
C2 : Wert - Hintegrund (0 .. 15)

Die Farben des Textmodus (PRINT, TBOX,  INPUT) werden festgelegt. Die Farben entsprechen den 16 Farben von MS-DOS im Textmodus. Beispiel:

Color 15,0
Print "Hugo was here!"


Copy S1 > S2
------------
S1 : String - Quelldatei
S2 : String - Zieldatei

Die Quelldatei wird kopiert und erhlt Zieldatei als Namen. Beide Strings knnen auch Pfadangaben enthalten. Wildcards sind jedoch nicht gestattet. Beispiel:

COPY "C:\START.BAT" > "D:\BAK\START.BAK"


Dec VAR
-------
VAR : Variablenname (Integer)

VAR wird um 1 erniedrigt. (Ist identisch mit SUB VAR,1)


Declare VAR [,VAR[,VAR]...]
---------------------------
VAR : Variablen-Name

In PROFAN mssen alle Variablen (zeitlich) vor der ersten Benutzung declariert werden. String-Variablen werden durch ein $, LongInt-Variablen durch ein &, Float-Variablen durch ein ! ,  Integer-Variablen durch ein % und Bereichsvariablen durch ein # gekennzeichnet. Beispiel:

Mit Ausnahme der Bereichsvariablen sind alle Variablen, die in Prozeduren oder Unterprogrammen declariert werden nur dort lokal gltig. Der verwandte  Speicherplatz wird bei Verlassen des Unterprogrammes/der Prozedur wieder freigegegen.

Decalare XPos%,YPos%,Text$


End
---
Programmende. Ohne weitere Abfrage wird  das Profan-Programm verlassen.


Erase #N
--------
N : Wert - Dateinummer (1 .. 8)

Die Datei mit dem Dateikennzeichen N  wird gelscht. Beispiel:

	ASSIGN #1,"TEST.BAK"
	ERASE #1


FileMode N
----------
N: Integer - Filemodus (siehe DOS-Dokumentation)

Der Filemodus der fr das ffnen von Dateien (mit RESET, REWRITE oder OPENRW) und den Zugriff auf diesen gilt, wird eingestellt. Unter allen DOS-Versionen sind folgende Filemodi vorhanden:

0:	Nur lesen
1:	Nur schreiben
2:	Lesen und Schreiben

Neuere DOS-Versionen kennen noch weitere Modi, die besonders im Netzwerk von Interesse sind.
Standardmig wird bei allen oben genannten Befehlen FileMode 2 benutzt. Will man jedoch eine Datei lesen, die das Attribut ReadOnly (Nur lesen) hat, so mu vor dem RESET bzw. OPENRW der FileMode auf 0 gesetzt werden.


Font N
------
N : Wert - Font - Nummer (0 .. 2)

Der Font N fr den Textmodus  (Textausgabe mit PRINT) wird gewhlt:

0 : System-Font (ANSI-Zeichensatz)
1 : OEM-Font (ASCII-Zeichensatz)
2 : ANSI-Font

Ist unter DOS wirkungslos. Damit die Zeichen unter Windows richtig angezeigt werden, solle am Anfang des Programmes FONT 1 eingestellt werden.


If N  ... [ElseIf N ...] [Else ... ] EndIf
------------------------------------------
N : Wert . Bedingungsausdruck

Die zwischen IF und ENDIF stehenden Zeilen werden nur dann ausgefhrt, wenn  N ungleich 0 ist. Beispiel:

If @Equ(Test%,78)
	Print "Test% ist 78!"
	Print "-------------"
EndIf

Auch eine Abrage 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:

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

ACHTUNG: Hinter ELSEIF mu ein Bedingungsausdruck stehen. Fehlt dieser wrde der Interpreter das ELSEIF zwar wie ELSE behandeln, aber das Runtime-Modul wrde den Fehler merken und mit einer Fehlermeldung "Zu wenig Parameter" abbrechen.


IfNot N ... [ElseIf N ... ] [Else ...] EndIf
--------------------------------------------
Als Kurzform fr If @Not(N) kann auch das krzere (und schnellere) IfNot verwandt werden:

IfNot @Equ(Test%,78)
	Print "Test% ist nicht 78!"
	Print "-------------------"
EndIf


Inc VAR
-------
VAR - Variablenname (Integer)

VAR wird um 1 erhht. (Ist identisch mit ADD VAR%,1)


Input #N,VAR
------------
N : Wert - Dateikennzeichen (1..8)
VAR : Variable

Aus der Datei #N wird ein Wert in die Variable gelesen. Beispiel:

Assign #1,"TEST.DAT"
Reset #1
Input #1,Titel$
Input #1,Anzahl%
Close #1


Input VAR
---------
VAR : Variable

Von der Tastatur wird ein Wert in die Variable gelesen (Textmodus). Beispiel:

Print "Geben Sie den Titel ein: ";
Input Titel$
Print "Geben Sie die Anzahl ein: ";
Input Anzahl%

Windowstypischer ist jedoch die Verwendung des Eingabedialoges mit der Funktion @Input$.


Let VAR=N|S
-----------
VAR : Variablenname
N   : Wert
S   : String

Einer zuvor mit DECLARE declarierten Variablen wird ein Wert zugewiesen. Das LET darf nicht weggelassen werden!

Beim LET-Befehl fr Stringvariablen knnen nun - hnlich wie beim PRINT-Befehl - mehrere Stringausdrcke durch Semikolon bzw. Komma getrennt angegeben werden. Werden zwei Stringausdrcke mit einem Komma getrennt, wird ein Leerzeichen eingefgt. Diese Methode ist einfacher und deutlich (!) schneller als das Zusammenfgen von Strings mittels der @ADD$-Funktion. Beispiel:

	LET Text$ = "Du hast",@Str$(Score%),"Punkte erzielt!"

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!


ListBoxItem$ N = S
------------------
N : Integer - Index (0 .. 999)
S : String

Der String S wird wird an Position N in die ListBox-Liste bernommen.


Locate X,Y
----------
X : Wert - Zeile
Y : Wert - Spalte

Der nchste PRINT- oder INPUT-Befehl positioniert auf Zeile X, Spalte Y. Wirkt nur fr Textmodus-Befehle.


MkDir S
-------
S : String - Pfadangabe

Das Verzeichnis S wird angelegt. Im Falle eines Fehlers hat %IORESULT einen von 0 verschiedenen Wert. Beispiel:

MkDir "C:\WINDOWS\TEST"

Siehe auch: ChDir, RmDir


NumWidth N
----------
N: Integer - Mindestweite

Mindestweite der Ausgabe numerischer Werte. Dieser Wert wird auch von der @STR$-Funktion und dem Befehl DrawText verwandt. Ist der Ausgabestring krzer wird er mit fhrenden Leerzeichen aufgefllt. Standarteinstellung ist 0.

Siehe auch: Decimals


OpenRW #N
---------
#N: Dateikennung (1 - 8)

Die Datei mit der Kennung #N wird im Binrmodus zum Lesen und Schreiben geffnet. Es knnen beliebige Bytes aus der Datei gelesen (@GetByte) und beliebige Bytes in die Datei geschrieben (PutByte) werden. Mit @FilePos kann die Position des Dateizeigers ermittelt werden und mit SEEK wird sie verndert.


Parameters VAR [,VAR[,VAR] ...]
-------------------------------
VAR - Variablennamen

Die Aufrufparameter einer Prozedur werden Variablen zugewiesen, die innerhalb der Prozedur bekannt sind. Ein Beispiel findet sich unter PROC. Die Anzahl der Variablen sollte gleich der Anzahl der bergabeparameter sein; berprft wird dieses aber ebensowenig, wie die Datentypen. Gegebenenfalls erfolgt eine automatische Umwandlung.

Siehe auch: Proc


Print #N,f;f,f ...
------------------
N : Wert - Dateikennzeichen (1..8)
f : druckbarer Ausdruck

Der Ausdruck, bzw. die Ausdrcke werden in die mit N bezeichnete Datei geschrieben. Steht zwischen den Ausdrcken ein Semikolon, so werden sie direkt aneinander gehngt, bei einem Komma wird ein Leerzeichen eingefgt.

Siehe auch unter ASSIGN, REWRITE, APPEND und CLOSE.


Print f;f,f...
--------------
f : druckbarer Ausdruck

Der Ausdruck, bzw. die Ausdrcke werden auf den Bildschirm geschrieben. Steht zwischen den Ausdrcken ein Semikolon, so werden sie direkt aneinander gehngt, bei einem Komma wird ein Leerzeichen eingefgt. Siehe auch unter LOCATE. Beispiel:

Print "Dies ist der",N%;". Test"


Proc <Name> ... EndProc
-----------------------
<Name> : Name der Prozedur

Eine Prozedur wird definiert, die im nachfolgenden Programm wie ein neuer Befehl verwandt werden kann. ber den PARAMETERS-Befehl werden die bergebenen Parameter eingelesen.

Beispiel:

PROC Wiederhole
	PARAMETERS Text$, Anzahl%
	DECLARE I%
	LET I%=0
	WHILE @LT(I%,Anzahl%)
		PRINT Text$
		INC I%
	WEND
ENDPROC

Wiederhole "Testtext",10

Die in der Prozedur ber PARAMETERS oder DECLARE deklarierten Variablen sind nur innerhalb der Prozedur bekannt (lokal). Alle Variablen, die auerhalb (oberhalb) der Prozedur definiert wurden sind in der Prozedur auch bekannt (wie in PASCAL). Die Prozedur kann auch schon vor Erreichen der Zeile ENDPROC ber RETURN verlassen werden, wobei dann die bergabe eines Wertes an das aufrufende Programm mglich ist.


PutByte #N1,N2
--------------
#N1: Dateikennung (1 - 8)
N2: Integer - zu schreibender Wert (0 ... 255)

Das Byte N2 wird an die aktuelle Position des Dateizeigers in die Datei mit der Kennung #N1 geschrieben und der Dateizeiger um 1 weitergesetzt. Befindet sich dadurch der Zeiger hinter dem Ende der Datei, liefert @EOF(#N) den Wert 1. Durch weitere Schreiboperationen mit PUTBYTE wrde die Datei vergert werden.

Siehe auch: @GetByte


Randomize
---------
Sorgt dafr, da die Zufallszahlen (@RND) auch wirklich zuflligen Charakter haben.


Rem ...
-------
Alles was dahinter steht, ist Kommentar. REM steht immer am Anfang der Kommentarzeile. Fr Kommentare hinter anderen Befehlen ist das ' zu benutzen.


Rename #N,S
-----------
N : Wert - Dateikennzeichen (1..8)
S : String  - neuer Name (mit Pfad)

Die Datei mit dem Kennzeichen N wird in S umbenannt. Enthlt S eine Pfadangabe (mit oder ohne Laufwerksbezeichnung), so wird sie verschoben. Verschieben ist nur innerhalb eines Laufwerks mglich. Beispiel:

Assign #3,"C:\TEST.DAT"
Rename #3,"C:\UTILS\TOAST.DAT"


Reset #N
--------
N : Wert - Dateikennzeichen (1..8)

Die Datei N wird zum Lesen geffnet. Beispiel:

Declare Zeile$  Assign #2,"TEST.DAT"
Reset #2
WhileNot @Eof(#2)
	Input #2,Zeile$
	Print Zeile$
Wend

Siehe auch: Rewrite, Append und OpenRW.


Return [<Wert>]
---------------
Beenden einer Prozedur. Es ist mglich einen Wert zurckzugeben. Dieser steht dann in @$(0), @%(0), @&(0) und/oder @!(0):

PROC Test
	Print "Das ist ein Test"
	Return "OK!"
ENDPROC

Print "Im Hauptprogramm"
Test
Print "Wieder zurck! Ergebnis:",@$(0)

Der zurckgegebene Wert darf auch eine lokale Variable sein.  WICHTIG: Auch wenn eine Prozedur mit RETURN verlassen wird, mu die Definition der Prozedur mit ENDPROC abgeschlossen werden.


Rewrite #N
----------
N : Wert - Dateikennzeichen (1..8)

Die Datei N wird zum Schreiben geffnet. Der bisherige Dateiinhalt geht verloren. Existiert sie nicht, wird sie erzeugt. Beispiel:

Assign #2,"C:\UTILS\TEST.DAT"
Rewrite #2
Print #2,Zeile$
Close #2

Um eine bestehende Datei zu erweitern, ist der Befehl APPEND  zu verwenden.

Siehe auch: Reset und OpenRW.


RmDir S
-------
S : String - Verzeichnisnamen

Das Verzeichnis S wird gelscht. Enthlt es noch Dateien oder Unterverzeichnisse, kann es nicht gelscht werden. Bei erfolgreicher Operation hat %IORESULT den Wert 0.

Sie auch: ChDir MkDir


Run S
-----
S : String - Programmname

Das Programm S wird aufgerufen und das aufrufende Profanprogramm beendet. Es knnen alle Windowsprogramme - auch mit Parametern - aufgerufen werden.  Beispiele:

Run "NOTEPAD HILFE.TXT"
Run "E:\PROFAN\PROFAN DEMO.RGH"
Run "WRITE"


Seek #N,A
---------
#N: Dateikennung (1 - 8)
A: LongInt - Position in der Datei

Der Dateizeiger der im Binrmodus geffneten Datei mit der Kennung #N wird auf die Position A gesetzt. Das erste Byte in der Datei hat die Position 0. Hinweis: SEEK #N,@GETFILESIZE(#N) setzt den Zeiger hinter das letzte Byte. Damit wird die Datei vergrert.


SetErrorLevel N
---------------
N: Integer - Errorlevel

Je nach Wunsch kann der Errorlevel auf einen der mglichen Werte gesetzt werden. Damit wird das Verhalten des Systems bei Auftreten eines Fehlers oder einer Warnung definiert:

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 ...


SetFAttr #N1,N2
---------------
#N1: Dateikennung
N2: Integer - Attribut(e)

Setzt das Attribut der Datei #N. Der Kennung #N mu eine Datei mit ASSIGN zugewiesen worden sein. Die Datei darf aber nicht geffnet sein. Geffnet wird eine Dartei durch die Befehle REWRITE, APPEND, RESET oder OPENRW. Die Attribute:

	$01 = ReadOnly
	$02 = Hidden
	$04 = SystemDatei
	$08 = Label
 	$10 = Directory-Eintrag
	$20 = Archiv

Werden mehrer Attribute verwandt, so sind sie zu addieren.


Shell S
-------
S : String - Programmname

Das Programm S wird aufgerufen und das aufrufende Profanprogramm luft weiter. Es knnen alle Windowsprogramme - auch mit Parametern - aufgerufen werden. Beispiel:

Shell "NOTEPAD HILFE.TXT"

Vergleiche auch: Run


StrWidth N
----------
N: Integer (Mindestweite)

Die Mindest-Ausgabeweite fr Strings (mittels des PRINT-Befehles) wird festgelegt. Strings, die krzer als N sind, werden entsprechend mit vorangestellten Leerzeichen verlngert. Voreingestellt ist der Wert 0 (= "normales" Verhalten der Strings).


Sub VAR,N
---------
VAR - Variablenname (Integer)
N   - Integer

N wird von Variablen VAR subtrahiert. (Ist schneller und einfacher als die @SUB-Funktion.) Beispiel:

SUB Punkte%,10


TBox X1,Y1 - X2,Y2; N
---------------------
X1,Y1 : Wert - linke obere Ecke
X2,Y2 : Wert - rechte untere Ecke
N     : Rahmentyp

Es wird im Textmodus eine Box gezeichnet. Die Koordinaten werden wie bei LOCATE in Zeichen eingegeben. Benutzt werden die Grafikzeichen des OEM-Zeichensatzes.

0 - Einfacher Rahmen
1 - Doppelter Rahmen
2 - Senkrecht doppelt/waagrecht einf.
3 - Ohne Rahmen


WaitInput
---------
Wartet auf einen Tastendruck. Das Ergebnis steht in den Systemvariablen %SCANKEY und %KEY. Unter DOS identisch mit WAITSCAN


WaitKey
-------
Wartet auf einen Tastendruck. Das Ergebnis steht in der Systemvariablen %KEY. (Funktionstasten werden nicht erkannt. Wird dies bentigt, ist WAITSCAN zu verwenden.)


WaitScan
--------
Wartet auf einen beliebigen Tastendruck. Auch Funktionstasten, Kusortasten, Shift- und Ctrltasten werden erkannt. Das Ergebnis steht in als virtueller Tastencode in %SCANKEY und - im Falle einer "normalen" Taste - als ASCII- Code in %KEY.

Wichtige Scancodes:

	16 -	Shift
	17 -	Strg
	27 -	Esc
	33 -	BildHoch
	34 -	BildRunter
	35 -	Ende
	36 -	Pos1
	37 -	Links
	38 -	Hoch
	39 -	Rechts
	40 -	Runter
	45 -	Einfg
	46 -	Entf
	112 -	F1
	... -	...
	123 -	F12


Die brigen lassen sich durch Ausprobieren mit folgendem Programm leicht austesten:

Cls
While 1    'Endlosschleife!
	WaitScan
	Print %ScanKey
Wend
End

Das Programm ist mit Strg-C zu beenden.


While N ... EndWhile
--------------------
N : Wert - Bedingungsausduck

Die zwischen WHILE und WEND stehenden Befehle werden solange wiederholt,  solange N ungleich 0 ist. Beispiel:

While N%
	Print "Gebe eine Zahl ein: ";
	Input N%
Wend

Anstelle von ENDWHILE kann auch die von Basic her gewohnte Schreibweise WEND verwandt werden.


WhileNot N ... EndWhile
-----------------------
N : Wert - Bedingungsausduck

Die zwischen WHILENOT und WEND stehenden Befehle werden solange wiederholt, solange N gleich 0 ist. Beispiel:

WhileNot @Eof(#2)
	Input #2,Zeile$
	Print Zeile$
Wend


Window X1,Y1-X2,Y2
WindowStyle N
WindowTitle S
------------------
Diese Befehle sind unter DOS wirkungslos, knnen aber in auch unter Windows eingesetzten Programmen verwandt werden, um eine brauchbare darstellung zu erzeugen. Zur Einstrellung der Hintergrundfarbe kann CLS mit Parameter aufgerufen werden.


ANHANG A: Fehlermeldungen
=========================

Folgende Fehlermeldungen und Warnungen werden vom Interpreter bzw. Compiler und Runtime-System erzeugt:

Programm-Struktur
-----------------
100 : 	Systemvariable unbekannt:
101 : 	Funktion unbekannt:
102 : 	Befehl unbekannt:
103 : 	Integer-Variable erwartet!
104 : 	Dateikennung erwartet!
105 : 	Tabellenkennung erwartet!
106 : 	ENDIF bzw. ELSE nicht gefunden!
107 : 	ENDIF nicht gefunden!
108 : 	Zu tiefe WHILE-Verschachtelung!
109 : 	ENDWHILE bzw. WHILE nicht gefunden!
110 : 	WHILE fehlt!
111 : 	GOSUB/PROC fehlt!
112 : 	PROC fehlt!
113 : 	Label nicht gefunden:
114 : 	Zu tiefe GOSUB/PROC-Verschachtelung!
115 : 	ENDPROC nicht gefunden!

Ungltige/fehlende Parameter
----------------------------
200 : 	Ungltiger Funktionswert!
201 : 	Division durch 0!
204 : 	String-Index ist < 1 !
205 : 	Substring-Nr ist < 1 !
206 : 	So viele Elemente sind nicht da!
207 : 	Bereichsgrenze berschritten:
208 : 	Kommandozeilenparameter fehlt!
209 : 	Datei nicht gefunden:
210 : 	Dateinummer nicht im erlaubten Bereich!
211 : 	Parameterzahl mu zwischen 0 und 8 liegen!
212 : 	Zu wenig Parameter!
213 : 	Funktionsargument fehlt!
214 : 	Keine Zahl:
215 : 	Variable nicht declariert:
216 : 	Falscher Parametertyp:
217 : 	Speicher fr Integer-Variablen erschpft!
218 : 	Speicher fr LongInt-Variablen erschpft!
219 : 	Speicher fr String-Variablen erschpft!
221 : 	Whrend der Druckausgabe verboten:
222 : 	Box nicht innerhalb des Fensters!
231 : 	Es sind lediglich 0 bis 999 Elemente erlaubt!
232 : 	Zu viele Elemente!
233 : 	Das Element gibt es nicht!
238 : 	Stringende fehlt!

IO-Fehler
---------
300 : 	Datei kann nicht gelesen werden:
301 : 	Datei kann nicht erzeugt werden:
302 : 	Fehler beim Lesen:
303 : 	Fehler beim Schreiben:

Sonstige Fehler
---------------
900 : 	Dieser Befehl ist in der Sharewareversion nicht vorhanden!
901 : 	Nur 999 Zeilen sind erlaubt!
902 : 	Zeile zu lang (max. 127 Zeichen)!
905 : 	Keine gltige PROFAN Datei!
906 : 	Programmdatei fehlerhaft!
