Session D-FXTO

Foxtools & Editor-Erweiterungen

Burkhard Stiller
ECHTZEIT DV-Systeme & Engineering


EINLEITUNG


EINFÜHRUNG

Editor-Erweiterungen mit Hilfe der Foxtools.Fll selber machen
Eine Bauanleitung nebst Vorlage, den ECHTZEIT Editor-Xtensions.

Was mich bislang an der Foxtools.fll-Systembibliothek am meisten erfreut hat, ist die Tatsache, daß es sie von Microsoft quasi als Zugabe umsonst gibt - und das ist etwas nicht ganz alltägliches!

In diesem Vortrag möchte ich auf spezielle Fragen zum Einsatz der Foxtools.fll-Bibliothek detaillierter eingehen, als ich dies in meinem Sonderheft zu besagten Foxtools (erschienen bei der dFPUG) aus Platzgründen konnte.

Wenn man sich mit einem komplexen Thema, wie es z.B. die Windows API-Programmierung darstellt, erstmals eingehender beschäftigt, ist es immer von sehr großem Nutzen, wenn man auf bereits Gelerntes und damit bekannte Strategien zurückgreifen kann. Als absoluter C-Neuling kamen mir da die FLL-Routinen der Foxtools-Bibliothek ganz recht, stellen sie doch neben einer Pseudoschnittstelle für das FoxPro-API, die auch xBase-User benutzen können noch zwei weitere mächtige Funktionen zum Einbinden und Aufrufen von externen Windows API-Funktionen zur Verfügung. Dies sind die allseits bekannten und beliebten RegFn()- und CallFn()-Routinen.

Neben einer ausreichenden Dokumentation - ich setze in meinem Vortrag wenigstens rudimentäre Kenntnisse meiner Foxtools-Dokumentation voraus (igitt, ich klinge wie mein alter Prof.) - aller zur Verfügung stehenden externen Routinen, ist es bei solchen "Forschungsreisen", wie ich meine damalige Lernphase heute gern bezeichne, immer von großem Nutzen, wenn man gleichzeitig auch ein Ziel vor Augen hat und nicht immer nur "wild in der Gegend herumprobiert". Damals fielen mir gleich einige Funktionen der Foxtools-Bibliothek ins Auge, die sich mit der internen FoxPro-Editor-Schnittstelle zu befassen schienen.

Nach ein paar zögerlichen Versuchen, die allesamt mit diversen Systemabstürzen einhergingen, fand ich doch die seinerzeit noch völlig undokumentierten, richtigen Übergabeparameter heraus und begann ein Konzept für das nun folgend beschriebene Tool zu entwicklen.

Grundgedanke meiner Arbeit war das müßige und fehlerhafte Automatisieren von spezialisierten Editor-Funktionen per FoxPro-Tastaturmakros durch einen programmtechnisch voll kontrollierbaren Vorgang zu ersetzen.

Das Resultat, das ich zu dieser Veranstaltung mitgebracht habe und auf das ich mich in den nun folgenden Ausführungen immer wieder stützen werde, ist auf den nächsten Seiten beschrieben.

Was Sie erwartet:

Doch fangen wir jetzt erst einmal mit der Vorstellung von etwas Greifbarem an.


ECHTZEIT Editor Xtensions

Kapitel I - Einführung

 

Der FoxPro-eigene Editor ist sicherlich der mit Abstand am häufigsten verwendete Texteditor zum Bearbeiten von Programmdateien und Quellcode-Segmenten. Leider vermißt man nach kurzer Zeit viele Funktionen, die andere professionelle Programm-Editoren auszeichnen. Diese "Lücken" werden von den Editor Xtensions geschloßen.

Im Wesentlichen handelt es sich bei dem xEditor um eine Sammlung von Systemmenüerweiterungen, die als Prozedur-Bibliothek zusammengefaßt aktiviert werden. Alle Funktionen können während der Arbeit im FoxPro-Editor durch ON KEY LABEL-Zuweisungen, oder über das Systemmenü aktiviert werden. Die aktuelle Umgebung (DBF-Arbeitsbereiche, SET-Einstellungen und Variablen) wird vom xEditor nicht berührt oder verändert, sodaß Sie vollkommen "ungestört" wie gewohnt weiterarbeiten können!

Der xEditor ist zudem optimal in allen Einzelheiten an jede individuelle Konfiguration anpaßbar!

Die OnKeyLabels und Systemmenü-Hotkeys aller Funktionen lassen sich individuell bequem per Dialog einstellen und in weiten Bereichen beeinflussen. Alle Funktionen sind auf Ablaufgeschwindigkeit hin optimiert und in 100% FoxPro-Code geschrieben. Damit der xEditor vollständig in jede Entwicklungsumgebung integriert werden kann, werden alle Funktionen, die in der geöffneten Prozedur-Bibliothek enthalten sein müssen im Quelltext mitgeliefert. Somit können Sie die Editor-Xtensions in Ihre bereits bestehende Systemerweiterung integrieren.

Der xEditor verwendet nur die überall schon vorhandene "FOXTOOLS.FLL" - Library, um die Zugriffe auf die einzelnen Editor-Sessions zu beschleunigen.

 


Kapitel II - Funktionsweise

Nach dem Start erweitern die Editor Xtensions das Systemmenü von FoxPro gemäß den Voreinstellungen. Dabei werden entweder neue Menüpunkte eingefügt, oder bestehenden Menüpunkten werden OnKeyLabels zugeordnet, damit diese einfacher zu erreichen sind.

Die Systemmenüerweiterungen werden zentral unter dem BAR-Namen <xEdit> abgelegt. Bitte beachten Sie, daß die Menü-Hotkeys aller in dieser Dokumentation gezeigten Menüsystemerweiterungen frei definierbar sind. Falls Sie in Ihren eigenen Systemerweiterungen hier benutzte Tastenkürzel bereits verwenden, haben Sie die Möglichkeit, die defaultmäßig eingestellten Menü-Hotkeys im Voreinstellungen-Dialog zu ändern.

Wir bezeichnen die von den verschiedenen Textverarbeitungen her bekannten Textbausteine in unseren FoxPro Editor-Xtensions als Templates. Bei einem Template handelt es sich um ein Stück Quelltext, das unter einem Stichwort in einer Datenbank abgelegt ist. Wenn nun in einer Editor-Session direkt nach Eingabe eines Worts eine vorbestimmte Taste gedrückt wird (Aktivierungstasten für diese "Textexpansion" können die LEER-Taste, die ENTER-Taste und die TAB-Taste sein), wird mittels C-Routinen aus der FOXTOOLS.FLL-Bibliothek das zuletzt geschriebene Wort ermittelt. Ist dieses Wort ein Stichwort aus der Template-Datenbank, wird augenblicklich der zugeordnete Programmquelltextbaustein (ebenfalls mittels C-Routinen aus der FOXTOOLS.FLL-Bibliothek) im Editor-Fenster eingesetzt. Diese automatische Expansion -wir nennen sie auch AutoExpand- erfolgt nur, wenn das ermittelte Wort 100prozentig mit dem Stichwort übereinstimmt. Natürlich haben Sie immer die Möglichkeit Templates auch manuell zu expandieren - s.w.u..

Die Tücken einer solchen automatischen Expansion liegen wie immer im Detail. Damit ein problemloses (d.h. ungestörtes, nebenwirkungsfreies) Arbeiten im FoxPro Editor weiterhin möglich ist, wurden einige Optionen in den xEditor-Voreinstellungen aufgenommen, die das Verhalten des xEditors im AutoExpand-Modus beeinflussen. Zum einen kann bestimmt werden, auf welche der o.g. Tasten der xEditor mit einem AutoExpand-Versuch reagieren soll. Weiterhin kann die AutoExpand-Funktion für das Befehls-Fenster, das ja auch eine "normale" Editor-Session darstellt, ausgeschaltet werden. Zusätzlich wurde die Möglichkeit geschaffen, die AutoExpand-Funktion in REM-Zeilen auszuschalten. Dadurch haben Sie die Möglichkeit, die in der Template-Datenbank benutzten Stichworte in Ihren Bemerkungszeilen als "Klartext" einzugeben, ohne daß gleich der xEditor den Quelltext wieder expandiert.

Um den Komfort abzurunden, können Sie die AutoExpand-Funktion kurzfristig per Hotkey deaktivieren, um z.B. bestimmte Strings einzugeben die Stichwort-Texte enthalten, und danach wieder reaktivieren.

Natürlich müssen Sie erst einmal Ihre Template-Datenbank mit häufig benutzten Quellcodes "bestücken".

Das Anlegen der Templates geschieht äußerst simpel und kann von Ihnen jederzeit mehr oder weniger nebenbei erledigt werden. Wenn Sie gerade einen Quellcode in einem geöffneten Fenster vor sich haben, markieren Sie einfach den gewünschten Teil und drücken Sie danach die Tastenkombination STRG+EINFG (oder benutzen Sie das Systemmenü oder das Floating-PopUp Menü der rechten Maustaste). Es erscheint ein Dialog, in dem Sie nur das zuzuordnende Stichwort, sowie eine kurze Erläuterung eingeben müssen. Das war schon alles...

Bild: templ001.bmp: xEditor > Template anlegen Dialog

 

Nun können Sie das neue Template sofort benutzen, oder noch weitere Ergänzungen und Änderungen im nachfolgend erläuterten Pflegedialog vornehmen.

Wenn Sie die Taste F11 drücken (oder Sie benutzen das Systemmenü oder das Floating-PopUp Menü der rechten Maustaste) erscheint der Template_pflegen-Dialog.

Bild: templ002.bmp: xEditor > Template pflegen Dialog

Beachten Sie in der Abbildung, den senkrechten Strich in der ersten Zeile des eigentlichen Template-Quelltextes vor dem Wort Titel. Dies ist eine s.g. Cursor-Rücksprungmarke.

Mit Hilfe der Cursor-Rücksprungmarke (CRm) können Sie die Position Ihres Schreibcursors nach erfolgter Template-Expansion festlegen. Das Zeichen, das als CRm dienen soll, kann in den Voreinstellungen definiert werden. Nach erfolgter Expansion ist das Zeichen gelöscht und der Schreibcursor steht an seiner Stelle, sodaß Sie sofort weiterschreiben können. Logischerweise kann je Template nur eine CRm eingetragen werden.

In den Voreinstellungen kann ein weiteres Sonderzeichen bestimmt werden, das sie mehrfach in Ihren Templates eintragen können, die s.g. Makro-Expansionsmarke (MEm). Trifft der xEditor beim Expandieren auf ein solches Zeichen, wird beim ersten Mal ein Dialogfenster geöffnet, in das Sie einen Text eingeben können (z.B. einen Variablennamen o.ä.). Bei jedem weiteren Auftreten des Makro-Expansionszeichens im Template-Orginaltext, wird dieses dann vom xEditor durch Ihren aktuellen Eingabetext beim Expandieren ersetzt.

Die weiteren Funktionen des Template pflegen Dialogs bedürfen an dieser Stelle keiner weiteren Erläuterung...

Natürlich wird es Ihnen oft passieren, daß Sie ein Stichwort für die Text-Expansion vergessen haben. Andererseits wünschen Sie eine Text-Expansion vielleicht nur auf "ausdrücklichen Wunsch" und nicht automatisch. Zu diesem Zweck wurde die Funktion manuell expandieren integriert.

Über den Hotkey ALT+Rück oder den entsprechenden Menüpunkt des System- oder Floating PopUp-Menüs wird das Wort an (oder in) dem ihre Eingabe-Cursor gerade steht markiert und in der Template-Datenbank gesucht. Falls jetzt kein "Treffer" in der Stichwortliste gefunden wird (das ist in diesem Fall normal und auch gewollt), erscheint ein Auswahldialog.

Bild: templ003.bmp: xEditor > Template manuell expandieren Auswahl-Dialog

Jetzt haben Sie die Möglichkeit ein Sichwort auszuwählen und per Doppelklick zu expandieren. Die Kurzbeschreibungen zu jedem Template, die Sie ja beim Anlegen desselben eingegeben haben, erscheinen jeweils als Hilfstext in der FoxPro-Statuszeile und können Ihnen so noch näher Auskunft über das angewählte Template geben, da die Stichworte ja meistens sehr kurz sind (man will ja nicht viel tippen müssen)!

Außerdem besteht die Möglichkeit, das Template nicht direkt in die aktuelle Editor-Session zu expandieren, sondern per <Kopieren>-Textknopf zusätzlich in die Zwischenablage zu übertragen. Damit steht es dann sofort auch in anderen geöffneten Fenstern zur Verfügung.

Wenn gewünscht (und aktiviert), sind die Funktionen des xEditors auch durch Klick der rechten Maustaste als "Floating PopUp-Menü" erreichbar.

In der folgenden Abbildung sehen Sie einen FoxPro-Hauptbildschirmschnappschuß nachdem bei geöffnetem Editor-Fenster die rechte Maustaste einmal geklickt wurde. Es erscheint an der Mauspfeilposition ein PopUp-Fenster mit den wichtigsten xEditor-Funktionen.

Bild: popup1.bmp> Floating PopUp-Menü über rechte Maustaste

Ab dieser Version der Editor Xtension wird der Editor-Status "Automatisch einrücken" für die jeweilige Editor-Session berücksichtigt. Ist das automatische Einrücken aktiv und beginnt die Quelltextzeile mit dem gefundenen Stichwort mit TAB-Sprüngen, wird auch der Tempalte-Text beim Expandieren um die vorgefundene TAB-Anzahl eingerückt.

Ab dieser Version der Editor Xtension kann per Voreinstellungsdialog bestimmt werden, ob die Template-Datenbank immer nur für den unmittelbaren Zugriff geöffnet wird, oder stets geladen bleibt. Im ersten Fall kann vorm Generieren von Screens (dort Speichern der Umgebungsinformationen) nicht vergessen werden, die Template-DBF vorab aus dem Arbeitsbereich zu entfernen. Sonst würde vielleicht der entsprechende Quelltext zum Öffnen erzeugt. Nachteilig kann sich das stetige Neuöffnen nur bei sehr langsamen Rechnern (ohne Festplatten-Cache) auf die Arbeitsgeschwindigkeit auswirken. Dort sollten Sie die zweite Möglichkeit ausprobieren und die Template-Datenbank ständig geöffnet halten.

Alle ständig benötigten Routinen der Editor-Xtensions werden mit der Anweisung SET PROCEDURE TO EDITOR.APP systemweit verfügbar gemacht. Sollten Sie schon eigene Routinen für Ihre Entwicklungsarbeit erstellt haben und in dieser Form verwalten und aufrufen, können Sie einfach die im Quelltext mitgelieferten xEditor-Funktionen zu Ihrer Funktionssammlung hinzufügen. In den xEditor-Voreinstellungen deaktivieren Sie dann einfach das automatische Setzen der Prozedurdatei, da Sie ja zuvor schon Ihre eigene Prozedurdatei aktiviert haben. Damit steht einer nahtlosen Integration der Editor Xtensions nichts mehr im Wege.


Kapitel III - Editor-Erweiterungen

Die Funktion Gehe zu Zeile... wird vom xEditor um leistungsfähige Funktionen ergänzt. Ab sofort ist die besagte Funktion auch per Hotkey erreichbar. Weiterhin verfügt der xEditor über die Möglichkeit, alle Funktionen und Prozeduren tabellarisch zu verwalten. Möchten Sie zu einer bestimmten Prozedur innerhalb Ihrer Editor-Session springen, suchen Sie sich einfach den Prozedur- / Funktionsnamen aus einer PopUp-Liste aus. Die Prozedur- und Funktionsnamen werden bei jedem Aufruf von Gehe zu Prozedur neu eingelesen. Dieser Vorgang ist im Regelfall sehr schnell abgeschlossen, da FoxTools.fll-Routinen zu Einlesen der Editor-Zeilen verwendet werden. Damit entfällt der sonst manchmal notwendige Zwischenschritt die Prozedur-Liste aktualisieren zu müssen.

Bild: gotoproc.bmp> Gehe zu Prozedur Dialogbox

Sie können Textmarken im Quelltext setzen. Eine Textmarke steht im Quelltext immer in Spalte #1 und sieht folgendermaßen aus: *:LABEL\makentext

Sie können diesen Text per Hand eintragen oder mit Hilfe eines kleinen Dialogs einfügen lassen. Weiterhin können Sie eine bestimmte, oder alle Textmarken aus einem Quelltext entfernen lassen.

Diese Funktion verhält sich analog zur Funktion "Springe zu Prozedur"....

Ähnlich wie Sie mit dem Hotkey STRG+F1 in FoxPro zum nächsten Fenster im Fensterstapel springen können, haben Sie nun die Möglichkeit per Hotkex zwischen den Fenstern der einzelnen Editor-Sessions vorwärts und rückwärts zu springen. Dabei werden alle anderen geöffneten (nichteditor-) Fenster übergangen.

Die Editor-Xtensions erweitern die normale Windows-Zwischenablage um eine FoxPro-interne lokale Zwischenablage. Dafür stehen Ihnen zwei neue Funktionen Kopieren -> xClipboard und Einfügen <- xClipboard zur Verfügung. Diese können über Hotkey oder über das System- oder Floating PopUp-Menü aktiviert werden.

 

Sie können in der lokalen Zwischenablage 10 verschiedene "Schächte" verwenden - siehe Screenshots:

Bild: xclipbrd.bmp> Kopieren in lokale Zwischenablage aus Editor-Session

 

Bild: xclipb02.bmp> Einfügen aus lokaler Zwischenablage in Editor-Session

Liest eine Textdatei von der Festplatte an der aktuellen Cursor-Position in die aktive Editor-Session ein.

. Schreibt einen markierten Textbereich einer Editor-Session in eine Textdatei auf die Festplatte.

Schreibt in alle Zeilen eines markierten Textblocks einer Editor-Session in Spalte #1 ein Stern (*).

Entfernt die Rem-Sternchen eines markierten Textblocks der aktuellen Editor-Session wieder.


Kapitel V - Quelltextgeneratoren

Folgende Generatoren sind für die Editor-Xtensions verfügbar, bzw. In Vorbereitung


Kapitel V - Voreinstellungen

Die Editor Xtensions sind vom Konzept her eine "unsichtbare" Funktionserweiterung des FoxPro Quelltext-Editors. Damit Sie in Ihrer gewohnten Arbeit nicht gestört werden, wurde besonders viel Programmieraufwand auf die Anpaßbarkeit der Xtensions verwendet. Alle Funktionen der Xtensions lassen sich per Voreinstellungs-Dialogprogramm ein-, bzw. ausschalten. Alle von den Xtensions benutzten Hotkeys können von Ihnen ebenfalls umdefiniert werden. Damit Sie die vollständige Kontrolle über die neue Systemerweiterung besitzen um diese noch perfekter in Ihre Arbeitsumgebung integrieren zu können, werden alle Prozeduren der Editor Xtensions, die über SET PROCEDURE TO... erreichbar sein müssen im Quelltext mitgeliefert. Damit lassen sich die Xtensions in Ihre vielleicht schon selbst entwickelten Erweiterungen nahtlos einbauen! Auf den folgenden Seiten sehen Sie eine Übersicht über die umfangreichen Voreinstellungsmöglichkeiten.

Bild: schalter.bmp> Voreinstellungen der Editor Xtensions (Seite #1)

Bild: hotkey1.bmp> Hotkey-Belegungen der Systemmenüerweiterungen (und ON KEY LABEL...)

Bild: hotkey2.bmp> Hotkey-Belegungen der Systemmenüerweiterungen

Bild: hotkey3.bmp> Hotkey-Belegungen der Systemmenüerweiterungen

Bild: diverses.bmp> Weitere Voreinstellungen und Systemparameter der Systemmenüerweiterungen

 

Damit die Voreinstellungen und alle weiteren Arbeitsparameter nicht in "anfälligen" Variablen gehalten werden müssen, werden diese Werte in der FOXPRO.INI - Datei geführt und bei Bedarf mit Funktionen aus dem WIN-API abgerufen (mittels REGFN() und CALLFN()), sodaß keine spürbaren Zeitverzögerungen entstehen.

Folgende Variablen werden in der Foxpro.ini-Datei (im Windows-Verzeichnis) gespeichert:

ECHTZEIT xEditor]
__Xlogo=NEIN
__Xsysmenu=JA
__Xpopup=JA
__Xautostart=JA
__Xcrlf=JA
__Xcommand=NEIN
__Xremark=NEIN
__Xclosedbf=JA
__Xauto=alt+f11
__Xauto2=Alt+F11
__Xtoggle1=JA
__Xexpand=alt+backspace
__Xexpand2=Alt+Rück
__Xmake=ctrl+ins
__Xmake2=Strg+Einfg
__Xmaint=f11
__Xmaint2=F11
__Xcopy=alt+c
__Xcopy2=Alt+C
__Xpaste=alt+v
__Xpaste2=Alt+V
__Xdef=f12
__Xdef2=F12
__Xhelp=shift+f1
__Xhelp2=Umschalt+F1
__Xoklend=alt+x
__Xoklend2=Alt+X
__Xblksav=shift+f5
__Xblksav2=Umschalt+F5
__Xblklod=shift+f6
__Xblklod2=Umschalt+F6
__Xblkrm=shift+f7
__Xblkrm2=Umschalt+F7
__Xblkurm=shift+f8
__Xblkurm2=Umschalt+F8
__Xgoline=alt+g
__Xgoline2=Alt+G
__Xgoproc1=alt+z
__Xgoproc2=Alt+Z
__Xgoproc3=ctrl+uparrow
__Xgoproc4=Strg+Pfeil_rauf

__Xgoproc5=ctrl+dnarrow
__Xgoproc6=Strg+Pfeil_runter
__Xgomark=alt+m
__Xgomark2=Alt+M

__Xedmark=f5
__Xedmark2=F5
__Xgenwin=alt+f3
__Xgenwin2=Alt+F3
__Xgenfld=alt+f5
__Xgenfld2=Alt+F5
__Xgenodb=alt+f6
__Xgenodb2=Alt+F6
__Xgencdb=alt+f7
__Xgencdb2=Alt+F7
__Xgenmdb=alt+f8
__Xgenmdb2=Alt+F8
__Xgenm2f=alt+f9
__Xgenm2f2=Alt+F9
__Xnxtwin=ctrl+pgdn
__Xnxtwin2=Strg+Bild_runter

__Xbckwin=ctrl+pgup
__Xbckwin2=Strg+Bild_rauf
__Xoklsav=alt+f2
__Xoklsav2=Alt+F2
__Xoklpop=rightmouse
__Xokloff=alt+f12
__Xnoproc=NEIN
__Xmacro=~
__Xtoggle2=JA
__Xautosave=NEIN
__XSavetime=0
__Xhomedir=F:\FOXPROW\EDITOR\
__Xspacebar=JA
__Xtabkey=NEIN
__Xenterkey=NEIN
__Xcursor=|

In der neuesten (professionellen) Version der Xtensions, die dann auch über Multiuser-Fähigkeiten verfügt, wird das Verwalten der Informationen noch komplexer. Allein die Tatsache, daß normalerweise angewandte Methoden, wie das Speichern von durchgängig benötigten Informationen in globalen Variablen, bei der Implementation der Editor-Xtension als systemnahe Erweiterung nicht in Frage kommt, macht eine komplexe Logik erforderlich. Eine einigermaßen erträgliche Arbeitsgeschwindigkeit (bedenken Sie, daß die Template-Expansion bei jedem Leertastenanschlag einsetzten wird) kann also nur mit Hilfe von C-Routinen erreicht werden. Und genau diese holen wir uns mit Hilfe der Foxtools-Bibliothek ins Haus.

Stellen wir an Dieser Stelle nur einmal folgenden Windows-API-Aufruf der unter FoxPro programmierten Entsprechung gegenüber:

 

Jetzt folgt die Entsprechung in FoxPro programmiert, mit der man z.B. die Config.fpw auslesen kann:

 

dazu wird zusätzlich noch folgende (bremsende) Subfunktion aufgerufen:

So, wie Sie unschwer erkennen können, ist der Einsatz eines Win-API-Calls um ein Vielfaches simpler und effektiver durchzuführen! Wobei wir gleich bei einem ersten Tip sind, den ich Ihnen nur wärmstens ans Herz legen kann:

Versehen Sie Ihre "Config.fpw" Initialisierungs-Datei mit einem Abschittseintrag gleich in der ersten Zeile! Diese könnte dann wie folgt aussehen:

 

Der Sektions-Text ist dabei unbedeutend (natürlich müssen Sie sich ihn merken). Damit sind Sie zukünftig in der Lage, auch Einstellungen der Config.fpw mit Hilfe der Win-API-Funktionen GetProvateProfileString() und WritePrivateProfileString() blitzschnell und äußerst bequem zu manipulieren!

Die Hauptarbeit, des Holens und Speicherns von "globalen Variablen" innerhalb der Editor-Erweiterung wird genau mit eben diesen Funktionen bewerkstelligt. Alle Variablen liegen immer als Texteintrag in einer bekannten INI-Datei vor und können so auch niemals mir dem Befehl CLEAR ALL versehentlich gelöscht werden, da sie immer wieder aus der INI-Datei bei Gebrauch eingelesen werden. Dieses Vorgehen klingt zwar zugegebener Weise anfangs eher umständlich und langsam, hat sich in der Praxis aber bestens bewährt, wenn man bedenkt, daß immer wieder benutzte Dateien vom Betriebssystem sowieso "gecached" werden und damit unmittelbar zur Verfügung stehen!

Damit nicht immer wieder ein Suchvorgang nach den entsprechenden INI-Dateien gestartet werden muß, dies würde in der Tat eine erhebliche Zeitverzögerung bedeuten, werden die benutzten Dateien in ganz genau vordefinierten Unterverzeichnissen unterhalb des FoxPro-Hauptverzeichnisses angelegt. Das FoxPro-Hauptverzeichnis wiederrum ist ja bekanntlich per SYS(2004) bequem zu ermitteln.

Schauen wir uns einmal solche Suchvorgänge anhand der internen Xeditor-Funktion "Xtoggle" etwas genauer an:

 

und so weiter und so fort...

Die Funktion GetPrivateProfileString liefert einen Textwert zu einem Abfrage-Item zurück, der dann bequem ausgewertet werden kann. Interessanter Weise gibt es noch eine weitere, seltener benutzte Funktion mit Namen GetPrivateProfileInt(), die als Rückgabe direkt einen Integerwert liefert, wodurch das lästige Konvertieren mit der VAL()-Funktion enfallen kann!

Kommen wir nun zu den eigentlichen Tricks und dem KnowHow, das in der xEditor-Toolbox verborgen ist:

Wenn eine Editor-Session (ein Editor-Fenster) geöffnet wird, bekommt das Fenster ein internes Fenster-Handle. Davon gibt es interessanter Weise unter FPW gleich zwei, nämlich das Windows-eigene Handle und ein FoxPro-internes Handle. Beide unterscheiden sich in der Nummer. Zur Konvertierung von den von mir so genannten Fox-Handlen zu den echten Windows.-Handlen gibt es eine Foxtools-Funktion mit Namen _WHTOHWND(). Die Namensgebung der Funktion enthält zwei Bestandteile nämlich die gebräuchliche Kennung für FoxPro-Handles "WH" und die in der C-Programmierung eingesetzte Schreibweise "HWND".

Tip:

Bitte benutzen Sie in Ihren Programmen immer diese Kennungsprefixe, wenn Sie Handle-Variablen verwalten, damit Sie Verwechselungen ausschließen können, denn nichts ist unangenehmer, als wenn sie die Foxtools-Funktionen mit ungültigen Handlen füttern - es kommt in 99 Prozent aller Fälle zum Systemabsturz!

Alle _ED-Funktionen der Foxtools-Bibliothek arbeiten mit den internen FoxPro-WHs, wodurch eine weiterer Umrechnungsschritt entfallen kann. Wenn nun ein Editor-Fenster geöffnet ist, kann man über das entsprechend zu ermittelnde WH-Handle per _ED-Funktionen alle nur erdenklichen Manipulationen innerhalb des Fensters ausführen! Aber Achtung, natürlich gibt es bei aller Euphorie auch einen Wehrmutstropfen zu verzeichnen. Ist ein gerade geöffnetes Fenster nicht das Fenster einer reinrassigen Editor-Session (z.B. Dialogfenster mit Edit-Region aus dem Screen-Generator), so stürzt FoxPro mit absoluter Zuverlässigkeit sofort ab, wenn Sie versuchen sollten eine _ED-Funktion mit solch einem Handle zu aktivieren!

Zur Lösung dieses Problems habe ich ehrlich gesagt Wochen benötigt, bevor mir beim Probieren folgende Kuriosität auffiel:

Die Editor-Voreinstellungen einer echten Editor-Session (die dann ja auch über das Systemmenü verfügbar sind) kann man sich mit der Foxtools-Funktion _EDGETENV() in ein Array einlesen lassen. Liegt aber gerade keine echte Editor Session vor, wird das Editor-Environment-Array nicht mit Werten gefüllt und die Funktion gibt eine 0 zurück! Damit hatte ich den gesuchten Indikator für eine absturzsichere Session-Adressierung, hier die Funktion, mit der die Abfrage ausgeführt wird:

 

Kommen wir nun in diesen Session Notes zum Herzstück der Editor-Erweiterung, der eigentlichen Expansions-Routine. Das abgedruckte Listing zeigt alle wesentlichen Feinheiten und ist selbsterklärend dokumentiert.

 

Es muß sichergestellt sein, daß wir in Editor-Session sind. zuerst setzen wir ein Flag, das anzeigt, ob das aktuelle Fenster das "Befehl"-Fenster ist. Das nachfolgend praktizierte "_EDSENDKEY"-Verfahren darf nämlich NICHT im Befehlsfenster angewand werden, da sonst bei ENTER-Taste keine Befehlsausführung erfolgt, sonden nur ein Zeilenumbruch!

 

Was hierbei deutlich wird ist die Tatsache, daß neben der Probelmatik der korrekten FoxPro-Handle-Findung auch beachtet werden muß, in welches der anderen FoxPro-Systemfenster gerade zufällig auch hinein geschrieben werden könnte. Das Befehlsfenster von FoxPro ist nämlich auch eine echte Editor-Session, mit dem Unterschied, daß ein dort abgesetztes ENTER die Ausführung des aktuellen Zeileninhalts zur Folge hätte. Also muß auf die verschiedenen Besonderheiten individuell eingegangen werden!

Abschließend bleibt zu der Editor-Xtension noch zu sagen, daß sie gerade an den neuesten Stand (VFP 3.0) angepßt werden. Natürlich wird sich die Gewichtung von bestimmten Features der Editor-Xtensions unter VFP ändern, trotzdem bleibt auch die Codierung per Hand in der neuen Version niemanden erspart und durch die Erweiterungsfähigkeit mittels der Anwenderschnittstelle können und werden die Editor-Xtensions unter VFP auch in Zukunft ein unentbehrliches Hilfmittel für jeden Vielschreiber werden!

"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!

Es gibt eine schöne und zugleich recht trickreiche Möglichkeit das oben beschriebene Fehlverhalten der Foxtools-Bibliothek elegant in eigenen Anwendungen zu umgehen!

Man muß nur einfach für jede Instanz der FoxPro-Anwendungen eine eigene FoxTools.fll laden und zwar jeweils unter einem anderen Namen!

Tip:

In einem Projekt kann per Projektmanager keine FLL-Datei "Included" werden - FoxPro weigert sich da beharrlich! Also, beschummeln wir FoxPro ein wenig und benennen die Bibliothek "FoxTools.fll" z.B. in "FoxTools.flx" um. Nun nimmt der Projektmanager von FoxPro die Bibliothek als Dokument in die APP mit auf! Achten Sie darauf, daß die Datei included wird, also nicht als eigenständige Datei z.B. mit auf die Distributionsdisketten muß.

Beim Starten der Anwendung generieren wir uns nun einfach einen eindeutigen Dateinamen mit der Erweiterung "FLL" und kopieren die "interne" Foxtools.flx in das TEMP-Verzeichnis (per SYS(2033) erfragen) auf der jeweiligen Arbeitsstation mit genau diesem eindeutigen Dateinamen. Nun kann man die Bibliothek mit

aktivieren. Natürlich muß man sich den Namen merken, damit man hinterher beim Verlassen der APP im Temp- Verzeichnis schön aufräumen kann! Man kann sogar einen Dateinamen mit einer anders lautenden Erweiterung (z.B. ".TMP") erzeugen, dann muß die Bibliothek aber folgendermaßen aufgerufen werden:

da FoxPro defaultmäßig nur nach FLLs schaut. All dies hat auch noch den großen Vorteil, daß z.B. eigene FLLs doch ganz bequem in einer APP versteckt werden können. Auch nach einem Programmabsturz, bei dem die als TMP-Datei getarnte Bibliothek auf der Platte zurückbleibt, muß ersteinmal irgendeinem Superhirn die Idee kommen, daß diese typische Schrottdatei im temp-Verteichnis da eine "kostbare" FLL- Bibliothek ist! Im Regelfall verbleiben von FoxPro sowieso etliche solcher Dateileichen im TEMP-Verzeichnis nach einem Absturz liegen, die dann in den allermeisten Fällen von einem reinlichen Endanwender weggelöscht werden!

So, nun haben wir für jede Instanz der Anwendung (ESL oder FoxPro im Orginal) immer eine neue Kopie der FoxTools.fll auch in den Hauptspeicher geladen, denn Windows ist nicht smart genug zu erkennen, daß es sich dabei jedesmal um ein und dieselbe FLL handelt. Ein abweichender Dateiname ist für Windows Grund genug eine neue Kopie der FLLin den Speicher zu holen. Dies widerspricht natürlich dem Grundgedanken der wiederverwendbaren DLLs nach allen Regeln der Kunst, bringt dem leidgeplagten Entwickler aber die so dringend benötigte erholsame Nachtruhe.


Zukunftsaussichten

Solange es noch Anwender geben wird, die sich nicht von Ihrem 16bit-Windows trennen wollen oder können (ich selbst gehöre auch dazu), wird es weiterhin 16bit DLL-Dateien geben, die man ansprechen können muß. Diese Aufgabe wird auch unter VFP weiterhin der Foxtools-Bibliothek (Version 3.0) zukommen. Solange es noch FPW2.6 geben wird, wird es logischerweise auch noch die alte Foxtools.fll geben.

Alle Neuentwicklungen dagegen werden immer mehr Funktionen aus den neu auf dem Markt erscheinenden 32bit-DLLs entleihen, was in der VFP-Version ja bekanntlich mit Hilfe des DECLARE DLL Befehls ralisiert wird.

Als ebenso zukunftssicher, wie der Programmstabilität dienlich hat sich der Einsatz von sogenannten Wrapper-Funktionen erwiesen (wrapp, engl.: einpacken). Dabei wird der eigentliche Funktionsaufruf immer über eine interne Prozedur geleitet, deren Name und Parametrisierung stets über alle Entwicklungsplattformen und Versionen hinweg gleich bleiben kann. Ändert sich beim Plattformwechsel z.B. die Parametrisierung, so muß diese nur einmal, innerhalb der Wrapper-Routine angepaßt werden! Ein u.U. langwieriges Testen und Anpassen des Funktionsaufrufs über mitunter hunderte von Modulen entfällt damit völlig. Der in Kauf zu nehmende Zeitverlußt, der durch die Zwischenschaltung einer weiteren Aufrufebene entsteht, hält sich in Grenzen und kann in Anbetracht der gewonnen besseren Wartbarkeit und Stabilität getrost vernachlässigt werden!

Ich wünsche Ihnen für Ihre zukünftigen Projekte unter FoxPro "gutes Gelingen" und würde mich jederzeit über Resonanz zu diesen Vortrag freuen.