PREINPUT -1300; ESCAPE ! Öffnet das TRACE-Fenster
PREINPUT -1301; ESCAPE ! Öffnet das COMMAND-Fenster
PREINPUT -1302; ESCAPE ! Öffnet das WATCH-Fenster
PREINPUT -1303; ESCAPE ! Öffnet das BREAK-Fenster
Dieser Code funktioniert nur in einer Windows ProvideX/Plus-Sitzung – in einer WindX-Umgebung führen diese Befehle nicht zum Öffnen des entsprechenden Debug-Fensters. Daher wird empfohlen, diesen Code wie folgt zu ändern:
PRINT 'OPTION'("DebugWindow","Trace"),
PRINT 'OPTION'("DebugWindow","Command"),
PRINT 'OPTION'("DebugWindow","Watch"),
PRINT 'OPTION'("DebugWindow","Break"),
Bei der Verwendung von WindX ist es empfehlenswert, die Trace-, Watch- und Break-Fenster so zu starten, dass sie die Anwendung auf der Serverseite überwachen. Dies kann erreicht werden, indem das Wort „Host“ vor den Namen des Debug-Fensters gesetzt wird, zum Beispiel: PRINT 'OPTION'("DebugWindow","Host Watch"),.
Um ein Debug-Fenster mit der Serveranwendung zu verbinden, nachdem es bereits gestartet wurde, senden Sie: PRINT 'OPTION'("DebugWindow","Host Trace Enable"),.
Zu überwachende Variablen und Break-Anweisungen können ebenfalls mithilfe des ‘OPTION’-Mnemonics in die Debug-Fenster geladen werden. Zum Beispiel: PRINT 'OPTION'("DebugWindow","Host Watch Add A$"), fügt die Variable A$ dem Watch-Fenster hinzu, und PRINT 'OPTION'("DebugWindow","Break Add Test=LEN(A$)>0"), lädt einen Break, der die Anwendung stoppt, sobald die Länge von A$ größer als 0 ist.
Eine vollständige Übersicht aller Möglichkeiten im Zusammenhang mit Debugging-Fenstern finden Sie in der ProvideX Language Reference PDF (v9.10) unter 5. Mnemonics / OPTION.
Hinweis: Um die ProvideX/PxPlus-Debugging-Fenster nutzen zu können, muss in der verwendeten INI-Datei (mit PRINT ARG(-1) sehen Sie, welche Datei verwendet wird) eine [Config]-Gruppe mit Debug=1 (ohne Anführungszeichen) enthalten sein.
Möchten Sie Ihrer Anwendung schnell und einfach ein neues Aussehen verleihen? Mit „Themes“ und „Visual Classes“ ist das möglich. Themes sind die früheren Templates. Sie bestimmen das Erscheinungsbild von Objekten in einer gesamten Bibliothek und werden daher in den Bibliotheks-Standardeinstellungen festgelegt.
Visual Classes beziehen sich auf ein einzelnes Objekt. Sie müssen sie daher für jedes Objekt individuell einstellen. In diesem Beispiel arbeiten wir nur mit Buttons, aber auch andere Objekte sind möglich.
Wir nehmen diese Buttons als Beispiel:
Schriftart: Arial, 20 Punkt
Vordergrund: Standard
Hintergrund: Standard
Wir erstellen nun ein „Theme“. Dazu starten wir Nomads und wählen im Menü: Options > Themes.
Sie sehen nun mehrere zusätzliche Optionen, die normalerweise bei einem Standard-Button nicht verfügbar sind. Zum Beispiel „Hover Border Color“. Das Ziel ist, dass der Button einen roten Rand erhält, wenn Sie mit der Maus darüber fahren. In diesem Beispiel werden außerdem einige andere Farben angezeigt. Dieses Theme „T1“ verknüpfen wir über Library Defaults mit unserer Bibliothek.
Ab dieser Version wird die Datei ACTIVATE.PVX im Verzeichnis "PXPKEYS" abgelegt, das sich eine Ebene oberhalb des PxPlus-Installationsverzeichnisses befindet. Beispiel: Wenn PxPlus im Standardverzeichnis installiert ist:
C:\PVX Plus Technologies\PxPlus 2014
wird die Aktivierungsdatei im Verzeichnis:
C:\PVX Plus Technologies\PxpKeys
gespeichert.
Dies bedeutet, dass die Aktivierung nicht mehr an eine bestimmte PxPlus-Version gebunden ist und verschiedene PxPlus-Versionen (gleichzeitig oder unabhängig voneinander) dieselbe Aktivierung nutzen können.
Sie können jederzeit auf eine bestimmte Aktivierung verweisen, indem Sie im [Config]-Block der INI-Datei Folgendes eintragen:
ActivationKey=Pfad_zum_Verzeichnis_mit_activate.pvx
Beispiel:
[Config] ActivationKey=D:\PxPlus\pxpkeys
Wenn Sie eine bestehende Windows-PxPlus-Installation auf Version 2014 aktualisieren und bereits ein lib\keys-Verzeichnis aus einer älteren Installation vorhanden ist, verwendet Version 2014 weiterhin diese Aktivierung und erstellt kein pxpkeys-Verzeichnis. Auch die Unix- und Linux-Versionen von v2014 verwenden weiterhin die Aktivierung im lib-Verzeichnis (unabhängig davon, ob es sich um ein Upgrade oder eine Neuinstallation handelt).
Ab der PxPlus-Windows-Version 11 kann in der [CONFIG]-Sektion der INI-Datei eine LOGFILE=-Zeile eingetragen werden. LOGFILE= muss auf einen vorhandenen Pfad verweisen, zum Beispiel:
LOGFILE=D:\tmp\logv11.txt
Der Pfad D:\tmp muss bereits existieren; die Textdatei logv11.txt wird erstellt, falls sie noch nicht vorhanden ist. Tritt in PxPlus ein interner Fehler auf, werden ein oder mehrere Einträge in die Protokolldatei geschrieben. Wird PxPlus zudem vom Betriebssystem beendet (z. B. durch Zugriff auf eine Speicheradresse außerhalb des PxPlus-Speicherbereichs, was die bekannte Meldung „PxPlus has stopped working“ verursacht), wird auch dies im Logfile vermerkt. So können Sie im Falle eines PxPlus-Absturzes nachvollziehen, an welcher Stelle in der Anwendung das Problem aufgetreten ist.
Jeder Logfile-Eintrag hat folgendes Format: Datum Uhrzeit [Programm:Zeile] Beschreibung des Problems
Bijvoorbeeld:
Aug 13 16:52 [D:\pxplus\pxp7\misc\zip_format.pgm:160] *OUT OF MEMORY* - Global Alloc failed
Aug 13 16:52 [D:\pxplus\pxp7\misc\zip_format.pgm:160] *OUT OF MEMORY* Unable to allocate
1760559116 bytes
Aug 14 13:40 [*plus/web/request:120] [TCP][Winsock]Error status:10035(796:)
Aug 19 09:44 [D:\pxplus\pvxplus11\misc\blobtest.pgm:200] Fatal exception error code
c0000005 occurred
Aug 19 09:44 [D:\pxplus\pvxplus11\misc\blobtest.pgm:200] - ERR=0 CTL=0 RET=258 LFA=1 LFO=1
Aug 19 09:44 [D:\pxplus\pvxplus11\misc\blobtest.pgm:200] - Last path used: [MySQL]mysql;
Aug 19 09:44 [D:\pxplus\pvxplus11\misc\blobtest.pgm:200] - Program stack follows:
Sep 18 09:59 [*winlist:5193] *MEMORY LIMIT HIT* - About to report an error 31
Dec 17 09:17 [webreq:12240] SSL Chkerror socket 488 sts 0 yields 5
Dec 17 09:17 [webreq:12240] [TCP][Winsock]Error status:10035 (488:)
Jan 13 09:12 [*ezweb/server:444] * Error:404 Not Found Request:/favicon.ico
Jan 13 09:12 [*plus/winutl/winqry:1615] Skipping ref to control 0 (Disable) at
1615:D:\PxPLUS\PvxPlus11.5\lib\_plus\winutl\winqry (255:D:\PxPLUS\PvxPlus11.5\lib\_winlist)
Jan 13 09:14 [*ezweb/server:36] Shutting down *ezweb/server
Sie können auch direkt aus Ihrer Anwendung heraus Einträge in die Protokolldatei schreiben, indem Sie SETTRACE RECORD verwenden. Beispiel: SETTRACE RECORD "OOPS" im Konsolenmodus erzeugt folgenden Eintrag: Jan 20 13:37 [:0] OOPS Ab PxPlus 2014 v.12 ist diese Funktionalität auch in den Unix- und Linux-Versionen von PxPlus verfügbar.
Um die Protokolldatei unter Unix/Linux zu aktivieren, erstellen Sie eine Datei mit dem Namen pvxtrace.log im PxPlus-Verzeichnis. Wenn PxPlus v.12 feststellt, dass diese Textdatei vorhanden ist, wird sie automatisch verwendet, um interne Meldungen zu speichern.
#!/bin/sh
PVXLIB=/pxplus/lib
PVXFLMAP=\\/
export PVXLIB PVXFLMAP
umask 0
cd /pxplus
{su username}
/pxplus/pxplus -dr=/pxplus/ *plus/cs/host -arg 4093 {forced program} >/dev/null &1
In PxPLUS v6.10 wurde eine neue Funktion hinzugefügt, mit der ein Windows-Drucker auf einem PC definiert werden kann, sodass er im Windows-Druckerauswahldialog erscheint. Wenn dieser Drucker innerhalb einer PxPLUS-Sitzung ausgewählt wird, versucht PxPLUS, den Drucker zu einem Gerätetreiber umzuleiten.
Dies ermöglicht es Entwicklern, auf Arbeitsstationen Windows-Drucker für Elemente wie Vorschau, PDF oder HTML-Ausgabe aus PxPLUS zu erstellen.
Diese Funktion arbeitet basierend auf dem Namen und den Eigenschaften des Druckers.
Sie sollten nun einen Drucker mit dem Namen „PxPLUS Viewer“ als einen der Drucker dieser Arbeitsstation haben. Innerhalb jeder PxPLUS-Anwendung sehen Sie diesen Drucker im *WINPRT*-Druckerauswahldialog. Wann immer dieser Drucker ausgewählt wird, leitet PxPLUS den Drucker zum entsprechenden Gerätetreiber um.
In unserem Beispiel haben wir einen Drucker mit dem Namen „PxPLUS Viewer“ erstellt, der mit „NUL:“ verbunden ist. Wenn dieser in der Druckerauswahl ausgewählt wird, schließt PxPLUS automatisch „*WINPRT*“ und öffnet stattdessen die Datei „*VIEWER*“.
HINWEIS: Dies funktioniert NUR in PxPLUS-Anwendungen!
Wenn der Benutzer einen dieser speziellen, in PxPLUS zugeordneten Drucker aus einer anderen Anwendung (Word, Notepad usw.) auswählt, erfolgt KEINE Ausgabe.
Zuerst gehen wir die Befehle, Funktionen und Parameter durch, die sich auf das Auffinden von Dateien beziehen.
'CD'-Parameter.
Der 'CD'-Parameter ist standardmäßig 'AUS', was bedeutet, dass das aktuelle Verzeichnis erst nach den Verzeichnissen in der PREFIX-Liste durchsucht wird.
Wenn der Parameter 'EIN' ist, durchsucht PxPLUS zuerst das aktuelle Verzeichnis und erst dann die PREFIX-Liste.
(siehe auch 'Suchregeln')
Um den Inhalt des Parameters zu prüfen: PRINT PRM ( 'CD' )
und um den Parameter zu ändern: SET PARAM 'CD' = 1 (oder 0)
PREFIX
Sie können den PREFIX-Befehl mit der PATH-Variablen in MS-DOS oder UNIX vergleichen.
Verwenden Sie den PREFIX-Befehl, um eine Reihe von Suchpfaden anzugeben, in denen PxPLUS suchen soll, wenn Sie ein OPEN / LOAD / RUN / CALL / PERFORM für eine Datei oder ein Programm ohne vollständigen Pfadnamen ausführen.
Beispiel:
PREFIX “/usr/mydir/data/ /usr/mydir/prog/ /usr/mydir/sub/ D:/other/data/”
Mit anderen Worten: Wenn Sie eine Datei mit vollständigem Pfadnamen öffnen, gelten die Suchregeln nicht.
Die Namen im PREFIX müssen durch ein Leerzeichen getrennt werden.
Wie Sie sehen, kann der Laufwerksbuchstabe dem Pfadnamen hinzugefügt werden, um auf einem anderen Laufwerk zu suchen als dem, das mit dem Befehl SETDRIVE aktiviert wurde.
Sie können 10 verschiedene PREFIXe angeben, nämlich PREFIX (0) bis PREFIX (9).
Beispiel:
PREFIX (0) “/usr/mydir/data/”
PREFIX (1)”/usr/mydir/prog/ /usr/mydir/sub/”
PREFIX (2)”D:/other/data/”
Der Vorteil besteht darin, dass Sie ein bestimmtes PREFIX DEAKTIVIEREN und AKTIVIEREN können.
z.B.: DISABLE 2, und die Suche in D:/other/data/ wird gestoppt.
PREFIX (0) ” … ” ist dasselbe wie PREFIX ” … ”
Wenn es Pfadnamen gibt, die bereits ein Leerzeichen enthalten, müssen Sie diesen Pfadnamen in Anführungszeichen setzen.
Beispiel:
PREFIX “C:/Tmp/ C:/usr/ “”C:/Program Files/”””
PRINT PFX oder PRINT PFX (n) zeigt den Inhalt von PREFIX an.
' = '-Zeichen für spezielle Suchvorgänge.
Das '='-Zeichen im PREFIX hat eine besondere Bedeutung. Jedes '='-Zeichen entspricht einem Buchstaben (oder einer Ziffer) des Dateinamens und wird durch diesen ersetzt. Das erste '='-Zeichen wird durch den ersten Buchstaben des Dateinamens ersetzt, das zweite '=' durch den zweiten Buchstaben usw.
Die Idee ist, große Verzeichnisse in kleinere zu unterteilen, um einen schnelleren Zugriff und eine bessere Verwaltung zu ermöglichen.
Beispiel:
Angenommen, Ihre Anwendung besteht aus mehreren Modulen. Am Programmnamen können Sie bereits erkennen, zu welchem Modul es gehört.
z.B. BH001 BH002 BH003 gehören zum Buchhaltungsmodul und LN001 LN002 LN… gehören zum Lohnabrechnungsmodul. Sie können dann Ihr (großes) Verzeichnis in mehrere kleinere Verzeichnisse aufteilen. Der Name dieser Unterverzeichnisse muss mit den ersten Buchstaben der Modulnamen übereinstimmen. In diesem Fall BH und LN.
Wenn PxPLUS nun nach einem Programm oder einer Datei sucht, wertet es die ersten übereinstimmenden Buchstaben aus und verwendet diese, um im richtigen Verzeichnis zu suchen.
Beispiel:
PREFIX “/myapp/==/”
OPEN (1)”BHHIST”
PxPLUS wertet den Dateinamen BHHIST aus und macht daraus ‘/ myapp / BH / BHHIST’ (1) und versucht so, die Datei zu öffnen.
Sternchen als PREFIX-Wildcards.(2)
Sie können '*' und '**' als Platzhalterzeichen in PREFIX verwenden, um (neue) Dateinamenerweiterungen zu unterstützen, ohne Ihre Programme ändern zu müssen.
Diese Erweiterung wurde in Version 4.20 eingeführt, hauptsächlich um Windows 2000-zertifiziert zu sein. Um Windows 2000-zertifiziert zu sein, müssen Ihre Dateien und Programme eine Erweiterung haben. Mit den Platzhalterzeichen in PREFIX können Sie Ihren Dateien eine bestimmte Erweiterung geben, ohne Ihre Programme ändern zu müssen.
Ein einzelnes Sternchen (*):
Wenn Ihr PREFIX-Befehl ein Sternchen gefolgt von einer Erweiterung enthält, ersetzt PxPLUS dieses Sternchen durch den Dateinamen, den Sie zu öffnen versuchen.
Mit diesem Ergebnis versucht PxPLUS dann, die Datei zu finden, und wenn sie nicht gefunden wird, versucht PxPLUS trotzdem, die Datei ohne Erweiterung zu öffnen.
Beispiel:
PREFIX (5) “*.dat”
OPEN(1)”kunde”
PxPLUS durchsucht das Verzeichnis nach ‘kunde.dat’ und öffnet die Datei. Wenn ‘kunde.dat’ nicht gefunden wird, sucht PxPLUS weiter nach ‘kunde’. Wenn gefunden, öffnet PxPLUS die Datei; wenn nicht, erzeugt PxPLUS einen FEHLER 12.
Hinweis!
KEYED “abcde”,5 erstellt nicht die Datei ‘abcde.dat’, sondern ‘abcde’, und
ERASE “abcde” löscht die Datei ‘abcde.dat’!
Doppelte Sternchen (**):
Wenn Ihr PREFIX zwei Sternchen zusammen mit einer Erweiterung enthält, erfolgt der oben beschriebene Ersatz nur, wenn der Dateiname im OPEN-Befehl noch keine eigene Erweiterung hat. Wenn der Name bereits eine Erweiterung hat, erfolgt kein automatischer Ersatz.
Beispiel:
PREFIX “/mydir/**.dat”
OPEN(1)”journal”
OPEN(2)”journal.hist”
Da ‘OPEN (1)”journal”’ eine Datei ohne Erweiterung ist, sucht PxPLUS zunächst nach ‘/mydir/journal.dat’ und dann nach ‘/mydir/journal’.
Da ‘OPEN (2)”journal.hist”’ bereits eine Erweiterung (.hist) hat, fügt PxPLUS kein ‘.dat’ hinzu und sucht einfach nach der Datei ‘/mydir/journal.hist’.
PREFIX PROGRAM
Verwenden Sie das Format PREFIX PROGRAM, um einen Suchpfad speziell für Programme zu definieren. PxPLUS sucht zuerst in diesem Pfad und eventuell anschließend in den anderen PREFIXen, wenn Sie einen LOAD-, RUN-, CALL-, PERFORM-, PROGRAM- oder SAVE-Befehl ausführen.
Beispiel:
PREFIX PROGRAM “/pvx/mydir/pgm/”
um den Inhalt anzuzeigen:
PRINT PFX(PGN)
PREFIX FILE
Dies ist nicht das Gegenstück zu PREFIX PROGRAM!
Verwenden Sie das Format PREFIX FILE, um dynamische Umwandlungen von Dateinamen vorzunehmen. Sie können z.B. ein ‘OPEN(x)”kunde”’ programmiert haben, tatsächlich aber “//andere_maschine/kunde” öffnen wollen.
Wie funktioniert das? Sie definieren eine KEYED-Datei mit externem Schlüssel und variabler Satzlänge. Wenn die Datei diese Voraussetzungen nicht erfüllt, erhalten Sie einen FEHLER 17:Invalid file type or contents.
Der Schlüssel ist der Name, wie er im Programm steht, z.B. “kunde”.
Das erste Feld ist der Name der Ersatzdatei, z.B. “//andere_maschine/kunde”.
Dann führen Sie den Befehl aus: PREFIX FILE “PFXDATEI”
Beim Öffnen prüft PxPLUS zunächst diese Datei, ob der Dateiname, den Sie öffnen wollen, als Schlüssel in dieser Datei existiert. Falls ja, wird das Feld als Dateiname verwendet, und alle Suchregeln gelten erneut.
Denken Sie daran, dass der Suchmechanismus nur gilt, wenn ein relativer Dateiname angegeben wird. Dateinamen mit absolutem Pfad werden sofort geöffnet, ohne zu suchen.
Beispiel:
KEYED “pfxdatei”,25
OPEN(1)”pfxdatei”
WRITE (1,key=”kunde”)”[odb]ACCESS;CUST;KEY=CUSTNO”
CLOSE(1)
……
PREFIX FILE “pfxdatei”
OPEN(1)”kunde” ! Intern wird dies zu
>> OPEN(1)”[odb]ACCESS;CUST;KEY=CUSTNO”
Wie Sie sehen, ist es sehr einfach, wenn Sie die Datenbank wechseln wollen. Sie müssen nur die KEYED-Datei ändern; Ihre Programme bleiben unverändert.
Seit Version 4.23 wurde der PREFIX FILE-Datei ein zweites Feld hinzugefügt.
Dies ist ein OPTIONS-Feld. Diese Optionen werden beim Öffnen der Datei zum OPT= hinzugefügt. Dies wurde gemacht, weil die Länge des Namens auf 256 Byte begrenzt ist.
Beispiel:
Die PREFIX FILE-Datei enthält Folgendes:
Key=”kunde”, Feld1=”[ODB]DSN;kunde”, Feld2=”KEY=cust_id”
OPEN(1)”kunde”
intern wird dies zu:
OPEN(1,OPT=”KEY=cust_id”)”[ODB]DSN;kunde”
oder …
OPEN(1,OPT=”REC=kundenname”)”kunde”
intern wird dies zu:
OPEN(1,OPT=”KEY=cust_id;REC=kundenname”)”[ODB]DSN;kunde”
Der Inhalt von OPT= wird tatsächlich an den Namen angehängt, was ergibt:
OPEN(1)”[ODB]DSN;kunde;KEY=cust_id;REC=kundenname”
PRINT PFX(-1) zeigt Ihnen die PREFIX FILE-Datei.
SUCHREGELN
PxPLUS sucht eine Datei oder ein Programm in dieser Reihenfolge:
OPEN
1) PREFIX FILE, falls verwendet. (Ersetzt den Pfadnamen und setzt die Sequenz fort)
2) Aktuelles Verzeichnis (wenn 'CD'-Parameter EIN ist)
3) PREFIX 0 bis 9
4) PROGRAM PREFIX, falls verwendet
5) Aktuelles Verzeichnis (wenn 'CD'-Parameter AUS ist)
LOAD / RUN / CALL / PERFORM / SAVE
1) PREFIX FILE, falls verwendet (Ersetzt den Pfadnamen und setzt die Sequenz fort)
2) Program Cache
3) Aktuelles Verzeichnis (wenn 'CD'-Parameter EIN ist)
4) PREFIX PROGRAM, falls verwendet
5) PREFIX 0 bis 9
6) Aktuelles Verzeichnis (wenn 'CD'-Parameter AUS ist)
Die PREFIX-Suchregeln gelten nicht nur für das Öffnen von Dateien, sondern auch für deren Erstellung. PxPLUS erstellt die Datei im ersten Pfad des ersten PREFIX. Wenn der 'CD'-Parameter EIN ist, werden Dateien im 'aktiven' Verzeichnis erstellt.
Beachten Sie, dass, sobald ein Programm im 'Cache' ist, und Sie das PREFIX deaktivieren, aus dem das Programm stammt, PxPLUS das Programm bei erneutem Aufruf weiterhin aus dem Cache holt und keinen Fehler 12 erzeugt.
LEISTUNG
Was Sie vermeiden sollten, ist der Laufwerksbuchstabe am Anfang des Pfadnamens.
SETDRIVE “C:” ! normalerweise ist dies der Standardwert
PREFIX “C:/myapp/data/ C:/myapp/files/ D:/mydir/somedir/ C:/pvx/lib/”
Besser ist:
SETDRIVE “C:”
PREFIX “/myapp/data/ /myapp/files/ D:/mydir/somedir/”
Erstens benötigen Sie /pvx/lib nicht in Ihrem Suchpfad. Jedes PxPLUS-Hilfsprogramm und jedes PxPLUS-Unterverzeichnis kann aufgerufen oder gefunden werden, indem Sie ein '*' voranstellen.
z.B. CALL “*web/email” anstelle von CALL “\pvx\lib\_web\email”
Zweitens muss PxPLUS durch Weglassen des Laufwerksbuchstabens nicht prüfen, ob das Laufwerk vorhanden ist, was Zeit spart.
Wenn möglich, setzen Sie den Pfad mit einem anderen Laufwerksbuchstaben ans Ende des Suchpfads.
OPEN (1) FILE$
OPEN (1,ISZ=1) FILE$
OPEN (1,ISZ=n) FILE$, waar n>1
OPEN (1) | OPEN (1,ISZ=1) | OPEN (1,ISZ=n) n>1 | |
---|---|---|---|
0D0A | 0D0A | 0D0A000000… | |
WRITE | 8A0D0A | 8A | 8A0000000000… |
WRITE RECORD | 0D0A | NOTHING | 000000… (tot LEN=n) |
PxPLUS prüft zuerst den ersten Datensatz einer „Serial“-Datei. Wenn ein Zeichen gefunden wird, das nicht im Bereich von ” ” (Leerzeichen) bis “~” (Tilde) liegt, betrachtet PxPLUS die Datei als Binärdatei und die Regeln von ‘OPEN (1,ISZ=1)’ gelten.
Sie müssen die Datei sperren (LOCK), wenn Sie etwas hineinschreiben möchten.
PxPLUS behandelt die Datei datensatzorientiert.
Die IND()-Funktion gibt Ihnen den aktuellen Datensatz zurück.
PxPLUS fügt immer $0D0A$ (1) am Ende eines Datensatzes hinzu.
Bei einem WRITE-Befehl wird zusätzlich vor dem Datensatztrenner ($0D0A$) ein Feldtrenner ($8A$) (2) eingefügt.
Ein ‘READ RECORD’ durchsucht die Daten in der Datei nach einer $0D0A$-Byte-Kombination.
Ein ‘READ’ impliziert ein ‘READ RECORD’. Die Daten aus dem ‘READ RECORD’ werden verwendet, um die Variablen zu füllen, wobei $8A$ als Feldtrenner dient.
Ein ‘READ (1,IND=n)’ liest den n+1-ten Datensatz.
1 Datensatztrenner
PxPLUS für Windows: Datensatztrenner ist $0D0A$
PxPLUS für UNIX: Datensatztrenner ist $0A$
In meinen Beispielen habe ich stets $0D0A$ verwendet.
2 Feldtrenner
Der Standard-Feldtrenner ist $8A$, kann jedoch mit dem ‘FS’-Parameter geändert werden.
Wenn Sie eine Datei mit ‘,ISZ=1’ öffnen, wird sie im BINÄRMODUS geöffnet, selbst wenn es sich um eine KEYED-Datei handelt.
Zur Kompatibilität mit anderen Business Basics ist ‘ISZ=-1’ erlaubt.
Diese Art des OPEN impliziert ein LOCK auf die Datei.
PxPLUS behandelt die Datei byteorientiert.
Die IND()-Funktion gibt Ihnen den Bytezeiger zurück, also die Anzahl der gelesenen Bytes.
PRINT X$ schreibt X$+$0D0A$
WRITE X$ schreibt X$+$8A$
WRITE RECORD X$ schreibt X$, fügt der Variablen nichts hinzu, fügt jedoch ein $00$ Byte hinzu, wenn die Variable leer ist.
Normalerweise lesen Sie die Datei mit READ RECORD(1,SIZ=nnn)X$
Andernfalls wird ‘SIZ=1’ angenommen.
‘READ(1,IND=n)’ liest das n+1-te Byte.
Vorsicht bei dieser Methode des Lesens und Schreibens.
Prüfen Sie immer, ob das Ergebnis Ihren Erwartungen entspricht.
‘PRINT’ schreibt die Variable(n) in die Datei. Jeder PRINT wird mit $0D0A$ abgeschlossen.
Mehrere PRINTs hintereinander sind möglich. Kein Feldtrenner zwischen zwei Feldern.
Wenn die n Bytes erreicht sind, wird ein ERROR #1 erzeugt.
Wenn die n Bytes nicht erreicht werden, wird der Rest der n Bytes mit $00$ gefüllt.
‘WRITE’ schreibt die Variable(n) in die Datei. Nach jedem Feld wird ein Feldtrenner ($8A$) hinzugefügt. Die restlichen n Bytes werden mit $00$ gefüllt.
‘WRITE RECORD’ schreibt die Daten ohne Trenner. Die restlichen n Bytes werden immer mit $00$ gefüllt.
Ein ‘READ’ impliziert ein READ RECORD mit n Bytes. Die Variablen werden anhand des gelesenen Datensatzes gefüllt.
Ein ‘READ RECORD’ liest n Bytes (n = beim OPEN angegeben)
Ein ‘READ RECORD (1,SIZ=x)’ liest x Bytes.
Zusammenfassung
WRITE PROCEDURE
SERIAL F$
OPEN LOCK (1) F$
PRINT (1)"10 REM"
PRINT (1)"20 BEGIN"
PRINT (1)"30 FOR I=1 to 10"
PRINT ...
PRINT (1)"9999 END"
READ PROCEDURE
CLOSE (1)
OPEN (1)F$
MERGE (1)
WRITE PROCEDURE
SERIAL F$
OPEN (1,isz=1) F$
DIM X$(128)
X$(1)=SOME_CODE$
X$(25)=OTHER_STUFF$
...
X$=X$+$09$
WRITE RECORD (1)X$
READ PROCEDURE
OPEN(1,isz=1)F$
GET:
READ(1,siz=129,end=DONE)X$
GOTO GET
DONE:
READ PROCEDURE
OPEN (1) F$
GET:
READ(1,end=DONE)X$,Y$,Z$
GOTO GET
DONE:
WRITE PROCEDURE
SERIAL F$
OPEN LOCK (1) F$
PUT:
A$= ... , B$= ... , C$= ...
WRITE (1)A$,B$,C$
GOTO PUT
0010 BEGIN ; PRINT 'CS','SB'
0020 FOR I=1 TO 2
0030 LET F$="c:\tmp\erase.me"; ERASE F$,ERR=*PROCEED; SERIAL F$
0050 !
0060 IF I=1 THEN OPEN LOCK (1)F$; PRINT "OPEN (1) "
0070 IF I=2 THEN OPEN LOCK (1,ISZ=1)F$; PRINT "OPEN(1,ISZ=1)"
0080 !
0090 PRINT (1)"111"
0100 WRITE (1)"222"
0110 WRITE RECORD (1)"333"
0130 PRINT (1)"444"
0140 WRITE (1)"555"
0150 WRITE RECORD (1)"666"
0160 !
0170 CLOSE (1); OPEN (1,ISZ=1) F$
0180 READ RECORD (1,SIZ=-1000) X$
0190 PRINT 'LF',"Binary file contents: ",'LF','LF','SF',HTA(X$),
0200 !
0330 CLOSE (1)
0331 PRINT 'SB','LF'
0340 NEXT I
Eine Link-Datei ist eine PxPLUS-Datei, mit der ein ‘ALIAS’-Name für einen bestimmten ‘Port’ oder eine bestimmte ‘Datei’ erstellt und ein Gerätetreiber damit verknüpft wird.
Eine PxPLUS-Link-Datei ist eine kleine, einfache Datei mit drei Bestandteilen.
– Der ‘Header’, der den Typ der Link-Datei angibt.
– Der Name des ‘anderen’ Ports oder der ‘anderen’ Datei.
– Der Name eines Gerätetreibers (CALL-Programms), der ausgeführt wird, nachdem die ‘andere’ Datei geöffnet wurde. (siehe Gerätetreiber unten)
Das ist im Grunde alles… Link-Dateien sind kleine Dateien in einem Verzeichnis wie viele andere auch und unterliegen denselben Regeln wie andere Dateien. Unter UNIX muss man daher auf Groß- und Kleinschreibung achten.
Es gibt drei verschiedene Typen von Link-Dateien, die im ‘Header’ der Link-Datei erkennbar sind: [Pvxlnk], [Pvxdev] und [Pvxapr]. Intern behandelt PxPLUS sie unterschiedlich.
Sprechen wir kurz über den ‘Header’ einer Datei.
Alle PxPLUS-Dateien haben einen ‘Header’. In ‘KEYED’-Dateien steht [PVXKEY], und ‘INDEXED’-Dateien haben [PVXIND].
Wenn PxPLUS eine Datei öffnet—egal welche—liest es sofort die ersten 512 Bytes (oder weniger). Es prüft, ob der ‘Header’ mit ‘[Pvx’ beginnt, und erkennt somit sofort, ob es sich um eine eigene Datei handelt. Jede andere Datei wird als ASCII-Datei betrachtet.
Handelt es sich um eine ‘keyed’-Datei, verarbeitet PxPLUS sie entsprechend. Der Interpreter kennt den internen Aufbau und kann die richtigen Datensätze lesen.
Bei einer Link-Datei weiß PxPLUS, dass sie anders zu behandeln ist als eine ‘keyed’-Datei.
Da PxPLUS die ersten 512 Bytes bereits gelesen hat, befindet sich die gesamte Link-Datei im Speicher. PxPLUS analysiert dann den Rest.
Ab Position 9, Länge 60: der Name der ‘anderen Datei’.
Ab Position 69, Länge 12: der Name des ‘CALL’- oder Gerätetreibers.
Intern schließt PxPLUS die Link-Datei. Auf demselben Kanal öffnet PxPLUS die ‘andere Datei’ und sorgt dafür, dass der Name der Link-Datei angezeigt wird, wenn Sie PRINT FID(Kanal) ausführen. Vor den Namen des Gerätetreibers wird ‘*dev’ gesetzt, was bedeutet, dass sich Gerätetreiber immer in ‘…../lib/_dev/’ befinden. Schließlich wird der ‘CALL’ ausgeführt.
Sie müssen sicherstellen, dass:
1) Die ‘andere Datei’ in PxPLUS geöffnet werden kann — richtige Berechtigungen, richtiger Pfad, richtiger Name (Groß-/Kleinschreibung beachten).
2) Der Gerätetreiber mit dem Befehl CALL “*dev/<programm>” lad- und ausführbar ist.
Es gibt natürlich ein Hilfsprogramm zum Erstellen von Link-Dateien, nämlich ‘*UCL’.
Wie bereits erwähnt, gibt es drei Arten von Link-Dateien. Ihre jeweiligen ‘Header’ sind: [Pvxlnk], [Pvxdev] und [Pvxapr].
Diese ‘Header’ bestimmen, wie PxPLUS sie intern verarbeitet.
[Pvxlnk] wird verwendet, um eine Verknüpfung zu einer anderen Datei herzustellen, ohne einen Gerätetreiber zu verwenden. Zum Beispiel könnten Sie die Datei ‘KUNDEN’ auf ein anderes Laufwerk wie ‘F:\DATA\KUNDEN’ verschieben und eine Link-Datei mit dem Namen KUNDEN erstellen. So müssen Sie Ihre Programme nicht ändern.
[Pvxdev] ist wahrscheinlich der am häufigsten verwendete Typ. Er öffnet eine andere Datei oder einen Port und ruft den Gerätetreiber auf. Dieser Typ wird für Drucker und ähnliche Geräte benötigt.
[Pvxapr] ist eine Link-Datei für ‘Slave’-Drucker—Drucker, die mit dem Druckerport eines Terminals verbunden sind. PxPLUS öffnet den ‘anderen Port’, führt das ‘CALL’-Programm aus und sendet das ‘PS’-Mnemonic an den Drucker. Beim Schließen des Kanals sendet PxPLUS das ‘PE’-Mnemonic.
Einige Beispiele :
Name of link file | LP |
Name of file/device | *windev*;\\texas\HP on Ne01: |
Selected driver | HPLASER |
Name of link file | LP |
Name of file/device | \\server_name\shared_printer_name\ |
Selected driver | OKI24 |
Name of link file | /MYAPP/P1 |
Name of file/device | >lp -d queuename -c -s 2>/dev/null |
Selected driver | EPSON |
Name of link file | SPOOL |
Name of file/device | /tmp |
Selected driver | spooler |
Name of link file | WINDOWS |
Name of file/device | [wdx]*winprt* |
Selected driver | myprog |
Der Name der Link-Datei ist vollkommen frei wählbar. Der Name der „anderen Datei oder des anderen Ports“ muss ein Name sein, den Sie in PxPLUS öffnen können. Also physische Ports (LPT1), oder Spool-Queues (>lp -dxxx -s ..), oder UNC-Namen (\\SERVER\PRINTER), oder TCP/IP-Ports ([TCP]1000;), ODBC-Verbindungen usw. …
Der Gerätetreiber ist ein CALL-Programm, das sich im Verzeichnis „*dev“ befinden muss. Sie können auch selbst einen solchen Treiber erstellen.
Ein PxPLUS-Gerätetreiber ist ein „CALL“-Programm, um eine Datei oder einen Port nach dem Öffnen zu initialisieren und vorzubereiten.
Beispiele:
Name of ‘link’ file | LP |
Name of file/dev. | /dev/lp0 |
Selected driver | OKI |
OPEN(1)"LP"
Dies entspricht folgendem:
OPEN(1)"/dev/lp0"
CALL "*dev/OKI"
SETFID (1)"LP"
'OKI' ist einfach nur ein PxPLUS-Programm. Man kann alles Mögliche hineinschreiben: andere Dateien öffnen, den Benutzer nach Eingaben fragen, andere CALLs ausführen – alles, was in einem normalen CALL möglich ist, geht auch hier.
Sehen Sie sich z. B. den Gerätetreiber HPLASER an: LOAD "*dev/hplaser".
Am Anfang steht eine Zeile, die mit DEFTTY (LFO) cols,rows oder DEFPRT (LFO) cols,rows beginnt.
DEFTTY und DEFPRT teilen PxPLUS mit, ob es sich um einen Bildschirm oder einen Drucker handelt. Ohne diese Angabe nimmt PxPLUS an, es handele sich um eine Datei. So weiß PxPLUS, ob FIN() im TERMINAL-Format (bei DEFTTY) oder im PRINTER-Format (bei DEFPRT) zurückgegeben werden soll.
COLS und ROWS werden ebenfalls für FIN() und Funktionen wie MXC() und MXL() verwendet.
LFO und LFA sind zwei Systemvariablen, ähnlich wie DAY oder SSN.
LFO = Last File Open, LFA = Last File Accessed.
Ein einfaches Programm wie "*dev/hplaser" zeigt, dass Sie eigene Mnemonics erstellen können. Diese existieren, solange der Kanal geöffnet ist, und sind somit kanalgebunden.
Mit der Funktion MNM() können Sie den Wert eines Mnemonics lesen und für einen anderen Kanal wiederverwenden.
Beispiel: Sie definieren die Mnemonics ‘PS’ und ‘PE’ für Ihren Bildschirm.
Im Gerätetreiber für Ihren ‘Slave’-Drucker können Sie diese Mnemonics von Kanal 0 (Ihrem Bildschirm) abrufen und auf den Druckerkanal anwenden.
Es gibt auch Mnemonics mit spezieller Bedeutung.
‘*C’ wird automatisch gesendet, wenn der Kanal geschlossen wird.
Meistens enthält er ‘Reset’-Codes zur Initialisierung des Druckers.
‘*R’ kann einen OS-Befehl enthalten, der beim Schließen des Kanals ausgeführt wird. Beispiel: ‘rm /tmp/lock_file’
Dann gibt es noch ‘*I’ und ‘*O’. Wenn Sie UNIX ‘mapchan’ kennen, wissen Sie, was *I und *O tun.
‘*I’ ist eine Eingabe-Konvertierungstabelle, ‘*O’ eine Ausgabe-Konvertierungstabelle.
Damit lassen sich bestimmte Zeichen bei Ein- und/oder Ausgabe in andere umwandeln.
Beispiel: MNEMONIC ‘*O’=$00 01 02 03.. .. ..1C 1D 1E 1F 2E 21 22 .. .. .. .. .. FE FF$
Diese Tabelle zeigt ein Leerzeichen als Punkt an. (Hexwert eines Leerzeichens ist $20$, ersetzt durch $2E$, einen Punkt)
Ein Beispiel für einen komplexeren Gerätetreiber:
! Mein Treiber
PCHAN=LFO, PNAME$=FID(LFO)
CLOSE(PCHAN)
[Code, der prüft, ob eine Lock-Datei existiert]
[Falls Lock-Datei vorhanden, EXIT 14, sodass OPEN einen ERROR=14 erhält]
[Code zum Erstellen der Lock-Datei]
[Code zum Erstellen einer temporären Datei: ‘MYOUTPUT’]
OPEN(PCHAN)"MYOUTPUT"
[CALL des Programms mit den Mnemonic-Definitionen]
SETFID (PCHAN) PNAME$ (ja, SETFID funktioniert auch mit Dateien!)
EXIT
Eine interessante PxPLUS-Funktion ist OPT().
Wenn Sie OPEN(KANAL,OPT="hallo")NAME$ ausführen, liefert OPT(KANAL) ‘hallo’ zurück. Alles, was Sie bei OPEN in OPT= setzen, kann im Gerätetreiber wieder abgerufen werden.
Beispiel:
Sie haben eine Link-Datei ‘LP’, der ‘andere Port’ ist ‘/dev/lp0’ und der Gerätetreiber heißt ‘myprog’
OPEN(1,ERR=stmt,OPT="Prüfen, ob das richtige Papier geladen ist!") "LP"
<PxPLUS Intern>
[Liest die Link-Datei ‘LP’]
[Schließt die Datei ‘LP’]
[Öffnet ‘/dev/lp0’]
[Verwendet SETFID, um ‘/dev/lp0’ in ‘LP’ umzubenennen]
[CALL "*dev/myprog"]
<In ‘*dev/myprog’>
options$=OPT(LFO)
[options$ enthält jetzt "Prüfen, ob das richtige Papier geladen ist!"]
IF NOT(NUL(OPTIONS$)) MSGBOX OPTION$,"Meldung"
[CALL-Programm beendet]
<PxPLUS Intern>
[Gibt einen EXIT-Rückgabewert an OPEN zurück]
Eine eher unbekannte Funktion ist SETDEV TSK().
Wer schon mit BBx gearbeitet hat, kennt TSK() zur Erzeugung einer Druckerliste. PxPLUS kann dies emulieren.
Mit diesem Befehl können Sie die TSK()-Daten laden, sodass TSK() die erwarteten Inhalte wie bei BBx zurückgibt. Nachteil: Eine TSK() lässt sich nicht löschen.
SETDEV TSK() $0100$+"LP"+$00$+">lp -dq1 %COPIES% -s 2>/dev/null"+$00$
SETDEV TSK() $0100$+"P1"+$00$+"/dev/lp1"+$00$
Mit X1$=TSK(0) und X2$=TSK(1) erhalten Sie den Inhalt zurück.
Wie Sie sehen, ist mit einem Gerätetreiber nahezu alles möglich.
Sehen Sie sich ‘*dev/spool’ an. Hier wird als ‘andere Datei’ ein Verzeichnis erwartet. Das Verzeichnis wird geschlossen, eine temporäre Datei darin erstellt und der Name wieder zurückgesetzt. Alle ‘print’-Ausgaben landen in dieser temporären Datei, und beim Schließen des Kanals wird der OS-Befehl ‘>lp -d…’ über das Mnemonic ‘*R’ gestartet. Mehrere Befehle können in ‘*R’ gespeichert werden, getrennt durch ein ‘;’ wie bei jedem OS-Befehl.
Ein spezieller Gerätetreiber ist ‘*dev/windows’. Dieser wird von ‘PxPLUS für Windows’ verwendet.
Dieses Programm sollten Sie nicht verändern! Allgemein sollten Sie Treiber in ‘*dev’ nicht ändern, da sie bei einer Neuinstallation von PxPLUS überschrieben werden. Sie können jedoch Kopien unter einem anderen Namen erstellen und diese anpassen. Für spezielle Anpassungen nutzen Sie das Verzeichnis ‘lib/_udev’. (Falls es nicht existiert, können Sie es anlegen)
PxPLUS prüft immer zuerst in diesem Verzeichnis, ob ein gleichnamiger Terminaltreiber existiert. In diesem Fall ‘WINDOWS’. Falls vorhanden, wird er ausgeführt.
Beispiel: Sie möchten blaue Schrift auf weißem Hintergrund.
Erstellen Sie ein Programm ‘*udev/windows’
0010 ! Windows
0020 print ‘blue’,’_white’,’df’,’cs’,
0030 exit
>save"*udev/windows"
>start
Es ist letztlich nur eine Frage der Terminologie. Das Konzept der Link-Dateien und Gerätetreiber ist recht einfach, weil… alles möglich ist. Man kann alles umsetzen, was man sich vorstellen kann… da es sich ‘nur’ um ein CALL-Programm handelt. Link-Dateien sind einfach eine Möglichkeit, einer Datei oder einem Port einen ALIAS-Namen zu geben oder <beliebig ergänzen>.
(Originaltext von Gord Davey, überarbeitet und ergänzt von Tino Vanholst)