Neuerungen in FCO 2.4 (Stand: 1.2.93)
----------------------------------------------------------------------

Was ist neu in FCO 2.4 ?

Dieser Text beschreibt den aktuellen Status der
Verbesserungen, die KRS bis heute gegenueber der
US-Version 2.1E in FCO eingefuegt hat.

Man kann nie sagen, da eine Software frei von
Fehlern ist. Das gilt natuerlich auch fuer FCO.
Ein erheblicher Teil der Entwicklungsarbeit von
KRS bestand daher in der Korrektur von Fehlern
- wir sind sicher, da wir eine ganze Menge von
"Bugs" getoetet haben.

An dieser Stelle moechten wir uns bei den vielen
Kunden bedanken, die uns wertvolle Hinweise auf
Fehler gegeben haben. Weiterhin moechten wir uns
fuer die vielen guten Anregungen fuer Erweiter-
ungen bedanken - in dieser Version haben wir viele
davon bereits verwirklicht.


Allgemeines

Meldungen

Alle Systemmeldungen, einschliesslich der Laufzeit-
Fehlermeldungen wurden in deutsch uebersetzt. Auch
die Compilermeldungen wurden uebersetzt.


Kommandos

SET SCOREBOARD

Als Vorgabe ist dieser Schalter nun OFF - das wider-
spricht zwar den Konventionen anderer Xbase-Produkte,
aber es erscheint uns sinnvoll, da die meisten Pro-
grammierer das SCOREBOARD ohnehin ausschalten.

Im SCOREBOARD wird nun auch der Zustand der Rollen-
Taste (Scroll Lock) angezeigt. Das Farbattribut fuer
die Statusanzeigen kann nun getrennt definiert werden
(siehe __color_score und SetColor()). Es ist jetzt
moeglich, nur bestimmte Status-Indikatoren anzuzei-
gen und die Bildschirmposition jedes Indikators kann
nun getrennt festgelegt werden (siehe Set_???_Pos()).


MENU TO

MENU TO unterstuetzt nun Umlaute als Auswahlbuchstaben.

Innerhalb eines MENU TO werden nun Timer-Interrupt-Rou-
tinen weiter ausgefuehrt.


@...GET

Es wird nun die Format-Funktion "@K" unterstuetzt, d.h.
der Inhalt eines GET-Feldes wird geloescht, wenn bei
Neueingabe in einem Feld als erste Eingabe nicht die
Rechtspfeiltaste gedrueckt wird, um den Cursor an eine
bestimmte Position im GET-Feld zu bringen.


@...SAY

Die Formatklausel "!" und die Funktionen "@!" und "@A"
bei SAY/GET ... PICTURE unterstuetzen nun Umlaute und
andere internationale Sonderzeichen.

Die Klauseln "@C" und "@X" geben jetzt nach den nume-
rischen Werten frei definierbare Texte statt "CR" und
"DB" aus. Diese Texte koennen mit der Funktion
SetDbCrString() definiert werden, z.B. "Soll" und
"Haben".


SET EXACT

SET EXACT ist nun als Vorgabe OFF, entsprechend dem
Standard anderer Xbase-Produkte.


???

Dieses Ausgabekommando entspricht dem ?-Kommando,
jedoch wird hier eine Zeilenschaltung nach Ausgabe
der Parameter erzeugt und nicht, wie bei '?' vor
Ausgabe der Parameter.


OPEN/USE <alias> READONLY

Diese neue Option des USE/OPEN-Kommandos erlaubt
das Oeffnen von Datenbanken im Modus "Nur Lesen",
aehnlich wie bei Clipper 5.


Neue und erweiterte Funktionen und Prozeduren in
FCO.LIB

Bit Funktionen

SetBit()
TestBit()
ResetBit()
MaskBit()
And()
Not()
Or()
Xor()


Datum

DDow()

Die Funktion entspricht dow(), gibt jedoch die
Nummer des Wochentages entsprechend der deutschen
Normung zurueck, d.h. Montag = Tag 1, ..., Sonn-
tag = Tag 7.


Datenbank, Dateien

A_Dbf()

Funktion entspricht Dbf(), erwartet jedoch einen
Aliasnamen als Parameter.


Browse()

Funktion aehnlich wie dbedit() in Clipper, mit
Maussteuerung und anderen Erweiterungen. In Anzei-
gespalten koennen auch abgeleitete Werte dargestellt
werden.


CreateTempFilename()

Funktion gibt einen eindeutigen Dateinamen zurueck,
z.B. fr temporaere Dateien.


Fldcnt(), A_Fldcnt()

Funktionen geben die Anzahl der Felder in einer
Datenbank zurueck.


Ind_Order(), A_Ind_Order()

Funktionen geben den aktuellen Status von SET ORDER
TO im aktuellen bzw. im angegebenen Alias-Bereich
zurueck.


Direkter Dateizugriff

Die Routinen fr direkten Dateizugriff unterstuetzen
nun gepufferte Ein-/Ausgabe.


Netzwerk-Untersttzung

Die Netzwerk-Funktionen sind nun kompatibel mit
Clipper 5.01 und frueheren Versionen von Clipper,
so da FCO- und Clipper-Programme konkurrierend in
einem Netz eingesetzt werden koennen.


Mathematische Funktionen

Dbl_Power()

Funktion gibt die Potenz einer Zahl als dbl-Wert
zurueck.


Factorial()

Funktion gibt die Fakultaet einer Zahl zurueck.


Maus-Routinen

Umfangreiche Mausroutinen stehen nun zur Verfuegung:

MouseAnyButtonPressed()
MouseButtonCheck()
MouseButtonPressed()
MouseButtonPressedRow()
MouseButtonPressedCol()
MouseButtonReleasedRow()
MouseButtonReleasedCol()
MouseButtonValue()
MouseButtonWait()
MouseButtonWaitPressed()
MouseButtonWaitReleased()
MouseDefineArea()
MouseInArea()
MouseActRow()
MouseActCol()
MouseSetCol()
MouseSetRow()
MouseSetRowCol()
MouseSaveState()
MouseRestoreState()
MouseCheck()
MouseOn()
MouseOff()
IsMouseOn()
MouseButtons()
MouseCursorType()


Druckerfunktionen

nPready()

Funktion prueft, ob der Drucker an einer be-
stimmten Schnittstelle bereit ist.


PrStatus()

Funktion gibt den Status eines Druckers an ei-
ner bestimmten Druckerschnittstelle zurueck.


Bildschirmfunktionen

Allgemeine Erweiterungen

Alle Routinen des Bildschirmtreibers verwenden
nun die aktuell definierte Bildschirmgroee
statt einer fest vorgegebenen Groee von 25 Zei-
len und 80 Spalten (dies ist der Standardwert,
wenn keine anderen Definitionen angegeben werden).

Saemtliche Bildschirm-Operationen koennen statt
ueber direkten Bildschirmzugriff nun auch ber
BIOS-Funktionen ausgefuehrt werden. Damit koen-
nen nun Anwendungen fr Computersysteme erstellt
werden, die "nur" BIOS-kompatibel sind.


Box

Prozedur zeichnet Rahmen, aehnlich die das BOX-
Kommando von Clipper.


GetMaxRow(), GetMaxCol()

Funktionen geben die groete Zeilen- bzw. Spal-
tenzahl der aktuell definieren Bildschirmgroee
zurueck (Vorgabe: 24 mal 79).


Is_Cursor()

Funktion gibt den aktuellen Zustand des Cursors
zurueck (ein- oder ausgeschaltet).

ScrnDriver()

Funktion gibt einen Kenner zurueck, der den ak-
tiven Modus des Bildschirmtreibers kennzeichnet
(direkt, BIOS oder DOS).


Scroll()
Scroll_1()
ScrollFill()

Funktionen zum Rollen von Bildschirmbereichen
nach oben oder unten, entweder um eine beliebige
Anzahl von Zeilen (Scroll()) oder um eine Zeile
(Scroll_1()). Optional koennen die freiwerden-
den Zeilen mit vorgegebenen Zeichen gefuellt
werden (ScrollFill()).


ScrSeg()

Funktion gibt die Segmentadresse des aktiven
Bildschirmadapters zurueck.


SetBlink()

Funktion schaltet zwischen den beiden moeglichen
Attributen (Blinken oder helle Darstellung) von
EGA- oder VGA-Adaptern um. Die Funktion gibt den
zuvor gueltigen Modus zurueck.


SetCapsPos()
SetInsPos()
SetNumPos()
SetScrollPos()

Prozeduren zur Definition der Bildschirmpositionen
der verschiedenen Status-Indikatoren des SCOREBOARD.
Die Prozeduren ermoeglichen es auch, bestimmte
Statusanzeigen ganz zu unterdruecken.


SetColor

Prozedur, aehnlich dem Kommando SET COLOR TO, aller-
dings wird hier als zusaetzlicher Parameter das
Attribut fr die Zustands-Indikatoren (siehe SET
SCOREBOARD) erwartet.


SetMaxRowCol()

Die Prozedur definiert die Maximalwerte fr Zeilen
und Spalten, die der Bildschirmtreiber beachten
soll (Anmerkung: durch die Prozedur wird der aktu-
elle Modus des Bildschirmtreibers nicht umge-
schaltet, es wird lediglich die logische Groee des
Bildschirms definiert - die Umschaltung mu separat
erfolgen).


Swap_Colors

Prozedur zum Vertauschen der Attribute __color_std
und __color_enhcd.


VideoType()

Die Funktion gibt den Typ des momentan aktiven
Bildschirmadapters zurueck.


ZoomBox()

Prozedur "oeffnet" einen Rahmen mit Verzoegerung.
Die Rahmenzeichen, das Fuellzeichen, die Attribute
fuer den Rand und den Fuellbereich und einen Schatten
koennen getrennt angegeben werden. Ein weiterer
Parameter steuert die Geschwindigkeit des Oeffnens.
Die Geschwindigkeit ist nahezu unabhaengig von der
Rechnergeschwindigkeit.


Funktionen fr direkten Bildschirmzugriff

PutScreenWord
GetScreenWord()
PutScreenChar
GetScreenChar()
PutScreenAttr
GetScreenAttr()


__color_score

Systemvariable, die das aktuelle Attribut der Status-
Indikatoren (SCOREBOARD) enthaelt.


__max_row, __max_col

Systemvariablen, die die aktuell definierten Maximal-
werte fr Zeilen- und Spaltenangaben enthalten.


SET Schalter

Die folgenden Funktionen geben den aktuellen Status
des entsprechenden SET-Schalters zurueck und weisen
ihm einen neuen Wert zu.

GetSetAlternate()
GetSetBell()
GetSetCentury()
GetSetConsole()
GetSetConfirm()
GetSetDate()
GetSetDecimals()
GetSetDeleted()
GetSetDelim()
GetSetDevPrt()
GetSetExact()
GetSetExclusive()
GetSetFixed()
GetSetIntensity()
GetSetMargin()
GetSetMessage()
GetSetPrint()
GetSetScoreboard()
GetSetStatus()

Die folgenden Funktionen geben den aktuellen
Zustand des entsprechenden SET-Parameters
zurueck.

GetAlternate()
GetBell()
GetCentury()
GetConsole()
GetConfirm()
GetDate()
GetDecimals()
GetDeleted()
GetDelim()
GetDevPrt()
GetExact()
GetExclusive()
GetFixed()
GetIntensity()
GetMargin()
GetMessage()
GetPrint()
GetScoreboard()
GetStatus()


Die folgenden Prozeduren setzen den Zustand
des entsprechenden SET-Parameters

SetAlternate()
SetBell()
SetCentury()
SetConsole()
SetConfirm()
SetDate()
SetDecimals()
SetDeleted()
SetDelim()
SetDevPrt()
SetExact()
SetExclusive()
SetFixed()
SetIntensity()
SetMargin()
SetMessage()
SetPrint()
SetScoreboard()
SetStatus()


Sonderfunktionen

__lib_lang

Systemvariable, die eine Information ber die
sprach-spezifischen Routinen in FCO.LIB kenn-
zeichnet, z.B. "English", "French", "German",
usw.


F_Init

Wenn die Prozedur in einem Programm definiert
ist, wird sie beim Start des Programms auto-
matisch unmittelbar vor dem Aufruf von fco_main
(bzw. force_main) aufgerufen. Damit koennen
Standard-Initialisierungen, z.B. die Installa-
tion von Programmunterbrechungen usw. vorgenom-
men werden.


F_Exit

Wenn die Prozedur in einem Programm definiert
ist, wird sie automatisch unmittelbar vor Been-
den der Programm-Ausfuehrung aufgerufen. Damit
koennen Standard-Routinen, z.B. das Abschalten
von Programmunterbrechungen usw. aufgerufen wer-
den. Diese Prozedur wird normalerweise auch bei
Programmabbruch durch Laufzeitfehler aufgerufen.


_$set_FCO, _$Is_FCO()

Diese internen Funktionen steuern bzw. testen
einen speziellen Merker, der von Drittanbietern
fuer Zusatzbibliotheken verwendet werden kann,
um festzustellen, ob ein Programm mit FCO.LIB
oder mit FORCE.LIB gelinkt wurde (FORCE.LIB
benutzt unterschiedliche Aufrufkonventionen
der Bildschirmtreiber).

Auf Anfrage stellen wir Drittanbieter die not-
wendigen Informationen dazu gerne kostenlos zur
Verfuegung.


Strings - Zeichenketten

CnvUmlt()

Funktion zur Umwandlung der deutschen Umlaute
in erweiterte Doppelvokale, so dass die Bildung
von Indexausdruecken entsprechend den DIN-Normen
moeglich ist.


Duden()

Funktion zur Umwandlung von deutschen Umlauten
in "normale" Zeichen, so dass die Bildung von
Indexausdruecken entsprechend der Sortierung in
den gebraeuchlichen deutschen Lexika moeglich
ist.


Isempty()

Funktion zur Pruefung, ob eine Zeichenkette
"wirklich" leer ist, d.h., ob sie die Laenge 0
hat.


Normalize()

Funktion zur Umwandlung einer Zeichenkette in
die "normalisierte" Form, entsprechend folgenden
Regeln:

- Alle Zeichen, bis auf Buchstaben und Ziffern
  werden entfernt
- Grossbuchstaben werden in Kleinbuchstaben umge-
  wandelt
- Internationale Sonderzeichen werden in die ent-
  sprechenden "normalen" Zeichen bzw. in Doppel-
  vokale umgewandelt

Die zurueckgegebene Zeichenkette wird entweder
rechts abgeschnitten oder rechts mit Leerzeichen
gefuellt, so da sie die gleiche Laenge wie die
urspruengliche Zeichenkette hat.

Diese Funktion ist besonders nuetzlich fr Index-
ausdruecke fuer Namensfelder usw.


System

Addr()

Die Funktion gibt die vollstaendige Speicheradresse
des angegebenen Objektes zurueck.


CpuSpeed()

Die Funktion gibt einen Relativwert fr die aktuelle
Geschwindigkeit des Computers zurueck.


DefineJump(), DoJump()

Routinen, die einen Sprung auf einen bestimmten,
vorgegebenen Punkt in einem Programm ermoeglichen.


Indirekte Funktionsaufrufe

FunctionAddress()

Funktion gibt die Adresse einer Routine zurueck.

IndCall

Ruft eine Routine indirekt auf, deren Adresse als
Parameter uebergeben wurde und uebergibt Parameter
an diese Routine.


Interrupt(), Int_W_Flags()

Routinen zum Aufruf von System-Unterbrechungen.


IsDir()

Funktion prueft, ob ein bestimmtes Verzeichnis
vorhanden ist.


LookForFile()

Funktion, aehnlich wie exist(), die Datei wird
jedoch nicht nur im aktuellen Pfad, sondern auch
in den mit der Umgebungsvariablen PATH im Betriebs-
system angegebenen Verzeichnissen gesucht.


OffsetValue()

Funktion gibt die Offset-Adresse des angegebenen
Parameters zurueck.


Peek(), Poke

Routinen zum direkten Lesen und Schreiben von Spei-
cheradressen.


PortInB(), PortInW(), PortOutB, PortOutW

Routinen zum Lesen und Schreiben von Bytes oder Worten
ueber die E/A-Kanaele des Computers.


SegmentValue()

Funktion gibt die Segment-Adresse des angegebenen
Parameters zurueck.


SetNumFormat

Die Prozedur steuert die Formatierung aller nume-
rischen Ein- und Ausgaben eines FCO-Programms. Als
Vorgabe wird der Dezimalpunkt und das Tausender-
Komma verwendet. Mit SetNumFormat knnen diese Zei-
chen nun vertauscht werden. Wenn das "Europaeische"
Zahlenformat aktiv ist, werden alle numerischen Aus-
gaben entsprechend formatiert.

Die Ausgabe der Funktion STR() erfolgt entsprechend,
waehrend die Funktion VAL() beide Formate akzeptiert.
Bei der Tastatureingabe werden Punkt und Komma als
Dezimaltrenner akzeptiert.


Ticks

Prozedur zur Verzoegerung der Programmausfuehrung um
die angegebene Anzahl von System-Zeitgebertakten
(18,2 ms).


Erweiterungen im FCO Compiler

Allgemeines

Vorgabe fr den Bibliotheknamen

Erzeugte OBJ-Module enthalten nun einen Eintrag fr
die Standard-Bibliothek (d.h. FCO.LIB). Damit braucht
bei den meisten Linkern FCO.LIB nicht mehr explizit
angegeben zu werden, so kann z.B. MS-Link statt mit

    LINK blabla,,,fco;

nun mit

    LINK blabla;

aufgerufen werden.



Dynamische Symboltabelle

Die Routinen zur Verwaltung der internen Symboltabelle
des Compilers wurden voellig ueberarbeitet, so da der
Compiler nun den gesamten freien DOS-Speicher fuer die
Symboltabelle ausnutzen kann. Die bisherigen Versionen
konnten lediglich eine Symboltabelle bis 64 KByte nut-
zen. Dadurch gab es bei groeeren Programmen waehrend
des Compilierens Probleme durch Ueberlauf des Variablen-
speichers. Der Kommandozeilenparameter '-v' des Compi-
lers wird nicht mehr unterstuetzt, da er nicht mehr
notwendig ist; ebenso entfaellt beim Compilieren die
Meldung ueber den freien Variablenspeicher.


Laenge einer logischen Programmzeile

Die maximal moegliche Laenge einer logischen Programm-
zeile (erste Zeile und Folgezeilen, wenn die erste oder
Folgezeilen mit ';' enden) wurde von 1024 auf 2048 er-
hoeht.


Spracherweiterungen

??? <Ausdrcke>

Neues Ausgabekommando, aehnlich '?', allerdings gibt
'???' zuerst die Ausdruecke aus und dann abschliessend
die Zeichen CR/LF (Zeilenanfang/neue Zeile), waehrend
'?' diese Zeichenkombination vor Ausgabe der Ausdruecke
ausgibt.


END

Neues Schluesselwort, das als Abkuerzung anstelle von
ENDDEF und ENDPRO verwendet werden kann.


ENDFUNC

Neues Schluesselwort, das anstelle von ENDPRO verwendet
werden kann (zum Abschlu einer Funktionsdefinition).


FUNC

Neues Schluesselwort, das als Abkuerzung von FUNCTION
verwendet werden kann.


PROC

Neues Schluesselwort, das als Abkuerzung von PROCEDURE
verwendet werden kann.


PROTO

Neues Schluesselwort, das als Abkuerzung von PROTOTYPE
verwendet werden kann.


PARA

Neues Schluesselwort, das als Abkuerzung von PARAMETERS
verwendet werden kann.


#output

Neue Compiler-Direktive zur Ausgabe einer Meldung
waehrend der Uersetzung, z.B. zur Information ueber be-
dingte Compilierung:

    #ifdef DEUTSCH
    #output Deutsche Version wird uebersetzt
    .
    .
    #else
    #output Englische Version wird uebersetzt
    .
    .
    #endif


#pragma stack

Erlaubt das Ein- und Ausschalten der Stapelspeicher-
pruefung in einem Programm (entsprechend der Compiler-
Option /n).


#pragma range

Erlaubt das Ein- und Ausschalten der Pruefung von
Array-Indizes in einem Programm (entsprechend der
Compiler-Option /r).


"Strukturzeichen"

Fuehrende Semigrafik-Zeichen in einer Programmzeile
werden nun wie Leerzeichen betrachtet, so dass fol-
gender Programmcode moeglich ist:

      DO WHILE DO_IT
        IF a > b
           ? "Kann nicht stimmen !"
        ELSE
           ? "Genau richtig !"
        ENDIF
      ENDDO

Zusaetzlich wird das Zeichen "Formularvorschub"
(chr(12)) als Leerzeichen betrachtet, so dass in
einer Quelldatei Seitenwechsel ohne vorangestellte
Kommentarzeichen fr den Ausdruck eingefuegt werden
koennen.


Stand  : 01.02.93
Quelle : M. Kalkhoff (KRS / @FIDO 2:245/60.6)

