Copyright: (C) 1995 by Burkhard Stiller * ECHTZEIT DV-Systeme


Index
Allgemeine - Disk/Datei - Strings - Clipboard - Editor - Fenster - NeueVFP

Foxtools.fll - Index

  Einleitung     Beiträge     Programmbeispiele

 Allgemeine Funktionen

CALLFN()

FOXTOOLVER()

INITIALIZE()

MSGBOX()

REGFN()

UNINITALIZE()

 Disk/Datei

ADDBS() 	CLEANPATH() 	JUSTSTEM()

DEFAULTEXT() 	JUSTDRIVE() 	MKDIR()

DRIVETYPE() 	JUSTEXT() 	RMDIR()

FORCEEXT() 	JUSTFNAME() 	VALIDPATH()

FOXTOUCH() 	JUSTPATH()

 Strings

NEXTWORD()

REDUCE()

STRFILTER()

WORDNUM()

WORDS()

 Clipboard

CLOSECLIP() 	GETCLIPFMT() 	SETCLIPDAT()

COUNTCLIPF() 	ISCLIPFMT()

EMPTYCLIP() 	ENUMCLIPFM()

GETCLIPDAT() 	REGCLIPFMT()

 Editor

_EDACTIVE() 	_EDGETPOS() 	_EDREVERT()

_EDCLOSEFI() 	_EDGETSTR() 	_EDSETENV()

_EDCOPY() 	_EDINDENT() 	_EDSETPOS()

_EDCUT() 	_EDINSERT() 	_EDSKIPLIN()

_EDDELETE() 	_EDLASTERR() 	_EDSTOPOS()

_EDGETCHAR() 	_EDOPENFIL() 	_EDSTOSEL()

_EDGETENV() 	_EDPASTE() 	_EDSENDKEY()

_EDGETLNUM() 	_EDPOSINVI() 	_EDSELECT()

_EDGETLPOS() 	_EDREDO() 	_EDUNDO()

_EDUNDOON()

 Fenster

_FINDWINDO() 	_WHIDE() 	_WSCROLL()

_FINDWINDP() 	_WHTOHWND() 	_WSCROLLP()

_GETWRECT() 	_WLEFT() 	_WSHOW()

_WATTR() 	_WLEFTP() 	_WSETPORT()

_WBOTTOM() 	_WMAINWIND() 	_WSELECT()

_WBOTTOMP() 	_WMOVE() 	_WSENDBEHI()

_WCLOSE() 	_WMOVEP() 	_WSIZE()

_WCLEAR() 	_WONTOP() 	_WSIZEP()

_WCLEARREC() 	_WOPEN() 	_WSETATTR()

_WCLEARRECP() 	_WOPENP() 	_WSETTITLE()

_WFINDTITL() 	_WPUTCHR() 	_WTITLE()

_WGETPORT() 	_WPUTSTR() 	_WTOP()

_WGETCURSO() 	_WPOSCURSO() 	_WWIDTH()

_WGETCURP() 	_WPOSCURP() 	_WWIDTHP()

_WHEIGHT() 	_WRIGHT() 	_WZOOM()

_WHEIGHTP() 	_WRIGHTP() 	MAINHWND()

 Neue VFP 3.0

_WFOOTER()

REGFN32()

GETPROSTRG()

PUTPROSTRG()


popup1
WIN-API Calls 	Registrierung & Aufruf von ext. Funktionen

Ordinal Calling 	Registrierung ext. Funkt. per Ordnungszahl

Fehlfunktionen 	Fehler beim Einsatz der Foxtools.fll


Beispiele
Getklick.prg 	Mauscursor auf Fensterelement ermitteln

Setmouse.prg 	Mauscursor "einsperren"

Graphwin.prg 	Schräge Linien und Kreise zeichnen

Flashwin.prg 	Fenstertitel "blinken" lassen

Functs.prg 	Unterstützende Funktionen

TopicIDs.prg 	Liste aller Topic-IDs der Foxtools-Hilfe


Einleitung

 Floating PopUp-Menü

Die mit FOXTOOLS.FLL gelieferten Funktionen, ausgenommen RegFn( ) und CallFn( ), werden durch den Microsoft Product Support Service (PSS) weder auf  elektronischem Wege noch telefonisch unterstützt. Die FOXTOOLS.FLL-Bibliothek und die meisten darin enthaltenen Funktionen gibt es schon eine ganze Weile, aber keine von ihnen wurde je einem vollständigen Testzyklus unterworfen. Da es für uns Entwickler natürlich wichtig ist, alle zur Verfügung stehenden Tools auch effektiv einsetzen zu können (auch die, die nicht von Microsoft direkt unterstützt werden), habe ich für die FOXTOOLS.FLL-Funktionen eine umfassende Dokumentation zusammengestellt.

Die ganze Vielfalt der DLL-Funktionen des Windows-APIs, die mit den FOXTOOLS.FLL-Funktionen RegFn( ) und CallFn( ) eingebunden und aufgerufen werden können, sind in den Büchern dokumentiert, die zusammen mit dem Windows Software Development Kit ausgeliefert werden. Das Windows SDK ist auch in C/C++ 7.0 bzw. Visual C++ von Microsoft enthalten.

Die FOXTOOLS.FLL- Bibliothek enthält insgesamt (in der dieser Dokumentation zugrunde liegenden Versionsnummer 1.03) 113 Funktionen zu den verschiedensten Einsatzgebieten. Man kann sagen, daß die wichtigsten Funktionsaufrufe des FoxPro-APIs von den FoxPro Entwicklern in dieser Bibliothek nocheinmal zusammengefaßt wurden. Damit steht ein Großteil der API-Funktionen seither auch "Nichtbesitzern" des FoxPro Library Construction Kits zur Verfügung. Da das FoxPro-API aber die Programmierung in C voraussetzt, werden in dessen Routinen allerlei "C-typische" Konstrukte und Aufrufe benutzt (beispielsweise Strukturen), zu denen es in FoxPro selbst keine Entsprechungen gibt. Die Entwickler mußten also beim Programmieren der FOXTOOLS.FLL eine Schnittstelle zwischen FoxPro´s xBase-Dialekt und FoxPro´s C-API herstellen. Dabei kamen sehr unterschiedliche und voneinander abweichende Umsetzungen der einzelnen API-Funktionen zustande. Bei meinen ersten Dokumentationsversuchen ging ich noch von der Annahme aus, man müsse nur die englische Dokumentation des Library Construction Kits ins Deutsche übersetzen und ein bißchen "aufpeppen", doch weit gefehlt! Jede FOXTOOLS.FLL -Funktion mußte neu erarbeitet, getestet und dokumentiert werden. Ich hoffe, daß der/die eine oder andere unter Ihnen die Ausführungen nützlich finden wird und auch gewinnbringend während der Arbeit mit FoxPro einsetzen kann. Für Fragen und Anregungen in CompuServe bin ich jederzeit sehr empfänglich und verbleibe bis dahin mit größtem Dank an meine in diesen Tagen sehr geduldige Frau,

Burkhard  Stiller


FloatPopInfo
Dieses Hilfesystem verfügt über ein "FloatingMenü", das Sie durck Klicken der rechten Maustaste aktivieren können, sobald sich der Maus-Cursor innerhalb der scrollbaren Textregion befindet.


CIS ID
ECHTZEIT DV-Systeme u. Engenieering

Burkhard Stiller

CIS: 100437,1645


Allgemeine Funktionen

Über diese Gruppe gibt es nicht viel zu sagen, außer daß alle Funktionen mehr oder weniger auch mit dem WIN-API zu tun haben. Speziell die beiden Funktionen RegFn() CallFn() eröffnen Ihnen eine Vielzahl neuer Möglichkeiten, indem Funktionen des WIN-API's duch sie in Ihre FoxPro-Anwendungen importiert und verwendet werden können!

Auf der anderen Seite können Sie die beiden Funktionen INITIALIZE() und UNINITIALIZE() gar nicht selbst nutzen. Es handelt sich hierbei sozusagen um den Ein- und Aussprungspunkt der Bibliothek beim Laden und Releasen derselben unter FoxPro. Sie sind in dieser Dokumentation nur der Vollständigkeit halber mit aufgeführt und bedürfen an dieser Stelle keiner weiteren Erläuterung.

CALLFN()

FOXTOOLVER()

INITIALIZE()

MSGBOX()

REGFN()

UNINITALIZE()


INITIALIZE()

Zweck:	Initialisierung der Foxtools.fll-Bibliothek.

Syntax:	wird vom System beim Laden aufgerufen

Parameter: 	keine

Rückgabe: 	keine

Vgl.:	UNINITIALIZE()

Beschreibung:

Diese Systemfunktion wird beim Laden der Library mit:

  SET LIBRARY TO FOXTOOLS.FLL (ADDITIVE)

aufgerufen und initialisiert systemintern die Funktionen. Diese Routine kann nicht von Ihnen aufgerufen werden!

Beispiel: -----


UNINITALIZE()

Zweck:	Entladen der Foxtools.fll-Bibliothek.

Syntax:	wird vom System beim Entladen aufgerufen

Parameter: 	keine

Rückgabe: 	keine

Vgl.:	INITIALIZE()

Beschreibung:

Diese Systemfunktion wird beim Releasen der Library mit:

  RELEASE LIBRARY FOXTOOLS.FLL

aufgerufen und gibt die vom System belegten Resourcen wieder frei. Diese Routine kann nicht von Ihnen aufgerufen werden!

Beispiel: -----


MSGBOX()

Zweck:	Modale Windows-Dialogbox ausgeben.

Syntax:	MSGBOX(<AusdrZ1>,<AusdrZ2>,<AusdrN1>)

Parameter:	<AusdrZ1> Nachrichtentext in der Dialogbox

<AusdrZ2> Fenstertitel der Dialogbox

<AusdrN1> Typ der Dialogbox

Rückgabe: 	Nummerisch

Vgl.:	MessageBox() - Funktion des Windows SDK´s

Beschreibung:

Die MSGBOX-Funktion ruft die Windows eigene Dialogroutine <MessageBox> auf. In <AusdrZ1> wird der Mitteilungstext der Dialogbox übergeben.

Tip:<AusdrZ1> kann auch CHR(13), also Return für erzwungene Zeilenumbrüche innerhalb des Mitteilungstextes enthalten! In <AusdrZ2> wird der Titel des Dialogbox-Fensters übergeben.

Tip: Der Titel-Text kann durch Leerzeichen (SPACES) verlängert werden, um so die Dialogbox künstlich zu verbreitern, wodurch auch der Mitteilungstext breiter ausgegeben wird!

Tip: Der Übergabeparameter <AusdrZ2> kann als Sonderfall auch der nummerische Wert 0 (Null) sein. In diesem speziellen Fall wird der Dialog-Fenstertitel auf das Wort "Fehler" gesetzt. <AusdrN1> bestimmt die Anzahl und die Beschriftung der Textknöpfe der Dialogbox, sowie die Ausgabe eines links angeordneten Bitmaps (oder unterdrückt das Bitmap). Abhängig von <AusdrN1>, wird von der MSGBOX()-Funktion ein entsprechender nummerischer Wert als Anwenderreaktion zurückgegeben.

Returnwerte:

<AusdrN1>	Buttons	Returnwert

0	[  OK  ]	1

1	[  OK  ][   Abbrechen  ]	1,2

2	[ Abbrechen ][ Wiederholen ][ Ignorieren ]	3,4,5

3	[ JA  ][ Nein ][ Abbrechen ]	6,7,2

4	[ JA  ][ Nein ]	6,7

5	[ Wiederholen ][ Abbrechen ]	4,2

Steuerungsmöglichkeiten:

Ausgabe von "STOPSCHILD": <AusdrN1> + 16

Ausgabe von "FRAGEZEICHEN": <AusdrN1> + 32

Ausgabe von "AUSRUFEZEICHEN": <AusdrN1> + 48

Ausgabe von "INFOSCHILD": <Ausdr1> + 64

Fokus auf 1. Textknopf: <AusdrN1> + 0

Fokus auf 2. Textknopf: <AusdrN1> + 256

Fokus auf 3. Textknopf: <AusdrN1> + 512

Modalität Applikations-bezogen: <AusdrN1> + 0

  gültig für alle Iconwerte: 0, 16, 32, 48,64

Modalität systemweit mit Titel: <AusdrN1> + 4096

  gültig für Iconwerte: 32, 48 und 64

Modalität systemweit ohne Titel: <AusdrN1> + 4096

  gültig für Iconwerte: 0 und 16

Beispiel:

test1 = MSGBOX("Dies ist der Mitteilungstext.", "Titel des Dialogfensters",3+32) && ergibt JA / NEIN / ABBRECHEN mit Fragezeichen.bmp

test2 = MSGBOX("General Protection Fault", "",4096) && ergibt den bekannten "Grusel-Dialog"

Hinweis:

Neu als eigenständiger Befehl in VFP 3.0 implementiert!


REGFN()

Zweck:	Anmelden einer externen Funktion

Syntax:	REGFN(<AusdrZ1>[,<Ausdrliste1>][,<Ausdrliste2>][,<AusdrZ2>])

oder anders ausgedrückt:

REGFN(FunktionName, [ArgTypen], [RückgabeTypen], [DLLName])

Parameter:	Details siehe Win-API Calls

Rückgabe: 	Nummerisch

Vgl.:	CALLFN()

Beschreibung:

Die Funktion akzeptiert die folgenden Argumenttypen: Integer, Long, Float, Double, String. Diese können als Referenz oder als Wert übergeben werden. Als Rückgabe erhalten Sie das Funktions-Handle als positiven Integerwert (größer/gleich 0), oder -1 wenn die Funktions-Registrierung nicht erfolgreich war.

Beispiel:

m.FnNr_1 = RegFn("MessageBox","I@C@CI","I")


CALLFN()

Zweck:	Aufruf einer importierten Funktion.

Syntax:	CALLFN(<AusdrN1>[,<Ausdrliste1>)

oder anders ausgedrückt:

CALLFN(Registriernummer,[Parameterliste])

Parameter:	<AusdrN1> Funktions-Handle (Registriernummer). Details siehe Win-API Calls

Rückgabe: 	variabel

Vgl.:	REGFN()

Beschreibung:

Die Funktion akzeptiert die folgenden Argumente: "Integer", "Long", "Float", "Double", "String/Buffer". Diese können als Referenz oder als Wert übergeben werden, je nachdem, wie sie im entsprechenden REGFN()-Aufruf angemeldet wurden.

Die folgenden Rückgabewerte werden unterstützt: "Integer", "Long", "Float", "Double", "String/Buffer". Diese werden nur als Wert zurückgegeben.

Beispiel:

= CallFN(m.FnNr_1,0,@messtxt,@messtit,messtyp)


FOXTOOLVER()

Zweck:	Version der FOXTOOLS.FLL Library zurückgeben.

Syntax:	FOXTOOLVER()

Parameter: 	keine

Rückgabe: 	Zeichen

Vgl.:

Beschreibung:

Ermittelt die Nummer der Version der FOXTOOLS-Library. Ich empfehle Ihnen, falls Sie beabsichtigen einige "Fehlfunktionen" von <Foxtools.fll>-Funktionen in Ihren eigenen Programmen zu benutzen, immer mit der FOXTOOLVER()-Funktion die Revisionsnummer abzuprüfen, damit Sie keine Überraschungen erleben müssen.

Beispiel:

? FOXTOOLVER()


Disk/Datei

Diese Gruppe der Funktionen kümmert sich um das Handling von Datei-, Pfad- und Laufwerksnamen und enthält die meisten "liebevollen" Fehler. Die Entwickler wollten hier schnelle Entsprechungen der alten xBase-Urversionen der Dateiunterstützungsroutinen auf die Beine stellen. Dies ist ihnen auch gut gelungen! Nur manchmal wurden bei der einen und anderen Routine Überprüfungen bestimmter einzuhaltener Vorgaben (da gibt's bei der Dateinamengebung ja bekanntlich genügend) vergessen. So kann man die JUSTDRIVE()-Funktion prima nutzen, um die bekannte `*:'-GenscrnX-Zeilenkennung auszulesen, da die Funktion eigentlich nur nach einem Doppelpunkt sucht und sich herzlich wenig um die Korrektheit des Laufwerksbuchstaben kümmert!

Ähnlich gelagert verhalten sich die JUSTEXT()- und JUSTSTEM()- Funktionen, die nur auf "ihren" Punkt im String scharf ist. Einen String mit zwei Sätzen (getrennt durch einen Punkt) in Satz #1 und #2 zerlegen? Bitteschön :

m.Cstring="Es waren einmal zwei Königskinder. Die hatten einander so lieb!"

m.satz1 = JUSTSTEM(string)+"."

m.satz2 = JUSTEXT(string)

Und noch rigoroser setzt sich die MKDIR()-Funktion über DOS-Vorgaben hinweg und schreibt, wenn Sie´s denn so wollen, auch ein Verzeichnis mit Leerstellen im Namen auf die Platte! Versuchen Sie das mal mit DOS-Befehlen wieder wegzukriegen!

Sie sehen, etliche Stolpersteine wurden nicht aus dem Weg geräumt, trotz alledem können Sie die Funktionen der Kategorie "DISK/DATEI" gefahrenlos einsetzen und auch für andere Einsatzgebiete mißbrauchen.

ADDBS() 	CLEANPATH() 	JUSTSTEM()

DEFAULTEXT() 	JUSTDRIVE() 	MKDIR()

DRIVETYPE() 	JUSTEXT() 	RMDIR()

FORCEEXT() 	JUSTFNAME() 	VALIDPATH()

FOXTOUCH() 	JUSTPATH()


DRIVETYPE()

Zweck:	Ermittelt den Typ des in <AusdrZ> übergebenen Laufwerks.

Syntax:	DRIVETYPE(<AusdrZ1>)

Parameter: 	<AusdrZ1> Laufwerksbuchstabe

Rückgabe: 	Numerisch

Vgl.:

Beschreibung:

Gibt in <AusdrN1> folgende Werte zurück :0 - Kein Typ2 - Floppy Disk3 - Hard Disk4 - Wechsel- oder Netz-Laufwerk

Beispiel:

? DRIVETYPE("C:")	gibt> 3


MKDIR()
MKDIR()	leicht fehlerhaft

Zweck:	Verzeichnis erstellen.

Syntax:	MKDIR(<AusdrZ1>)

Parameter: 	<AusdrZ1> Verzeichnisname

Rückgabe: 	Nummerisch

Vgl.:	RMDIR()

Beschreibung:

Erzeugt ein durch <AusdrZ> spezifiziertes Verzeichnis. Diese Funktion prüft allerdings nicht bis ins letzte, ob Länge oder Format des Verzeichnisstrings gültig sind. Der Rückgabewert ist 0 bei Erfolg und 1 für "Scheitern". Eine 6 wird zurückgegeben, wenn das Verzeichnis bereits existiert. Falle: mit dieser Funktion kann man Verzeichnisse erzeugen, die unerlaubte Zeichen im Verzeichnisnamen haben (siehe Beispiel unten)!

Beispiel:

? MKDIR("C:\WINDOWS") gibt> 6 -> dann existiert´s bereits!

? MKDIR("C:\THISISTOOLONG") gibt> 0 -> Erzeugt> C:\THISISTO

? MKDIR("C:\THIS IS") gibt> 0 -> Erzeugt> C:\THIS IS <<Das ungültige Leerzeichen wird erlaubt!!

? MKDIR("C:\   THISIS WRONG") gibt> 1 -> nicht möglich!

Leerzeichen als Beginn eines Verzeichnisnamens sind ungültig!

Hinweis:

Diese Funktion steht erst ab der Version 1.01 von FoxTools zur Verfügung.


RMDIR()

Zweck:	Verzeichnis entfernen.

Syntax:	RMDIR(<AusdrZ1>)

Parameter: 	<AusdrZ1> Verzeichnisname

Rückgabe: 	Nummerisch

Vgl.:	MKDIR()

Beschreibung:

Löscht ein durch <AusdrZ> angegebenes Verzeichnis. Die Funktion überprüft allerdings nicht, ob der Verzeichnisname gültig war (siehe MKDIR()-Funktion). Bei Erfolg wird 0 zurückgegeben, sonst 1. Mit dieser Funktion kann man Verzeichnisse entfernen, die unerlaubte Zeichen im Verzeichnisnamen haben (siehe Beispiel)!

Beispiel:

? RMDIR("C:\THIS IS") gibt> 0 wenn Verzeichnis gelöscht wurde

Hinweis:

Diese Funktion steht erst ab der Version 1.01 von FoxTools zur Verfügung. Die RMDIR()-Funktion löscht auch Verzeichnisse mit eigentlich "unmöglichen" Namen, die zum Beispiel mit der MKDIR()-Funktion "kreiert" wurden.


JUSTFNAME()
JUSTFNAME()	leicht fehlerhaft

Zweck:	Ermittelt den Dateinamen aus einer kompletten Pfadangabe.

Syntax:	JUSTFNAME(<AusdrZ1>)

Parameter: 	<AusdrZ1> Lw, Pfad und Dateiname können enthalten sein

Rückgabe: 	Zeichen

Vgl.:	CLEANPATH(), JUSTDRIVE()

Beschreibung:

Ermittelt den Dateinamen aus <AusdrZ1>, der auch eine komplette Pfadangabe und Lw enthalten kann. Diese Funktion sucht in <AusdrZ1> nach dem letzten Rückstrich und gibt ab der darauffolgenden Position die restlichen (ungezählten/ungeprüften> Falle!) Zeichen aus <AusdrZ1> wieder. Ist kein Rückstrich vorhanden, wird das gleiche Spiel mit dem Doppelpunkt wiederholt. Sind weder Rückstrich, noch Doppelpunkt in <AusdrZ1> enthalten, wird der gesamte <AusdrZ1> zurückgegeben. Tip: Schauen Sie sich das letzte Beispiel an, wenn Sie an eigenen Treibern für GENSCRNX basteln!

Beispiel:

? JUSTFNAME("C:\FOXPROW\FOXPROW.EXE") &&gibt> FOXPROW.EXE zurück

? JUSTFNAME(MLINE(memo,_MLINE) &&gibt> NOSCNOBJ zurück, wenn Memozeile z.B. die GENSCRNX-Direktive> *:NOSCNOBJ enthält


JUSTSTEM()
JUSTSTEM()	leicht fehlerhaft

Zweck:	Ermittelt den Namensstamm aus einer kompletten Pfadangabe.

Syntax:	JUSTSTEM(<AusdrZ1>)

Parameter:	<AusdrZ1> Lw, Pfad und Dateiname können enthalten sein

Rückgabe: 	Zeichen

Vgl.:	CLEANPATH()

Beschreibung:

Ermittelt den Namensstamm (die ersten, maximal acht Zeichen des Dateinamens) aus <AusdrZ1>, der auch eine komplette Pfadangabe und Lw enthalten kann. Diese Funktion sucht in <AusdrZ1> nach dem letzten Rückstrich und gibt alles (ungezählt> Falle!) bis zu einem darauffolgenden Dateinamens-Punkt zurück.

Beispiel:

? JUSTSTEM("C:\FOXPROW\FOXTOOLS.FLL") &&gibt> FOXTOOLS

? JUSTSTEM("C:\FOXPROW\FOXTsdfsdfsdOOLS.FLL") &&gibt> FOXTsdfsdfsdOOLS


JUSTEXT()
JUSTEXT()	leicht fehlerhaft

Zweck:	Erweiterung aus einem Dateinamen zurückgeben.

Syntax:	JUSTEXT(<AusdrZ1>)

Parameter:	<AusdrZ1> Lw, Pfad und Dateiname können enthalten sein

Rückgabe: 	Zeichen

Vgl.:	JUSTPATH(), JUSTFNAME()

Beschreibung:

Ermittelt die Namenserweiterung aus <AusdrZ1>, der auch eine komplette Pfadangabe und Lw enthalten kann. Diese Funktion untersucht <AusdrZ1> auf das Vorhandensein des ersten Punkts und gibt, wenn gefunden, die restlichen (ungezählten> Falle!) Zeichen aus <AusdrZ1> wieder, ansonsten wird der Nullstring zurückgegeben.

Beispiel:

? JUSTEXT("C:\FOXPROW\FOXPROW.EXE") &&gibt> EXE

? JUSTEXT("Mein Name ist Hase. Ich weiß von nichts!") &&  ist Mist, aber geht gibt> (Space)Ich weiß von nichts!

Hier noch eine schnelle Methode den Nachkomma-Anteil einer Dezimal-Zahl in Texten auszugeben:

SET POINT TO "." && Setting vorher sichern nicht vergessen

m.Nval1=12345.8988 && die Zahl kommt von irgendwoher

?"Der Nachkomma-Anteil beträgt: 0,"+JUSTEXT(STR(val1,10,5))


JUSTPATH()
JUSTPATH()	leicht fehlerhaft

Zweck:	Ermittelt den Dateinamen aus einer kompletten Pfadangabe.

Syntax:	JUSTPATH(<AusdrZ1>)

Parameter:	<AusdrZ1> Lw, Pfad und Dateiname können enthalten sein

Rückgabe: 	Zeichen

Vgl.:	CLEANPATH()

Beschreibung:

Ermittelt den Dateinamen aus <AusdrZ1>, der auch eine komplette Pfadangabe und Lw enthalten kann. Diese Funktion sucht in <AusdrZ1> nach dem letzten Rückstrich und gibt alles bis zu diesem Rückstrich (aber ohne ihn selbst) zurück. Verzeichnisnamen selbst können auch Punkt und Namenserweiterung besitzen.

Beispiel:

? JUSTPATH("C:\FOXPROW\FOXPROW.EXE") && gibt> C:\FOXPROW

? JUSTPATH("C:\TOOLS.BIN\FOXPRO\ISDSKIN.BIN") &&gibt> C:\TOOLS.BIN\FOXPRO


JUSTDRIVE()
JUSTDRIVE()	leicht fehlerhaft

Zweck:	Laufwerksbezeichnung aus einer kompletten Pfadangabe zurückgeben.

Syntax:	JUSTDRIVE(<AusdrZ1>)

Parameter:	<AusdrZ1> Lw, Pfad und Dateiname können enthalten sein

Rückgabe: 	Zeichen

Vgl.:	CLEANPATH(), JUSTFNAME()

Beschreibung:

Gibt aus <AusdrZ1> die Laufwerksbezeichnung zurück, wenn <AusdrZ1> eine kompletten Pfadangabe mit Laufwerksbuchstaben und Doppelpunkt enthält. Diese Funktion untersucht <AusdrZ1> auf das Vorhandensein des Doppelpunkts an StringPos #2 (nachdem ein LTRIM() ausgeführt wurde) und gibt, wenn gefunden, die ersten beiden Zeichen des getrimmten Strings (ungeprüft> Falle!) wieder, ansonsten wird ein Nullstring zurückgegeben.

Tip: Schauen Sie sich das letzte Beispiel an!

Beispiel:

? JUSTDRIVE("       C:\FOXPROW\FOXPROW.EXE") &&gibt> C:

? JUSTDRIVE("FOXPROW\FOXPROW.EXE") &&gibt>  Leerstring

? JUSTDRIVE("ß:FOXPROW\") && ist Mist, aber geht; gibt> ß:

IF JUSTDRIVE(MLINE(memo,_MLINE) ="*:"

  * Memozeile enthält z.B. eine GENSCRNX-Direktive> 	*:NOSCNOBJ

  * und JUSTDRIVE("*:NOSCNOBJ......") ergibt "*:"

  * selbst wenn die Direktive NICHT in Spalte 0 des Code-Snippets steht!


FORCEPATH()

Zweck:	Neue Pfadangabe in Ausdruck erzwingen.

Syntax:	FORCEPATH(<AusdrZ1>,<AusdrZ2>)

Parameter:	<AusdrZ1> Dateiname mit oder ohne Pfad, Laufwerk und Erweiterung	<AusdrZ2> neuer Pfad (mit Laufwerk)

Rückgabe: 	Zeichen

Vgl.:	CLEANPATH()

Beschreibung:

Gibt <AusdrZ1> zurück, nachdem darin die gesamte Pfadangabe durch die in <AusdrZ2> übergebene ersetzt wurde.

Beispiel:

? FORCEPATH("C:\DOS\SETVER.EXE", "C:\FOXPROW") &&gibt> C:\FOXPROW\SETVER.EXE


FORCEEXT()
FORCEEXT()	leicht fehlerhaft

Zweck:	Erzwingen einer Dateinamenserweiterung, egal ob eine solche vorhanden ist.

Syntax:	FORCEEXT(<AusdrZ1>,<AusdrZ2>)

Parameter:	<AusdrZ1> Dateiname (mit oder ohne Lw, Pfad und Erweiterung)	<AusdrZ2> Erweiterung (ohne Punkt)

Rückgabe: 	Zeichen

Vgl.:	CLEANPATH()

Beschreibung:

Gibt <AusdrZ1> mit einer neuen Erweiterung zurück, auch wenn schon eine vorhanden war. Der Inhalt von <AusdrZ2> wird ungeprüft (Falle!) angehängt!

Beispiel:

? FORCEEXT("C:\FOXPROW\FOXTOOLS.FLL", "DLL") &&gibt> C:\FOXPROW\FOXTOOLS.DLL

? FORCEEXT("C:\FOXPROW\FOXTOOLS.FLL", "DLLLLD") &&gibt> C:\FOXPROW\FOXTOOLS.DLLLLD


DEFAULTEXT()
DEFAULTEXT()	leicht fehlerhaft

Zweck:	Rückgabe einer Dateinamenserweiterung, wenn keine vorhanden ist.

Syntax:	DEFAULTEXT(<AusdrZ1>,<AusdrZ2>)

Parameter:	<AusdrZ1> Dateiname (mit oder ohne Lw, Pfad und Erweiterung)	<AusdrZ2> Erweiterung (ohne Punkt)

Rückgabe: 	Zeichen

Vgl.:	CLEANPATH()

Beschreibung:

Gibt <AusdrZ1> mit  der in <AusdrZ2> enthaltenen neuen Erweiterung zurück, falls nicht bereits eine Erweiterung in <AusdrZ1> vorhanden ist. Wenn der in <AusdrZ1> übergebene Dateiname bereits eine Erweiterung besitzt, wird diese beibehalten. Der Inhalt von <AusdrZ2> wird ungeprüft (Falle!) angehängt!

Beispiel:

? DEFAULTEXT("C:\DOS\SETVER", "FLL") &&gibt> C:\DOS\SETVER.FLL

? DEFAULTEXT("C:\DOS\SETVER.TXT", "FLL") &&gibt> C:\DOS\SETVER.TXT

? DEFAULTEXT("C:\SETVER", "Schrott.Ext") &&gibt> C:\SETVER.Schrott.Ext


ADDBS()

Zweck:	Rückstrich (Backslash) anhängen.

Syntax:	ADDBS(<AusdrZ1>)

Parameter:	<AusdrZ1> Zeichenkette (auch mit Laufwerk und Pfadangabe)

Rückgabe: 	Zeichen

Vgl.:

Beschreibung:

Gibt <AusdrZ1> mit angehängtem Rückstrich  (Back-slash) zurück, wenn nicht schon ein Rückstrich als letztes Zeichen in <AusdrZ1> vorhanden war.

Beispiel:

? ADDBS("C:")

ACCEPT "Geben Sie den Pfad ein: " TO m.Cpfadm.Cpfad = ADDBS(m.Cpfad)

? m.Cpfad


VALIDPATH()
VALIDPATH()	leicht fehlerhaft

Zweck:	Syntax-Prüfung eines Dateinamens.

Syntax:	VALIDPATH(<AusdrZ1>)

Parameter: 	<AusdrZ1> zu prüfender Pfad/Dateiname

Rückgabe: 	Logisch

Vgl.:	CLEANPATH()

Beschreibung:

Überprüft, ob die Syntax des Dateinamens und/oder Pfades in <AusdrZ1> gültig ist. DOS Wildcard-Zeichen in <AusdrZ1> ergeben immer ein .F. als Resultat.Diese Funktion hat einen Fehler! Wird ein Unterverzeichnis mit (zulässig) Namenserweiterung in <AusdrZ1> zur Prüfung übergeben und ist diese Namenserweiterung (fehlerhafter Weise) länger als 3 Zeichen, so gibt die Funktion trotzdem, und deswegen auch fehlerhaft, ein logisches .T. zurück!

Beispiel:

? VALIDPATH("C:\FOO") &&gibt RICHTIG> .T.

? VALIDPATH("C:\THISISVERYLONG") &&gibt RICHTIG> .F.

? VALIDPATH("12345678\12345678.1234\Test.TXT") &&gibt FEHLERHAFT> .T.


CLEANPATH()

Zweck:	Gültigen Dateinamen (mit Laufwerk und Pfad) erzingen.

Syntax:	CLEANPATH(<AusdrZ1>)

Parameter:	<AusdrZ1> Dateiname (mit oder ohne Laufwerk, Pfad und Erweiterung)

Rückgabe: 	Zeichen

Vgl.:	VALIDPATH()

Beschreibung:

Gibt <AusdrZ1> zurück, nachdem der Inhalt auf korrekten Pfad-, Laufwerks- und Dateinamen geprüft und gegebenenfalls korrigiert wurde. Es wird nicht überprüft, ob es ein entsprechendes Laufwerk oder einen entsprechenden Pfad wirklich gibt!

WICHTIG: Da viele der Dateinamen-Manipulationsroutinen der Foxtools-Library nicht alle möglichen Fehler in den übergebenen Parametern überprüfen und deshalb unbrauchbare Ergebnisse zurückliefern können, empfiehlt es sich, solche "unsicheren" Rückgabewerte immer noch mit der CLEANPATH()-Funktion abschließend zu "säubern"!

Beispiel:

? CLEANPATH("LANGERDATIENAME") &&gibt> LANGERDA

? CLEANPATH("C:D:\\DATEINAME") &&gibt> D:\DATEINAM


FOXTOUCH()

Zweck:	Aktualisieren der Datei-, Datum- und -Zeitattribute

Syntax:	FOXTOUCH(<AusdrZ1>)

Parameter: 	<AusdrZ1> Dateiname (mit Laufwerk und Pfad)

Rückgabe: 	Nummerisch

Vgl.:

Beschreibung:

Diese Funktion setzt das Datei-Datum und die Datei-Zeit der in <AusdrZ1> angegebenen Datei auf das PC-Datum u.- Zeit. Insbesondere wird auch ein nicht gesetztes Archiv-Bit von der Funktion gesetzt! Die Funktion liefert den nummerischen Wert 0 zurück, wenn die in <AusdrZ1> übergebene Datei existiert und deren Attribute aktualisiert werden konnten. Ist die Datei vorhanden, eine Aktualisierung aber nicht möglich, wird 1 zurückgegeben. Ist die angegebene Datei nicht vorhanden, wird ein (abfangbarer) Fehler erzeugt.

Beispiel:

? FOXTOUCH("C:\TEST.TXT") &&gibt> 0 -> Datei -Datum, u. -Zeit aktuell.


Strings

Die Funktionen zur Stringbehandlung erlauben Ihnen besonders einfach, komplexe Strings zu bearbeiten und zu zerlegen. Diese Funktionen können von Ihnen gewinnbringend während des "Parsens" von Befehlssequenzen eingesetzt werden, da Worte sehr schnell aus Strings extrahiert und weiterverarbeitet werden können.

Da während meiner Tests keinerlei Fehlfunktionen auftraten, wage ich an dieser Stelle einfach einmal die Behauptung (natürlich wie immer ohne Gewähr), daß diese Funktionsgruppe fehlerfrei arbeitet.

NEXTWORD()

REDUCE()

STRFILTER()

WORDNUM()

WORDS()


REDUCE()

Zweck:	Wiederholte Werte aus einer Zeichenkette suchen und entfernen.

Syntax:	REDUCE(<AusdrZ1>,<AusdrZ2>)

Parameter:	<AusdrZ1> Durchsuchte Zeichenkette

<AusdrZ2> Zu entfernende Zeichen

Rückgabe: 	Zeichen

Vgl.:	STRFILTER()

Beschreibung:

Die Funktion sucht in <AusdrZ1> nach dem Vorkommen von <AusdrZ2> und ersetzt diesen durch ein Leerzeichen. Wird in <AusdrZ2> ein Leerzeichen angegeben, kann die Funktion dazu verwendet werden, Gruppen von Leerzeichen aus einer Zeichenkette zu entfernen und dann durch ein einzelnes Leerzeichen zu ersetzen.

Beispiel:

? REDUCE("This is       lots of spaces", " ") &&gibt> This is lots of spaces

? REDUCE("Repeat characters AAAA and delete", "A") &&gibt> Repe t ch r cters   nd delete

? REDUCE("*:TestPara", "") &&gibt> *:TestPara (keine Änderung wenn <AusdrZ2> leer ist)

? REDUCE("*:TestPara", "*:") &&gibt>  TestPara (mit einem führenden SPACE)


STRFILTER()

Zweck:	Gibt einen String mit allen aufgetretenen Filtertreffern wieder.

Syntax:	STRFILTER(<AusdrZ1>,<AusdrZ2>)

Parameter:	<AusdrZ1> Durchsuchte Zeichenkette

<AusdrZ2> Zu suchende Zeichen (Filter-Buchstaben)

Rückgabe: 	Zeichen

Vgl.:	REDUCE()

Beschreibung:

Durchsucht <AusdrZ1> sequentiell nach allen Einzelbuchstaben in <AusdrZ2> (Filter) und gibt jeden Filtertreffer in <AusdrZ1> als Resultat zurück. Groß und Kleinschreibung werden in <AusdrZ1> und <AusdrZ2> berücksichtigt!

Beispiel:

? STRFILTER("This is FoxTools", "T") &&gibt> TT (zwei Treffer)

? "Der String enthält "+STR(LEN(STRFILTER("Dieser String ist mit vielen I","i.")))+" i." &&gibt> Der String enthält      5 i.

? "Der String enthält "+STR(LEN(STRFILTER("Dieser String ist mit vielen I","I.")))+" I." &&gibt> Der String enthält      1 I.


WORDS()

Zweck:	Anzahl der Worte in String liefern.

Syntax:	WORDS(<AusdrZ1>[,<AusdrZ2>])

Parameter:	<AusdrZ1> Durchsuchte Zeichenkette	[<AusdrZ2>] Wort-Begrenzungszeichen

Rückgabe: 	Numerisch

Vgl.:	WORDNUM()

Beschreibung:

Ermittelt Anzahl der Worte im Ausdruck <AusdrZ>. Worte werden durch Zeichen im optionalen Ausdruck <AusdrZ2> begrenzt. Voreinstellung für <AusdrZ2> sind Leertaste, Tabulator und Return. In <AusdrZ2> können auch mehrere verschiedene Wort-Trennzeichen angegeben werden! Achtung, wenn <AusdrZ2> angegeben wurde, sind keine Defaults mehr gültig! Sie müssen dann auch die Standard-Trennzeichen (Leertaste, Tabulator und Return) mit in <AusdrZ2> angeben!

Beispiel:

? WORDS("This is a test of FoxTools") &&gibt> 6

? WORDS("C:\Test\sub1\sub2\Test.TXT") &&gibt> 1

? WORDS("C:\Test\sub1\sub2\Test.TXT","\") &&gibt> 5


WORDNUM()

Zweck:	Ermittelt das n-te Wort im Ausdruck.

Syntax:	WORDNUM(<AusdrZ1>,<AusdrN1>[,<AusdrZ2>])

Parameter:	<AusdrZ1> Durchsuchte Zeichenkette

<AusdrN1> n-tes Wort

<AusdrZ2> Wort-Begrenzungszeichen

Rückgabe: 	Zeichen

Vgl.:	WORDS(), NEXTWORD()

Beschreibung:

Die Funktion gibt aus <AusdrZ1> das <AusdrN1>-te Wort zurück. Wörter werden durch Zeichen im optionalen Ausdruck <AusdrZ2> begrenzt. Voreinstellung für <AusdrZ2> sind Leertaste, Tabulator und Return. In <AusdrZ2> können auch mehrere verschiedene Wort-Trennzeichen angegeben werden! Achtung, wenn <AusdrZ2> angegeben wurde, sind keine Defaults mehr gültig! Sie müssen dann auch die Standard-Trennzeichen (Leertaste, Tabulator und Return) mit in <AusdrZ2> angeben!

Beispiel:

? WORDNUM("This is a test of FoxTools", 4) &&gibt> test

? WORDNUM("One,Two:Three,Four,Five", 4, ":,") &&gibt> Four


NEXTWORD()

Zweck:	Ermittelt das nächste Wort im Ausdruck.

Syntax:	NEXTWORD(<AusdrZ1>, <AusdrN1>[,<AusdrZ2>])

Parameter:	<AusdrZ1> Durchsuchte Zeichenkette

<AusdrN1> Zeichen-Startposition in <AusdrZ1> an der Suche beginnt

<AusdrZ2> Wort-Begrenzungszeichen

Rückgabe: 	Zeichen

Vgl.:	WORDNUM(), WORDS()

Beschreibung:

Ermittelt das nächste Wort im Ausdruck <AusdrZ1>, beginnend (einschließlich) mit dem Zeichen an String-Position <AusdrN>, endend direkt vor einem im optionalen Ausdruck <AusdrZ2> angegebenen Zeichen oder dem Ende der Zeichenkette <AusdrZ1>, wenn <AusdrZ2> fehlt. Voreinstellung für <AusdrZ2> sind Leertaste, Tabulator und Return. In <AusdrZ2> können auch mehrere verschiedene Wort-Trennzeichen angegeben werden! Achtung, wenn <AusdrZ2> angegeben wurde, sind keine Defaults mehr gültig! Sie müssen dann auch die Standard-Trennzeichen (Leertaste, Tabulator und Return) mit in <AusdrZ2> angeben!

Beispiel:

? NEXTWORD("This is a test of FoxTools", 12) &&gibt> est

? NEXTWORD("One,Two,Three,Four,Five", 12,",") &&gibt> ee


Clipboard

Zu den Clipboard-Funktionen bleibt anzumerken, daß diese normalerweise nicht viel Nutzen bringen.

Der eleganteste Weg Daten ins Clipboard zu befördern und aus diesem wieder einzulesen ist immer noch der Gebrauch der FoxPro-Systemvariable _CLIPTEXT!

Damit gehen Sie nämlich kein Risiko ein, da Sie immer nur Texte (sprich String-Daten) angeliefert bekommen. Die Weiterbearbeitung der _CLIPTEXT-Variable unterliegt der vollständigen Kontrolle des Systems, eventuelle Fehlzuweisungen werden smart abgefangen. Demgegenüber erlauben die Foxtools die direkte Manipulation aller möglichen Clipboard-Formate (wenn´s nur immer ginge!). Versuchen Sie z.B. ein Bitmap, das Sie mit der Paintbrush-Copy Funktion in die Zwischenablage befördert haben mit der Funktion GETCLIPDAT() irgendwie in FoxPro einzuschleusen, bedeutet das den unmittelbaren "Hirntod" von FoxPro!

Seien Sie vorsichtig bei Ihren Experimenten!

CLOSECLIP() 	GETCLIPFMT() 	SETCLIPDAT()

COUNTCLIPF() 	ISCLIPFMT()

EMPTYCLIP() 	ENUMCLIPFM()

GETCLIPDAT() 	REGCLIPFMT()


GETCLIPDAT()

Zweck:	Holen von ClipBoard-Daten (nur Text-Daten funktionieren korrekt).

Syntax:	GETCLIPDAT(<AusdrN1>)

Parameter:	 <AusdrN1> Datentyp des Clipboard-Objektes (siehe Tabelle)

Rückgabe: 	variabel

Vgl.:	OPENCLIP(), ISCLIPFMT(), CLOSECLIP()

Beschreibung:

Wenn das ClipBoard mit der "LowLevel-Funktion" OPENCLIP() geöffnet wurde, können Sie mit der <GetClipDat()>-Funktion ein Clipboard-Datenobjekt durch Angabe des Objekt-Typs in <AusdrN1> in z.B. eine FoxPro-Variable einlesen. Einen Auszug der in Windows möglichen Objekt-Typen entnehmen Sie der untenstehenden Tabelle. Geben Sie in <AusdrN1> die Typnummer eines Datenobjekt an, das gerade nicht im Clipboard vorhanden ist, gibt die Funktion ein logisches <.F.> zurück, ansonsten erhalten Sie die (Text-)Daten als Rückgabewert. Dies funktioniert nur mit Daten vom Typ CF_TEXT!

Tip: Überprüfen Sie vorm Holen der Daten mit der ISCLIPFMT()-Funktion das Vorhandensein des Datentyps <1> im Clipboard.

WICHTIG: Versuchen Sie niemals Bitmap-Objekte an Text-Variablen zu übergeben oder auf dem FoxPro-Screen mit ?GETCLIPDAT(2)  auszugeben - ein System-Crash ist Ihnen sonst sicher!

C-Konstante	ID-Wert	Beschreibung

CF_TEXT   	1	Data ist ein Array von Buchstaben. Jede Zeile endet mit einer CR-LF-Kombination. Ein "Null Char" signalisiert das Ende der Daten.

CF_BITMAP	2	Data ist Bitmap.

CF_METAFILEPICT	3	Data ist ein Metafile.

CF_SYLK	4	Data ist im Microsoft Symbolic Link (SYLK) Format.

CF_DIF	5	Data im Data Interchange Format (DIF).

CF_TIFF	6	Data ist im Tag Image File Format (TIFF).

CF_OEMTEXT	7	Data ist ein Array von Buchstaben im OEM-Character Set. Jede Zeile endet mit einer Carriage return–linefeed (CR-LF) Kombination. Ein "Null-Char" signalisiert das Ende der Daten.

CF_DIB	8	Data ist Device_independant_Bitmap.

CF_PALETTE	9	Data ist eine Farbpalette.

CF_PENDATA	10	Data ist für die Windows "Pen Extensions".

CF_RIFF	11	Data ist im Resource Interchange File Format (RIFF).

CF_WAVE	12	Data beschreibt eine "Sound Wave". Dies ist ein Subset des CF_RIFF-Datenformats und kann nur für "RIFF WAVE-Dateien" benutzt werden.

Beispiel:

IF OPENCLIP(MAINHWND())

   m.Ctext = GETCLIPDAT(1) && Text-Daten holen

   IF TYPE("m.Ctext") = "C"

      ? m.Ctext

   ENDIF

   = CLOSECLIP()

ENDIF


GETCLIPFMT()

Zweck:	Holen eines anwenderdefinierten, registrierten Formatnamens

Syntax:	GETCLIPFMT(<AusdrN1>)

Parameter: 	<AusdrN1> Formatnamen-ID

Rückgabe: 	Zeichen

Vgl.:	 OPENCLIP(), REGCLIPFMT(), ISCLIPFMT(), CLOSECLIP(), COUNTCLIP()

Beschreibung:

Mit dieser Funktion können Sie sich (wenn es Sinn machen würde) zu einem anwenderdefinierten Clipboard-Format (ID-Nummern von 0xC000 bis 0xFFFF) den zugehörigen Formatnamen zurückgeben lassen. In <AusdrN1> dürfen keine ID-Nummern (Werte) von vordefinierten Windows-Formaten verwendet werden! Ein eigenes Format können Sie mit der Funktion REGCLIPFMT() definieren. Diese Funktion erzeugt dort auch automatisch den hier in <AusdrN1> benötigten ID-Wert.

Ist ein anwenderdefiniertes Clipboard-Format mit dem in <AusdrN1> angegebenen ID-Wert vorhanden, gibt die GETCLIPFMT() den zugehörigen Formatnamen als Zeichenausdruck zurück. Andernfalls (ID-Wert nicht im Wertebereich von 49152 - 65535, oder Format unter entsprechender ID-Nummer nicht registriert) wird ein Null-String zurückgegeben.

Beispiel:

=OPENCLIP(0)	&& Clipboard öffnen

m.Nfmtid = EGCLIPFMT("ECHTZEIT_DV_Systeme") ID-Wert merken

? m.Nfmtid

? GETCLIPFMT(m.Nfmtid) && zum ID-Wert Formatnamen ausgeben

=CLOSECLIP() && Clipboard schließen


ISCLIPFMT()

Zweck:	Prüfen, ob ein bestimmtes Format im Clipboard vorhanden ist.

Syntax:	ISCLIPFMT(<AusdrN1>)

Parameter: 	<AusdrZ1> Formatnamen-ID

Rückgabe: 	Logisch

Vgl.:	REGCLIPFMT(), ENUMCLIPFM(), COUNTCLIP()

Beschreibung:

Die Funktion ISCLIPFMT() überprüft, ob im Clipboard Daten in einem bestimmten (auch anwenderdefinierten) Format zur Verfügung stehen. Das Clipboard braucht zur Ausführung dieser Funktion vorher nicht geöffnet zu werden.

Beispiel:

#DEFINE  cf_Text  1

? ISCLIPFMT(cf_Text) &&gibt> <.T.>, wenn Text-Daten im Clipboard


ENUMCLIPFM()

Zweck:	Holen einer verfügbaren Format-ID.

Syntax:	ENUMCLIPFM(<AusdrN1>)

Parameter: 	<AusdrN1> Formatnamen-ID

Rückgabe: 	Nummerisch

Vgl.:	REGCLIPFMT(), ISCLIPFMT(), COUNTCLIP()

Beschreibung:

Die Funktion ENUMCLIPFM() zählt die in der Clipboard-Liste gefundenen Formate auf. Jeder Aufruf dieser Funktion gibt als Rückgabewert das nächste in der Liste erscheinende Format zurück. Wird in <AusdrN1> eine 0 übergeben, wird das erste verfügbare Format der Clipboard-Liste zurückgegeben. So kann man z.B. eine Formatabfrage-Schleife beginnen. Ist in <AusdrN1> die letzte verfügbare Clipboard Format-ID angegeben (es folgt also keine weitere), oder ist das Clipboard nicht geöffnet worden, so wird eine 0 zurückgegeben.

Beispiel:

m.Nfmtid = 0

IF OPENCLIP(MAINHWND()) && FoxPro öffnet Clipboard

DO WHILE .T.

m.Nfmtid = ENUMCLIPFM(m.Nfmtid)

IF m.Nfmtid > 0

? m.Nfmtid

?? "  " + GETCLIPFMT(m.Nfmtid)

ELSE

EXIT

ENDIF

ENDDO

= CLOSECLIP()

ELSE

WAIT WINDOW NOWAIT "Clipboard kann nicht geöffnet werden!"

ENDIF


REGCLIPFMT()

Zweck:	Anwenderdefiniertes Format registrieren

Syntax:	REGCLIPFMT(<AusdrZ1>)

Parameter: 	<AusdrZ1> Neuer Formatname

Rückgabe: 	Nummerisch

Vgl.:	ENUMCLIPFM(), ISCLIPFMT(), COUNTCLIP()

Beschreibung:

Mit der Funktion REGCLIPFMT() läßt sich ein neues Format im Clipboard registrieren. Das neu registrierte Format kann dann in darauffolgenden Clipboard-Funktionen als gültiges Format aufgerufen werden. Es erscheint in der Liste der Formate des Clipboards. <AusdrZ> ist eine Zeichenkette, welche den Namen des Formats festlegt.

Der Rückgabewert ist die Format-ID des neuregistrierten Formats. War vorher bereits das gleiche Format registriert (auch durch eine andere Anwendung), wird der Windows-interne Zähler dieses Formats um eins erhöht und es wird die gleiche Format-ID zurückgegeben, wie im Fall der Erstregistrierung. Der Rückgabewert ist 0, wenn das Format nicht registriert werden kann.

Beispiel:

=OPENCLIP(0)	&& Clipboard öffnen

m.Nfmtid = EGCLIPFMT("ECHTZEIT_DV_Systeme") && ID-Wert merken

? m.Nfmtid

=CLOSECLIP()


SETCLIPDAT()

Zweck:	Schreiben von Daten ins Clipboard.

Syntax:	SETCLIPDAT(<AusdrN1>,<AusdrZ1>)

Parameter:	<AusdrN1> Datentyp-ID	<AusdrZ1> Datenwerte (in FoxPro immer Text!)

Rückgabe: 	Logisch

Vgl.:	OPENCLIP(), CLOSECLIP()

Beschreibung:

Mit Hilfe der Funktion SETCLIPDAT() lassen sich Daten ins Clipboard schreiben. In <AusdrN1> wird die Typ-ID übergeben (siehe dazu auch Funktion GETCLIPDAT()) und in <AusdrZ1> die Textdaten selbst. Dieser Weg sieht zwar genial aus, läßt sich aber mit STORE m.Ctext TO _CLIPTEXT viel eleganter lösen! Ist die Aktion erfolgreich, wird .T. zurückgegeben.

Beispiel:

=OPENCLIP(0) && Clipboard öffnen

= SETCLIPDAT(1,"ECHTZEIT_DV_Systeme")  && Text ins Clipboard schreiben=CLOSECLIP()


EMPTYCLIP()

Zweck:	Löschen des Clipboards

Syntax:	EMPTYCLIP()

Parameter: 	keine

Rückgabe: 	Logisch

Vgl.:	OPENCLIP(), CLOSECLIP()

Beschreibung:

Die Funktion EMPTYCLIP leert das Clipboard und setzt die Handles zu den Daten im Clipboard frei. Das Clipboard muß vor Ausführung dieser Funktion geöffnet werden! Ist das Löschen erfolgreich, wird ein .T. zurückgegeben, sonst ein .F..

Beispiel:

? EMPTYCLIP() &&gibt> <.T.> zurück, wenn erfolgreich.


COUNTCLIPF()
COUNTCLIPF()	fehlerhafte Funktion

Zweck:	Holen der Anzahl verschiedener Formate im Clipboard.

Syntax:	COUNTCLIPF()

Parameter: 	keine

Rückgabe: 	Nummerisch

Vgl.:	OPENCLIP(), CLOSECLIP()

Beschreibung:

Die Funktion COUNTCLIPF() sollte eigentlich die Anzahl der momentan im Clipboard vorhandenen, verschiedenen Datenformate zurückgeben - analog zur <CountClipboardFormats>-Funktion des WIN-API´s. Leider erhält man immer den Wert 0! Als Workaround können Sie das Programmbeispiel der ENUMCLIPFM()-Funktion um einen Schleifenzähler ergänzen, der Ihnen die Anzahl zurückgeben kann.

Beispiel:

* COUNTCLIPF()-Funktionsersatz

STORE 0 TO m.NfmtId, m.NfmtCount

= OPENCLIP(MAINHWND()) && FoxPro öffnet Clipboard

DO WHILE .T.

m.Nfmtid = ENUMCLIPFM(m.Nfmtid)

IF m.Nfmtid > 0

? m.Nfmtid

?? "  " + GETCLIPFMT(m.Nfmtid)

m.NfmtCount = m.NfmtCount+1

ELSE

EXIT

ENDIF

ENDDO

= CLOSECLIP()

RETURN m.NfmtCount


OPENCLIP()

Zweck:	Öffnen (und Sperren) des Clipboards.

Syntax:	OPENCLIP(<AusdrN1>)

Parameter: 	AusdrN1

Rückgabe: 	Logisch

  Vgl.:	CLOSECLIP()

Beschreibung:

Die Funktion OPENCLIP() öffnet das Clipboard. Andere Anwendungen sind nicht mehr in der Lage, das Clipboard zu modifizieren. Dies gilt solange, bis die Funktion CLOSECLIP() aufgerufen und das Clipboard wieder freigegeben wurde. <AusdrN> ist das Handle des (Anwendungs-)Fensters, das der neue Clipboard-Eigentümer ist (0 wird akzeptiert). Ist das Clipboard schon von einer anderen Anwendung geöffnet (und deshalb gesperrt), gibt die Funktion ein .F. zurück. Bei gelungenem Öffnen und Sperren wird ein .T. zurückgegeben. Für die Benutzung fast aller Clip-Funktionen muß vorher das Clipboard geöffnet werden.

Beispiel:

IF OPENCLIP(0) &&Aktion gelungen, hier jetzt Clipboard-Funktionen ausführen...

=CLOSECLIP()

ELSE

WAIT WINDOW NOWAIT "Kann Clipboard nicht öffnen!"

ENDIF


CLOSECLIP()

Zweck:	Schließen (und Freigeben) des Clipboards.

Syntax:	CLOSECLIP()

Parameter: 	keine

Rückgabe: 	Logisch

Vgl.:	OPENCLIP()

Beschreibung:

Schließt das zuvor mit der OPENCLIP()-Funktion geöffnete Clipboard. Rückgabewert ist .T. bei erfolgreichem Schließen, sonst immer .F.!

Beispiel:

? CLOSECLIP() &&gibt> <.T.>, wenn Clipboard geöffnet war und korrekt  geschloßen werden konnte.


Editor

Die Funktionen zur Manipulation von FoxPro-Editorfenstern bringen eine Fülle neuer Einsatzmöglichkeiten! Sie sind vom Funktions- und Leistungsumfang recht komplett, wenn auch nicht immer völlig fehlerfrei. Leider lassen sich diese Fehler nicht zu unserem Vorteil nutzen - es sind halt ganz einfach Fehlfunktionen - trotzdem können Sie die Funktionen bei vorsichtigem (gut geprüften) Einsatz bedenkenlos benutzen!

Als Einsatzgebiete kommen Erweiterungen der Editor-Systemfunktionen in Betracht. Wie wäre es mit Block- markieren, kopieren, verschieben oder ähnlichem? Solche Funktionen müssen Sie nun nicht unbedingt mehr über das Bearbeiten-Menü abarbeiten (Schluß mit KEYBOARD"{CTRL+V}" u.s.w.), weil diese Befehle nun direkt vom Programm aus abgesetzt werden können!

Weiterhin ist folgendes Szenario problemlos realisierbar: Sie schreiben ein spezielles Befehlswort, klicken irgendwo in das Wort und auf Druck der rechten Maustaste kopiert ein Programm dann einen dazu passenden Textbaustein aus einer Routinen-Datenbank direkt in das Editor-Fenster hinein. Nicht schlecht, oder?

Eine abschließende Warnung darf aber nach all den schönen Worten nicht fehlen! Seien Sie bitte äußerst vorsichtig beim Umgang mit den erforderlichen FP-Fenster-Handlen, die Sie als Parameter zur Identifizierung der einzelnen Editor-Sessions übergeben müssen. Ist ein Handle nicht mehr gültig, weil Sie das Editorfenster im interaktiven Modus "per Hand" geschlossen haben, gibt's bei dessen Übergabe "schweren Ärger", denn dann spielt FoxPro im gleichen Augenblick "beleidigte Kuh" (Systemabsturz)!

_EDACTIVE() 	_EDGETPOS() 	_EDREVERT()

_EDCLOSEFI() 	_EDGETSTR() 	_EDSETENV()

_EDCOPY() 	_EDINDENT() 	_EDSETPOS()

_EDCUT() 	_EDINSERT() 	_EDSKIPLIN()

_EDDELETE() 	_EDLASTERR() 	_EDSTOPOS()

_EDGETCHAR() 	_EDOPENFIL() 	_EDSTOSEL()

_EDGETENV() 	_EDPASTE() 	_EDSENDKEY()

_EDGETLNUM() 	_EDPOSINVI() 	_EDSELECT()

_EDGETLPOS() 	_EDREDO() 	_EDUNDO()

_EDUNDOON()


_EDSETPOS()

Zweck:	Positionieren der Schreibmarke.

Syntax:	_EDSETPOS(<AusdrN1>,<AusdrN2>)

Parameter:	<AusdrN1> FP-FensterHandle des Editorfensters	<AusdrN2> Neue Offset-Position der Schreibmarke

Rückgabe: 	Logisch immer .T.

Vgl.:	_EDGETLNUM(), _EDGETCHAR(), _EDGETPOS()

Beschreibung:

Positioniert den Schreib-Cursor im Fenster an die gewünschte Position, evtl. vorher gewählter (markierter) Text wird deselektiert. In <AusdrN1> müssen Sie ein gültiges FoxPro-Fenster-Handle eines Editor-Fensters übergeben. In <AusdrN2> geben Sie die neue Position der Schreibmarke an. Falle: Verwenden Sie in <AusdrN1> niemals ungeprüfte (ungültige) Fensterhandle - ein System-Crash ist Ihnen sonst sicher!

Beispiel:

m.N_wHandle =_EDOPENFIL("E:\TEST.TXT",1) && Editor-Fenster öffnen

IF m.N_wHandle > 0

m.N_EdPos = 10 && Schreibmarke hinter 10. Zeichen ab Textanfang...

= _EdSetPos(m.N_wHandle, m.N_EdPos) && ...setzen.

ENDIF


_EDSKIPLIN()

Zweck:	Offset einer neuen Zeile ermitteln.

Syntax:	_EDSKIPLIN(<AusdrN1>,<AusdrN2>,<AusdrN3>)

Parameter:	<AusdrN1> FP-FensterHandle des Editorfensters	<AusdrN2> Offset-Position der Schreibmarke	<AusdrN3> Zeilenanzahl-Offset (mit Zählbasis <0>)

Rückgabe: 	Nummerisch

Vgl.:	_EDGETCHAR(), _EDSETPOS()

Beschreibung:

Diese Funktion gibt einen neuen Offset-Wert der Schreibmarke vom Textanfang aus gesehen zurück, ohne den Schreib-Cursor wirklich zu bewegen. Die dabei ermittelte Position der Schreibmarke liegt in Spalte 0 der "Zielzeile" (vorm ersten Zeichen der Zeile). Geben Sie in <AusdrN1> das FP-FensterHandle des Editorfensters an. Geben Sie in <AusdrN2> die Ausgangs-Offsetposition der Schreibmarke an (1.Zeile => #0). Geben Sie in <AusdrN3> die Anzahl der Zeilen an, die der Cursor (theoretisch mit Pfeiltasten <rauf> oder <runter>) versetzt werden soll. Die Funktion spielt jetzt folgende Arbeit durch:  Der Cursor wird im Text nach Zeichen <AusdrN2> plaziert und dann <AusdrN3> Zeilen weiter nach unten (oder für negativen <AusdrN3> nach oben) gesetzt und dort in Spalte 0 plaziert.

Abschließend wird die Cursor-Offsetposition ab Textanfang ermittelt, der Cursor wieder an seinen ursprünglichen Platz befördert und die ermittelte Offsetposition zurückgegeben.

Beispiel:

m.N_EdPos = _EDSKIPLIN(m.N_wHandle,0,2) && Offset v. Zeile #3 ermitteln


_EDGETPOS()

Zweck:	Aktuelle Position der Schreibmarke.

Syntax:	_EDGETPOS(<AusdrN1>)

Parameter:	<AusdrN1> FP-FensterHandle des Editorfensters

Rückgabe: 	Nummerisch

 Vgl.:	_EDGETCHAR(), _EDSETPOS()

Beschreibung:

Die Funktion _EDGETPOS() gibt die aktuelle Schreib-Cursorposition im Editor-Fensters zurück. Geben Sie in <AusdrN1> das FP-FensterHandle des Editorfensters an. Sofern Text markiert wurde, zeigt der zurückgegebene Wert nicht auf das Ende der Markierung, sondern stellt den Markierungsanfangspunkt  (Markierungsanker) dar.

Beispiel:

m.N_EdPos = _EDGETPOS(m.N_wHandle) && aktuelle Cursor-Position


_EDGETLPOS()
_EDGETLPOS()	[fehlerhaft!]

Zweck:	Cursor-Offsetposition bis zum 1. Zeichen in Zeile # zurückgeben.

Syntax:	_EDGETLPOS(<AusdrN1>,<AusdrN2>)

Parameter:	<AusdrN1> FP-FensterHandle des Editorfensters	<AusdrN2> Zeilennummer des Editorfensters

Rückgabe: 	Nummerisch

Vgl.:	_EDGETLNUM

Beschreibung: (so müßte es sein)

Die _EDGETLPOS()-Funktion gibt die Cursor-Offsetposition ab Textanfang bis zum ersten Zeichen der in <AusdrN2> übergebenen Zeile zurück. Geben Sie in <AusdrN1> das FP-FensterHandle des Editorfensters an.

Beispiel: (so müßte es gehen)

m.N_EdPos = _EDGETLPOS(m.N_wHandle,9) && Positions-Offset von Zeile 9

So sollte es eigentlich gehen - Es wird aber immer nur der Fehler "Datentyp stimmt nicht überein" erzeugt!


_EDGETLNUM()
_EDGETLNUM()	[fehlerhaft!]

Zweck:	Zeilennummer von Cursorposition zurückgeben.

Syntax:	_EDGETLNUM(<AusdrN1>,<AusdrN2>)

Parameter:	<AusdrN1> FP-FensterHandle des Editorfensters	<AusdrN2> Cursor-Offsetposition

Rückgabe: 	Nummerisch

Vgl.:	_EDGETCHAR(), _EDGETLPOS()

Beschreibung: (so müßte es sein)

Die _EDGETLNUM()-Funktion gibt die in <AusdrN2> übergebene Cursor-Offsetposition ab Textanfang die aktuelle Zeilennummer zurück. Geben Sie in <AusdrN1> das FP-FensterHandle des Editorfensters an.

Beispiel: (so müßte es gehen)

m.N_EdLine = _EDGETLNUM(m.N_wHandle,m.N_EdPos) && Zeilennummer für <m.N_EdPos>- Positions-Offset

So sollte es eigentlich gehen - Es wird aber immer nur der Fehler "Datentyp stimmt nicht überein" erzeugt!


_EDPOSINVI()

Zweck:	Ist Cursor-Position sichtbar?

Syntax:	_EDPOSINVI(<AusdrN1>,<AusdrN2>)

Parameter:	<AusdrN1> FP-FensterHandle des Editorfensters	<AusdrN2> Gewünschte Cursor-Offsetposition

Rückgabe: 	Logisch

Vgl.:	_EDGETPOS(), _EDSTOPOS()

Beschreibung:

Die _EDPOSINVI()-Funktion gibt für die in <AusdrN2> übergebene Cursor-Offsetposition den "Sichtbarkeits-Status" für die Schreibmarke zurück. Dies ist der Wert .T., wenn die gewünschte Position im angegebenen Editierfenster sichtbar ist und .F., wenn nicht. Geben Sie in <AusdrN1> das FP-FensterHandle des Editorfensters an.

Beispiel:

IF NOT _EDPOSINVI(m.N_wHandle,_EDGETPOS(m.N_wHandle)) && wenn nicht sichtbar...

   =_EDSTOPOS(m.N_wHandle,_EDGETPOS(m.N_wHandle),.F.) && ...dann scrollen

ENDIF


_EDSTOPOS()

Zweck:	Editor-Fensterinhalt scrollen.

Syntax:	_EDSTOPOS(<AusdrN1>,<AusdrN2>,<AusdrL1>)

Parameter:	<AusdrN1> FP-FensterHandle des Editorfensters	<AusdrN2> Gewünschte Cursor-Offsetposition	<AusdrL1> Zentrieren?

Rückgabe: 	Logisch immer .T.

Vgl.:	_EDPOSINVI()

Beschreibung:

Diese Funktion stellt sicher, daß die gewünschte Position im gewählten Editierfenster sichtbar ist. Hierbei wird die aktuelle Cursorposition nicht verändert. Eine vertikale Zentrierung ist möglich, wenn man für <AusdrL1> den Wert .T. einsetzt. Falls dies nicht geschehen soll, wird hier ein .F. übergeben. Geben Sie in <AusdrN1> das FP-FensterHandle des Editorfensters an und in <AusdrN2> die sichtbar zu machende Position im Text.

Beispiel:

IF NOT _EDPOSINVI(m.N_wHandle,m.N_EdPos) &&unsichtbare Position

=_EDSTOPOS(m.N_wHandle,m.N_EdPos,.F.) && Scrollen nicht Zentrier.

ENDIF


_EDSTOSEL()

Zweck:	Editor-Fensterinhalt scrollen.

Syntax:	_EDSTOSEL(<AusdrN1>,<AusdrN2>)

Parameter:	<AusdrN1> FP-FensterHandle des Editorfensters	<AusdrL1> Zentrieren?

Rückgabe: 	Logisch immer .T.

Vgl.:	_EDSTOPOS()

Beschreibung:

Diese Funktion stellt sicher, daß ein selektierter (markierter) Bereich im gewählten Editierfenster sichtbar ist. Hierbei wird die aktuelle Markierung nicht verändert. Eine vertikale Zentrierung ist möglich, wenn man für <AusdrL1>  den Wert .T. einsetzt. Falls dies nicht geschehen soll, wird hier ein .F. übergeben. Geben Sie in <AusdrN1> das FP-FensterHandle des Editorfensters an.

Beispiel:

IF NOT _EDPOSINVI(m.N_wHandle) &&unsichtbare Selektion

=_EDSTOSEL(m.N_wHandle,.T.) && Scrollen und zentrieren

ENDIF


_EDINSERT()

Zweck:	Text in Editor-Fenster plazieren.

Syntax:	_EDINSERT(<AusdrN1>,<AusdrZ1>,<AusdrN2>)

Parameter:	<AusdrN1> FP-FensterHandle des Editorfensters

<AusdrZ1> Text

<AusdrN2> Länge des Textes

Rückgabe:  	Logisch immer .T.

Vgl.:	_EDGETPOS(), _EDSETPOS()

Beschreibung:

Fügt an der Cursor-Position den in <AusdrZ1> übergebenen Text ein. In <AusdrN2> wird die Länge des einzufügenden Textes übergeben. Geben Sie in <AusdrN1> das FP-FensterHandle des Editorfensters an.

Beispiel:

m.C_Text = "TEST"

= _EDINSERT(m.N_wHandle,m.C_Text,LEN(m.C_Text))


_EDSENDKEY()

Zweck:	Zeichen an Editor-Fenster abschicken.

Syntax:	_EDSENDKEY(<AusdrN1>,<AusdrN2>)

Parameter:	<AusdrN1> FP-FensterHandle des Editorfensters	<AusdrN2> Zeichen als Int-Zahl

Rückgabe: 	Logisch immer .T.

Vgl.:	_EDINSERT()

Beschreibung:

Übergibt das durch <AusdrN2> festgelegte ANSI-/ASCII-Zeichen dem Editor-Fenster. Alle nicht "interpretierberen" Zeichenwerte (Steuerzeichen) werden im Editor als Kästchen dargestellt. Geben Sie in <AusdrN1> das FP-FensterHandle des Editorfensters an.

Beispiel:

= _EDsendkey(m.N_wHandle,33) && sendet > ! < an Editor-Fenster


_EDDELETE()

Zweck:	Zeichen löschen.

Syntax:	_EDDELETE(<AusdrN1>)

Parameter:	<AusdrN1> FP-FensterHandle des Editorfensters

Rückgabe: 	Logisch

Vgl.:	_EDSELECT(), _EDSETPOS()

Beschreibung:

Löscht den markierten Bereich im Editor-Fenster. Ist nichts gewählt (markiert), dann wird auch nichts gelöscht. Geben Sie in <AusdrN1> das FP-FensterHandle des Editorfensters an.

Beispiel:

= _EDDELETE(m.N_wHandle) && löscht markierten Bereich


_EDGETCHAR()

Zweck:	Zeichen an Cursor-Offsetposition holen.

Syntax:	_EDGETCHAR(<AusdrN1>,<AusdrN2>)

Parameter:	<AusdrN1> FP-FensterHandle des Editorfensters	<AusdrN1> Leseposition (mit Zählbasis <0>)

Rückgabe: 	Zeichen

Vgl.:	_EDGETPOS(), _EDSETPOS()

Beschreibung:

Ermittelt das an der in <AusdrN2> übergebenen Position stehende Zeichen und gibt es als Buchstabe zurück. Dabei wird bei Null beginnend gezählt (erstes Zeichen ist also Zeichen #0). Die Zeilenende-Zeichen (CHR(13) +CHR(10)) werden mitgezählt!

ACHTUNG: gelangen Sie durch Übergabe von zu großem <AusdrN2> über das Dateiende hinaus, gibt die Funktion kontinuierlich das Leerzeichen (CHR(32)) zurück.

Beispiel:

? _EDGETCHAR(m.N_wHandle,0) && erstes Zeichen holen und ausgeben


_EDGETSTR()

Zweck:	Zeichenkette zwischen Cursor-Offsetpositionen holen.

Syntax:	_EDGETSTR(<AusdrN1>,<AusdrN2>,<AusdrN3>)

Parameter:	<AusdrN1> FP-FensterHandle des EditorfenstersRückgabe: 	Zeichen

Vgl.:	_EDGETCHAR()

Beschreibung:

Geben Sie in <AusdrN1> das FP-FensterHandle des Editorfensters an. Die Funktion _EDGETSTR() gibt den String von Offset-Position <AusdrN2> bis Offset-Position <AusdN3> einschließlich der Buchstaben an den Endpunkten zurück

Beispiel:

m.N_wHandle =_EDOPENFIL("TEST.TXT",1) && Datei öffnen

m.N_Edstart = 10 && vom einschl. 10. Zeichen ab Textanfang...

m.N_Edend = 20 && ... bis einschl. 20. Zeichen ab Textanfang...

? _EDGETSTR(m.N_wHandle,m.N_Edstart,m.N_Edend) && ...zurückgeben


_EDINDENT()

Zweck:	Zeile ein-/ ausrücken.

Syntax:	_EDINDENT(<AusdrN1>,<AusdrN2>)

Parameter:	<AusdrN1> FP-FensterHandle des Editorfensters	<AusdrN1> Anzahl der Tabstops

Rückgabe: 	Logisch

Vgl.:	_EDGETLNUM(), _EDGETLPOS(), _EDGETPOS(), _EDSETPOS()

Beschreibung:

Mittels dieser Funkton läßt sich die aktuelle Zeile (in der der Cursor steht) im Editierfenster um die festgelegte Anzahl von Tabstops einrücken. Durch Angabe eines negativen Werts in <AusdrN2> kann auch eine entsprechende Anzahl von Tabstops ausgerückt werden. Geben Sie in <AusdrN1> das FP-FensterHandle des Editorfensters an.

Beispiel:

=_EDINDENT(m.N_wHandle,2) && markierten Text 2 Tabs einrücken

=_EDINDENT(m.N_wHandle,-3) && markierten Text  3 Tabs ausrücken


_EDSELECT()

Zweck:	Textbereich zwischen Cursor-Offsetpositionen markieren.

Syntax:	_EDSELECT(<AusdrN1>,<AusdrN2>,<AusdrN3>)

Parameter:	<AusdrN1> FP-FensterHandle des Editorfensters	<AusdrN1> Start-Offsetposition (eingeschlossen)	<AusdrN1> Ende-Offsetposition (eingeschlossen)

Rückgabe: 	Logisch

Vgl.:	_EDCOPY(), _EDCUT(), _EDPASTE()

Beschreibung:

Hiermit wird der Textbereich zwischen <AusdrN2> und <AusdrN3> einschließlich dieser beiden Positionen selektiert (markiert). Geben Sie in <AusdrN1> das FP-FensterHandle des Editorfensters an.

Beispiel:

m.N_wHandle =_EDOPENFIL("TEST.TXT",1) && Datei öffnen

m.N_Edstart =  _EDSKIPLIN(m.N_wHandle,0,1) && Start-Offset von Zeile 2

m.N_Edend =  _EDSKIPLIN(m.N_wHandle,0,4) && Ende-Offset von Zeile 4

= _EDSELECT(m.N_wHandle,m.N_Edstart,m.N_Edend) && ...markieren


_EDCOPY()

Zweck:	Markierten Text ins Clipboard kopieren.

Syntax:	_EDCOPY(<AusdrN1>)

Parameter:	<AusdrN1> FP-FensterHandle des Editorfensters

Rückgabe: 	Logisch

Vgl.:	_EDSETPOS(), _EDSELECT(), _EDCUT(), _EDPASTE()

Beschreibung:

Kopiert den gewählten Teil der Datei im angegebenen Editierfenster ins Clipboard. Das Clipboard braucht dabei nicht geöffnet zu werden! Geben Sie in <AusdrN1> das FP-FensterHandle des Editorfensters an.

Beispiel:

* Ersten 10 Zeilen ins Clipboard kopieren

m.N_wHandle =_EDOPENFIL("TEST.TXT",1) && Datei öffnen

m.N_Edstart =  _EDSKIPLIN(m.N_wHandle,0,0) && Start-Offset von Zeile 1

m.N_Edend =  _EDSKIPLIN(m.N_wHandle,0,10) && Ende-Offset von Zeile 10

= _EDSELECT(m.N_wHandle,m.N_Edstart,m.N_Edend) && ...markieren

= _EDCOPY(m.N_wHandle)


_EDCUT()

Zweck:	Markierten Text ins Clipboard verschieben.

Syntax:	_EDCUT(<AusdrN1>)

Parameter:	<AusdrN1> FP-FensterHandle des Editorfensters

Rückgabe: 	Logisch

Vgl.:	_EDSETPOS(), _EDSELECT(), _EDCOPY(), _EDPASTE()

Beschreibung:

Verschiebt den gewählten Teil der Datei im angegebenen Editierfenster ins Clipboard. Das Clipboard braucht dabei nicht geöffnet zu werden! Geben Sie in <AusdrN1> das FP-FensterHandle des Editorfensters an.

Beispiel:

* Ersten 10 Zeilen ins Clipboard kopieren und dann löschen

m.N_wHandle =_EDOPENFIL("TEST.TXT",1) && Datei öffnen

m.N_Edstart =  _EDSKIPLIN(m.N_wHandle,0,0) && Start-Offset von Zeile 1

m.N_Edend =  _EDSKIPLIN(m.N_wHandle,0,10) && Ende-Offset von Zeile 10

= _EDSELECT(m.N_wHandle,m.N_Edstart,m.N_Edend) && ...markieren

= _EDCUT(m.N_wHandle)


_EDPASTE()

Zweck:	Daten aus Clipboard einfügen.

Syntax:	_EDPASTE(<AusdrN1>)

Parameter:	<AusdrN1> FP-FensterHandle des Editorfensters

Rückgabe: 	Logisch

Vgl.:	_EDSETPOS(), _EDSELECT(), _EDCOPY(), _EDCUT()

Beschreibung:

Kopiert den Inhalt des Clipboards an die aktuelle Einfügestelle der Datei im angegebenen Editierfenster. Das Clipboard braucht dabei nicht geöffnet zu werden! Geben Sie in <AusdrN1> das FP-FensterHandle des Editorfensters an.

Beispiel:

m.N_wHandle =_EDOPENFIL("TEST.TXT",1) && Datei öffnen.

m.N_EdPos = 10 && Schreibmarke hinter 10. Zeichen ab Textanfang...

= _EdSetPos(m.N_wHandle, m.N_EdPos) && ...setzen und dann...

= _EDPASTE(m.N_wHandle)	&& ...Daten aus Clipboard einfügen.


_EDUNDO()

Zweck:	Rückgängig machen.

Syntax:	_EDUNDO(<AusdrN1>)

Parameter:	<AusdrN1> FP-FensterHandle des Editorfensters

Rückgabe: 	Logisch

Vgl.:	_EDUNDOON(), _EDREDO()

Beschreibung:

Macht die letzte Änderung der Datei im angegebenen Editierfenster rückgängig. Werden von einem Benutzer Änderungen an einer Datei vorgenommen, so werden diese in einem Buffer festgehalten. Diese Funktion kann mehrfach hintereinander eingesetzt werden, womit man mehrere nacheinander erfolgte Änderungen rückgängig machen kann. Änderungen, die vor der Verwendung der Sichern-Aktion (aus Datei-Menü) stattgefunden haben, können nicht mehr rückgängig gemacht werden. Geben Sie in <AusdrN1> das FP-FensterHandle des Editorfensters an, in dem Sie das Rückgängigmachen aktivieren wollen.

Beispiel:

= _EDUNDO(m.N_wHandle)


_EDREDO()

Zweck:	Wiederholen von "rückgängig".

Syntax:	_EDREDO(<AusdrN1>)

Parameter:	<AusdrN1> FP-FensterHandle des Editorfensters

Rückgabe: 	Logisch

Vgl.:	_EDUNDOON(), _EDUNDO()

Beschreibung:

Wurde eine Änderung an der Datei im angegebenen Editierfenster mittels der Funktion _EdUndo() rückgängig gemacht, so kann sie mittels der Funktion _EdRedo() erneut vorgenommen werden. Geben Sie in <AusdrN1> das FP-FensterHandle des Editorfensters an, in dem Sie das "Wiederholen" aktivieren wollen.

Beispiel:

= _EDREDO(m.N_wHandle)


_EDUNDOON()

Zweck:	Gruppieren von Editor-Aktionen für Rückgängigmachen.

Syntax:	_EDUNDOON(<AusdrN1>,<AusdrL1>)

Parameter:	<AusdrN1> FP-FensterHandle des Editorfensters	<AusdrL1> Gruppenstart / Ende Schalter

Rückgabe: 	Logisch

Vgl.:	_EDREDO(), _EDUNDO()

Beschreibung:

Macht es möglich, eine Reihe von Editieraktionen als Gruppe zu betrachten, auf die die Funktionen _EdUndo() bzw. _EdRedo() angewendet werden können. Nachdem für den Gruppierungsparameter <AusdrL1> FALSE eingegeben oder ein _EdUndo() verwendet wurde, werden alle weiteren Aktionen nicht mehr als Teil der Gruppe betrachtet. Geben Sie in <AusdrN1> das FP-FensterHandle des Editorfensters an, in dem Sie die Gruppierung ein/ausschalten wollen.

Beispiel:

m.N_wHandle =_EDOPENFIL("TEST.TXT",1) && Datei öffnen

=_EDUNDOON(m.N_wHandle,.T.) && UNDO-Gruppierung einschalten

= _EDINSERT(m.N_wHandle,"TEST",4) && Wort einfügen

= _EDSENDKEY(m.N_wHandle,13) && nächste Zeile

= _EDINSERT(m.N_wHandle,"NEUER TEXT",10)&& zwei Worte einfügen

= _EDSENDKEY(m.N_wHandle,13) && nächste Zeile

= _EDSETPOS(m.N_wHandle,1) && Cursor in Zeile #1

= _EDINDENT(m.N_wHandle,1) && Zeile einrücken

?_EDUNDOON(m.N_wHandle,.F.) && UNDO-Gruppierung ausschalten

WAIT WINDOW "Taste drücken, um Aktion zurückzunehmen (UNDO)"

= _EDUNDO(m.N_wHandle)


_EDACTIVE()

Zweck:	Anzeigen oder Verstecken des Cursors / Selektion.

Syntax:	_EDACTIVE(<AusdrN1><AusdrL1>)

Parameter:	<AusdrN1> FP-FensterHandle des Editorfensters	<AusdrN1> Hide/Show Auswahl

Rückgabe: 	Logisch

Vgl.:	_EDSELECT()

Beschreibung:

Diese Funktion ermöglicht es, einen gewählten Bereich anzuzeigen oder zu verstecken. Wird für <AusdrL1> TRUE eingesetzt, so ist der gewählte Bereich oder die Einfügestelle im angegebenen Fenster aktiviert. Eine Deaktivierung erfolgt durch Übergabe von FALSE. Geben Sie in <AusdrN1> das FP-FensterHandle des Editorfensters an, in dem Sie den Cursor anzeigen/verstecken wollen.

Beispiel:

=_EDACTIVE(m.N_wHandle, .T.) && Cursor (oder Selektion) anzeigen


_EDLASTERR()

Zweck:	Fehlernummer eines schweren Editor-Funktionsfehlers.

Syntax:	_EDLASTERR(<AusdrN1>)

Parameter:	<AusdrN1> FP-FensterHandle des Editorfensters

Rückgabe: 	Nummerisch

Vgl.:	_EDGETENV(), _EDSETENV()

Beschreibung:

Die Funktion gibt die Fehlernummer des zuletzt aufgetretenen Editierfehlers im entsprechenden Fenster an. Geben Sie in <AusdrN1> das FP-FensterHandle des Editorfensters an, in dem Sie nach einen aufgetretenen Fehler suchen wollen. Wenn die letzte Aktion im Editorfenster ohne Fehler ausgeführt worden ist, gibt _EDLASTERR() den Wert <0> zurück! Hinweis: Da Editor-Fehlernummern > 0 nur nach schwerwiegenden Systemfehlern zurückgegeben werden, wie z.B. "Low Memory" oder "Out of Handles", können Sie eine Nachprüfung Ihrer ausgeführten Editor-Aktionen mittels der _EDLASTERR()-Funktion meistens vernachlässigen - es sei Ihnen verziehen.

 Beispiel:

m.N_wHandle =_EDOPENFIL("TEST.TXT",1) && z.B. leere Datei öffnen

= _EDSETPOS(m.N_wHandle,100) && Cursor hier (weit) hinter Dateiende

? _EDLASTERR(m.N_wHandle) && gibt <0> zurück, da kein schwerer Fehler


_EDGETENV()

Zweck:	Holen der Editor-Umgebung.

Syntax:	_EDGETENV(<AusdrN1>,<@ARRAY>)

Parameter:	<AusdrN1> FP-FensterHandle des Editorfensters

<@ARRAY> Umgebungsinfo-Array: eindimensional 25ig-zeilig

Rückgabe: 	Nummerisch

Vgl.:	_EDSETENV(), _EDLASTERR()

Beschreibung:

Diese Funktion holt die systeminternen Informationen, die FoxPro zu jedem geöffneten Editor-Fenster in einer Struktur ablegt und setzt diese in das per Referenz übergebene Array ein. Dieses Array muß eindimensional mit 25 Zeilen vordefiniert an die Funktion als <@Array> übergeben werden, ansonsten wird die Fehlermeldung "Array argument not of proper size" erzeugt! Geben Sie in <AusdrN1> das FP-FensterHandle des Editorfensters an, dessen Umgebungsinformationen Sie in das Array stellen wollen. Die Elemente des Arrays werden von der Funktion entsprechend initialisiert und gefüllt. Ist die Funktion erfolgreich, wird der Wert 1 zurückgegeben und die Arrayelemente können ausgewertet werden. Die meisten Elemente dürfen von Ihnen nicht verändert werden, da Sie für Sie "read only" sind. In der nachfolgenden Tabelle sind diese Elemente mit einem "R" gekennzeichnet:

Tabelle eines Editor-Environment Arrays:

Ele:=Inhalt	Typ/ro/Bemerkung

[1]:= Dateiname	C /R/ Maximal 130 Zeichen

[2]:= Zeichenanzahl	N /R/ Anzahl Bytes im Text

[3]:= Längenbegrenzung	N /R/ 0 = unendlich

[4]:= Dirty-Flag	N /-/ Wurde Inhalt geändert?, dann = 1, sonst = 0

[5]:= Auto-Indent	N /-/ Automatisch Einrücken?, dann = 1, sonst = 0

[6]:= BackUp	N /-/ BackUp-Datei erstellen?, dann = 1, sonst = 0

[7]:= AddLineFeeds	N /-/ Mit Zeilenvorschub sichern?, dann = 1, sonst = 0

[8]:= AutoCompile	N /-/ Automatisch Kompilieren?, dann = 1, sonst = 0

[9]:= AddCtrlZ	N /-/ Ctrl-Z an Datei anhängen?, dann = 1, sonst = 0

[10]:= SavePrefs	N /-/ Voreinstellungen speichern?, dann = 1, sonst = 0

[11]:= DragAndDrop	N /-/ Mouse-Drag&Drop erlauben?, dann = 1, sonst = 0

[12]:= ReadOnly	N /R/ ReadOnly- (r/o) Status: 0 = Datei nicht r/o

[13]:= Status	N /-/ Statuszeile anzeigen?, dann = 1, sonst = 0

[14]:= LockPrefs	N /-/ Voreinst. updatebar?, dann = 1, sonst = 0

[15]:= InsertMode	N /-/ Einfügen?, dann = 1, Überschreiben = 0

[16]:= WrapMode	N /-/ Wenn kleiner als 0, dann keinen Zeilenumbruch

[17]:= SelektionStart	N /R/ Start des markierten (selektierten) Textes

[18]:= SelektionEnde	N /R/ Ende des markierten (selektierten) Textes

[19]:= SelektionAnker	N /R/ CursorPos (Verankerung der Selektion)

[20]:= JustierungsMode	N /-/ Art der Text-Bündigkeit:

0 = linksbündig

1 = rechtsbündig

2 = zentriert

[21]:= Tabulatorbreite	N /-/ TAB-Sprungweite in # Leerzeichen

[22]:= Font-Name	C /-/ Maximal 64 Zeichen

[23]:= Font-Größe	N /-/ Texteditor- Zeichengröße

[24]:= Font-Stil	N /-/ Texteditor- Zeichenstil

0 = Normal

1 = Fett

2 = Kursiv

3 = Kursiv Fett

[25]:= EditorSession	N /R/ Art der gerade editierten Datei:

1 = PRG - Programm

2 = TXT - Dokument

Beispiel:

m.N_wHandle =_EDOPENFIL("TEST.PRG",1) && Datei öffnen

DIMENSION a_EdEnv[25]

?_EDGETENV(m.N_wHandle,@a_EdEnv)

CLEAR

DISPLAY MEMORY LIKE a_EdEnv


_EDSETENV()

Zweck:	Schreiben in die Editor-Umgebung.

Syntax:	_EDSETENV(<AusdrN1>,<@ARRAY>)

Parameter:	<AusdrN1> FP-FensterHandle des Editorfensters	<@ARRAY> Umgebungsinfo-Array

Rückgabe: 	Nummerisch

Vgl.:	_EDGETENV(), _EDLASTERR()

Beschreibung:

Diese Funktion legt über das <@ARRAY> - Umgebungsinfo-Array Informationen zur Editierumgebung fest. Die Strukturbeschreibung des <@ARRAY> finden Sie unter _EDGETENV(). Geben Sie in <AusdrN1> das FP-FensterHandle des Editorfensters an, dessen Umgebung Sie verändern (beeinflussen) wollen. Wichtig: Bevor Sie diese Funktion aufrufen, müssen Sie das entsprechende Array dimensioniert und mit der analog aufzurufenden Funktion _EDGETENV() initialisiert haben. Ändern Sie dann zuerst die Arrayeinträge die nicht "ReadOnly" sind nach Ihren Wünschen ab und rufen Sie abschließend die Funktion _EDSETENV() auf, um die Änderungen wirksam werden zu lassen. Wichtig: Der Einfügen/Überscheiben - Modus wird systemweit geändert und nicht nur für das in <AusdrN1> referenzierte Editorfenster! Falle: Achten Sie peinlichst genau auf die korrekten Wertebereiche (nur 1 und 0, oder größere Werte möglich?) in den Array-Zeilen - ein System-Crash ist Ihnen sonst ziemlich sicher!

Beispiel:

m.N_wHandle =_EDOPENFIL("TEST.PRG",1) && Datei öffnen

DIMENSION a_EdEnv[25] && Array dimensionieren

= _EDGETENV(m.N_wHandle,@a_EdEnv) && Umgebung holen

* jetzt ändern wir die Größe der Tabstops auf 6 Leerzeichen

a_EdEnv[21] = 6

* und noch den Einfügemodus systemweit in den Überschreiben-Modus wechseln

a_EdEnv[15] = 0

* und noch die Statuszeile ausschalten

a_EdEnv[13] = 0

* und zur Krönung noch das SystemPulldown Bearbeiten-Voreinstellungen

* disablen >  "LockPrefs" nicht mehr updatebar!

a_EdEnv[14] = 0

= _EDSETENV(m.N_wHandle,@a_EdEnv) && Umgebung schreiben


_EDOPENFIL()

Zweck:	Öffnet eine Datei in einem Editor-Fenster.

Syntax:	_EDOPENFIL(<AusdrZ1><AusdrN1>)

Parameter:	<AusdrZ1> Dateiname	<AusdrN1> Editier-Modus

Rückgabe: 	Nummerisch

Vgl.:	_EDCLOSEFI(), _EDREVERT()

Beschreibung:

Öffnet die in <AusdrZ1> festgelegte Datei in einem neuen Editor-Fenster, so daß ein Editiervorgang begonnen werden kann. Folgende Optionen stehen für den Bearbeitungsmodus, der in <AusdrN1> kodiert übergeben werden muß zur Verfügung:

#define FO_READONLY	0

#define FO_WRITEONLY	1

#define FO_READWRITE 2

Die Funktion gibt Ihnen bei Erfolg das FP-FensterHandle des neuen Editor-Fensters zurück.

Beispiel:

m.C_Fname = GETFILE("*.*","Datei ansehen","Öffnen")

m.N_FP_Whdl = _EDOPENFIL(m.C_Fname,0) && schreibgeschützt


_EDCLOSEFI()

Zweck:	Schließen einer Editor-Session.

Syntax:	_EDCLOSEFI(<AusdrN1><AusdrN2>)

Parameter:	<AusdrN1> FP-FensterHandle des Editorfensters	<AusdrN2> Schließen-Modus

Rückgabe: 	Nummerisch

Vgl.:	_EDOPENFIL(), _EDREVERT()

Beschreibung:

Schließt sowohl das in <AusdrN1> referenzierte  Editierfenster als auch die im Fenster angezeigte Datei. Der Optionsparameter, der in <AusdrN2> übergeben wird, kann wie folgt gesetzt werden:

<AusdrN2> = 0 : Speichert sofort.

<AusdrN2> = 1 : Speichert nach Bestätigung in Dialogbox. (Bestätigung nur, wenn Änderungen vorgenommen wurden)

<AusdrN2> = 2 : Öffnet Dialogbox "Speichern Unter..." Es wird einer der folgenden Werte zurückgegeben:

Returnwert = 1 : Anwenderabbruch ohne Speichern.

Returnwert = 2 : Anwender hat Datei gespeichert und geschlossen.

Returnwert = 3 : Anwender hat Änderungen verworfen, Datei geschlossen.

Beispiel:

ON KEY LABEL "F12" STORE _EDCLOSEFIL(m.N_FP_Whdl,1) TO m.N_Close


_EDREVERT()

Zweck:	Datei: "Letzte Fassung" wiederherstellen.

Syntax:	_EDREVERT(<AusdrN1>)

Parameter:	<AusdrN1> FP-FensterHandle des Editorfensters

Rückgabe: 	Logisch

Vgl.:	_EDUNDO(), _EDUNDOON(), _EDREDO()

Beschreibung:

Verwirft alle am Editor-Text gemachten Änderungen, die nach der letzten Abspeicherung über das Datei-Pulldownmenü: "Speichern" vorgenommen wurden. Im FoxPro Library Construction Kit gibt es noch eine API-Funktion mit Namen _EDSAVE(), die diese Zwischenspeicherung á la Systempulldownmenü "Datei.Speichern" vornehmen kann. Aus unerklärlichen Gründen wurde diese Funktion aber nicht in die FOXTOOLS.FLL-Bibliothek mit aufgenommen - schade !

Beispiel:

m.N_wHandle =_EDOPENFIL("TEST1.PRG",1) && Datei öffnen

m.C_Text = "TEST für die Funktion"+CHR(13)

= _EDINSERT(m.N_wHandle,m.C_Text,LEN(m.C_Text))

m.C_Text = "_EDREVERT()"+CHR(13)

= _EDINSERT(m.N_wHandle,m.C_Text,LEN(m.C_Text))

WAIT WINDOW "Taste drücken für _EDREVERT()"

= _EDrevert(m.N_wHandle) && alle Änderungen verwerfen


Fenster

Die größte Funktionsgruppe beinhaltet die Aufrufe für Fenstermanipulationen. Hierbei müssen Sie in sehr vielen Fällen zwischen zeichenorientierten und pixelorientierten Funktionen unterscheiden, denn anders als in FoxPro´s xBase-Dialekt, akzeptieren die Fenster-Funktionen bei Koordinatenangaben allesamt nur ganzzahlige Werte. Damit die Fenster unter Windows pixelgenau plaziert werden können, verfügt das FoxPro-API über spezielle Funktionen, die ihre Koordinatenparameter in Pixeleinheiten erwarten! Zu diesen Windows-typischen Funktionen gibt es dann immer die entsprechende zeichenorientierte Variante, die natürlich auch eingesetzt werden kann. Hier ist dann aber immer nur eine Positionierung "auf dem nächsten ganzen Zeichen" des aktuell verwendeten Fonts möglich (ist also ungenauer)! Diese "Zweigleisigkeit" der Funktionen wird unter FoxPro´s xBase-Sprache durch Verwendung von Koordinaten mit Nachkommastellen umgangen.

Weiterhin wird die Farbverwaltung der Fenster in FPW fast gänzlich von Windows selbst übernommen, woduch einige FOXTOOLS.FLL-Funktionen unter Windows nicht recht funktionieren wollen. Ich habe, mangels tieferer Einsicht in die Programmierung der aktuellen Foxtools-Bibliothek, die entsprechenden Funktionen als "teilweise fehlerhaft" markiert. Bitte lesen Sie meine Ausführungen an den entsprechenden Stellen.

Die mit diesen Routinen erzeugten Fenster haben einige interessante Eigenschaften, die Sie wirklich nutzbringend einsetzen können:

Da Sie die Erzeugung der Fenster mehr oder weniger an FoxPro´s Fensterverwaltung "vorbei" vornehmen, erscheinen diese auch nicht im Fenster-Menü, sind nicht mit CLEAR ALL zu löschen und verhalten sich auch sonst wie "waschechte" Systemfenster! Eine prima Gelegenheit gleich einmal eine Symbolleiste zu realisieren, die in FoxPro integriert werden kann!

_FINDWINDO() 	_WHIDE() 	_WSCROLL()

_FINDWINDP() 	_WHTOHWND() 	_WSCROLLP()

_GETWRECT() 	_WLEFT() 	_WSHOW()

_WATTR() 	_WLEFTP() 	_WSETPORT()

_WBOTTOM() 	_WMAINWIND() 	_WSELECT()

_WBOTTOMP() 	_WMOVE() 	_WSENDBEHI()

_WCLOSE() 	_WMOVEP() 	_WSIZE()

_WCLEAR() 	_WONTOP() 	_WSIZEP()

_WCLEARREC() 	_WOPEN() 	_WSETATTR()

_WCLEARRECP() 	_WOPENP() 	_WSETTITLE()

_WFINDTITL() 	_WPUTCHR() 	_WTITLE()

_WGETPORT() 	_WPUTSTR() 	_WTOP()

_WGETCURSO() 	_WPOSCURSO() 	_WWIDTH()

_WGETCURP() 	_WPOSCURP() 	_WWIDTHP()

_WHEIGHT() 	_WRIGHT() 	_WZOOM()

_WHEIGHTP() 	_WRIGHTP() 	MAINHWND()


MAINHWND()

Zweck:	Rückgabe des WIN-Fensterhandles des FoxPro-Hauptfensters.

Syntax:	MAINHWND()

Parameter: 	keine

Rückgabe: 	Nummerisch

Vgl.:	_WHTOHWND(), _WMAINWIND()

Beschreibung:

Die Funktion MAINHWND() gibt das Windows-FensterHandle des FoxPro-Hauptfensters zurück.

Beispiel:

m.N_FPhwnd = MAINHWND()


_GETWRECT()

Zweck:	Ermitteln der Pixelkoordinaten eines umschließenden Fensterrahmens.

Syntax:	_GETWRECT(<AusdrN1>,<@AusdrN2>,<@AusdrN3>,<@AusdrN4>,<@AusdrN5>)

Parameter:	<AusdrN1> FP-FensterHandle des Fensters

<AusdrN2> äußerer Rand oben

<AusdrN3> äußerer Rand links

<AusdrN4> äußerer Rand unten

<AusdrN5>äußerer Rand rechts

Rückgabe: 	Logisch

Vgl.:	_WSIZE(), _WTOP(), _WBOTTOM(), _WLEFT(), _WRIGHT()

Beschreibung:

Die Funktion _GETWRECT ist eine Umsetzung der WIN-API Funktion void GetWindowRect(hwnd, lprc), die neben dem WIN-Fensterhandle <hwnd> einen Zeiger <lprc> auf eine Struktur vom Typ <RECT> erwartet. Diese Struktur besteht aus vier Integer-Werten, die die obere, linke und untere, rechte Ecke eines Rechtecks definieren. Die Foxtools-Funktion erwartet diese Struktur nun "zerlegt" in vier per Referenz übergebenen Variablen und schreibt während der Arbeit die Koordinaten eines "fensterumschließenden" Rahmens in diese hinein. Als Funktionsrückgabewert wird .T. (unbedeutend) geliefert. Nach Ausführung der Funktion können Sie die vier Variablen auswerten und so die "äußeren" Kanten des Fensterrahmens erfahren.

Beispiel:

* Vorausgesetzt Ihre Bildschirmauflösung ist auf 640 x 480 Bildpunkte gesetzt

* und das FoxPro-Hauptfenster auf volle Größe maximiert....

STORE 0 TO m.N_oben,m.N_links,m.N_unten,m.N_rechts, m.N_FPhwnd

m.N_FPhwnd = MAINHWND()

= _GETWRECT(m.N_FPhwnd,@oben,@links,@untenL,@untenr)

? m.N_oben	&&	gibt> -4

? m.N_links	&&	gibt> -4

? m.N_unten	&&	gibt> 484

? m.N_rechts	&&	gibt> 644

? "Interessant, nicht wahr?"


_WHTOHWND()

Zweck:	FensterHandle-Konvertierung.

Syntax:	_WHTOHWND(<AusdrN1>)

Parameter:	<AusdrN1> FP-FensterHandle eines Fensters

Rückgabe: 	Nummerisch

Vgl.:	MAINHWND(), _WMAINWIND()

Beschreibung:

FoxPro benutzt systemintern eine eigene, von Windows unabhängige Fensterverwaltung, um mit der DOS-Version kompatibel zu bleiben. Die FensterHandle-Nummern von FoxProW weichen deshalb von den entsprechenden Windows-FensterHandle Nummern ab. Ein und dasselbe Fenster hat auf der einen Seite das obligatorische WIN-FensterHandle und auf der anderen Seite in FoxProW aber auch noch das FP-FensterHandle. Die Funktion _WhToHwnd() gibt das WIN-FensterHandle zum in <AusdrN1> übergebenen FP-FensterHandle zurück.

Tip: Benutzen Sie zur besseren Unterscheidung zwischen Variablen mit FP-Handlen und WIN-Handlen eine Namensgebung wie: m.WH_name für FoxPro-FensterHandle (wh) ist die typische Notation in FoxPro und m.HWND_name für Windows-FensterHandle (hwnd) ist typische WIN-Notation in C.

Beispiel:

m.N_hwnd = _WHTOHWND(MAINHWND())


_WFINDTITL()

Zweck:	FP-FensterHandle nach Fenster-Titel ermitteln.

Syntax:	_WFINDTITL(<AusdrZ1>)

Parameter: 	<AusdrZ1> Fenstertitel

Rückgabe: 	Nummerisch

Vgl.:	_FINDWINDO()

Beschreibung:

Ermittelt FP-FensterHandle für das Fenster mit dem in <AusdrN1> übergebenen Titeltext. Wichtig: Es muß der komplette Titel des Fensters buchstabengetreu an die Funktion übergeben werden - Groß-Kleinschreibung wird beachtet! Anderenfalls (Fenster existiert nicht) wird 0 zurückgegeben.

Tip: Ein gültiges FoxPro-Befehl-FensterHandle wird immer zurückgegeben, auch wenn das Befehlsfenster geschlossen ist. FP-FensterHandle für das Debug- , das Trace- und das View-Fenster (u.s.w.) werden nur dann größer als Null (also existent) zurückgegeben, wenn diese auch aktiviert sind.

Beispiel:

_WFINDTITL("Befehl") &&gibt> 1908840 (hier zufällig dieser Wert)


_WMAINWIND()

Zweck:	Rückgabe des FP-FensterHandles des FoxPro-Hauptfensters.

Syntax:	_WMAINWIND()

Parameter: 	keine

Rückgabe: 	Nummerisch

Vgl.:	MAINHWND()

Beschreibung:

Ermittelt das FP-FensterHandle für das FoxPro-Hauptfenster unter FoxPro für Windows oder Mac, bzw. das FoxPro-Desktop unter FoxPro für DOS. Achtung: Bei meinen Test hat sich gezeigt, daß das FP-FensterHandle immer den gleichen Wert zurückliefert, ganz gleich in welcher Instanz FP gerade läuft, oder welche anderen Programme noch in der Taskliste aktiv sind!

Beispiel:

? _WHTOHWND(_WMAINWIND())	gibt> (immer?) 1908516

? MAINHWND() &&gibt> ebenfalls (immer?) 1908516


_FINDWINDO()
_FINDWINDO()	[zeichenorientiert]

Zweck:	Status eines POINTS (Punkts) auf FoxPro´s Screen zurückgeben.

Syntax:	_FINDWINDO(<@AusdrN1>,<AusdrN2>,<AusdrN3>)

Parameter:	<@AusdrN1> FP-FensterHandle mit Punkt

<AusdrN2> Zeile des Punkts relativ zum Screen

<AusdrN3> Spalte des Punkts relativ zum Screen

Rückgabe: 	Nummerisch

Vgl.:	_FINDWINDP()

Beschreibung:

Die Funktion _FINDWINDO() gibt den Status eines an die Funktion übergebenen Punktes (normalerweise des Maus-Punkts) zurück. Desweiteren modifiziert die Funktion die per Referenz übergebene Variable <@AusdrN1>. Dort hinterlegt die Funktion das FensterHandle des Fensters, auf dem gerade der Punkt liegt. Die Koordinate des Punkts wird in Zeile und Spalte "zerlegt" in <AusdrN2> und <AusdrN3> als IntegerWert an die Funktion übergeben, wobei die Werte als Koordinaten relativ zum FP-Hauptfenster (Screen) angegeben werden müssen. Weitere Details siehe Funktion _FINDWINDP()!

Beispiel:  Getklick.prg


Getklick.prg
* GETKLICK.PRG

*

* Mit Hilfe dieser Routine können Sie herausfinden, auf welchem Kind-Fenster

* ein Mausklick abgesetzt wurde, und auf welchem Fensterelement der Maus-

* Cursor dabei gestanden hat.

* (C) 1994/95 by Burkhard Stiller * ECHTZEIT DV-Systeme * Rheda-Wiedenbrück

*

*_FINDWINDP [WINDOWS] Gibt "Status" eines (an die Funktion übergebenen) Pixel-Punktes zurück.

*	Parameters:

*	<@AusdrN1>,<zeile>,<spalte> Der Punkt wird als Pixelzeile,Pixelspalte relativ zum Screen angegeben.

*	Returns:

*	<AusdrN2> liefert dann den Status des Punkts zurück (siehe DO CASE...ENDCASE)

*	Modifies:

*	<@AusdrN1> FoxPro-Handle des FoxPro Fensters auf dem sich der Punkt befindet.

*	Dieser Wert wird in der Interger-Variablen <AusdrN1> abgelegt.

DO CASE

CASE _WINDOWS

SET LIBRARY TO  LOCFILE("FOXTOOLS","FLL","<Foxtools.fll> suchen") ADDITIVE

CASE _DOS

SET LIBRARY TO  LOCFILE("FOXTOOLS","PLB","<Foxtools.plb> suchen") ADDITIVE

ENDCASE

CLEAR ALL

CLEAR

ACTIVATE WINDOW COMMAND

?

? "Klicken Sie mit der rechten Maustaste"

? "auf die Elemente des geöffneten"

? "Befehls-Fensters"

?

? "Bitte beachten Sie, daß das Foxpro-Hauptfenster"

? "maximiert (ohne Rahmen) ist!"

*

PUBLIC fpwh, fpRetwh

fpwh=_WMAINWIND()	&& FoxPro-Hauptfenster-Handle zum Vergleichen merken

fpRetwh=0	&& von Funktion zurückgegebenes Fenster-Handle initialisieren

ON KEY LABEL RIGHTMOUSE DO GetKlickRegion IN GetKlick.prg

*

RETURN

FUNCTION GetKlickRegion

PRIVATE lNwo, lNxpix, lNypix, lNoffset

DO CASE

CASE _WINDOWS OR _MAC

lNoffset=38	&& das ist die Höhe des FoxPro-Fenstertitel zusammen mit dem Menübalken

lNxpix=INT(MCOL("")*FONTMETRIC(6,WFONT(1,""),WFONT(2,""),WFONT(3,"")))

lNypix=INT(MROW("")*FONTMETRIC(1,WFONT(1,""),WFONT(2,""),WFONT(3,"")))+lNoffset

*

* lNxpix und lNypix enthalten die Mauskoordinaten-Pixelwerte in der

* Client-Area des FoxPro-Hauptfensters, wenn dieses maximiert ist!

lNwo = _FINDWINDP(@fpRetwh,lNxpix,lNypix)

CASE _DOS

lNoffset=0	&& habe ich nicht ausprobiert ! - MROW("") gibt auf Menüzeile <0> zurück

*	und in Client-Area <1 - 24> (im Modus 80x25)

lNxpix=MCOL("")

lNypix=MROW("")+lNoffset

lNwo = _FINDWINDO(@fpRetwh,lNxpix,lNypix)

ENDCASE

IF fpRetwh=fpwh	&& Klick auf Foxpro-Hauptfenster (oder FoxPro-Titelzeile oder FoxPro-Systemmenü)

WAIT "Nicht auf ein Kindfenster des Hauptfensters geklickt!" WINDOW NOWAIT

ELSE

DO CASE

CASE lNwo = 0

WAIT WINDOW NOWAIT "Auf festem Rahmen"

CASE lNwo =1

WAIT WINDOW NOWAIT "In der Hilfe -Region"

CASE lNwo =2

WAIT WINDOW NOWAIT "In der Arbeits/Text -Region"

CASE lNwo =3

WAIT WINDOW NOWAIT "In der Ziehen/Titel -Region"

CASE lNwo =4

WAIT WINDOW NOWAIT "In der Größe_ändern -Region"

CASE lNwo =5

WAIT WINDOW NOWAIT "In der Schließen -Region"

CASE lNwo =6

WAIT WINDOW NOWAIT "In der Vollbild -Region"

CASE lNwo =7

WAIT WINDOW NOWAIT "In der Pfeil_rauf -Region"

CASE lNwo =8

WAIT WINDOW NOWAIT "In der Pfeil_runter -Region"

CASE lNwo =9

WAIT WINDOW NOWAIT "In der Seite_rauf -Region"

CASE lNwo =10

WAIT WINDOW NOWAIT "In der Seite_runter -Region"

CASE lNwo =11

WAIT WINDOW NOWAIT "In der vertikal_Rollknopf -Region"

CASE lNwo =12

WAIT WINDOW NOWAIT "In der Pfeil_nach_links -Region"

CASE lNwo =13

WAIT WINDOW NOWAIT "In der Pfeil_nach_rechts -Region"

CASE lNwo =14

WAIT WINDOW NOWAIT "In der Bild_nach_links -Region"

CASE lNwo =15

WAIT WINDOW NOWAIT "In der Bild_nach_rechts -Region"

CASE lNwo =16

WAIT WINDOW NOWAIT "In der horizontal_Rollknopf -Region"

CASE lNwo =17

WAIT WINDOW NOWAIT "Im Fenster-Menü"

CASE lNwo =20

WAIT WINDOW NOWAIT "In der auf_Symbolgröße -Region"

OTHERWISE

WAIT WINDOW NOWAIT "Irgendwo sonst..."

ENDCASE

ENDIF

RETURN


Setmouse.prg
*SETMOUSE.PRG

*

* SETMOUSE schaltet Mauscursor aus bzw. ein, indem

* der Mauscursor auf den "letzen Pixel links unten" auf

* dem Windows-Desktop eingegrenzt wird - dadurch

* ist der Mauspfeil "unsichtbar" und die Maus "aktionsunfähig"

*

* Diese Funktion wird nicht unbedingt benötigt! Sie ist von

* mir nur "in Anlehnung" an den FoxPro DOS - Befehl:

* SET MOUSE ON | OFF

* eingebunden worden, damit ich mir nicht so viele

* verschiedene Prozedurnamen und Parameter merken

* muß. Die eigentliche Arbeit wird von der Prozedur

* CLIP_MCURSOR erledigt, die auch "stand allone"

* eingesetzt werden kann - Parameter siehe dort!

*

* (C) 1992-1994 Burkhard Stiller

*

FUNCTION SetMouse

* Maus "Windows-weit" ein- u.- ausschalten

PARAMETERS lcModus	&& "ON" oder "OFF"

PRIVATE ALL

IF _DOS

WAIT WINDOW "Dies ist eine Windows-Routine!"+CHR(13)+;

"Benutzen Sie unter DOS <SET MOUSE ON | OFF>"+CHR(13)+;

"Weiter mit einer Taste...."

RETURN

ENDIF

IF PARAMETERS()=0

WAIT 'Aufruf mit Parameter "ON" oder "OFF" versuchen! (Taste...)' WINDOW

RETURN

ENDIF

lcModus=IIF(EMPTY(lcModus),"ON",UPPER(ALLTRIM(lcModus)))

lcModus=IIF(lcModus $ "_ON_OFF_", lcModus, "ON")

IF lcModus="OFF"

nWinScrHight=SYSMETRIC(2)	&& FoxPro Desktop Pixelhöhe

* Maus links, unten einsperren

RETURN CLIP_MCURSOR("LOCK", 0 , nWinScrHight-1, 1, nWinScrHight)

ELSE

RETURN CLIP_MCURSOR("RESET")

ENDIF

******************************************************************

* CLIP_MCURSOR definiert ein Rechteck auf dem

* Screen (!) - unter Windows allgemein (!)

* in dem sich die Maus nur noch bewegen kann

* (C) 1992-1994 Burkhard Stiller

*

* Übergabeparameter:

* modus	:=	 "RESET" oder "LOCK" für Maus auf ganzen Screen freischalten oder

* 	in Rechteck ("Mauskäfig") "einsperren".

* lnLinks, lnOben, lnRechts, lnUnten := Eckkoordinaten des "Mauskäfigs"

*

* LIBRARY FOXTOOLS.FLL wird zur Ausführung benötigt!

*

* letzte Änderung am 22.09.94:

* 	WIN-API-Funktion SetRect() registriert -

*	schöne Arbeitserleichterung!

*

*

FUNCTION CLIP_MCURSOR

PARAMETERS lcModus, lnLinks, lnOben, lnRechts, lnUnten

PRIVATE lnClipCurs, lnSetCurPos, lcScrnArea, lnWinScrWidth, lnWinScrHight

PRIVATE lCmodus, lnLinks, lnRechts, lnOben, lnUnten, lConError

*

IF _DOS

WAIT WINDOW "Dies ist eine Windows-Routine!"+CHR(13)+;

"Benutzen Sie unter DOS <SET MOUSE ON | OFF>"+CHR(13)+;

"Weiter mit einer Taste...."

RETURN

ENDIF

*

STORE ON("ERROR") TO lConError	&& Error-Handler sichern

ON ERROR *	&& Error-Trapping ausschalten

*

* Foxtools.fll API-Library laden, falls noch nicht geschehen

IF AT("FOXTOOLS.FLL", SET("LIBRARY")) = 0

SET LIBRARY TO  LOCFILE("FOXTOOLS","FLL","<Foxtools.fll> suchen") ADDITIVE

IF AT("FOXTOOLS.FLL", SET("LIBRARY")) = 0

WAIT "FOXTOOLS.FLL nicht geladen - CLIP_MCURSOR nicht ausführbar..." WINDOW NOWAIT

ON ERROR &lConError && Error-Trapping wieder einschalten

RETURN .F.

ENDIF

ENDIF

*

* unterstützende Funktionen laden, falls noch nicht geschehen

* diese Routinen können Sie auch in Ihre persönliche Prozeduren-

* sammlung einbinden, dann kann der hier folgende Aufruf entfallen,

* wenn Ihre Prozedurdatei z.B. beim Start von Foxpro automatisch

* geladen wird.

IF AT("FUNCTS", SET("PROCEDURE")) = 0

SET PROCEDURE TO LOCFILE("FUNCTS","PRG|FXP","<functs.prg> suchen")

IF AT("FUNCTS", SET("PROCEDURE")) = 0

WAIT "FUNCTS.PRG Routinnen nicht geladen - CLIP_MCURSOR nicht ausführbar..." WINDOW NOWAIT

ON ERROR &lConError && Error-Trapping wieder einschalten

RETURN .F.

ENDIF

ENDIF

*

ON ERROR &lConError 	&& Error-Trapping wieder einschalten

RELEASE lConError 	&& Variable release

*

IF EMPTY(lcModus)	&& Default für Param #1 laden, falls nötig

lcModus="RESET"	&& Maus wieder frei bewegbar auf gesamten Screen

ELSE

lcModus=UPPER(ALLTRIM(lcModus))

ENDIF

*

nWinScrWidth = SYSMETRIC(1)	&& FoxPro Desktop Pixelbreite

nWinScrHight =  SYSMETRIC(2)	&& FoxPro Desktop Pixelhöhe

*

* Wenn Parameter nicht übergeben sind Vars auf logisch .F. initialisiert...

* ... dann werden die Defaultwerte eingesetzt, d.h. Mauscursor in Fenstertitel- und Menü-Zeile einsperren.

lnLinks=IIF(TYPE("lnLinks")="L",0,lnLinks)	&& 1.Parameter

lnOben=IIF(TYPE("lnOben")="L",0,lnOben)	&& 2.	"

lnRechts=IIF(TYPE("lnRechts")="L",nWinScrWidth,lnRechts)	&& 3.	"

lnUnten=IIF(TYPE("lnUnten")="L",38,lnUnten)	&& 4. 	"

*

* hier noch auf korrekte: " lnUnten muß größer als lnOben sein" Parameterübergabe prüfen....

*	in dieser PD-Version nicht enthalten

* hier noch auf korrekte: " lnLinks muß kleiner als lnRechts sein" Parameterübergabe prüfen....

*	in dieser PD-Version nicht enthalten

*

nClipCurs 	= RegFn("ClipCursor", "C", "")	&& String wird als RECT-Struktur mißbraucht

IF nClipCurs = -1

WAIT "<ClipCursor()> konnte nicht registriert werden - CLIP_MCURSOR nicht ausführbar..." WINDOW NOWAIT

RETURN .F.

ENDIF

nSetCurPos	= RegFn("SetCursorPos", "II", "")	&& Mauscursor setzen an x , y [beide Integer]

IF nSetCurPos = -1

WAIT "<SetCursorPos()> konnte nicht registriert werden - CLIP_MCURSOR nicht ausführbar..." WINDOW NOWAIT

RETURN .F.

ENDIF

* Funktionen SetRect() und SetRectEmpty() am 22.09.1994 im WINDOWS-API "gefunden"!!

* Der Aufruf von SetRect() vereinfacht das Handling des RECT-Strukturinhalts ganz erheblich,

* da nur noch ein 8-Zeichen langer String definiert werden muß (egal welcher Inhalt!), der dann

* entweder mit SetRectEmpty() "genullt" wird, was auch mit dem FoxPro-Befehl:

* lCstring=REPLICATE(CHR(0),8) 	erledigt werden kann. Die Funktion SetRect() akzeptiert jetzt

* direkt vier Intergerzahlen(!) für die benötigten Pixelwerte und setzt diese

* korrekt in die (String-)RECT-Struktur ein!! - Eine Umwandlung mit meiner UDF aus der Prozedur-

* in FUNCTS.PRG die INT2CHR() heißt kann jetzt entfallen - schade(!?)

FnSetRect = RegFn("SetRect","@CIIII","")	&& RECT-Struktur schreiben

* FnSetRectEmpty = RegFn("SetRectEmpty","@C","")	&& RECT-Struktur nullen - wird hier nicht benötigt!

DO CASE

CASE lcModus="RESET" && Mousecursor wieder auf vollen Bildschirm freischalten

= CallFn(nClipCurs,0)	&& Sonderfall: NULL-Parameter bedeutet: volle Freischaltung

= CallFn(nSetCurPos,INT(nWinScrWidth/2),INT(nWinScrHight/2))	&& mittig setzen

CASE lcModus="LOCK"

*

* Die alte Methode ist jetzt überflüssig:

* STORE Int2Chr(lnLinks)+Int2Chr(lnOben)+Int2Chr(lnRechts)+Int2Chr(lnUnten) TO cScrnArea

*

* Die neue Art mit der WINDOWS-API Funktion SetRect() ist viel eleganter...

STORE REPLICATE(CHR(0),8) TO cScrnArea

=CallFn(FnSetRect,@cScrnArea,lnLinks,lnOben,lnRechts,lnUnten)

*

* hier geht´s mit der alten Routine weiter...:

= CallFn(nClipCurs,cScrnArea) 	&& Beschränkung einschalten

= CallFn(nSetCurPos,0,0)	&& Cursor versetzen: "einsperren"

ENDCASE

*

RETURN .T.


Graphwin.prg
*GRAPHWIN.PRG

*

* (C) Burkhard Stiller 1994

*

* Testprogramm zum Lernen des WIN GDI

*

* Quick und unglaublich "dirty"

* wollte ich eigentlich noch nicht veröffentlichen...

*

CLEAR

?? "Schräge Striche unter FoxPro-WIN"

IF _DOS

WAIT WINDOW "Dies ist eine Windows-Routine!"+CHR(13)+;

"Weiter mit einer Taste...."

RETURN

ENDIF

*

SET PROCEDURE TO LOCFILE("FUNCTS","PRG|FXP","<functs.prg> suchen")

SET LIBRARY TO  LOCFILE("FOXTOOLS","FLL","<Foxtools.fll> suchen") ADDITIVE

*

* TextOut (2.x)

* BOOL TextOut(hdc, nXStart, nYStart, lpszString, cbString)

* HDC hdc;	/* handle of device context	*/

* int nXStart;	/* x-coordinate of starting position	*/

* int nYStart;	/* y-coordinate of starting position	*/

* LPCSTR lpszString;	/* address of string	*/

* int cbString;	/* number of bytes in string	*/

* The TextOut function writes a character string at the specified location, using the currently selected font.

* Parameter	Description

* hdc	Identifies the device context.

* nXStart	Specifies the logical x-coordinate of the starting point of the string.

* nYStart	Specifies the logical y-coordinate of the starting point of the string.

* lpszString	Points to the character string to be drawn.

* cbString	Specifies the number of bytes in the string.

* Returns: The return value is nonzero if the function is successful. Otherwise, it is zero.

*

FnTextOut	= RegFn("TextOut","IIICI","I")

FnGetBkColor	= RegFn("GetBkColor","I","L")

FnSetTextColor	= RegFn("SetTextColor","IL","L")

FnSetBkMode	= RegFn("SetBkMode","II","I")	&& Hintergrund 2:=Opaque, 1:=Transparent

FnGetDC	= RegFn("GetDC","I","I")	&& hdc für Client-Area

FnGetWindowDC	= RegFn("GetWindowDC","I","I")	&& hdc für gesamtes Fenster

FnReleaseDC	= RegFn("ReleaseDC","II","I")	&& Device-Kontext releasen

*

FnMoveTo	= RegFn("MoveTo","III","I")	&& Cursor setzen

FnLineTo	= RegFn("LineTo","III","I")	&& Linie zeichnen

*

* fpwhdl=_EDOPENFIL("TEST.TXT",1)	&& zum Üben Editor-Fenster erzeugen...

* Winwhdl=_WHTOHWND(fpwhdl)	&& und FPwhdl -> WINwhdl...

Winwhdl=mainhwnd()	&& ... oder REM und im FP-Hauptfenster "rummalen"

*

*

hdc = CallFn(FnGetWindowDC,Winwhdl)	&& DC-Handle der Client-Area des Editor-Fensters holen

FnGetUpdateRect = RegFn("GetUpdateRect","I@CI","L")	&& Holt ein RECT für Update-Rechteck

FnSetRect=RegFn("SetRect","@CIIII","")	&& RECT-Struktur schreiben

FnSetRectEmpty=RegFn("SetRectEmpty","@C","")	&& RECT-Struktur nullen

*

* RECT-Struktur aufbauen

RECT_Area=REPLICATE(CHR(0),8)

lnLinks=0

lnOben=0

lnRechts=100

lnUnten=60

=CallFn(FnSetRect,@RECT_Area,lnLinks,lnOben,lnRechts,lnUnten)

*

* Zeichnen

= CallFn(FnMoveTo,hdc,0,0)	&& in linke, obere Ecke

= CallFn(FnLineTo,hdc,100,30)	&& nu mal los...

= CallFn(FnLineTo,hdc,100,60)

= CallFn(FnLineTo,hdc,50,60)

= CallFn(FnLineTo,hdc,0,0)

oldBkMode = CallFn(FnSetBkMode,hdc,1)	&& auf "Transparent:=1" setzen

oldTextColor = CallFn(FnSetTextColor	,hdc,16777215) && weißen Text setzen

BkColorText = STR(CallFn(FnGetBkColor,hdc),8,0)

= CallFn(FnTextOut,hdc,25,5,BkColorText,8)

* Ellipse()-Funktion

m.Ellipse = RegFn("Ellipse","IIIII","I")

= CallFn(Ellipse,hdc, 5,5,19,19)	&& Echtzeit-innen

* Pie()-Funktion

m.Pie = RegFn("Pie","IIIIIIIII","I")

= CallFn(Pie,hdc, 5,5,22,22,8,22,5,17) && Echtzeit-außen

* Fertig -> schick, was?

ok = CallFn(FnReleaseDC,Winwhdl,hdc)	&& DC-Handle releasen

?

? ok


Flashwin.prg
*FLASHWIN.PRG

*

* Mit Hilfe der FlashWindow - WinAPI-Funktion können Sie den Titel-Balken

* eines Fensters blitzen lassen. In diesem Beispielprogramm verwende

* ich die Funktionen  _WHTOHWND(_WGETPORT()) aus dem FoxPro-API -

* <foxtools.fll>, um das Fensterhandle des aktuellen Ausgabefensters

* in Foxpro auf die korrekte Handle-Nummer in Windows umzurechnen.

*

* Der Effekt eignet sich prima für Warnungsfenster - zusammen mit der Funktion

* MessageBeep()

*

CLEAR ALL

CLEAR

HIDE WINDOWS ALL

?

? "Klicken Sie die rechte Maustaste"

?"um das Anwender-Fenster zu <flashen>"

?

ON KEY LABEL RIGHTMOUSE  DO FlashWindow IN flashwin.prg WITH 300

DEFINE WINDOW TEST1 FROM 10,0 TO 20,40 TITLE "TEST1" ZOOM FLOAT GROW CLOSE SYSTEM

ACTIVATE WINDOWS TEST1

FUNCTION FlashWindow

PARAMETERS lNwieoft

IF _DOS

WAIT WINDOW "Dies ist eine Windows-Routine!"+CHR(13)+;

"Weiter mit einer Taste...."

RETURN

ENDIF

*

PRIVATE lConError

*

STORE ON("ERROR") TO lConError	&& Error-Handler sichern

ON ERROR *	&& Error-Trapping ausschalten

* Foxtools.fll API-Library laden, falls noch nicht geschehen

IF AT("FOXTOOLS.FLL", SET("LIBRARY")) = 0

SET LIBRARY TO  LOCFILE("FOXTOOLS","FLL","<Foxtools.fll> suchen") ADDITIVE

IF AT("FOXTOOLS.FLL", SET("LIBRARY")) = 0

WAIT "FOXTOOLS.FLL nicht geladen - Routine nicht ausführbar..." WINDOW NOWAIT

ON ERROR &lConError && Error-Trapping wieder einschalten

RETURN .F.

ENDIF

ENDIF

ON ERROR &lConError 	&& Error-Trapping wieder einschalten

RELEASE lConError 	&& Variable release

*

* Windows-Routine anmelden

lNfnFlashWind=RegFn("FlashWindow","II","I")

* regisirieren:	1. Parameter Windows-Fenster-Handle

*	2. Parameter logisch (0/1) Invert-Flag:

*	0:= Status wechseln

*	1:= Status wiederherstellen

lNretVal=0	&&	 Rückgabe-Parameter der Funktion initialisieren

*	Rückgabe:	0:= Fenster war nicht aktiv beim Aufruf der Funktion

*	!0:=Fenster war aktiv beim Aufruf der Funktion

* Wandeln des aktiven Foxpro-Ausgabefensters - Handles in ein Windows-Handle

lNhwnd=_WHTOHWND(_WGETPORT())

* Routine ausführen

FOR lNi=1 TO lNwieoft

lNretVal=CallFn(lNfnFlashWind,lNhwnd,1)	&& <0> im dritten Param. ergibt keinen guten Effekt!

NEXT

RETURN lNretVal


Functs.prg
*FUNCTS.PRG

*

* ---------------------------------------------------------------------

* (C) 1992-1994 Burkhard Stiller

* Unterstützende FUNKTIONEN

* ---------------------------------------------------------------------

*

* Name    	| Übergabe-Parameter<Type> 	| Return-Parameter<Type>

*.............................................................................................

* BIN2NUM	bin<C>,@zahl1<N>	zahl<N>

* BINAND	zahl1<N>,zahl2<N>	binstring<C>

* BINOR	zahl1<N>,zahl2<N>	binstring<C>

* BINXOR	zahl1<N>,zahl2<N>	binstring<C>

* DEZ2HEX	zahl<N>	hexstring<C>

* GETHIBYTE	wert<N>[0-65535]	IntWert<N>[0-255]

* GETLOBYTE	wert<N>[0-65535] 	IntWert<N> 	[0-255]

* HEX2DEZ	string<C>	zahl<N>

* INT2CHR	wert<N>[0-65535]	<2-Bytes String>

* NUM2BIN	zahl1<N>,@bin<C>	binstring<C>

****************************************************************

* BIN2NUM wandelt einen Binärstring in Zahl zurück

* Die Funktion nimmt keinerlei Überprüfung vor!

* (C) 1992-1994 Burkhard Stiller

*

* muß aufgerufen werden>     = Bin2Num(cBinZahl,@nIntZahl)

*

FUNCTION Bin2Num

* Bemerkung: die schnellste Routine, die ich bislang für diesen Zweck

* hingekriegt habe - habe Sie noch eine schnellere: bitte lassen Sie´s mich wissen!!

PARAMETERS cBinString, nNummer

PRIVATE m.i, nLaenge

nNummer = 0

nLaenge = LEN(cBinString)

FOR i = 1 TO nLaenge

nNummer = nNummer + VAL(SUBSTR(cBinString,i,1)) * 2 ^ (nLaenge - i)

ENDFOR

*

RETURN .T.

****************************************************************

* BINAND Binäres AND

* Vergleicht zwei übergebene Integer-Zahlen auf Bitebene

* und gibt einen Binär-String zurück

* Die Funktion nimmt keinerlei Validitätsprüfung vor!

* (C) 1992-1994 Burkhard Stiller

*

FUNCTION BinAND

* Bemerkung: die schnellste Routine, die ich bislang für diesen Zweck

* hingekriegt habe - habe Sie noch eine schnellere: bitte lassen Sie´s mich wissen!!

PARAMETERS nZahl1,nZahl2

PRIVATE ALL

STORE "" TO cBinStr1, cBinStr2

=Num2Bin(nZahl1,@cBinStr1)

=Num2Bin(nZahl2,@cBinStr2)

cBinString=""

FOR i=1 TO LEN(cBinStr1)

cBinString=cBinString+IIF(SUBSTR(cBinStr1,i,1)="1" AND SUBSTR(cBinStr2,i,1)="1","1","0")

ENDFOR

*

RETURN cBinString

****************************************************************

* BINOR Binäres OR

* Vergleicht zwei übergebene Integer-Zahlen auf Bitebene

* und gibt einen Binär-String zurück

* Die Funktion nimmt keinerlei Validitätsprüfung vor!

* (C) 1992-1994 Burkhard Stiller

*

FUNCTION BinOR

* Bemerkung: die schnellste Routine, die ich bislang für diesen Zweck

* hingekriegt habe - habe Sie noch eine schnellere: bitte lassen Sie´s mich wissen!!

PARAMETERS nZahl1,nZahl2

PRIVATE ALL

STORE "" TO cBinStr1, cBinStr2

=Num2Bin(nZahl1,@cBinStr1)

=Num2Bin(nZahl2,@cBinStr2)

cBinString=""

FOR i=1 TO LEN(cBinStr1)

cBinString = cBinString + IIF(SUBSTR(cBinStr1,i,1) = "1" OR SUBSTR(cBinStr2,i,1) = "1","1","0")

ENDFOR

*

RETURN cBinString

****************************************************************

* BINXOR Binäres XOR

* Vergleicht zwei übergebene Zahlen (von 0 bis 255) auf Bitebene

* und gibt einen Binär-String zurück

* Die Funktion nimmt keinerlei Validitätsprüfung vor!

* (C) 1992-1994 Burkhard Stiller

*

FUNCTION BinXOR

* Bemerkung: die schnellste Routine, die ich bislang für diesen Zweck

* hingekriegt habe - habe Sie noch eine schnellere: bitte lassen Sie´s mich wissen!!

PARAMETERS nZahl1,nZahl2

PRIVATE ALL

STORE "" TO cBinStr1, cBinStr2

=Num2Bin(nZahl1,@cBinStr1)

=Num2Bin(nZahl2,@cBinStr2)

cBinString=""

FOR i=1 TO LEN(cBinStr1)

cBinString = cBinString + IIF(SUBSTR(cBinStr1,i,1) # SUBSTR(cBinStr1,i,1),"1","0")

ENDFOR

*

RETURN cBinString

****************************************************************

* Funktion Dez2Hex

* Liefert aus einem nummerischen (Dezimal-)Wert

* den dazugehörigen HEX-String

* (C) 1992-1994 Burkhard Stiller

* ---------------------------------

* Übergabe: Nummer

* Rückgabe: Hex-String

* Anmerkung :	enthält der Rückgabestring keine Buchstaben, wird

* 	er automatisch durch die führendes 'h'-Kennung ergänzt

* ---------------------------------

* Beispiele für Aufruf: ? Dez2Hex(3490) oder hextext=Dez2Hex(-3456)

*

FUNCTION Dez2Hex

* Bemerkung: die schnellste Routine, die ich bislang für diesen Zweck

* hingekriegt habe - habe Sie noch eine schnellere: bitte lassen Sie´s mich wissen!!

PARAMETERS Nummer

PRIVATE ALL

IF TYPE('nummer')<>"N" && Kein nummerischer Wert übergeben

WAIT "Dez2Hex-Fehler: übergebener Parameter keine Zahl..." WINDOW NOWAIT

?? CHR(7)

RETURN ''

ENDIF

*

STORE "0123456789ABCDEF" TO checks	&& Hexadezimal-Zeichen

STORE "" TO retstring	&& Rückgabewert vorbelegen

STORE 0 TO modrest	&& Zwischenspeicher für MOD-Division

STORE 0 TO stellenwert	&& Zwischenspeicher für Berechnung

STORE "" TO hexziffer	&& Zwischenspeicher für Hexziffer

STORE 1 TO potenz	&& Potentzvariable für 16 ^ potenz

STORE "" TO vorzeichen	&& Vorzeichen für Hex-String

STORE .T. TO numonly	&& Flag: Nur Ziffern im Hex-String

*

* Prüfen, ob übergebene Nummer=0 ist

IF nummer=0

RETURN "h0"

ENDIF

*

* Prüfen, ob übergebene Nummer negativ ist

IF nummer<0

vorzeichen="-"	&& Hexstring bekommt bei Rückgabe ein führendes '-'

nummer=ABS(nummer)	&& Intern rechnen wir nur mit absolutem Wert

ENDIF

*

potenz=1	&& Hochzahl initialisieren

DO WHILE nummer>0	&& solange noch was von übergebener Zahl "übrig"! ist...

*

* ... MODULO-Rest der aktuellen 16er-Potenz und des (Rest-) Betrags

* von <nummer> ermitteln == >> Wert der Stelle im Hex-String

modrest=nummer % 16^potenz

*

* Dezimalen Wert (kann ja sehr groß sein) nach Zahl im Bereich

* von 0-15 wandeln (für die einzelne Stelle) und +1 addieren,

* um den Offset an die SUBSTR-Funktion (1-based) anzupassen

stellenwert = modrest / 16^(potenz-1)  +1

*

* Dieser 'Dezimalwert' muß nun noch in Hexadezimal umgewandelt werden, ...

hexziffer=SUBSTR(checks,stellenwert,1)

* ... wobei der Hexstring von "rechts nach links" aufgebaut wird.

* Deshalb in Hexstring 'vorne' anfügen.

retstring=hexziffer+retstring

*

* gegebenenfalls noch Merker für "HEX-Qualifizierung" (vorangestelltes 'h') ausschalten

IF stellenwert>10	&& Das ergibt einen Buchstaben im Hexstring, ...

numonly=.F.	&& ... also brauchen wir kein führendes "h" mehr!

ENDIF

*

* Jetzt von <nummer> den Betrag (dezim.-Wert) für die

* gerade im Hexstring erzeugte Stelle abziehen

nummer=nummer-modrest

*

* 16er-Potenz erhöhen := > nächst höhere Ziffer im Hexstring erzeugen

potenz=potenz+1

ENDDO

*

RETURN vorzeichen+IIF(numonly,"h","")+retstring

***********************************************************************

*	Funktion GetHiByte

*	Last modified 21.07.1993

*	High Byte eines Integer-Wertes aufrufen

* 	(C) 1992-1994 Burkhard Stiller

*

FUNCTION GetHiByte

PARAMETERS nWert

PRIVATE ALL

nWert=INT(nWert)	&& kann entfallen, falls Sie sicher sein können

nWert=MAX(0,nWert)	&& kann entfallen, falls Sie sicher sein können

nWert=MIN(65535,nWert)	&& kann entfallen, falls Sie sicher sein können

RETURN (nWert-GetLoByte(nWert))/256

***********************************************************************

*	Funktion GetLoByte

*	Last modified 21.07.1993

*	High Byte eines Integer-Wertes aufrufen

* 	(C) 1992-1994 Burkhard Stiller

*

FUNCTION GetLoByte

PARAMETERS nWert

PRIVATE ALL

nWert=INT(nWert)	&& kann entfallen, falls Sie sicher sein können

nWert=MAX(0,nWert)	&& kann entfallen, falls Sie sicher sein können

nWert=MIN(65535,nWert)	&& kann entfallen, falls Sie sicher sein können

RETURN nWert % 256

****************************************************************

* Funktion Hex2Dez

* Liefert aus einem Hexstring

* den numerischen Integerwert im Dezimal-Format

* (C) 1992-1994 Burkhard Stiller

* ---------------------------------

* Übergabe: String

* Rückgabe: Nummer

* Achtung:	Bei einem fehlerhaften HEX-String

* 	wird '0' zurückgegeben und es erscheint

* 	ein Warnhinweis...

* ---------------------------------

* Beispiele für Aufruf: ? Hex2Dez("h100") oder zahl=Hex2Dez("-FA07")

*

FUNCTION Hex2Dez

* Bemerkung: die schnellste Routine, die ich bislang für diesen Zweck

* hingekriegt habe - habe Sie noch eine schnellere: bitte lassen Sie´s mich wissen!!

PARAMETERS Hexstring

PRIVATE ALL

IF TYPE('hexstring')<>"C"	&& Kein String übergeben

WAIT "Hex2Dez-Fehler: übergebener Parameter kein String..." WINDOW NOWAIT

?? CHR(7)

RETURN 0

ENDIF

*

STORE "0123456789ABCDEF" TO checks	&& Teststring

STORE 0 TO retval	&& Rückgabewert vorbelegen

STORE 1 TO i	&& Schleifenvariable (Pointer)

STORE 1 TO vorzeichen	&& Vorzeichen für neg.-Werte

STORE "" TO Substring	&& Puffer für akt. Zeichen

*

* Zuerst String in Großbuchstaben wandeln

hexstring=ALLTRIM(UPPER(hexstring))

*

* Prüfen, ob erstes Zeichen ein Minus '-' ist

IF LEFT(hexstring,1)="-"

vorzeichen=-1

hexstring=SUBSTR(hexstring,2) 	&& Vorzeichen entfernen

ENDIF

*

* Prüfen, ob das folgende Zeichen die (zulässige) Hex-Kennung 'H' ist

IF LEFT(hexstring,1)="H"

hexstring=SUBSTR(hexstring,2) 	&& Hex-Kennung entfernen

ENDIF

*

* führende Nullen entfernen

DO WHILE LEFT(hexstring,1)="0"

hexstring=SUBSTR(hexstring,2)

ENDDO

*

STORE LEN(hexstring) TO sl 	&& verbleibende StringLänge

STORE 0 TO charval	&& Buchstabenwert für A=10 B=11 u.s.w.

STORE sl-1 TO posval	&& Positionswert für Formel 16^pos

*

* String auswerten

FOR i=1 TO sl	&& i ist der String-Pointer

*

* 1 Zeichen aus Hexadezimal-String auslesen (von links nach rechts)

substring=SUBSTR(hexstring,i,1)

*

* Ermitteln des Buchstabenwerts (=Pos.-Nummer im 'checks'-String)

* AT() liefert Werte von [0-16] ->  0:= 'nicht gefunden'

charval=AT(substring,checks)-1 && um -1 korrigieren, da Wert #1 := 0

*

* Test auf korrektes Zeichen

IF charval=-1	&& nicht im 'checks'-String enthalten

WAIT "Hex2Dez-Fehler: unzulässige Zeichen im String..." WINDOW NOWAIT

?? CHR(7)

RETURN 0

ENDIF

*

* Jetzt den Wert der Hex-Ziffer an Pos. 'posval' errechnen

* und zum Gesamtwert hinzuaddiern

retval=retval+charval*16^posval

*

* abschließend für nächsten Durchlauf den Positionswert für die Formel

* 16 ^ posval reduzieren, da die nächste Ziffer im Hex-String

* 'eine Stelle weiter rechts' liegt (=> um 1 kleinere Potenz)

posval=posval-1

ENDFOR

*

*

RETURN INT(retval*vorzeichen)

***********************************************************************

*	Funktion Int2Chr

*	Last modified 21.07.1993

* 	(C) 1992-1994 Burkhard Stiller

*	Integer-Zahl in zwei Zeichen langen String wandeln

*

FUNCTION Int2Chr

PARAMETERS nWert

PRIVATE ALL

cHiByte=CHR(GetHiByte(nWert))

cLoByte=CHR(GetLoByte(nWert))

RETURN cLoByte+cHiByte

****************************************************************

* NUM2BIN wandelt eine Integer-Zahl in ihr Binärformat

* (C) 1992 Burkhard Stiller

* es wird keinerlei Überprüfung vorgenommen!

* muß aufgerufen werden>     = Num2Bin(nIntZahl,@cBinZahl)

*

FUNCTION Num2Bin

* Bemerkung: die schnellste Routine, die ich bislang für diesen Zweck

* hingekriegt habe - habe Sie noch eine schnellere: bitte lassen Sie´s mich wissen!!

PARAMETERS nNummer,cBinString

* Wenn übergebene <nNummer> immer Integer-Zahl ist, kann

* die folgende Umwandlung/Überprüfung "Remarked" bleiben

*nNummer = INT(nNummer)

cBinString = ""

DO CASE

CASE nNummer > 0

DO WHILE nNummer > 0

cBinString = STR( nNummer%2 ,1 ,0) + cBinString

nNummer = FLOOR(nNummer / 2)

ENDDO

RETURN .T.

CASE nNummer = 0

STORE "0" TO cBinString

RETURN .T.

ENDCASE

RETURN .F.


TopicIDs
*TOPICIDS.PRG

*

* ---------------------------------------------------------------------

* (C) 1992-1994 Burkhard Stiller

* Liste aller in der Foxtools.hlp

* vorkommenden Context-IDs

* ---------------------------------------------------------------------

*

#define MainIndex  1

#define PopUp1  2

#define Beispiele  3

#define Einleitung  4

#define FloatPopInfo  5

#define CIS_ID  6

#define Allgemeine_Funktionen  7

#define INITIALIZE  8

#define UNINITALIZE  9

#define MSGBOX  10

#define REGFN  11

#define CALLFN  12

#define FOXTOOLVER  13

#define Disk_Datei  14

#define DRIVETYPE  15

#define MKDIR  16

#define RMDIR  17

#define JUSTFNAME  18

#define JUSTSTEM  19

#define JUSTEXT  20

#define JUSTPATH  21

#define JUSTDRIVE  22

#define FORCEPATH  23

#define FORCEEXT  24

#define DEFAULTEXT  25

#define ADDBS  26

#define VALIDPATH  27

#define CLEANPATH  28

#define FOXTOUCH  29

#define Strings  30

#define REDUCE  31

#define STRFILTER  32

#define WORDS  33

#define WORDNUM  34

#define NEXTWORD  35

#define Clipboard  36

#define GETCLIPDAT  37

#define GETCLIPFMT  38

#define ISCLIPFMT  39

#define ENUMCLIPFM  40

#define REGCLIPFMT  41

#define SETCLIPDAT  42

#define EMPTYCLIP  43

#define COUNTCLIPF  44

#define OPENCLIP  45

#define CLOSECLIP  46

#define Editor  47

#define _EDSETPOS  48

#define _EDSKIPLIN  49

#define _EDGETPOS  50

#define _EDGETLPOS  51

#define _EDGETLNUM  52

#define _EDPOSINVI  53

#define _EDSTOPOS  54

#define _EDSTOSEL  55

#define _EDINSERT  56

#define _EDSENDKEY  57

#define _EDDELETE  58

#define _EDGETCHAR  59

#define _EDGETSTR  60

#define _EDINDENT  61

#define _EDSELECT  62

#define _EDCOPY  63

#define _EDCUT  64

#define _EDPASTE  65

#define _EDUNDO  66

#define _EDREDO  67

#define _EDUNDOON  68

#define _EDACTIVE  69

#define _EDLASTERR  70

#define _EDGETENV  71

#define _EDSETENV  72

#define _EDOPENFIL  73

#define _EDCLOSEFI  74

#define _EDREVERT  75

#define Fenster  76

#define MAINHWND  77

#define _GETWRECT  78

#define _WHTOHWND  79

#define _WFINDTITL  80

#define _WMAINWIND  81

#define _FINDWINDO  82

#define Getklick_prg  83

#define Setmouse_prg  84

#define Graphwin_prg  85

#define Flashwin_prg  86

#define Functs_prg  87

#define TopicIDs  88

#define _FINDWINDP  89

#define _WONTOP  90

#define _WOPEN  91

#define _WSCROLL  92

#define _WOPENP  93

#define _WSCROLLP  94

#define _WCLOSE  95

#define _WHIDE  96

#define _WSHOW  97

#define _WZOOM  98

#define _WSELECT  99

#define _WSENDBEHI  100

#define _WGETPORT  101

#define _WSETPORT  102

#define _WMOVE  103

#define _WSIZE  104

#define _WMOVEP  105

#define _WSIZEP  106

#define _WTOP  107

#define _WBOTTOM  108

#define _WLEFT  109

#define _WRIGHT  110

#define _WHEIGHT  111

#define _WWIDTH  112

#define _WTOPP  113

#define _WBOTTOMP  114

#define _WLEFTP  115

#define _WRIGHTP  116

#define _WHEIGHTP  117

#define _WWIDTHP  118

#define _WCLEAR  119

#define _WCLEARREC  120

#define _WCLEARRECP  121

#define _WPOSCURSO  122

#define _WPOSCURP  123

#define _WGETCURSO  124

#define _WGETCURP  125

#define _WATTR  126

#define _WSETATTR  127

#define _WPUTCHR  128

#define _WPUTSTR  129

#define _WSETTITLE  130

#define _WTITLE  131

#define Neue_VFP_3.0  132

#define _WFOOTER  133

#define REGFN32  134

#define GETPROSTRG  135

#define PUTPROSTRG  136

#define Win_API_Calls  137

#define Bytelaengen  138

#define Ordinal_Calling  139

#define Fehlfunktionen  140

#define Echtzeit  141

#define Copyright  142

#define dFPUG  143

#define Veranstaltungen  144

#define Publikationen  145

#define Online  146

#define Service  147

#define Jahresabo  148

#define Mitgliedschaft  149

#define Coupon  150

#define Glossar  151


_FINDWINDP()
_FINDWINDP()	[pixelorientiert]

Zweck:	Status eines POINTS (Pixel-Punkts) auf Screen zurückgeben.

Syntax:	_FINDWINDOP(<@AusdrN1>,<AusdrN2>,<AusdrN3>)

Parameter:	<@AusdrN1> FP-FensterHandle mit Mouse-Punkt

<AusdrN2> Punkt-Zeile in Pixeln reletiv zum Screen

<AusdrN3> Punkt-Spalte in Pixeln reletiv zum Screen

Rückgabe: 	Nummerisch

Vgl.:	_FINDWINDO()

Beschreibung:

Die Funktion _FINDWINDP() gibt den "Status" eines an die Funktion übergebenen Pixel-Punktes (normalerweise des Maus-Punkts) zurück. Desweiteren modifiziert die Funktion die per Referenz übergebene Variable <@AusdrN1>. Dort hinterlegt die Funktion das FP-FensterHandle des Fensters, auf dem gerade der Punkt liegt. Die Koordinate des Punkts wird in Pixel-Zeile und Pixel-Spalte "zerlegt" in <AusdrN2> und <AusdrN3> an die Funktion übergeben, wobei die Werte als Pixel-Werte relativ zum Screen (z.B. Screen 640 x 480 oder 800 x 600 oder 1024 x 768 Pixel) angegeben werden müssen. Als Resultat gibt die Funktion den "Status" des Punkts als IntegerWert zurück. Welche Werte was bedeuten, soll der folgende Auszug aus dem Getklick.prg  verdeutlichen.

Der Funktions-ReturnWert wurde in der Variablen <lNwo> abgelegt....

DO CASE

CASE lNwo = 0

WAIT WINDOW NOWAIT "Auf festem Rahmen"

CASE lNwo =1

WAIT WINDOW NOWAIT "In der Hilfe -Region"

CASE lNwo =2

WAIT WINDOW NOWAIT "In der Arbeits/Text -Region"

CASE lNwo =3

WAIT WINDOW NOWAIT "In der Ziehen/Titel -Region"

CASE lNwo =4

WAIT WINDOW NOWAIT "In der Größe_ändern -Region"

CASE lNwo =5

WAIT WINDOW NOWAIT "In der Schließen -Region"

CASE lNwo =6

WAIT WINDOW NOWAIT "In der Vollbild -Region"

CASE lNwo =7

WAIT WINDOW NOWAIT "In der Pfeil_rauf -Region"

CASE lNwo =8

WAIT WINDOW NOWAIT "In der Pfeil_runter -Region"

CASE lNwo =9

WAIT WINDOW NOWAIT "In der Seite_rauf -Region"

CASE lNwo =10

WAIT WINDOW NOWAIT "In der Seite_runter -Region"

CASE lNwo =11

WAIT WINDOW NOWAIT "In der vertikal_Rollknopf -Region"

CASE lNwo =12

WAIT WINDOW NOWAIT "In der Pfeil_nach_links -Region"

CASE lNwo =13

WAIT WINDOW NOWAIT "In der Pfeil_nach_rechts -Region"

CASE lNwo =14

WAIT WINDOW NOWAIT "In der Bild_nach_links -Region"

CASE lNwo =15

WAIT WINDOW NOWAIT "In der Bild_nach_rechts -Region"

CASE lNwo =16

WAIT WINDOW NOWAIT "In der horizontal_Rollknopf -Region"

CASE lNwo =17

WAIT WINDOW NOWAIT "Im Fenster-Menü"

CASE lNwo =20

WAIT WINDOW NOWAIT "In der auf_Symbolgröße -Region"

OTHERWISE

WAIT WINDOW NOWAIT "Irgendwo sonst..."

ENDCASE

Beispiel:  Getklick.prg


_WONTOP()

Zweck:	FP-FensterHandle des obersten Fensters zurückgeben.

Syntax:	_WONTOP()

Parameter: 	keine

Rückgabe: 	Nummerisch

Vgl.:	_WOPENP(), _WSHOW()

Beschreibung:

Ermittelt das FP-FensterHandle des zuvorderst liegenden Fensters. Normalerweise beziehen sich Eingaben von der Tastatur auf dieses oberste Fenster. Sind alle Fenster geschloßen (Befehlsfenster auch), gibt _WONTOP() das FoxPro-Hauptfenster Handle zurück.

Beispiel:

m.wh_OT = _WONTOP()


_WOPEN()
_WOPEN()	[zeichenorientiert] & fehlerhaft

Zweck:	Erstellen eines neues Fensters.

Syntax:	_WOPEN(<AusdrN1>,<AusdrN2>,<AusdrN3>,<AusdrN4>,<AusdrN5>,<AusdrN6>,<AusdrZ1>,<AusdrZ2>)

Parameter:	<AusdrN1> IntegerZahl: Zeile obere Koordinate

<AusdrN2> IntegerZahl: Spalte linke Koordinate

<AusdrN3> IntegerZahl: Zeile untere Koordinate

<AusdrN4> IntegerZahl: Spalte rechte Koordinate

<AusdrN5> IntegerZahl: Fenster-Attribute

<AusdrN6> IntegerZahl: Farbpalettenummer

<AusdrZ1> anwenderdefinierte Farbpalette

<AusdrZ2> String für Rahmenzeichen

Rückgabe: 	Nummerisch

Vgl.:	_WOPENP(), _WSETATTR(), _WSETTITLE(), _WSHOW()

Beschreibung:

Die Funktion erzeugt ein neues Fenster an den festgelegten Koordinaten und gibt als Resultat das FP-FensterHandle zurück. Die Koordinaten, die in den Parametern <AusdN1> bis <AusdrN4> übergeben werden, können außerhalb des Bildschirms liegen, doch die Fensterhöhe darf 120 Zeichen und die Fensterbreite 264 Zeichen nicht überschreiten. Der fünfte Parameter dient zur Festlegung der Attribute dieses Fensters. Dafür kann einer oder mehrere der folgenden Werte zusammenaddiert in <AusdrN5> als IntegerZahl übergeben werden:

Tabelle der Fensterattribute

FLAG	Wert	ATTRIBUT

WCURSOR 	2	Cursor im Fenster angezeigt

ZOOM 	4  	Benutzer kann Fenster zoomen

ADJ 	8 	Benutzer kann Größe verändern

CLOSE 	16 	Benutzer kann Fenster schließen

MOVE 	32 	Benutzer kann Fenster bewegen

HSCROLLBAR	64 	Horizontalen Rollbalken anzeigen (geht nicht!)

VSCROLLBAR 	128 	Vertikalen Rollbalken anzeigen (geht nicht!)

AUTOSCROLL 	256 	Scrollt automatisch, wenn Inhalt über untere Begrenzung hinausgeht

WEVENT 	1024 	Empfängt, aktiviert und deaktiviert "Events": muß z.B. gesetzt werden, damit Titel beim Anklicken Farbe bekommt!

SHADOW 	2048 	Fenster wirft einen Schatten

WMODAL 	4096 	Benutzer kann Fenster nicht in den Hintergrund setzen (StayOnTop-Flag!)

WMINIMIZE 	8192	Benutzer kann Fenster minimieren

Der sechste Parameter, welcher die Nummer der Farbpalette angibt, kann jeden gültigen Wert annehmen. Darüberhinaus kann auch der Wert -1 gesetzt werden. Dies bedeutet dann, daß die in <AusdrZ1> definierte Farbpalette zu verwenden ist. (funktioniert unter Windows nicht!) Ein anwenderdefinierter Farbpaletten-String ist 11 Zeichen lang (10 Farbpaare und ein Schatten-Attribut für FP-DOS). Die einzelnen Farbpaare werden dabei in einem Byte (Buchstaben) kodiert. Die ersten 3 Bit des "Low-Nibbels" (Nibbel := 4 Bit) des Farbpaar-Bytes enthalten die Information zur Vordergrund-(Schrift-)Farbe. Am gesetzten 4. Bit des Low-Nibbels erkennt FoxPro ein gesetztes "Vordergrundfarbe intensiv"-Attribut.

Die ersten 3 Bit des "High-Nibbels" des Farbpaar-Bytes enthalten analog dazu die Farbinformation zur Hintergrund- (Papier-) Farbe. Am gesetzten 4. Bit des High-Nibbels erkennt FoxPro ein gesetztes "binken"-Attribut. (Ganz schön "trullala", wie?) - Jetzt wird´s gleich etwas verständlicher, wenn Sie in Ihren Programmen folgende Konstanten definieren und für das zu erzeugende Farbpaar einfach "zusammenrechnen":

Vordergrund dezim.	High-Low Nibble

BLACK_ON	0	0000 0000

BLUE_ON	1	0000 0001

GREEN_ON	2	0000 0010

CYAN_ON	3	0000 0011

RED_ON	4	0000 0100

MAGENTA_ON 5	0000 0101

BROWN_ON	6	0000 0110

WHITE_ON	7	0000 0111

Hintergrund

BLACK	0	0000 0000

BLUE	16	0001 0000

GREEN	32	0010 0000

CYAN	48	0011 0000

RED	64	0100 0000

Schatten-Bytewerte für FP-DOS (Farbpaar 11)

CASTSSHADOW:= BRIGHT + BLACK_ON + BLACK

CASTSNOSHAD:= BRIGHT + WHITE_ON + WHITE + BLINK

Eine FoxPro-Farbpaarliste wie z.B.:

   W+/B, W+/BG*, GR+/B, GR+/B, R+/B, W+/GR, GR+/RB, N+/N, GR+/B, R+/B

muß jetzt wie folgt als String erzeugt werden:

   m.C_scheme = WHITE_ON + BLUE + BRIGHT  && 1. Farbpaar

   m.C_scheme = m.C_scheme + WHITE_ON + CYAN + BRIGHT + BLINK  && 2.

   m.C_scheme = m.C_scheme + MAGENTA_ON + BLUE + BRIGHT  & 3. Farbpaar

u.s.w....

Danach können Sie Ihr eigenes Schema durch Übergabe in <AusdrZ1> verwenden, wenn Sie gleichzeitig in <AusdrN6> den Wert -1 übergeben.

Im letzten Parameter <AusdrZ2> kann durch den angegebenen Rahmen-String der Fenstertyp übergeben werden. Näheres dazu siehe Funktion _WOPENP().

Das Fenster wird definiert, aber noch nicht geöffnet. Die Farbattribute, sowie ein Fenstertitel können mit den Funktionen: _WATTR() und _WTITLE() abgefragt und mit _WSETATTR() und _WSETTITLE() nachträglich verändert/gesetzt werden. Abschließend können Sie mit der Funktion _WSHOW(m.FP_HANDLE) das Fenster anzeigen.

Beispiel:

STORE 1 TO m.N_oben, m.N_links

STORE 10 TO m.N_unten, m.N_rechts.C_colors = m.C_colors +CHR(BLACK_ON + WHITE + BLINK)

m.C_colors = m.C_colors +CHR(BLACK_ON + WHITE + BLINK)

m.C_colors = m.C_colors +CHR(WHITE_ON + BLUE + BRIGHT)

m.C_colors = m.C_colors +CHR(BLACK_ON + WHITE + BLINK)

m.C_colors = m.C_colors +CHR(WHITE_ON + BLUE + BRIGHT)

m.C_colors = m.C_colors +CHR(WHITE_ON + BLUE + BRIGHT)

m.C_colors = m.C_colors +CHR(BLACK_ON + BLACK)

m.C_colors = m.C_colors +CHR(BLACK_ON + WHITE + BLINK)

m.C_colors = m.C_colors +CHR(WHITE_ON + WHITE + BLINK)

m.C_colors = m.C_colors +CHR(CASTSSHADOW)

m.N_FP_hwnd01 = _WOPEN(m.N_oben, m.N_links, m.N_unten, m.N_rechts,m.C_flags, m.N_scheme, "", m.C_rahm)


_WSCROLL()
_WSCROLL()	[zeichenorientiert]

Zweck:	Scrollt einen rechteckigen Fensterbereich.

Syntax:	_WSCROLL(<AusdrN1>,<AusdrN2>,<AusdrN3>,<AusdrN4>,<AusdrN5>,<AusdrN6>,<AusdrN7>)

Parameter:	<AusdrN1> Handle des Fensters

<AusdrN2> IntegerZahl: Zeile obere Koordinate

<AusdrN3> IntegerZahl: Spalte linke Koordinate

<AusdrN4> IntegerZahl: Zeile untere Koordinate

<AusdrN5> IntegerZahl: Spalte rechte Koordinate

<AusdrN6> IntegerZahl: horizontal Scrollen

<AusdrN7> IntegerZahl: vertikal Scrollen

Rückgabe: 	Logisch

Vgl.:	_WSCROLLP()

Beschreibung:

Diese Funktion dient dazu, einen Bereich des Fensters nach links oder rechts, aufwärts oder abwärts zu scrollen. Geben Sie in <AusdrN1> das FP-FensterHandle für das Fenster an, dessen Bereich gescrollt werden soll. Die Parameter <AusdrN2> bis <AusdrN5> beschreiben den zu scrollenden Bereich. im Parameter <AusdrN6> übergeben Sie die Anzahl der Zeichen um die horizontal verschoben werden soll. Ist der Wert hier negativ, so wird der Fensterinhalt nach links gescrollt. Umgekehrt gilt für einen positiven Wert, daß der Fensterinhalt nach rechts verschoben wird. Im letzten Parameter <AusdrN7> findet sich die Anzahl der Zeichen um die vertikal verschoben werden soll. Ist der Wert hier negativ, so wird der Fensterinhalt nach oben gescrollt. Umgekehrt gilt für einen positiven Wert, daß der Fensterinhalt nach unten verschoben wird.

WICHTIG: Sind beide Scroll-Werte gleich 0, so löscht _WSCROLL() den festgelegten Bereich.

Beispiel:

STORE 2 TO m.N_oben, m.N_linksSTORE 8 TO m.N_unten, m.N_rechtsSTORE 2 TO m.N_horiSTORE -1 TO m.N_verti


_WOPENP()
_WOPENP()	[pixelorientiert] & fehlerhaft

Zweck:	Erstellen eines neues Fensters unter FoxPro für Windows oder Macintosh.

Syntax:	_WOPENP(<AusdrN1>,<AusdrN2>,<AusdrN3>,<AusdrN4>,<AusdrN5>,<AusdrN6>,<AusdrZ1>,<AusdrZ2>)

Parameter:	<AusdrN1> Reihe der oberen Pixel-Koordinate

<AusdrN2> Spalte der linken Pixel-Koordinate

<AusdrN3> Reihe der unteren Pixel-Koordinate

<AusdrN4> Spalte der rechten Pixel-Koordinate

<AusdrN5> Fenster-Attribute

<AusdrN6> Farbpalettenummer

Rückgabe: 	Nummerisch

Vgl.:	_WOPEN() , _WSETATTR(), _WSETTITLE(), _WSHOW(), _WCLEAR()

Beschreibung:

Die Funktion erzeugt ein neues Fenster und gibt als Resultat das FP-FensterHandle zurück. Die Koordinaten, die in den Parametern <AusdN1> bis <AusdrN4> übergeben werden, können außerhalb des Bildschirms liegen. Die Koordinaten werden in Pixeln relativ zum Hauptfenster angegeben. Der fünfte Parameter dient zur Festlegung der Attribute dieses Fensters. Dafür kann einer oder mehrere Attribut-Werte (siehe Funktion _WOPEN()) zusammenaddiert in <AusdrN5> als IntegerZahl übergeben werden.

Der sechste Parameter, welcher die Nummer der Farbpalette angibt, kann jeden gültigen Wert (1-24) annehmen. Darüberhinaus kann auch der Wert -1 gesetzt werden, was dann bedeutet, daß die in <AusdrZ1> definierte Farbpalette zu verwenden ist. Ein anwenderdefinierter Farbpaletten-String ist 11 Zeichen lang - Details siehe Funktion _WOPEN() - funktioniert unter Windows nicht. Im letzten Parameter <AusdrZ2> kann durch die Vorbelegung eines Rahmen-Strings der Fenstertyp übergeben werden:

* DoppelterRahmen-Fenstertyp (aktiviert autom. auch Titelzeile im Fenster)

#DEFINE WO_DOUBLEBOX CHR(205) + CHR(205) + CHR(186) +CHR(186)+ CHR(201) + CHR(187) + CHR(200) + CHR(188) +CHR(205) + CHR(205)+ CHR(186) + CHR(186) + CHR(201) +CHR(187) +CHR(200) +CHR(188)

* EinfacherRahmen-Fenstertyp

#DEFINE WO_SINGLEBOX CHR(196) + CHR(196) + CHR(179) +CHR(179) + CHR(218) + CHR(191) + CHR(192) + CHR(217) +CHR(196) + CHR(196) + CHR(179) + CHR(179) + CHR(218) +CHR(191) + CHR(192) + CHR(217)

* PanelRahmen-Fenstertyp

#DEFINE WO_PANELBORDER REPLICATE(CHR(219),16)

* System-Fenstertyp

#DEFINE WO_SYSTEMBORDER REPLICATE(CHR(32),4) + CHR(254) + CHR(240) + CHR(32) + CHR(249) + REPLICATE(CHR(32),8)

Das Fenster wird definiert, aber noch nicht geöffnet. Die Attribute sowie ein Fenstertitel können mit den Funktionen _WATTR()  und _WTITLE() abgefragt und mit _WSETATTR() und _WSETTITLE() verändert werden. Abschließend können Sie mit der Funktion _WSHOW() das Fenster anzeigen.

Tip: Diese, von einer "LowLevel"-Funktion erzeugten Fenster, erscheinen nicht im System-Pulldownmenü "Fenster" und können auch nicht mit CLEAR ALL oder CLEAR WINDOWS ALL gelöscht werden - sie sind ideal für den Einsatz von System-Erweiterungen (Symbolleiste etc) geeignet!

Falle: Wenn Sie ein Fenster mit dem Attribut "CLOSE := 8" (Benutzer kann Fenster schließen) definiert haben, müssen Sie vor Anwendung der Funktion _WCLOSE(Handle) unbedingt überprüfen, ob das Handle noch gültig ist (Fenster noch exisitiert) - sonst steht Ihnen mal wieder ein System-Crash ins Haus! Weitere Details erfahren Sie unter der Funktionsbeschreibung für _WCLOSE().

Beispiel:

STORE 0 TO m.N_oben, m.N_links

STORE 630 TO m.N_rechts

STORE 50 TO m.N_unten

#DEFINE WO_SYSTEMBORDER   REPLICATE(CHR(32),4) + CHR(254) + CHR(240) + CHR(32) + CHR(249) + REPLICATE(CHR(32),8)

#DEFINE WCURSOR 2 && Cursor wird im Fenster angezeigt

#DEFINE ZOOM 4 && Benutzer kann Fenster zoomen

#DEFINE ADJ 8 && Benutzer kann Größe verändern

#DEFINE MOVE 32 &&Benutzer kann Fenster bewegen

#DEFINE AUTOSCROLL 256 &&Auto-Scrolling aktiviert

#DEFINE WEVENT 1024 &&Empfängt, aktiviert und deaktiviert Ereignisse

m.C_flags = WCURSOR + ZOOM + ADJ + MOVE + AUTOSCROLL + WEVENT

m.N_scheme = 5  && Standard-Schema #5

m.C_colors = "" && kein eigenes Schema

* Jetzt Fenster definieren

m.wh_01 = _WOPENP(m.N_oben, m.N_links, m.N_unten, m.N_rechts,m.C_flags, m.N_scheme, m.C_colors, WO_SYSTEMBORDER)

* und anzeigen

= _WSHOW(m.wh_01)


_WSCROLLP()
_WSCROLLP()	[pixelorientiert]

Zweck:	Scrollt einen rechteckigen Fensterbereich.

Syntax:	_WSCROLLP(<AusdrN1>,<AusdrN2>,<AusdrN3>,<AusdrN4>,<AusdrN5>,<AusdrN6>,<AusdrN7>)

Parameter:	<AusdrN1> FP-Handle des Fensters

<AusdrN2> Reihe obere Pixel-Koordinate

<AusdrN3> Spalte linke Pixel-Koordinate

<AusdrN4> Reihe untere Pixel-Koordinate

<AusdrN5> Spalte rechte Pixel-Koordinate

<AusdrN6> horizontal Scrollen

<AusdrN7> vertikale Scrollen

Rückgabe: 	Logisch

Vgl.:	_WSCROLL()

Beschreibung:

Diese Funktion dient dazu, einen Bereich des FPW-Fensters nach links oder rechts, aufwärts oder abwärts zu scrollen. Geben Sie in <AusdrN1> das FP-FensterHandle für das Fenster an, dessen Bereich gescrollt werden soll. Die Parameter <AusdrN2> bis <AusdrN5> beschreiben den zu scrollenden Bereich. im Parameter <AusdrN6> übergeben Sie die Anzahl der Pixel um die horizontal verschoben werden soll. Ist der Wert hier negativ, so wird der Fensterinhalt nach links gescrollt. Umgekehrt gilt für einen positiven Wert, daß der Fensterinhalt nach rechts verschoben wird. Im letzten Parameter <AusdrN7> findet sich die Anzahl der Pixel um die vertikal verschoben werden soll. Ist der Wert hier negativ, so wird der Fensterinhalt nach oben gescrollt. Umgekehrt gilt für einen positiven Wert, daß der Fensterinhalt nach unten verschoben wird. WICHTIG: Sind beide Werte gleich 0, so löscht _WSCROLL() den festgelegten Bereich.

Beispiel:

STORE 200 TO m.N_oben, m.N_links

STORE 500 TO m.N_unten, m.N_rechts

STORE 50 TO m.N_hori

STORE -10 TO m.N_verti

= _WSCROLLP(m.wh_01, m.N_oben, m.N_links, m.N_unten, m.N_rechts, m.N_hori, m.N_verti)


_WCLOSE()

Zweck:	Schließen eines Fensters.

Syntax:	_WCLOSE(<AusdrN1>)

Parameter: 	<AusdrN1> FP-Handle des Fensters

Rückgabe: 	Logisch

Vgl.:	_WOPEN(), _WOPENP()

Beschreibung:

Die Funktion schließt das Fenster mit dem in <AusdrN1> übergebenen FP-FensterHandle und gibt den belegten Speicherplatz wieder frei. Falle: Wenn Sie ein Fenster mit dieser Funktion schließen wollen und als Übergabeparameter eine ungültige Handle-Nummer übergeben, ist ein System-Crash ziemlich sicher!

Beispiel:

m.wh_01 = _WOPENP(Noben, Nlinks, Nunten, Nrechts,Cflags, Nscheme, Ccolors,WO_SYSTEMBORDER)

= WCLOSE(m.wh_01) && schließen


_WHIDE()

Zweck:	Fenster verbergen.

Syntax:	_WHIDE(<AusdrN1>)

Parameter: 	<AusdrN1> FP-Handle des Fensters

Rückgabe: 	Logisch

Vgl.:	_WSHOW()

Beschreibung:

Entfernt das Fenster dessen FP-FensterHandle Sie in <AusdrN1> übergeben haben vom Bildschirm, behält seinen Inhalt aber gespeichert, so daß es jederzeit wieder mit _WSHOW() dargestellt werden kann.

Beispiel:

m.wh_01 = _WOPENP(m.N_oben, m.N_links, m.N_unten, m.N_rechts,m.C_flags, m.N_scheme, m.C_colors, WO_SYSTEMBORDER)

= WHIDE(m.wh_01) && verstecken


_WSHOW()

Zweck:	Anzeigen eines verborgenen Fensters.

Syntax:	_WSHOW(<AusdrN1>)

Parameter: 	<AusdrN1> FP-Handle des Fensters

Rückgabe: 	Logisch

Vgl.:	_WHIDE()

Beschreibung:

Stellt das mittels _WHide() verborgene Fenster wieder auf dem Bildschirm dar.

Beispiel:

= WHIDE(m.wh_01)	&& verstecken= WSHOW(m.wh_01)	&& anzeigen


_WZOOM()

Zweck:	Fenstergröße verändern.

Syntax:	_WZOOM(<AusdrN1>,<AusdrN2>)

Parameter: 	<AusdrN1> FP-Handle des Fensters

<AusdrN2> Fensterstatus nach Zoom

Rückgabe: 	Logisch

Vgl.:	_WSHOW(), _WHIDE()

Beschreibung:

Die Funktion dient dazu, das Fenster dessen FP-FensterHandle Sie in <AusdrN1> übergeben müssen zu minimieren, zu maximieren oder wieder auf Urspungsgröße zu bringen. Der zweite Parameter <AusdrN2> kann folgendermaßen gesetzt werden:

#DEFINE WZ_MINIMIZE	2

#DEFINE WZ_NORMAL	1

#DEFINE WZ_MAXIMIZE	0

Beispiel:

#DEFINE ZOOM 4 &&Benutzer kann Fenster zoomen

#DEFINE ADJ 8 &&Benutzer kann Größe verändern

#DEFINE WO_SYSTEMBORDER ;

REPLICATE(CHR(32),4) + CHR(254) + ;

CHR(240) + CHR(32) + CHR(249) + ;

REPLICATE(CHR(32),8)

STORE 0 TO m.N_oben, m.N_links

STORE 20 TO m.N_unten, m.N_rechts

m.C_flags = ZOOM+ADJ

m.wh_01 = _WOPENP(m.N_oben, m.N_links, m.N_unten, m.N_rechts,m.C_flags, 1, "", WO_SYSTEMBORDER)

= WZOOM(m.wh_01, WZ_MAXIMIZE) && maximieren


_WSELECT()

Zweck:	Fenster OnTop bringen (selektieren).

Syntax:	_WSELECT(<AusdrN1>)

Parameter: 	<AusdrN1> FP-Handle des Fensters

Rückgabe: 	Logisch

Vgl.:	_WSENDBEHI(), _WSETPORT(), _WGETPORT()

Beschreibung:

Dient dazu, das Fenster, dessen FP-Handle Sie in <AusdrN1> übergeben müssen auf dem Bildschirm in den Vordergrund treten zu lassen. Dabei wird das Fenster nur im Stapel "OnTop" geholt aber noch nicht automatisch zum aktiven Ausgabefenster. Verwenden Sie hierfür den Befehl _WSETPORT()

Beispiel:

m.N_temp = _WGETPORT() && aktuelles AusgabefensterHandle ...

IF m.N_temp <> m.N_FP_hwnd01 && ... nicht Handle von Message-Win

= _WSELECT(m.N_FP_hwnd01)  && Message-Win nach vorne holen

= _WSETPORT(m.N_FP_hwnd01)  && Ausgabe darin aktivieren

? "Bitte Taste drücken"

= INKEY(0,"HM") && Auf Taste warten

= _WHIDE(m.N_FP_hwnd01) && Message-Win verstecken

= _WSETPORT(m.N_temp) && alten Ausgabeport reaktivieren

ELSE

? "Bitte Taste drücken"

= INKEY(0,"HM") && Auf Taste warten

ENDIF


_WSENDBEHI()

Zweck:	Fenster im Stapel nach hinten stellen.

Syntax:	_WSENDBEHI(<AusdrN1>)

Parameter: 	<AusdrN1> FP-Handle des Fensters

Rückgabe: 	Logisch

Vgl.:	_WSELECT()

Beschreibung:

Dient dazu, das Fenster, dessen FP-FensterHandle Sie in <AusdrN1> übergeben müssen, auf dem Bildschirm in den Hintergrund treten zu lassen. Es befindet sich dann an unterster Position im Fensterstapel. Der Ausgabeport wird dadurch nicht beeinflußt!

Beispiel:

= _WSENDBEHI(m.N_FP_hwnd01)


_WGETPORT()

Zweck:	Holen des FP-FensterHandles des aktiven Ausgabefensters.

Syntax:	_WGETPORT()

Parameter: 	keine

Rückgabe: 	Nummerisch

Vgl.:	_WSETPORT()

Beschreibung:

Gibt das FP-FensterHandle des Fensters, welches aktuell dem Benutzer zur Ausgabe dient zurück.

Beispiel:

m.N_curPort = _WGETPORT() && aktuelles AusgabefensterHandle ...

= _WSETPORT(m.N_FP_hwnd01) && Neues Fenster aktivieren

? "Bitte Taste drücken"

= INKEY(0,"HM") && Auf Taste warten

= _WCLOSE(m.N_FP_hwnd01) && Fenster releasen

= _WSETPORT(m.N_curPort) && alten Ausgabeport reaktivieren


_WSETPORT()
_WSETPORT()	leicht fehlerhaft

Zweck:	Ausgabe-Fenster festlegen.

Syntax:	_WSETPORT(<AusdrN1>)

Parameter: 	<AusdrZ1> FP-Handle des Fensters

Rückgabe: 	Nummerisch	(nicht zu gebrauchen!)

Vgl.:	_WGETPORT()

Beschreibung:

Diese Funktion legt das Fenster, dessen FP-FensterHandle Sie in <AusdrN1> übergeben müssen, als das neue Ausgabefenster fest und sollte als Wert das Handle des davor aktiven Ausgabefensters zurückgeben.

Falle: der Wert der zurückgegeben wird ist kein gültiges FP-FenserHandle! Benutzen Sie ihn also NICHT in anderen Funktionen weiter!

Wichtig: Sie sollten nicht vergessen, das "alte" Ausgabefenster wieder zu reaktivieren, nachdem Ihre Routine mit der _WSETPORT()-Funktion abgearbeitet worden ist. - So steht es jedenfalls in der Dokumentation zur _WSetPort( )-Funktion im Library Construction Kit S. 298ff.. Dies bezieht sich aber primär auf Ihre selbst entwickelten API-Routinen. Inwiefern diesem Ratschlag in der Foxtools.fll-Routine schon Rechnung getragen wurde, entzieht sich meiner Kenntnis. Ich empfehle daher aus Sicherheitsgründen (Programmstabilität), nach Beenden der Manipulationen am Ausgabefenster den vorigen "Orginalport" immer wie empfohlen zu restaurieren!

Beispiel:

m.N_GoodPort = _WGETPORT( ) && dieses FP-Handle ist OK!...

m.N_SchrottPort = _WSETPORT(m.N_MessagePort) && ...dieses nicht!

RELEASE m.N_SchrottPort && Wert ist "Trümmer", also weg damit

? "Bitte warten"

= _WSETPORT(m.N_GoodPort)


_WMOVE()
_WMOVE()	[zeichenorientiert]

Zweck:	Bewegt ein Fenster zeichenweise.

Syntax:	_WMOVE(<AusdrN1>,<AusdrN2>,<AusdrN3>)

Parameter:	<AusdrN1> FP-Handle des Fensters

<AusdrN2> Ecke links,oben auf Spalte #

<AusdrN3> Ecke links,oben auf Zeile #

Rückgabe: 	Logisch

Vgl.:	_WMOVEP()

Beschreibung:

Bewegt das durch das FP-FensterHandle in <AusdrN1> übergebene Fenster an eine neue Position. Die neuen Koordinaten der linken, oberen Ecke des Fensters werden in (Integerwerten) Zeilen und Spalten in den Parametern <AusdrN2> und <AusdrN3> an die Funktion übergeben. Das Fenster kann nach Durchführung auch teilweise oder ganz außerhalb des Bildschirms liegen.

Beispiel:

= _WMOVE(m.N_wHandle, 1,2) && Fenster auf  Spalte #1, Zeile #2 setzen


_WSIZE()
_WSIZE()	[zeichenorientiert]

Zweck:	Fenstergröße verändern.

Syntax:	_WSIZE(<AusdrN1>,<AusdrN2>,<AusdrN3>)

Parameter:	<AusdrN1> FP-Handle des Fensters

<AusdrN2> neue Fensterbreite in Spalten

<AusdrN3> neue Fensterhöhe in Zeilen

Rückgabe:	Logisch

Vgl.:	_WSIZEP()

Beschreibung:

Legt die neuen Abmessungen des Fensters fest, dessen FP-FensterHandle Sie in <AusdrN1> übergeben haben. Die neue Breite in Spalten und die neue Höhe in Zeilen werden in den Parametern <AusdrN2> und <AusdrN3> übergeben.

Beispiel:

= _WSIZE(m.N_wHandle, 5,10)


_WMOVEP()
_WMOVEP()	[pixelorientiert]

Zweck:	Bewegt ein Fenster pixelweise.

Syntax:	_WMOVEP(<AusdrN1>,<AusdrN2>,<AusdrN3>)

Parameter:	<AusdrN1> FP-Handle des Fensters

<AusdrN2> Ecke links,oben auf Pixelspalte #  relativ zum Screen

<AusdrN3> Ecke links,oben auf Pixelzeile #  relativ zum Screen

Rückgabe: 	Logisch

Vgl.:	_WMOVE()

Beschreibung:

Bewegt das durch das FP-FensterHandle in <AusdrN1> übergebene Fenster an eine neue Position. Die neuen Koordinaten der linken, oberen Ecke des Fensters werden in Pixelwerten der Reihen und Spalten in den Parametern <AusdrN2> und <AusdrN3> an die Funktion übergeben. Das Fenster kann nach Durchführung auch teilweise oder ganz außerhalb des Bildschirms liegen.

Beispiel:

= _WMOVEP(m.N_wHandle, 100,200) && Fenster auf  Point (100,200)


_WSIZEP()
_WSIZEP()	[pixelorientiert]

Zweck:	Fenstergröße verändern.

Syntax:	_WSIZEP(<AusdrN1>,<AusdrN2>,<AusdrN3>)

Parameter:	<AusdrN1> FP-Handle des Fensters

<AusdrN2> neue Fensterbreite in Pixeln

<AusdrN3> neue Fensterhöhe in Pixeln

Rückgabe: 	Logisch

Vgl.:	_WSIZE()

Beschreibung:

Legt die neuen Abmessungen des Fensters fest, dessen FP-FensterHandle Sie in <AusdrN1> übergeben haben. Die neue Breite und die neue Höhe werden in den Parametern <AusdrN2> und <AusdrN3> als Pixelwerte übergeben.

Beispiel:

= _WSIZE(m.N_wHandle, 300,100)

* neue Breite: 300 Pixel, Höhe: 100 Pixel


_WTOP()
_WTOP()	[zeichenorientiert]

Zweck:	Fenster "VonZeile"-Wert zurückgeben.

Syntax:	_WTOP(<AusdrN1>)

Parameter: 	<AusdrN1> FP-Handle des Fensters

Rückgabe: 	Nummerisch

Vgl.:	_WTOPP(), WBOTTOM()

Beschreibung:

Ermittelt die Bildschirmzeile auf der sich die obere Seite des Fensters befindet, dessen FP-FensterHandle Sie in <AusdrN1> übergeben haben. >Unter Windows werden alle theoretischen Nachkommastellen, die ja durch die pixelgenaue Positionierung möglich sind, im Rückgabewert abgeschnitten.

Beispiel:

? _WTOP(m.N_wHandle) && obere Fensterkante auf Zeile #


_WBOTTOM()
_WBOTTOM()	[zeichenorientiert]

Zweck:	Fenster "BisZeile"-Wert zurückgeben.

Syntax:	_WBOTTOM(<AusdrN1>)

Parameter: 	<AusdrN1> FP-Handle des Fensters

Rückgabe: 	Nummerisch

Vgl.:	_WBOTTOMP(), _WTOP()

Beschreibung:

Ermittelt die Bildschirmzeile auf der sich die untere Seite des Fensters befindet, dessen FP-FensterHandle Sie in <AusdrN1> übergeben haben. Unter Windows werden alle Nachkommastellen, die durch die pixelgenaue Positionierung möglich sind, im Rückgabewert abgeschnitten.

Beispiel:

? _WBOTTOM(m.N_wHandle) && untere Fensterkante auf Zeile #


_WLEFT()
_WLEFT()	[zeichenorientiert]

Zweck:	Fenster "VonSpalte"-Wert zurückgeben.

Syntax:	_WLEFT(<AusdrN1>)

Parameter: 	<AusdrN1> FP-Handle des Fensters

Rückgabe: 	Nummerisch

Vgl.:	_WLEFTP(), WRIGHT()

Beschreibung:

Ermittelt die Bildschirmspalte auf der sich die linke Seite des Fensters befindet, dessen FP-FensterHandle Sie in <AusdrN1> übergeben haben. Unter Windows werden alle theoretischen Nachkommastellen, die durch die pixelgenaue Positionierung möglich sind, im Rückgabewert abgeschnitten.

Beispiel:

? _WLEFT(m.N_wHandle) && linke Fensterkante auf Spalte #


_WRIGHT()
_WRIGHT()	[zeichenorientiert]

Zweck:	Fenster "BisSpalte"-Wert zurückgeben.

Syntax:	_WRIGHT(<AusdrN1>)

Parameter: 	<AusdrN1> FP-Handle des Fensters

Rückgabe: 	Nummerisch

Vgl.:	_WRIGHTP(), WLEFT()

Beschreibung:

Ermittelt die Bildschirmspalte auf der sich die rechte Seite des Fensters befindet, dessen FP-FensterHandle Sie in <AusdrN1> übergeben haben. Unter Windows werden alle theoretischen Nachkommastellen, die durch die pixelgenaue Positionierung möglich sind, im Rückgabewert abgeschnitten.

Beispiel:

? _WRIGHT(m.N_wHandle) && rechte Fensterkante auf Spalte #


_WHEIGHT()
_WHEIGHT()	[zeichenorientiert]

Zweck:	Nutzbare Fensterhöhe.

Syntax:	_WHEIGHT(<AusdrN1>)

Parameter: 	<AusdrN1> FP-Handle des Fensters

Rückgabe: 	Nummerisch

Vgl.:	_WHEIGHTP(), _WWIDTH()

Beschreibung:

Ermittelt die Anzahl der Zeilen im nutzbaren Innenbereich (client area) des Fensters, dessen FP-FensterHandle Sie in <AusdrN1> übergeben müssen. Unter Windows müssen Sie das Funktionsresultat noch mit der durchschnittlichen Zeichenhöhe in Pixeln multiplizieren, um ein brauchbares Ergebnis zu bekommen!

Beispiel:

? _WHEIGHT(m.N_wHandle) && Nutzbare Zeilen # in Fenster


_WWIDTH()
_WWIDTH()	[zeichenorientiert]

Zweck:	Nutzbare Fensterhöhe in Pixelzeilen.

Syntax:	_WWIDTH(<AusdrN1>)

Parameter: 	<AusdrN1> FP-Handle des Fensters

Rückgabe: 	Nummerisch

Vgl.:	_WWIDTHP(), _WHEIGHT()

Beschreibung:

Ermittelt die Anzahl der Pixelspalten im nutzbaren Innenbereich (client area) des Fensters, dessen FP-FensterHandle Sie in <AusdrN1> übergeben müssen. Unter Windows müssen Sie das Funktionsresultat noch mit der durchschnittlichen Zeichenbreite in Pixeln multiplizieren, um ein brauchbares Ergebnis zu bekommen!

Beispiel:

? _WWIDTH(m.N_wHandle) && Nutzbare Pixelspalten # in Fenster


_WTOPP()
_WTOPP()	[pixelorientiert]

Zweck:	Fenster "VonPixelZeile"-Wert zurückgeben.

Syntax:	_WTOPP(<AusdrN1>)

Parameter: 	<AusdrN1> FP-Handle des Fensters

Rückgabe: 	Nummerisch

Vgl.:	_WTOP(), WBOTTOMP()

Beschreibung:

Ermittelt die Bildschirm-Pixelzeile auf der sich die obere Seite des Fensters befindet, dessen FP-FensterHandle Sie in <AusdrN1> übergeben haben.

Beispiel:

? _WTOPP(m.N_wHandle) && obere Fensterkante auf Pixelzeile #


_WBOTTOMP()
_WBOTTOMP()	[pixelorientiert]

Zweck:	Fenster "BisPixelZeile"-Wert zurückgeben.

Syntax:	_WBOTTOMP(<AusdrN1>)

Parameter: 	<AusdrN1> FP-Handle des Fensters

Rückgabe: 	Nummerisch

Vgl.:	_WBOTTOM(), _WTOPP()

Beschreibung:

Ermittelt die Bildschirm-Pixelzeile auf der sich die untere Seite des Fensters befindet, dessen FP-FensterHandle Sie in <AusdrN1> übergeben haben.

Beispiel:

? _WBOTTOMP(m.N_wHandle) && untere Fensterkante auf Pixelzeile #


_WLEFTP()
_WLEFTP()	[pixelorientiert]

Zweck:	Fenster "VonPixelSpalte"-Wert zurückgeben.

Syntax:	_WLEFTP(<AusdrN1>)

Parameter: 	<AusdrN1> FP-Handle des Fensters

Rückgabe: 	Nummerisch

Vgl.:	_WLEFT(), WRIGHTP()

Beschreibung:

Ermittelt die Bildschirm-Pixelspalte auf der sich die linke Seite des Fensters befindet, dessen FP-FensterHandle Sie in <AusdrN1> übergeben haben.

Beispiel:

? _WLEFTP(m.N_wHandle) && linke Fensterkante auf Pixelspalte #


_WRIGHTP()
_WRIGHTP()	[pixelorientiert]

Zweck:	Fenster "BisPixelSpalte"-Wert zurückgeben.

Syntax:	_WRIGHTP(<AusdrN1>)

Parameter: 	<AusdrN1> FP-Handle des Fensters

Rückgabe: 	Nummerisch

Vgl.:	_WRIGHT(), WLEFTP()

Beschreibung:

Ermittelt die Bildschirms-Pixelpalte auf der sich die rechte Seite des Fensters befindet, dessen FP-FensterHandle Sie in <AusdrN1> übergeben haben.

Beispiel:

? _WRIGHTP(m.N_wHandle) && rechte Fensterkante auf Pixelspalte #


_WHEIGHTP()
_WHEIGHTP()	[pixelorientiert]

Zweck:	Nutzbare Fensterhöhe in Pixeln.

Syntax:	_WHEIGHTP(<AusdrN1>)

Parameter: 	<AusdrN1> FP-Handle des Fensters

Rückgabe: 	Nummerisch

Vgl.:	_WHEIGHT(), _WWIDTHP()

Beschreibung:

Ermittelt die Anzahl der Pixelzeilen im nutzbaren Innenbereich (client area) des Fensters, dessen FP_FensterHandle Sie in <AusdrN1> übergeben müssen.

Beispiel:

? _WHEIGHTP(m.N_wHandle) && Nutzbare Pixelzeilen # in Fenster


_WWIDTHP()
_WWIDTHP()	[pixelorientiert]

Zweck:	Nutzbare Fensterhöhe in Pixeln.

Syntax:	_WWIDTHP(<AusdrN1>)

Parameter: 	<AusdrN1> FP-Handle des Fensters

Rückgabe: 	Nummerisch

Vgl.:	_WWIDTH(), _WHEIGHTP()

Beschreibung:

Ermittelt die Anzahl der Spalten im nutzbaren Innenbereich (client area) des Fensters, dessen FP_FensterHandle Sie in <AusdrN1> übergeben müssen.

Beispiel:

 ? _WWIDTHP(m.N_wHandle) && Nutzbare Pixelspalten # in Fenster


_WCLEAR()

Zweck:	Client-Area eines Fensters löschen.

Syntax:	_WCLEAR(<AusdrN1>)

Parameter: 	<AusdrN1> FP-Handle des Fensters

Rückgabe: 	Logisch

Vgl.:	_GETWRECT(), _WCLEARREC(), _WCLEARREP()

Beschreibung:

Löscht den Inhalt des Fensters, dessen FP-FensterHandle Sie in <AusdrN1> übergeben müssen, indem der Innenbereich durch eine Fläche in der voreingestellten Hintergrundfarbe ersetzt wird. Die Cursorposition bleibt dabei unverändert. Achtung: unter Windows wird immer mit der in der Systemsteuerung eingestellten Texthintergrundfarbe gelöscht!

Beispiel:

? _WCLEAR(m.N_wHandle) && Client Area löschen


_WCLEARREC()
_WCLEARREC()	[zeichenorientiert]

Zweck:	Rechteckigen Bereich eines Fensters löschen.

Syntax:	_WCLEARREC(<AusdrN1>,<AusdrN2>,<AusdrN3>,<AusdrN4>,<AusdrN5>)

Parameter:	<AusdrN1> FP-Handle des Fensters

<AusdrN2> Reihe der oberen Zeile

<AusdrN3> Spalte der linken Spalte

<AusdrN4> Reihe der unteren Zeile

<AusdrN5> Spalte der rechten Spalte

Rückgabe: 	Logisch

Vgl.:	_GETWRECT(), _WCLEARRECP(), _WCLEAR()

Beschreibung:

Löscht den rechteckigen Inhalt des Fensters, dessen FP-FensterHandle Sie in <AusdrN1> übergeben müssen, indem der Innenbereich durch eine Fläche in der voreingestellten Hintergrundfarbe ersetzt wird. Achtung: unter Windows wird immer mit der in der Systemsteuerung eingestellten Texthintergrundfarbe gelöscht! Das zu löschende Rechteck wird in den Parametern <AusdrN2> für die obere Rechteck-Zeile, <AusdrN3> für die linke Rechteck-Spalte, <AusdrN4> für die untere Rechteck-Zeile und <AusdrN4> für die linke Rechteck-Spalte übergeben. Diese Zeilen- und Spalten-Angaben "umschließen" das zu löschende Rechteck! Dies bedeutet, daß man die Koordinaten für <AusdrN4> und <AusdrN5> um eins größer und die in <AusdrN2> und <AusdrN3> um eins kleiner wählen muß, als das zu löschende Rechteck selbst groß sein soll. Die Cursorposition bleibt von der Funktion unverändert bestehen.

Beispiel:

STORE 2 TO m.N_oben, m.N_links

STORE 8 TO m.N_unten, m.N_rechts

m.N_wHandle = _WGETPORT()

= _WCLEARREC(m.N_wHandle,m.N_oben, m.N_links,m.N_unten, m.N_rechts)


_WCLEARRECP()
_WCLEARREP()	[pixelorientiert]

Zweck:	Rechteckigen PixelBereich eines Fensters löschen.

Syntax:	_WCLEARREP(<AusdrN1>,<AusdrN2>,<AusdrN3>,<AusdrN4>,<AusdrN5>)

Parameter:	<AusdrN1> F-Handle des Fensters

<AusdrN2> Reihe der oberen Pixel-Zeile

<AusdrN3> Spalte der linken Pixel-Spalte

<AusdrN4> Reihe der unteren Pixel-Zeile

<AusdrN5> Spalte der rechten Pixel-Spalte

Rückgabe: 	Logisch

Vgl.:	_GETWRECT(), _WCLEARREC(), _WCLEAR()

Beschreibung:

Löscht den rechteckigen Inhalt des Fensters, dessen FP-FensterHandle Sie in <AusdrN1> übergeben müssen, indem der Innenbereich durch eine Fläche in der voreingestellten Hintergrundfarbe ersetzt wird. Achtung: unter Windows wird immer mit der in der Systemsteuerung eingestellten Texthintergrundfarbe gelöscht! Das zu löschende Rechteck wird in den Parametern <AusdrN2> für die obere Rechteck-Pixelzeile, <AusdrN3> für die linke Rechteck-Pixelspalte, <AusdrN4> für die untere Rechteck-Pixelzeile und <AusdrN4> für die linke Rechteck-Pixelspalte übergeben. Diese Pixel-Zeilen/Spaltenangaben "umschließen" das zu löschende Rechteck! Dies bedeutet, daß man die Koordinaten für <AusdrN4> und <AusdrN5> um einen Pixel größer und die in <AusdrN2> und <AusdrN3> um einen Pixel kleiner wählen muß, als das zu löschende Rechteck selbst groß sein soll. Die Cursorposition bleibt von der Funktion unverändert bestehen.

Beispiel:

STORE 100 TO m.N_oben, m.N_links

STORE 300 TO m.N_unten, m.N_rechts

m.N_wHandle = _WGETPORT()

= _WCLEARREP(m.N_wHandle,m.N_oben, m.N_links,m.N_unten, m.N_rechts)


_WPOSCURSO()
_WPOSCURSO()	[zeichenorientiert]

Zweck:	Setzen des Ausgabe-Cursors.

Syntax:	_WPOSCURSO(<AusdrN1>,<AusdrN2>,<AusdrN3>)

Parameter:	<AusdrN1> FP-Handle des Fensters

<AusdrN2> Spalte der neuen Ausgabekoordinate

<AusdrN3> Zeile der neuen Ausgabekoordinate

Rückgabe: 	Logisch

Vgl.:	_WGETCURP(), _WGETCURSO()

Beschreibung:

Setzt die Ausgabeposition im  Fenster, dessen FP-FensterHandle Sie in <AusdrN1> übergeben müssen an die neue Position, deren Koordinaten Sie in <AusdrN2> für Spalte# und <AusdrN3> für Zeile# angeben müssen. Das Neusetzen führt allerdings nicht dazu, daß die Eingabestelle erscheint. Normalerweise ist die Eingabestelle nur sichtbar, wenn FoxPro auf eine Eingabe wartet.

Beispiel:

STORE 1 TO m.N_links && neue Spalte = 1

STORE 3 TO m.N_oben && neue Zeile =3

= _WSETCURSO(m.N_wHandle, m.N_links, m.N_oben) && Cursor setzen


_WPOSCURP()
_WPOSCURP()	[pixelorientiert]

Zweck:	Setzen des Ausgabe-Cursors unter Windows.

Syntax:	_WPOSCURP(<AusdrN1>,<AusdrN2>,<AusdrN3>)

Parameter:	<AusdrN1> FP-Handle des Fensters

<AusdrN2> Pixel-Spalte der neuen Ausgabekoordinate

<AusdrN3> Pixel-Zeile der neuen Ausgabekoordinate

Rückgabe: 	Logisch

Vgl.:	_WGSETCURSO(), _WGETCURP()

Beschreibung:

Setzt die Ausgabeposition im  Fenster, dessen FP-FensterHandle Sie in <AusdrN1> übergeben müssen an die neue Position, deren Koordinaten Sie in <AusdrN2> für Pixel-Spalte# und <AusdrN3> für Pixel-Zeile# angeben müssen. Das Neusetzen führt allerdings nicht dazu, daß die Eingabestelle erscheint. Normalerweise ist die Eingabestelle nur sichtbar, wenn FoxPro auf eine Eingabe wartet.

Beispiel:

STORE 100 TO m.N_links && neue Pixel-Spalte = 100

STORE 300 TO m.N_oben && neue Pixel-Zeile =300

= _WSETCURSO(m.N_wHandle, m.N_links, m.N_oben) && Cursor setzen


_WGETCURSO()
_WGETCURSO()	[zeichenorientiert]&fehlerhaft

Zweck:	Ermitteln der AusgabeCursor-Koordinaten.

Syntax:	_WGETCURSO(<AusdrN1>,<AusdrN2>,<AusdrN3>)

Parameter:	<AusdrN1> FP-Handle des Fensters

<AusdrN2> nummerischer Wert

<AusdrN3> nummerischer Wert

<AusdrN2> und <AusdrN3> dürfen nicht als Referenz übergeben werden!

Rückgabe: 	Nummerisch immer <3> (also unsinnig)

Vgl.:	_WGETCURP(), _WPOSCURSO()

Beschreibung:

_WGETCURSO() sollte eigentlich die aktuelle Ausgabeposition im angegebenen Fenster in Zeilen und Spalten ermitteln! Ich hätte mir den Einsatz der Funktion folgendermaßen gedacht:

STORE 0 TO m.N_Spalte, m.N_Zeile && POINT-Koordinaten initialisieren

m.N_FP_whdl = GETPORT( ) && AusgabefensterHandle holen

= _WGETCURSOR(m.N_FP_whdl,@N_Spalte, @N_Zeile)

? "Ausgabe erfolgt derzeit in Zeile #"+;

ALLTRIM(STR(m.N_Zeile,10,0))+" und dort in Spalte #"+ ;

ALLTRIM(STR(m.N_Spalte,5,0))

So hätte man die x/y-Koordinaten in den referenzierten Variablen ablegen können und als Funktions Return-Wert ein <.T.> zurückgeben können. Aber leider haut das nicht hin. Es wird immer eine Fehlermeldung wegen zu wenigen Übergabe-Parametern (wenn man mit deren Anzahl experimentiert), oder wegen falschem Datentyp zurückgegeben. Das nachfolgende Beispiel "funktioniert" zwar anscheinend fehlerlos, bringt aber kein vernünftiges Ergebnis zurück!

Beispiel:

m.N_wHandle = _WFINDTITL("Befehl")

STORE 0 TO m.point1,m.point2

?_WGETCURSO(m.N_wHandle,m.point1,m.point2)

* Returnwert gibt immer> 3 und Werte von <m.point1> und <m.point2> (logischerweise!) immer unverändert <0>!


_WGETCURP()
_WGETCURP()	[pixelorientiert] & fehlerhaft

Zweck:	Ermitteln der AusgabeCursor-Koordinaten.

Syntax:	_WGETCURP(<AusdrN1>,<AusdrN2>,<AusdrN3>)

Parameter:	<AusdrN1> FP-Handle des Fensters

<AusdrN2> nummerischer Wert

<AusdrN3> nummerischer Wert

<AusdrN2> und <AusdrN3> dürfen nicht als Referenz übergeben werden!

Rückgabe: 	Nummerisch immer <3> (also unsinnig)

Vgl.:	_WGETCURSO(), _WPOSCURP()

Beschreibung:

Nur für Windows und Mac. Sollte eigentlich die aktuelle Ausgabeposition im angegebenen Fenster in Pixeln ermitteln. - Funktioniert aber genausowenig wie die DOS-Variante _WGETCURSO() !

Beispiel: können wir uns sparen....


_WATTR()
_WATTR()	fehlerhaft

Zweck:	Holen eines Farb-Attributs für Fenster.

Syntax:	_WATTR(<AusdrN1>,<AusdrN2>)

Parameter:	<AusdrN1> FP-Handle des Fensters

<AusdrN2> Farb-Attribut Indexnummer des Fensters

Rückgabe: 	Nummerisch

Vgl.:	_WSETATTR()

Beschreibung:

Ermittelt ein Farbattribut-Byte (Int-Wert), dessen Indexnummer sie in <AusdrN2> übergeben müssen, aus dem Farbindex in der Farbpalette des angegebenen Fensters, dessen FP-FensterHandle Sie in <AusdrN1> übergeben müssen. Logischerweise wird für jedes einzelne Fenster eine Farbattributsliste geführt. Anders als der FoxPro-Befehl SCHEME(), der Info´s zu einem Schema (gültig für alle Fenster) zurückgibt, erhält man mit _Wattr() Info´s speziell nur zum Schema des angegebenen Fensters! Farb-Indexnummern die von _WSetAttr() and _WAttr() benutzt werden, sind im ..\LCK\PRO_EXT.H wie folgt aufgelistet:

enum

WA_PENCOLOR = -1,	/* CURRENT PEN COLOR = -1*/

WA_NORMAL,	/* normal text 0	*/

WA_ENHANCED,	/* enhanced text 1	*/

WA_BORDER,	/* window border 2	*/

WA_FOREMOST,	/* title when foremost 3	*/

WA_TITLE,	/* title otherwise 4	*/

WA_SELECTED,	/* selected text 5	*/

WA_HOTKEY,	/* control hotkeys 6	*/

WA_SHADOW,	/* color of shadows that fall on this window. 7*/

WA_ENABLED,	/* enabled control 8	*/

WA_DISABLED,	/* disabled control 9	*/

WA_ISSHADOW	/* window casts a shad 10	*/

Die Funktion müßte jetzt also bei Aufruf mit einem gültigen Handle z.B.:

_WATTR(m.N_FP_hndl, 0)

das Farbattribut für den normalen Ausgabetext zurückgeben, oder für

_WATTR(m.N_FP_hndl, -1)

die Stiftfarbe ermitteln! Nix da (!), es wird konstant und beharrlich der in <AusdrN2> übergebene Wert auch als Return-Wert zurückgegeben. Das ist unbrauchbar!

Beispiel:

* Theoretisch müßte die Funktion so arbeiten:

* Ausgeben des kompletten Farb-Schemas, das vom aktiven

* Ausgabefenster verwendet wird:

m.N_hdl = _WOPEN(......   && Fenster öffnen, damit wir ein FP-Handle haben

DIMENSION Schema[11]

FOR m.i = -1 TO 10

* alle Attribute in Array sichern:l, m.i-2,Schema[m.i])

NEXT

Da aber das Array (in aufsteigender Reihenfolge) immer mit den Werten -1,0,1,2,3,...,10 gefüllt wird, werden keine korrekten Einstellungen restauriert!


_WSETATTR()

Zweck:	Setzen eines neuen Farb-Attributs für ein spezielles Fenster.

Syntax:	_WSETATTR(<AusdrN1>,<AusdrN2>,<AusdrN3>)

Parameter:	<AusdrN1> FP-Handle des Fensters

<AusdrN2> Farbattribut-Indexnummer [-1 bis 10]

<AusdrN3> Attribut-Byte: neuer Wert

Rückgabe: 	Logisch

Vgl.:	_WATTR()

Beschreibung:

Ändert das Attribut-Byte im fenstereigenen Schema im Eintrag (Index) <AusdrN2>. Der neue Wert wird in <AusdrN3> übergeben und ersetzt den vorhandenen. Das Fenster, dessen Farbattributsliste sie ändern möchten, wird als FP-FensterHandle in <AusdrN1> an die Funktion übergeben.

Beispiel:

#DEFINE WA_PENCOLOR -1

#DEFINE RED_ON	4	&& 0000 0100

#DEFINE WHITE	112	&& 0111 0000

#DEFINE BRIGHT	8	&& 0000 1000

#DEFINE BLINK	128	&& 1000 0000

STORE RED_ON+WHITE+BRIGHT TO m.attrib

m.N_FP_hwnd01 = _WOPEN(0,0,50,30,........ u.s.w...

= _WSETATTR(m.N_FP_hwnd01, WA_PENCOLOR, m.attrib)

= _WSHOW(m.N_FP_hwnd01)

= _WSETPORT(m.N_FP_hwnd01)

= _WPUTSTR(m.N_FP_hwnd01,"Roter Text auf  grauem Grund")


_WPUTCHR()

Zweck:	Zeichen an Ausgabeposition in Fenster ausgeben.

Syntax:	_WPUTCHR(<AusdrN1>,<AusdrN2>)

Parameter:	<AusdrN1> FP-Handle des Fensters

<AusdrN1> Zeichenwert

Rückgabe: 	Logisch

Vgl.:	_WPUTSTR()

Beschreibung:

Stellt das durch <AusdrN2> festgelegte Zeichen an der Ausgabeposition des Fensters, dessen FP-FensterHandle Sie in <AusdrN1> übergeben müssen in der aktuellen PEN/PAPER-Farbe dar. Spezielle Zeichen, wie z.B. für´s  Einfügen einer Zeile (Carriage-Return) oder BEEP (CHR(7) werden als Steuerzeichen verwendet und nicht auf dem Bildschirm dargestellt. Um solche Zeichen als "Text" ausgeben zu lassen, müssen Sie den IntWert 256 zum <AusdrN2> Wert hinzuaddieren.

Beispiel:

=_WPUTCHR(m.N_FP_hwnd01,10) && LF senden

=_WPUTCHR(m.N_FP_hwnd01,10+256) && LF-Zeichen in Fenster schreiben


_WPUTSTR()

Zweck:	Zeichenkette an Ausgabeposition in Fenster ausgeben.

Syntax:	_WPUTSTR(<AusdrN1>,<AusdrZ1>)

Parameter:	<AusdrN1> FP-Handle des Fensters

<AusdrZ1> Zeichenkette

Rückgabe: Logisch

Vgl.:	_WPUTCHR()

Beschreibung:

Stellt eine Zeichenkette, die Sie in <AusdrZ1> übergeben müssen an der aktuellen Ausgabeposition des Fensters, dessen FP-FensterHandle Sie in <AusdrN1> übergeben müssen in der aktuellen PEN/PAPER-Farbe dar. Ausgaben, die normalerweise ein Scrolling im Fenster bewirken, können undefinerte Resultate hervorrufen, falls vorher das Attribut AUTOSCROLL bei Fensterdefinition mittels _WOPEN() oder _WOPENP() nicht gesetzt wurde - also nicht vergessen!

Beispiel:

m.N_FP_hwnd01 = _WOPENP(0,0, 100, 100,m.C_flags, 1,1, WO_SYSTEMBORDER)

=_WPUTSTR(m.N_FP_hwnd01,"Dies ist ein Test")


_WSETTITLE()

Zweck:	Setzen / entfernen eines Fenstertitels.

Syntax:	_WSETTITLE(<AusdrN1>,<AusdrZ1>)

Parameter:	<AusdrN1> FP-Handle des Fensters

<AusdrZ1> neuer Fenstertitel oder <0> für Titel entfernen

Rückgabe: 	Logisch

Vgl.:	_WTITLE()

Beschreibung:

Gibt dem Fenster, dessen FP-FensterHandle Sie in <AusdrN1> übergeben müssen den unter <AusdrZ1> übergebenen Titel. Möchte man den Titel eines Fensters einfach nur entfernt, so übergibt man ausnahmsweise den nummerischen Wert <0> in <AusdrZ1> als neuen Titel.

Beispiel:

m.N_FP_hwnd01 = _WOPENP(m.N_oben, m.N_links, m.N_unten, m.N_rechts,m.C_flags, 1,1, WO_SYSTEMBORDER)

= _WSETTITLE(m.N_FP_hwnd01,"Test")


_WTITLE()

Zweck:	Holen eines Fenster-Titels

Syntax:	_WTITLE(<AusdrN1>)

Parameter: 	<AusdrN1> FP-Handle des FenstersRückgabe: 	Zeichen

Vgl.:	_WSETTITLE()

Beschreibung:

Gibt den Titel des Fensters, dessen FP-FensterHandle Sie in <AusdrN1> übergeben müssen als Text zurück.

Beispiel:

m.N_FP_hwnd01 = _WOPENP(m.N_oben, m.N_links, m.N_unten, m.N_rechts,m.C_flags, 1,1, WO_SYSTEMBORDER)

= _WSETTITLE(m.N_FP_hwnd01,"Test")

? _WTITLE(m.N_FP_hwnd01)


Neue VFP 3.0
Neu in VFP 3.0

Die in diesen Tagen neu erscheinende Visual FoxPro Version 3.0 wird wieder mit der hier nun ausführlich dokumentierten FOXTOOLS.FLL-Bibliothek ausgeliefert. Dies geschieht natürlich auch aus Gründen der Abwärtskompatibilität.

Der Umfang der Bibliothek wurde durch vier Funktionen erweitert. Zum Zeitpunkt der Drucklegung dieser Sonderausgabe wurden von mir nur die in der 1.03er Bibliothek fehlerhaften Funktionen in der neuen 3.0er Version eingehend getestet - ich kann Sie beruhigen, sie sind alle noch genauso fehlerhaft! Ob sich am Verhalten der anderen "leicht fehlerhaften" Routinen etwas geändert hat, konnte ich aus Zeitgründen noch nicht genauestens erforschen. Ich werde diese "Generalinspektion" aber bei Zeiten nachholen und zu einem späteren Zeitpunkt in einem Newsletter veröffentlichen.

 Auffälligste Änderung sind sicherlich die nummerischen Rückgabewerte der verschiedenen Funktionen. Gaben beispielsweise die diversen Fenster-Funktionen alle noch "durchaus lesbare" Handle-Nummern zurück, z.B. ?_WMAINWIND() ergab: 1908516, so liefert die gleiche Funktion nun unter Visual FoxPro das Handle: -.1942E+10 - bedingt durch die neuen 32Bit-Strukturen!

_WFOOTER()

REGFN32()

GETPROSTRG()

PUTPROSTRG()


_WFOOTER()

Zweck:	Holen eines Fenster-Fußtextes

Syntax:	_WFOOTER(<AusdrN1>)

Parameter: 	<AusdrN1> FP-Handle des FenstersRückgabe: 	Zeichen

Vgl.:	_WTITLE()

Beschreibung:

Gibt den Fußtext des Fensters, dessen FP-FensterHandle Sie in <AusdrN1> übergeben müssen als Text zurück.

Hinweis:

Ist im Library Construction Kit von FPW 2.6 als "MS-DOS only" - Funktion gekennzeichnet. Gibt bei Standard-Fenstern, die (natürlich) keinen Fußtext kennen einen Leerstring zurück.

Beispiel:

? _WFOOTER(m.N_FP_hwnd01)


REGFN32()

Zweck:	Anmelden einer externen Funktion aus 32bit-Dll.

Syntax:	REGFN32(<AusdrZ1>[,<Ausdrliste1>][,<Ausdrliste2>][,<AusdrZ2>])

oder anders ausgedrückt:

REGFN32(FunktionName, [ArgTypen], [RückgabeTypen], [DLLName])

Parameter:	Details siehe Win-API Calls

Rückgabe: 	Nummerisch

Vgl.:	REGFN(), CALLFN()

Beschreibung:

Die Funktion akzeptiert die folgenden Argumenttypen: Integer, Long, Float, Double, String. Diese können als Referenz oder als Wert übergeben werden. Als Rückgabe erhalten Sie das Funktions-Handle als positiven Integerwert (größer/gleich 0), oder -1 wenn die Funktions-Registrierung nicht erfolgreich war.

Beispiel:

m.Fn32Nr_1 = ; REGFN32("ChooseFont","@C","I","C:\WINDOWS\SYSTEM\WIN32S\COMDLG32.DLL")


GETPROSTRG()

Zweck:	Lesen eines Eintrags aus der WIN.INI-Datei.

Syntax:	GETPROSTRG(<AusdrZ1>, <AusdrZ2>, <AusdrZ3>, <@AusdrZ4>, <AusdrN1>)

Parameter:	<AusdrZ1> Section-Name

<AusdrZ2> Entry-Name

<AusdrZ3> Default-Rückgabewert

<@AusdrZ4> Rückgabepuffer-String

<AusdrN1> Rückgabepuffer-Länge

Rückgabe: 	Nummerisch

Vgl.:	PUTPROSTRG()

Beschreibung:

Die Funktion liest einen Eintrag (Entry) aus der WIN.INI-Datei unter einer Sektion (Section) und legt das Ergebnis als Zeichenkette in einem vorzuinitialisierenden und zu übergebenden String ab. Als direkten Returnwert der Funktion erhalten Sie die neue Länge des Strings. Dieser kann, falls der übergebene Section- oder Entry-Name nicht existiert, auch einen Default-Rückgabewert enthalten, der dann in <AusdrZ3> übergeben werden muß. Diese Funktion entspricht exakt der Funktion "GetProfileString" des WIN-API's. Die genaue Funktion entnehmen Sie bitte folgenden Beispielen.

Beispiel:

m.LcSection = "ECHTZEIT"

m.LcEntry = "test"

m.LcDefault = "Kein Eintrag vorhanden"

m.LcReturnBuffer = SPACE(50)

m.LnRetBuffLen = LEN(m.LcReturnBuffer)

*

* Section und / oder Entry nicht vorhanden:

?GETPROSTRG(m.LcSection,m.LcEntry,m.LcDefault,m.LcReturnBuffer,m.LnRetBuffLen) && Ausgabe:> 22

?m.LcReturnBuffer && Ausgabe:> Kein Eintrag vorhanden

*

*Section und Entry vorhanden, Entry mit Wetzuweisung:

?GETPROSTRG(`WINDOWS',"spooler",m.LcDefault,m.LcReturnBuffer,m.LnRetBuffLen) && Ausgabe:> 3

?m.LcReturnBuffer && Ausgabe:> yes

*

*Section und Entry vorhanden, Entry ohne Wertzuweisung:

?GETPROSTRG(`WINDOWS',"run",m.LcDefault,m.LcReturnBuffer,m.LnRetBuffLen) && Ausgabe:> 0

?m.LcReturnBuffer && Ausgabe:> (nix)

*

*Sektion vorhanden und Entry leer übergeben:

?GETPROSTRG(`WINDOWS',"",m.LcDefault,m.LcReturnBuffer,m.LnRetBuffLen) && Ausgabe:> 390 o.ä.

?m.LcReturnBuffer && Ausgabe:> hier alle Entry-Namen zu der Sektion "WINDOWS"


PUTPROSTRG()

Zweck:	Schreiben eines Eintrags in der WIN.INI-Datei.

Syntax:	PUTPROSTRG(<AusdrZ1>, <AusdrZ2>, <AusdrZ3>)

Parameter:	<AusdrZ1> Section-Name

<AusdrZ2> Entry-Name

<AusdrZ3> zu schreibender Eintragswert (String)

Rückgabe: 	Logisch

Vgl.:	GETPROSTRG()

Beschreibung:

Die Funktion schreibt zu einen Eintrag (Entry) in der WIN.INI-Datei unter einer Sektion (Section) einen in <AusdZ3> übergebenen Text rechts vom Gleichheitszeichen. Als Returnwert der Funktion erhalten Sie logisch .T., wenn die Funktion erfolgreich ausgeführt wurde.. Diese Funktion entspricht exakt der Funktion "WriteProfileString" des WIN-API's.

Wichtig: Mit Hilfe dieser Funktion können Sie auch Einträge (Entry) und sogar ganze Sektionen löschen! Die genaue Arbeitsweise entnehmen Sie bitte folgenden Beispielen.

Beispiel:

m.LcSection = "ECHTZEIT"

m.LcEntry = "test"

m.LcValue =  "Testeintrag"

*

* Section und / oder Entry nicht vorhanden:

?PUTPROSTRG(m.LcSection,m.LcEntry, m.LcValue) && Ausgabe:> .T., und

*	die Win.ini-Datei erhält am Ende folgende neue Einträge:

*	[ECHTZEIT]

*	test = Testeintrag

*

*Sektion mit mehreren Entries:

m.LcSection = "ECHTZEIT"

m.LcEntry = "test"

m.LcValue =  ""

?PUTPROSTRG(m.LcSection,m.LcEntry, m.LcValue) && Ausgabe:> .T. , und

*	Entry "Test" wird gelöscht

*

*Sektion mit nur einer Entry:

m.LcSection = "ECHTZEIT"

m.LcEntry = "test"

m.LcValue =  ""

?PUTPROSTRG(m.LcSection,m.LcEntry, m.LcValue) && Ausgabe:> .T., und

*	die gesamte Sektion wird gelöscht, da das einzige Entry keinen Wert meht zugewiesen bekommen hat!


WIN-API Calls
Tips & Tricks

WIN-API Calls

Die beiden Funktionen RegFn() und CallFn() erlauben die Registrierung (Einbindung) von (externen) WIN-API Funktionen innerhalb von FoxProW. Eine WIN-API Funktion wird mit Hilfe REGFN()-Funktion innerhalb von FoxPro bekannt gemacht. Dabei wird festgelegt, welche Anzahl und Typen von Parametern die externe Funktion bei deren Aufruf benötigt und welchen Datentyp sie bei Beendigung an FoxPro zurückgeben kann. Weiterhin kann noch angegeben werden, in welcher ladbaren Windows-Bibliothek die Funktion zu suchen ist, falls sie nicht in einer der Standard-Bibliotheken enthalten sein sollte, oder bereits geladen wurde.

Eine (beipielhafte) Windows-Funktion mit Namen "MyWinFunction()" benötigt beim Aufruf z.B. einen Parameter vom Typ Text (String) und gibt als Rückgabewert die Anzahl der Buchstaben in diesem String als Integerwert zurück. Die korrekte Registrierung könnte wie folgt aussehen, vorausgesetzt, die Funktion wäre in einer der Standard-Bibliotheken enthalten (user.exe, krnl386.exe und gdi.exe) oder bereits von Windows geladen:

a.)	m.LnMyWinFn = REGFN("MyWinFunction","C","I")

In vielen Fällen wird in WIN-API Funktionen aber ein Zeiger auf den auszuwertenden String übergeben. Dies realisieren Sie in FoxProW mit folgender Schreibweise:

b.)	m.LnMyWinFn = REGFN("MyWinFunction","@C","I")

Hier wird nun vorgeschrieben, daß der Funktionsparameter später unbedingt mit dem vorangestellten @-Zeichen (also als Referenz) übergeben werden muß.

Um bestimmten Sonderfällen in den WIN-API Funktionen Rechnung zu tragen, läßt die CALLFN()-Funktion den Wert nummerisch 0 als "Ausnahmewert" in Parametern zu, die mit der REGFN()-Funktion eigentlich als String-Typ ("C") vereinbart worden sind. Mit dieser Sonderregelung wird dann der allen C-Programmieren bekannte NULL-Wert simuliert. Dies funktioniert aber nicht, wenn ein Parameter explizit als Zeiger "@C" auf einen String vereinbart wurde. Bei solch einer Typenvereinbarung führt die spätere Übergabe eines NULL-Werts als Parameter zu einer Fehlermeldung!

Interessanterweise wird in allen Fällen in denen in der SDK-Referenz die Zeigerübergabe (theoretisch unter FPW also als "@C" anzumelden) auf einen nicht mehr veränderbaren String gefordert wird, auch die "einfache" Registrierung ("C") in FPW akzeptiert und fehlerfrei ausgeführt! Mehr dazu erfahren Sie später.

Nun gibt es aber im WIN-API, das ja komplett auf "C"-Programmierung aufbaut, bestimmte Datentypen und Konstruktionen, zu denen es in FoxPro's xBase-Dialekt keine Entsprechung gibt. Hier hilft ein wenig Kenntnis über die verschiedenen C-Variablentypen und Strukturen und ein bißchen "Experimentierfreude" weiter.

Hier die Liste aller möglichen Kennbuchstaben die in der REGFN()-Funktion unter FPW zur Datentypvereinbarung benutzt werden können:

I 	= Integer

L 	= Long

F 	= Float/Gleitkommazahl

D 	= Double/Gleitkommazahl

C 	= Zeichenkette

dabei müssen die C-Datentypen wie folgt mit den FPW-Datentypen übereinstimmen:

F, D 	> muß in Foxpro eine Gleitkommazahl sein

I, L 	> muß in Foxpro eine ganze Zahl sein

C 	> muß in Foxpro eine als Wert übergebene Zeichenfolge oder 0 (NULL) sein. Bei Übergabe von nummerisch 0 wird der Nullzeiger übergeben.

Wird in der Windows SDK-Referenz ein Parameter vom Typ LPCSTR vereinbart, versteht man darunter einen 32Bit-Zeiger auf einen "nicht modifizierbaren String". Solchermaßen vereinbarte Parametertypen können in der REGFN()-Funktion unter FoxPro immer als einfacher String "C"-Typ vereinbart werden. Wird dagegen in der SDK-Referenz ein Parameter vom Typ LPSTR vereinbart, ist dies ein 32Bit-Zeiger auf einen normalen, veränderbaren String, der in FoxPro in der REGFN()-Funktion dann auch als String-Pointer "@C"-Typ vereinbart werden muß!

Als weiteres Hindernis müssen die in C gebräuchlichen Strukturen in FoxPro simuliert werden. Etwas vergleichbares stellen in FPW die Arrays dar, die Sie theoretisch genau wie Strukturen in C einsetzen können. Da die Arrays in FPW aber dynamisch erweiterbar sind, werden die einzelnen Datenelemente der (Array)Struktur in FPW ganz anders im Speicher abgelegt und verwaltet als die statischen Stukturen, die als Übergabeparameterblöcke in den verschiedenen WIN-API Funktionen Verwendung finden! Somit können Arrays von FoxPro nicht als Strukturen in WIN-API Calls benutzt werden.

Als C-Programmierer wissen Sie, daß eine Struktur "nur" eine im RAM des Computers aufeinanderfolgende Anzahl von Speicherstellen ist, die nach einem vorgegebenen Schema (Strukturdefinition) mit den einzelnen Strukturelementen belegt wurde. Jedes dieser Elemente der Struktur besitzt einen vereinbarten Datentyp und dieser wiederum hat eine vorgegebene Byte-Länge. Jetzt kann man in "C" unmittelbar über den Offset (Elementname) auf jedes der Elemente der Struktur und dessen Inhalt zugreifen. Siehe dazu Gebräuchliche Byte-Längen der diversen C-Datentypen.

Der eigentliche Trick besteht nun darin, zu ermitteln, wie viele Bytes die im SDK beschriebene Struktur einer benötigten API-Funktion hat (unter C würde man sich dies mit der sizeof()-Funktion anzeigen lassen). Hat man dies ermittelt, erstellt man unter FoxPro eine Stringvariable mit der gleichen Anzahl Zeichen, da jedes Zeichen ja genau ein Byte lang ist und somit einem Byte der C-Struktur entspricht. Daß die interne Länge des FP-Strings aus verwaltungstechnischen Gründen etwas länger ausfällt, kann vernachlässigt werden.

Bei der Registrierung der WIN-API Funktion mittels REGFN() wird dann an der Stelle, an der die API-Funktion den Zeiger auf die Struktur erwartet (wahrheitsgemäß) ein Parameter vom Typ "C" (Zeiger auf einen nicht modifizierbaren String) registriert. Die einzelnen Buchstaben (Bytes) des Strings können nun vor Aufruf der registrierten API-Funktion mit selbstgeschriebenen "LowLevel"-Routinen typgerecht vorbelegt werden. Das "Kauderwelsch" des Stringinhalts wird von der WIN-API Funktion dann strukturelementweise korrekt interpretiert (für die C-Routine im WIN-API sieht's halt aus wie: "vollkommen normal in C programmiert"). Damit wäre das System "überlistet" und das Problem der Strukturdefinitionen unter FoxPro gelöst!

Hinweis: Schauen Sie sich die Beispiele in dieser Online-Hilfe an.

Tip: Bitte beachten Sie, daß bestimmte Windows-Funktionen nicht nur einen Integerwert oder einen einfachen String als Return-Wert zurückgeben, sonden lt. SDK-Dokumentation z.B. ihre Ergebnisse als ein "DWORD" bereitstellen. Diesen "4-bytigen" Werten muß dann bei der Registrierung der jeweiligen Funktion unbedingt Rechnung getragen werden. Nehmen wir als Beispiel oben bereits benutzte Demo-Funktion und behaupten einmal, diese gibt ein DWORD als Return-Wert zurück. Die Registrierung müßte dann wie folgt lauten:

c.)	m.LnMyWinFn = REGFN("MyWinFunction","C","L")

Das "L" zeigt FoxPro, daß der 4-Byte Datentyp "long" zurückerwartet wird. Mit entsprechenden selbst programmierten Funktionen könnten dann z.B. das Low- und das High-Wort wieder getrennt und ausgewertet werden.

Tip: Manchmal kann es Ihnen passieren, daß eine Funktion, die Sie namentlich registrieren möchten (anscheinend) nicht auffindbar ist. Sie erhalten dann beispielsweise eine Fehlermeldung: "Dynamic library does not contain a function called xyz". Hier hilft meistens der Einsatz des optionalen 4.Parameters in der RegFn()-Funktion. Übergeben Sie dort namentlich die DLL-Datei (am besten mit Laufwerk- und Pfad-Angabe), die Ihre Funktion enthält. Manchmal hat es auch geholfen, die DLL-Datei in einen FoxPro-Suchpfad zu kopieren, um die Registrierung erfolgreich abschließen zu können.


Bytelängentabelle
(Auszugs aus der C/C++ 7.0 Referenz:

 Verschiedenen Datentypen in der C/C++ Programmierung):

Tabelle der Variablentypen, Bytelängen und Wertebereiche

int	*2	signed, System abhängig (normal 2 Bytes)

unsigned int	*2	unsigned, System abhängig (normal 2 Bytes)

char	1	signed char, -128 to 127

unsigned char	1	none 0 to 255

short	2	short int, -32.768 to 32.767

unsigned short	2	unsigned short int, 0 to 65.535

long	4	long int, -2.147.483.648 to 2.147.483.647

unsigned long	4	unsigned long int, 0 to 4.294.967.295

enum	2	none, -32.768 to 32.767

float	4	none, 3.4E ± 38 (7 digits)

double	8	none, 1,7E ± 308 (15 digits)

long double	10	none, 1,2E ± 4932 (19 digits)

* Für unseren Fall sind int und short, sowie unsignd int und unsignd short identisch.


Ordinal Calling
Tips & Tricks

Ordinal Calling

Normalerweise enthält eine DLL-Datei "benannte" Funktionen. Dies bedeutet, daß bei der Compilierung der DLL alle Funktionen einen mehr oder weniger aussagekräftigen Namen von den Programmierern erhalten haben. Diese Namen sind recht schnell mit entsprechenden Tools (ein einfacher Hex-Editor tut's auch) herauszufinden.und mit ein bißchen Experimentierfreude kann auch jeder versierte "Nichtfachmann" sich später dieser Funktionen bedienen.

Allerdings gibt es auch die Möglichkeit, alle in einer DLL enthaltenen Funktionen "per Ordnungszahl" zu exportieren. Dies wird in den meisten Fällen als ein zusätzlicher "Kopierschutz" benutzt, denn jetzt müssen Sie schon genau wissen unter welcher Nummer Sie welche Funktion ansprechen müssen. Dies ist mit einfachen Mittel nicht mehr ohne weiters möglich, da die Ordnungszahlen "unlesbar" im Binär-Code der DLL-Bibliothek verborgen bleiben. Aber gesetzt den Fall Sie haben eine DLL erworben, die ihre Funktionen via Ordnungszahl (also "per Nummer") exportiert, dann können Sie die bislang besprochenen Möglichkeiten der RegFn()-Funktion nicht gebrauchen, denn diese registriert eine DLL-Funktion "per Namen"!

Microsoft sagt zwar in einem Satz (Zitat aus "Foxtools.wri"):

"Das erste Argument ist der Name oder die Ordnungszahl der Funktion, die registriert werden soll."

Schweigt sich aber im weiteren darüber aus, wie dies denn nun in der Praxis realisierbar ist. Hier nun endlich die Klärung anhand eines kurzen Programmbeispiels.

Gegeben sei eine DLL-Bibliothek (sie heißt z.B.: "MYTEST.DLL"), die zwei Funktionen - nennen wir sie einfach FnA() und FnB() - enthält, die nur per Ordnungszahl exportiert werden. FnA() wird mit der Ordnungszahl #1 und FnB() mit #2 exportiert. Die weiteren Funktionsparameter sind für das folgende Programmbeispiel willkürlich gewählt:

* Register DLL-Fkt's via "ordinal calling"* © 1994 by B. Stiller** Zuerst DEFINEn:#DEFINE FnA	1#DEFINE FnB	2** Jetzt registrieren:m.LnFnHandle1 = REGFN((FnA),"C@C","I","MYTEST.DLL")m.LnFnHandle2 = REGFN((FnB),"IC","C","MYTEST.DLL")*IF m.LnFnHandle1 > -1 AND m.LnFnHandle2 > -1	* Nun können die Funktionen aufgerufen werdenELSE	WAIT WINDOW "Registrierung fehlgeschlagen"ENDIF* EOP

Wie Sie sehen können, werden anstelle eines Funktionsnamens die vorher definierten Ausdrücke eingesetzt. Sie dürfen keinesfalls die Klammerung der Ausdrücke vergessen, damit diese korrekt als Namensausdrücke interpretiert werden.


Fehlfunktionen
Tips & Tricks

Fehlfunktionen

"Nobody is perfect" - Dies trifft auch auf die FOXTOOLS.FLL-Bibliothek zu!

Ich möchte an dieser Stelle nicht noch einmal auf bestimmte Fehler innerhalb der verschiedenen Einzelfunktionen hinweisen, sondern auf einen wirklich schwerwiegenden Bug innerhalb des Gesamtsystems der Foxtools.fll zu sprechen kommen.

Der Fehler, der Ihr laufendes FoxPro-Programm mit absoluter Sicherheit unter allen Windows 3.x -Versionen durch einen GPF zum Absturz bringt, kann sehr einfach von Ihnen reproduziert werden und tritt immer nur dann auf, wenn Sie mehrere Instanzen von FoxPro (und den Foxtools) gestartet haben.

Starten Sie FoxPro, laden Sie die Foxtools-Bibliothek und registrieren und benutzen Sie dann in einem kleinen Programm z.B. die MessageBox()-Funktion aus dem WIN-API. Während Sie sich dort einen Nachrichten-Dialog anzeigen lassen, wechseln Sie in den Programm Manager und starten eine zweite Instanz von FoxPro, in der Sie dasselbe Programm ein zweites Mal ablaufen lassen. Nun beenden Sie diese laufende FoxPro-Instanz ganz normal und wechseln wieder zur ersten Instanz (wo Sie noch das Dialogfenster sehen sollten). Wenn Sie dieses Fenster nun schließen, stürzt Ihr System unweigerlich ab!

Was ist passiert? Nun, weil FoxPro's FLLs im Grunde genommen nichts anderes sind als DLL-Dateien, treffen für sie die gleichen Regeln und Einschränkungen zu. Eine davon besagt, daß FLL-Bibliotheken "voll reentrant" programmiert sein müssen. Beim Starten einer neuen Instanz von FoxPro und dem dort stattfindenden erneuten Laden der FLLs werden keine neuen Kopien der FLLs in den Speicher geladen. Alle Instanzen benutzen den selben Code- und Daten-Bereich, der schon im Hauptspeicher vorhanden ist! Und darin wiederum sind alle globalen Variablen, die die FLL deklariert ebenfalls enthalten. Das heißt, daß alle aktiven Instanzen der Foxtools.fll nur den einen gemeinsamen Satz von Public Variablen "sehen" und verwenden, anstatt ihren eigenen "Variablen-Satz" zu initialisieren und zu verwenden!

Releasen Sie nun in einer Instanz die Foxfools.fll-Bibliothek, wird die darin enthaltene CALLONUNLOAD Funktion ausgeführt. Anhand des auftretenden Fehlers läßt sich unschwer deuten, daß die darin enthaltene Routine "gründlich aufräumt" und die Public Variablen löscht. Wodurch allen weiteren Instanzen "der Boden unter den Füßen weggezogen wird".

Seien Sie also beim Einsatz der Foxtools sehr vorsichtig, wenn es darum geht, daß Ihr Programm auf einem WIN 3.x - System in mehr als einer Instanz stabil laufen soll. Unter Windows NT können Sie ja jeder Instanz ggf. Einen eigenen Speicherbereich mit getrennten Kopien aller benutzen DLLs zuweisen, um diesem Problem zu begegnen.

Für die "FLL-Programmierer" unter Ihnen sei ein Beitrag von Herrn Roland Kappeler (erschienen 1993 in der November-Ausgabe des FoxTalk-Magazins im Pinnacle Publishing Verlag) erwähnt: "Design Cross-Platform FoxPro API-Libraries", der sich dieser Problematik ausführlich annimmt und eine wirklich vorzügliche Lösung aufzeigt!


ECHTZEIT
ECHTZEIT DV-Systeme u. Engineering

   Burkhard Stiller gründete 1988 die Firma ECHTZEIT DV-Systeme und Engineering (damals noch unter dem Namen SH* Soft.-und Hardwareentwicklung) in Bielefeld. In den Anfangsjahren wurden vor allen Dingen PC-Netzwerke und Komplettlösungen auf der Basis von Open Access entwickelt und vertrieben. Auf der Suche nach einer neuen flexibleren datenbankgestützten Entwicklungsplattform wurde dann FoxPro 1.0 im Unternehmen eingeführt. Seither entwickelt der Autor Individuallösungen für Firmen unter FoxPro und bietet überregional auch Support und Schulungen für diese Programmierplattform an. Durch seinen 1993 in die Firma eingetretenen Partner wurde der Bereich CAD für Architekten als weiterer, wichtiger Unternehmenszweig erschlossen. 1995 erfolgte die Autorisierung zum CompetenceCenter für die Produkte der Darmstädter DB-Soft AG, in deren Auftrag nun der Vertrieb, Support und Anpassungen der kaufmännischen Windows-Software durchgeführt wird.

   Aus der Reihe der im eigenen Unternehmen für FoxPro entwickelten Tools sind besonders die EditorXtensions, sowie die PrinterDriverEnhancements für Entwickler interessant. Bereits in der Realisation befinden sich weiterhin die Help-CompilerXtension, sowie eine umfassende Toolbox für den Zugriff auf Multimedia-Datenquellen, die MultiMediaXtensions.

   Als kaufmännische Lösung wurde im Hause WinFakt, eine Spezial-Fakturierung für Hersteller/Dienstleister, entwickelt. Hiermit ist es möglich, eingehende Aufträge "ganz im Dienste des Kunden" abzuwickeln und zu fakturieren; z.B. werden Artikel, Artikelnummern u.s.w. vom jeweiligen Kunden vorgegeben. Die gesamten Stammdaten werden also kundenorientiert verwaltet, wobei doppelte Artikelnummern etc. durchaus möglich sind!

Weiterhin bietet diese Fakturierung für die Erfassung von Aufträgen mit sehr vielen Einzelpositionen (arbeits- und personalintensiv) die Möglichkeit der "Multiuser-Erfassung". An einem Auftrag können mehrere Bearbeiter gleichzeitig Positionen erfassen und bearbeiten. Die Erweiterung mit einer zeitgemäßen EDI-Schnittstelle (Perwill-EDI) ist für das kommende Frühjahr geplant.

   Für die nächste Zukunft (mit Visual FoxPro) hat sich ECHTZEIT, dem kommenden multimedialen Zeitalter entsprechend, die Entwicklung eines TouchScreen-Systems vorgenommen, das zur Verkaufsförderung und Mitarbeiterentlastung in Fachabteilungen größerer Warenhäuser zum Einsatz kommen wird. Erste Baumuster dieser "stillen Verkäufer" sowie die dazugehörige Hardware wurden bereits erfolgreich mit einer noch unter FP2.6 erstellten Prototypen-Software getestet. Die Vorstellung des vertriebsfähigen Produktes wird voraussichtlich auf der CeBit '96 erfolgen.

   Anfragen zwecks unverbindlicher Kontaktaufnahme bitte:

(bevorzugt!) über CompuServe unter 100437,1645

oder per Telefon unter (05242) 402103

oder per Fax unter (05242) 402104


Copyright


dFPUG
 deutschsprachige FoxPro User Group

dFPUG INFO / ANMELDECOUPON  ADRESSEN / BESTELLINFO

dFPUG AUF EINEN BLICK:

VERANSTALTUNGEN

PUBLIKATIONEN

ONLINE

SERVICE

dFPUG-MITGLIEDSCHAFT

dFPUG AUSFÜHRLICH:

SIE ARBEITEN & ENTWICKELN MIT FOXPRO ?

... oder wieso Sie sich für die deutschsprachige FoxPro User Group interessieren sollten ...

Die dFPUG (deutschsprachige FoxPro User Group) wendet sich an alle FoxPro-Anwender - Gelegenheitsprogrammierer und professionelle Entwickler von Standard- oder Individualsoftware - wobei es keine Rolle spielt, welche FoxPro-Version Sie benutzen. Wir verstehen uns als Ihre deutschsprachige Plattform für aktuelle Information und Erfahrungsaustausch. Darüberhinaus sind wir Ihre unabhängige Interessenvertretung gegenüber dem Hersteller Microsoft.

Die wesentlichen Vorteile einer Mitgliedschaft in der dFPUG haben Sie schon komprimiert eingangs lesen können. Auf den folgenden Seiten wollen wir Sie ausführlicher über uns informieren. Für weitere Fragen stehen wir Ihnen gerne zur Verfügung. Benutzen Sie sie bitte den ausdruckbaren Coupon zur Registrierung oder zur Anforderung von weiteren Informationen!

REGIONALTREFFEN (Stammtische)

Da nicht alles mit geschriebenen Worten abgehandelt werden kann, sondern sich vieles besser bei einem mündlichen Erfahrungsaustausch zwischen Gleichgesinnten erörtern läßt, organisiert die dFPUG regionale Stammtische. Meist werden dort Vorträge gehalten oder FoxPro-Programme vorgestellt und die verwendete Technik diskutiert. Bisher gibt es diese Regionaltreffen in 16 Städten in Deutschland, Österreich und der Schweiz. Weitere Stammtische sind in Vorbereitung, wir sind immer an regionalen dFPUG-Vertretern interessiert. Die dFPUG veröffentlicht für diese Treffen die aktuellen Termine und Themen auf unserer Terminübersicht, lädt bei Bedarf die regionalen Mitglieder & Interessenten zu den Treffen ein und stellt Material zur Verfügung.

WORKSHOPS

Auf Stammtischen können hervorragend einzelne kleinere Themen behandelt oder Anwendungen und Beispiele vorgestellt werden. Zur Darstellung von Lösungsmöglichkeiten für komplexe Programmierprobleme ist eine ganztägige Veranstaltung der bessere Ort. Deshalb bietet die dFPUG eintägige Workshops an. Vorgesehen sind (je nach Seminarraum) 10-12 Teilnehmer, für die meist entsprechende Computer zur Verfügung stehen. Die Teilnahmegebühr für diese Arbeitstreffen mit Spezialthemen betägt 172,50 DM (incl. MwSt., bzw. 150,- DM zzgl. MWSt.) pro Person, incl. Pausengetränke. Eine Mitgliedsfirma kann mehrere angestellte Mitarbeiter auf den gleichen Workshop schicken.

FoxPro-ENTWICKLERKONFERENZ

Jährlicher Höhepunkt unserer Veranstaltungen ist die mehrtägige FoxPro-Entwicklerkonferenz in Frankfurt am Main mit einem breiten Vortragsangebot von deutschen, amerikanischen und kanadischen Rednern. Hier treffen Sie so bekannte Redner wie z.B. Lisa C. Slater oder Steven  Black. Frühzeitig erhalten Mitglieder das vorläufige Programm und können zu Sonderkonditionen teilnehmen.

NEWSLETTER FUCHS

Alle 2 bis 3 Monate erscheint unser dFPUG-Newsletter "Fuchs". Die ersten Seiten sind aktuellen Informationen und Neuigkeiten rund um FoxPro, die dFPUG, Produkte und CompuServe gewidmet. Gefolgt von einer Vielzahl von Artikeln über Programmiertechniken und FoxPro-Know-How sowie einfache Lösungen für häufig auftretende größere Probleme. Zusätzlich behandeln wir auch immer wieder wechselnde allgemeine Themen und berichten über Veranstaltungen. Regelmäßig schauen wir für Sie in die Bücherregale und bewerten neue Titel kritisch für Sie oder erweitern unser "Who is Who" der FoxPro-Szene und stellen Ihnen die wichtigsten Persönlichkeiten vor.

SONDERHEFTE

Einige Themen sind viel zu komplex, als daß sie in einem Newsletter-Artikel ausreichend behandelt werden könnten. Deshalb gibt die dFPUG zusätzlich mehrmals im Jahr Fuchs-Sonderausgaben zu Spezialthemen heraus. Beispiel hierfür ist unser Doppel-Sonderheft zur Erweiterung des Maskengenerators um eine Vererbungslogik "GenScreenX/GenMenuX". Und damit Sie wissen, was Sie erwartet: 1995 werden wir Sonderhefte zu den Themen Netzwerklibrary (44 Seiten), Software-Ergonomie (ca. 48 S.), FoxTools/Funktionen (diese Ausgabe) und zum neuen Datenbankcontainer (ca. 32 S.) ausliefern. Außerdem erscheint eine Sonderausgabe rund um Visual FoxPro 3.0.

OFFICE & DATABASE

Als kostenlose Beilage zum Newsletter erhalten Sie als Mitglied bis auf weiteres alle zwei Monate das Magazin "Office & Database" aus dem Synergy-Verlag mit Artikeln zu verschiedenen Produkten von Microsoft. Neben FoxPro werden MS Office, MS Access und MS SQL-Server behandelt.

BEGLEITDISKETTEN

Zu jeder Ausgabe des Newsletters sowie zu den meisten Sonderheften erhalten Sie die entsprechenden Beispielprogramme und Listings auf einer Begleitdiskette (3 1/2"-Disketten, 1,44 MB). Vergriffene Fuchs-Ausgaben, ältere Begleitdisketten sowie die Begleitdisketten zum Magazin Office & Database können Sie im dFPUG-Diskettenservice erhalten.

AUTOREN UND INSERENTEN

Herzlich willkommen sind Sie natürlich nicht nur als Leser des Newsletters sondern auch als Autor von gelungenen Artikeln. Aktuelle Infos, Rückfragen und Leserbriefe sind uns jederzeit und in jeder Form willkommen. Bei Einreichung von Artikeln (jede gedruckte Textseite wird mit 120,- DM honoriert) bitten wir um kurze Rücksprache mit der Redaktion. Den eigentlichen Artikel benötigen wir als ASCII-Fließtext auf Diskette oder per eMail. Sofern Sie selbst FoxPro-Software erstellen, Produkte rund um FoxPro vertreiben oder neue Mitarbeiter suchen, können Sie in unserem Newsletter preiswerte Anzeigen schalten (1/1 Seite 300,- DM zzgl. MWSt., 1/2 Seite 200,- DM zzgl. MWSt.).

COMPUSERVE

CompuServe, als eine der größten Mailboxen der Welt, besitzt Anschlüsse in fast allen größeren Städten. Mehrere Diskussionsforen zu FoxPro stehen innerhalb von CompuServe zur Verfügung. Die von der dFPUG betreute Sektion finden Sie im Forum "MSCESYS". Innerhalb dieser Sektion veröffentlichen wir aktuelle Termine und Themen, beantworten Fragen unserer Mitglieder (wobei viele dFPUG-Miglieder uns beim Beantworten unterstützen) und stellen im Rahmen der Library Dateien zum Downloaden zur Verfügung. Jederzeit können auch Dateien von Mitgliedern upgeloadet und der Allgemeinheit zur Verfügung gestellt werden. Die CompuServe-Gebühren können durch die Nutzung eines Offline-Readers deutlich gesenkt werden können. Um Ihnen einen Eindruck der Möglichkeiten von CompuServe zu geben, erhalten Neumitglieder einen 15 US-$-Gutschein mit sofort verwendbarer Benutzernummer.

MAILBOXEN

Bei unserem eigenen Mailbox-Netzwerk hingegen können Sie kaum Kosten senken. Die einzelnen Boxen sind nämlich ausschlieálich dFPUG-Mitgliedern zugänglich - dafür aber unlimitiert und kostenlos (sie tragen nur Ihre eigenen Telefongebühren). Vorerst gibt es Knoten in den Städten Aachen, Bamberg/Bayreuth, Bern (CH), Eschwege, Frankfurt/M., Hamburg, Salzburg (A), Seebruck und Ulm - mit steigender Tendenz. Insbesondere bemühen wir ums um eine Vernetzung über die Landesgrenzen hinweg. Unsere Mailboxen bieten sowohl die Möglichkeit zum Austausch auf regionaler Ebene als auch den Blick auf Diskussionen in den anderen Boxen, denn regelmäßig werden die öffentlichen Messages von der Zentrale zwischen alle Boxen ausgetauscht. Gleiches gilt für die dFPUG-Library mit Dateien zum Downloaden - viele MB warten auf Sie! Das Mailboxsystem kann mit Terminalprogrammen und Offline-Readern angesteuert werden.

HOTLINE

Nicht jeder hat ein Modem und kann uns somit per DFÜ erreichen - und trotz der personellen Verstärkung ist die MS-Hotline oft überlastet. In solchen Fällen kann Ihnen vielleicht die dFPUG-Hotline weiterhelfen. Dienstags und Donnerstags sind wir für Sie von 13:00 bis 18:00 Uhr erreichbar und beantworten Ihre Fragen zu Programmierproblemen mit FoxPro. Besonders schnell geht es, wenn Sie uns vorher das Problem faxen und nach ein paar Bedenkminuten für uns die Hotline anrufen. Wir bitten allerdings darum, die Hotline nicht überzustrapazieren.

DISKETTENSERVICE

Von großem Nutzen sind unsere exklusiven Funktions- und Datensammlungen. Diese enthalten Standard-Routinen im Quellcode und Daten, deren Erstellung und Sammlung für einen einzelnen Programmierer mit erheblichem Zeitaufwand verbunden wäre. Jede Diskette kostet nur 5,- DM zzgl. MwSt. (+ 5,- DM Versandkosten pro Bestellung). Über den Diskettenservice können Sie ebenfalls Begleitdisketten zu Newslettern, Sonderheften und zu Office & Database bestellen. Ein neues Bestellformular ist derzeit in Vorbereitung.

SONDERRABATTE

Die dFPUG bemüht sich für alle Mitglieder um günstige Einkaufs- und Bezugskonditionen bei den verschiedenen Anbietern und Distributoren. Dabei kann es sich um generelle Rabattvereinbarungen oder um zeitlich begrenzte Sonderangebote handeln. Alle Mitglieder erhalten bei den deutschen Distributoren von FoxPro-Add-Ons, den Firmen ProLib GmbH und IBV Voller, 5% Einkaufsrabatt oder können sich bei uns preiswert für die Windows-Version der Netzwerklibrary GPLIB registrieren lassen.

dFPUG-NEUMITGLIEDERPAKET

Als neues Mitglied erhalten Sie zu Beginn der Mitgliedschaft unser sog. "dFPUG-Einstiegspaket", eine Sendung mit allen noch vorrätigen Newslettern, Sonderheften und Begleitdisketten. Darin enthalten ist auch der oben erwähnte CompuServe-Gutschein, die aktuelle Termin- & Workshopübersicht sowie ggf. weitere dFPUG-Formulare. Abgesehen davon lassen wir uns immer wieder Überraschungen einfallen und legen den Mitgliederaussendungen oft weiteres Material bei. Besonderes Highlight war z.B. die Beta-CD-ROM zu Visual FoxPro 3.0 kurz nach der CeBIT'95.

dFPUG-MITGLIEDSCHAFT

Die dFPUG ist wegen dem damit verbundenen Verwaltungsaufwand kein eingetragener Verein. Sie ist rein rechtlich ein Abonnement des dFPUG-Newsletters Fuchs. Die Clubleistungen sind an das Abonnement und nicht an eine Vereinsmitgliedschaft i.S.d. Vereinsrechtes geknüpft. Herausgeber ist die ISYS Softwareentwicklungs- und Verlagsgesellschaft mbH mit Sitz in D-65760 Eschborn. Wir verstehen uns dennoch als ein Club von Gleichgesinnten und nicht als Zeitschriftenverlag. Unser kleines Team würde sich freuen, wenn Ihr Interesse an der deutschsprachigen FoxPro User Group geweckt wurde und Sie Abonnent des dFPUG-Newsletters Fuchs und damit Mitglied der dFPUG werden.

    Ihr dFPUG-Team


Veranstaltungen

Regionaltreffen, Workshops, Konferenzen

- Regionaltreffen alle 4 bis 8 Wochen, über 150 pro Jahr,

  in: Aachen, Bamberg, Basel, Bayreuth, Berlin, Dresden,

  Essen, Frankfurt/Main, Hamburg, Hannover, München,

  Saarbrücken, Salzburg, Stuttgart, Wien, Zürich

- preiswerte 1-tägige Workshops zu Spezialthemen rund um FoxPro

- jährliche FoxPro-Entwicklerkonferenz in Frankfurt/Main mit

  breitem Vortragsangebot


Publikationen

Newsletter "Fuchs", Sonderhefte, Office & Database

- Newsletter "Fuchs" mit 32 Seiten Artikeln zu FoxPro

  und Begleitdiskette

- dFPUG-Sonderhefte mit 32 bis 64 Seiten zu Spezialthemen,

  mit Begleitdiskette

- alle 2 Monate MS Office & Database vom Synergy-Verlag

  mit Artikeln zu verschiedenen Themen


Online

CompuServe, dFPUG-Mailboxen

- eigene Diskussions-Sektion und Datei-Library in CompuServe

- vernetzte Mailboxen in Aachen, Bamberg, Eschwege, Frankfurt,

  Hamburg, Ulm, Salzburg u.a. (alle Messages und Library-Dateien

  sind auch im dFPUG-Diskettenservice erhältlich)


Service

Hotline, Diskettenservice, Einkaufsrabatte

- telefonische Hotline zu Programmierfragen

  Dienstag und Donnerstag von 13:00 bis 18:00 Uhr

- dFPUG-Diskettenservice mit Quellcodedisketten für 5,- DM

  pro Stück zzgl. Versand

- Einkaufsrabatt (5%) bei den bekannten Distributoren

  ProLib GmbH und IBV Voller


Jahresabo

Das Newsletter-Jahresabonnement kostet

180,- DM incl. MWSt. (bzw. 1260,- ÖS oder

180,- sFR) und Versand.

Für Fragen stehen wir gerne unter

Tel. 06173-68182 zur Verfügung.

Den Anmeldecoupon können Sie uns auch einfach

per Fax 06173-65997 schicken (wahlweise den

Text rauskopieren und ergänzt an

CIS-ID 100024,1364, Rainer Becker mailen!).

dFPUG INFO / ANMELDECOUPON


Mitgliedschaft

Beitrag, Zusatzleistungen (Stand: August 1995)

- der Jahresbeitrag beträgt 180,- DM incl. MwSt.

  (1260 ÖS, 180 sFR) und Versand

- alle Publikationen, Teilnahme an Regionaltreffen,

  Nutzung von Mailboxen im Beitrag enthalten

- zusätzlich: CompuServe-Gutschein, Informationsmaterial

  (CD-ROMs, Zeitschriften)


Anmeldecoupon
dFPUG INFO / ANMELDECOUPON

( ) Ich abonniere den dFPUG-Newsletter FUCHS für 180,- DM (Preis Stand: August 1995)

    (incl. MwSt.) frei Haus und werde damit Mitglied in

    der dFPUG. Das Abonnement gilt zunächst für 1 Jahr und

    verlängert sich um ein weiteres Jahr, sofern nicht

    6 Wochen vor Ablauf schriftlich gekündigt wird.

( ) Bitte schicken Sie mir unverbindlich weitere Informationen

    zur deutschsprachigen FoxPro User Group (dFPUG) sowie ein

    kostenloses Probeexemplar des Newsletters FUCHS.

ADRESSE:

Firma:

Name, Vorname:

Straße:

Land-PLZ-Ort:

Telefon / Fax:

CompuServe-ID:

Ums.St.Id.Nr.:

ZAHLUNGSWEISE: (ggf. RECHNUNGSADRESSE angeben!)

( ) per Überweisung nach Rechnungserhalt

( ) per Bankeinzug,

          nachfolgend meine Bankverbindung

          BLZ         :

          Konto-Nr.   :

          Bankname    :

          Kontoinhaber:

DATUM:

1. UNTERSCHRIFT:

Mir ist bekannt, daß ich diese Bestellung innerhalb von

10 Tagen bei der dFPUG c/o ISYS GmbH, Messerschmittstr. 2 a,

D-65760 Eschborn, widerrufen kann und bestätige dies mit meiner

2. Unterschrift.

2. UNTERSCHRIFT:


Glossar
Quick Index

Bitte "vernachlässigen" Sie führende Unterstiche bei

Ihrer Suche nach Schlüsselworten!

A

ADDBS()

B

C

CALLFN()

CLEANPATH()

CLOSECLIP()

COUNTCLIPF()

D

DEFAULTEXT()

DRIVETYPE()

E

_EDACTIVE()

_EDCLOSEFI()

_EDCOPY()

_EDCUT()

_EDDELETE()

_EDGETCHAR()

_EDGETENV()

_EDGETLNUM()

_EDGETLPOS()

_EDGETPOS()

_EDGETSTR()

_EDINDENT()

_EDINSERT()

_EDLASTERR()

EMPTYCLIP()

ENUMCLIPFM()

_EDOPENFIL()

_EDPASTE()

_EDPOSINVI()

_EDREDO()

_EDREVERT()

_EDSENDKEY()

_EDSELECT()

_EDSETENV()

_EDSETPOS()

_EDSKIPLIN()

_EDSTOPOS()

_EDSTOSEL()

_EDUNDO()

_EDUNDOON()

F

_FINDWINDO()

_FINDWINDP()

FORCEEXT()

FORCEPATH()

FOXTOOLVER()

FOXTOUCH()

G

GETCLIPDAT()

GETCLIPFMT()

GETPROSTRG()

_GETWRECT()

H

I

INITIALIZE()

ISCLIPFMT()

J

JUSTDRIVE()

JUSTEXT()

JUSTFNAME()

JUSTPATH()

JUSTSTEM()

K

L

M

MAINHWND()

MKDIR()

MSGBOX()

N

NEXTWORD()

O

OPENCLIP()

P

PUTPROSTRG()

Q

R

REDUCE()

REGFN()

RMDIR()

REGFN32()

REGCLIPFMT()

S

STRFILTER()

SETCLIPDAT()

T

U

UNINITIALIZE()

V

VALIDPATH()

W

_WATTR()

_WBOTTOM()

_WBOTTOMP()

_WCLEAR()

_WCLEARREC()

_WCLEARREP()

_WCLOSE()

_WFOOTER()

_WFINDTITL()

_WGETCURSO()

_WGETCURP()

_WGETPORT()

_WHEIGHT()

_WHIDE()

_WLEFT()

_WLEFTP()

_WMAINWIND()

_WMOVE()

_WMOVEP()

_WONTOP()

_WOPEN()

_WOPENP()

WORDNUM()

WORDS()

_WPUTCHR()

_WPUTSTR()

_WPOSCURP()

_WPOSCURSO()

_WRIGHT()

_WRIGHTP()

_WSCROLL()

_WSCROLLP()

_WSELECT()

_WSENDBEHI()

_WSETATTR()

_WSETPORT()

_WSETTITLE()

_WSHOW()

_WSIZE()

_WSIZEP()

_WTITLE()

_WTOP()

_WTOPP()

_WWIDTH()

_WWIDTHP()

_WZOOM()

X

Y

Z