[1] [2] [3] [4]

 

Wert des Flag Bedeutung

1

Rückgabe nur der Verzeichnisse, die Teil des Dateisystems sind. Wenn der Anwender ein Verzeichnis auswählt, das nicht Teil des Dateisystems ist, wird die Schaltfläche OK deaktiviert.

2

Enthält keine Netzwerkverzeichnisse unterhalb der Stufe der Domain in der Baumansicht.

8

Ausschließlich Rückgabe übergeordneter Verzeichnisse. Wenn der Anwender etwas anderes als ein übergeordnetes Verzeichnis auswählt wird die Schaltfläche OK deaktiviert.

16

Fügt ein Kontrollelement ein, in dem der Anwender den Namen des gesuchten Verzeichnisses angeben kann (nur in einigen Versionen von Windows verfügbar).

64

Nutzung der neuen Benutzeroberfläche (nur in Windows 2000 und höher verfügbar).

4096

Es werden nur Rechner zurückgegeben. Wenn der Anwender etwas anderes als einen Computer auswählt, wird die Schaltfläche OK deaktiviert.

8192

Es werden nur Drucker zurückgegeben. Wenn der Anwender etwas anderes als einen Drucker auswählt, wird die Schaltfläche OK deaktiviert.

16384

Zeigt sowohl Dateien als auch Verzeichnisse an (nur in einigen Versionen von Windows verfügbar).

CD ? nutzt den gleichen Dialog wie GETDIR(), bietet aber nicht alle neuen Möglichkeiten.

Nach der letzten Änderung, die der Benutzeroberfläche zuzuordnen ist, haben FoxPro-Entwickler seit vielen Versionen gefragt. Seit langem kontrolliert die Systemvariable _DBLCLICK zwei unterschiedliche Dinge. Wie der Name vermuten lässt, entscheidet sie, wie viel Zeit zwischen zwei Mausklicks vergehen darf, damit sie als ein Doppelklick gewertet werden. Außerdem entschied der Inhalt dieser Variablen darüber, wie schnell ein Anwender bei der inkrementellen Suche in Comboboxen eine Eingabe machen musste. In VFP 7 wurden diese beiden Punkte getrennt, und die inkrementelle Suche wird jetzt durch die neue Systemvariable _INCSEEK kontrolliert.

OOP-Sprache

Zusätzlich zu den verschiedenen Änderungen der Kontrollelemente, die wir bereits besprochen haben, gibt es noch verschiedene andere Änderungen an VFPs objektorientierter Sprache. Als Erstes wurde der Befehl DEFINE CLASS erweitert, um es Ihnen zu ermöglichen, die Klassenbibliothek, von der die Klasse abgeleitet wird, mit anzugeben. Die neue Syntax von DEFINE CLASS lautet:

DEFINE CLASS ClassName AS ParentClass;
[ OF ClassLibrary ]

Der Vorteil dieses Formats liegt darin, dass Sie vor der Klassendefinition kein SET CLASSLIB oder SET PROCEDURE absetzen müssen. Die Klassenbibliothek kann (und sollte in der Regel auch) den Pfad enthalten und in Anführungsstriche gesetzt werden (beispielsweise wenn der Pfad Leerzeichen enthält).

Die Funktion AMEMBERS() bietet zusätzliche Informationen sowohl für VFPs native Objekte als auch für COM-Objekte. Der neue Wert 3 für den dritten Parameter gibt an, dass die Funktion ein vierspaltiges Array zurückliefern soll – die Inhalte der Spalten sehen Sie in Tabelle 4.

Tabelle 4 Was befindet sich in einem Objekt) – Aufruf von AMEMBERS() mit 2 als dritter Parameter gibt ein vierspaltiges Array mit den folgenden Inhalten wieder.

Spalte Inhalt

1

Name der Eigenschaft, des Ereignisses oder der Methode

2

Typ des Eintrags. Für VFP-Objekte sind die möglichen Werte „Property“, „Event“ oder „Method“. Für COM-Objekte sind die möglichen Werte „PropertyPut“, „PropertyGet“ und „Method“.

3

Bei VFP-Objekte ist dieser Eintrag leer. Bei Methoden von VFP-Objekten die Parameterliste. Bei Eigenschaften und Methoden von COM-Objekten die Signatur des Mitglieds, beruhend auf der Parameterliste, zusätzlich der Rückgabewert.

4

Die Hilfe zu dem Eintrag.

AMEMBERS() hat auch den Parameter cFlags erhalten, in dem Sie für native Objekte angeben können, welche Mitglieder zurückgegeben werden sollen. Tabelle 5 listet die möglichen Werte auf. Die Flags in jeder Filtergruppe sind exklusiv. Als Vorgabeverhalten werden, wenn mehrere Werte hintereinander in cFlags eingegeben sind, diese mit OR verknüpft, so dass der Parameter mit dem Wert „HP“ alle verborgenen und geschützten Eigenschaften, Ereignisse und Methoden beinhaltet. Nach Übergabe von „GU“ sind im Ergebnis alle Untereigenschaften enthalten, die entweder global oder benutzerdefiniert sind.

Tabelle 5 Auswahl der Untereigenschaften – AMEMBERS() neuer vierter Parameter lässt Sie das Ergebnis filtern.

 
Wert Filtergruppe Bedeutung

P

Sichtbarkeit

Geschützt

H

Sichtbarkeit

Versteckt

G

Sichtbarkeit

Global

N

Ursprung

Native Eigenschaften, Ereignisse und Methoden

U

Ursprung

Benutzerdefinierte Eigenschaften, Ereignisse und Methoden

I

Vererbung

Geerbte Eigenschaften, Ereignisse und Methoden

B

Vererbung

Basis- Eigenschaften, Ereignisse und Methoden

C

Änderung

Geändert

R

Schreibgeschützt

Schreibgeschützt

Es gibt noch zwei spezielle Flags. Das Aufnehmen von „+“ irgendwo im Parameter cFlags zeigt an, dass die Filter mit AND statt mit OR verknüpft werden sollen. Er ergibt beispielsweise die Übergabe von „GU+“ ein Ergebnis, bei dem alle Mitglieder sowohl global als auch benutzerdefiniert sind.

Das zweite spezielle Flag ist „#“, mit dem das Ergebnisarray eine weitere Spalte erhält. Die neue Spalte enthält die Flags, die zu dem entsprechenden Eintrag gehören.

Hier ein Beispiel für die beiden neuen Features. Der Code erstellt eine Instanz der Klasse _MoverLists aus FoxPros Foundation Classes und listet die geschützten Teile der Klasse einschließlich ihrer Flags auf:

oObject = NewObject( "_MoverLists", ;
          HOME()+"FFC\_CONTROLS" )
AMEMBERS( aMemberList, oObject, ;
          3, "P#" )
LIST MEMORY LIKE aMemberList
AMEMBERLIST         Pub            A    
(    1,    1)    C     "ADDTOPROJECT"
(    1,    2)    C     "Method"
(    1,    3)    C     ""
(    1,    4)    C     "Dummy code for adding files to project."
(    1,    5)    C     "CPUI"
(    2,    1)    C     "NINSTANCES_ACCESS"
(    2,    2)    C     "Method"
(    2,    3)    C     ""
(    2,    4)    C     "Access method for nInstances property."
   (    2,    5)    C     "CPUI"
   (    3,    1)    C     "NINSTANCES_ASSIGN"
   (    3,    2)    C     "Method"
   (    3,    3)    C     "vNewVal"
   (    3,    4)    C     "Assign method for nInstances property."
   (    3,    5)    C     "CPUI"
   (    4,    1)    C     "NOBJECTREFCOUNT_ACCESS"
   (    4,    2)    C     "Method"
   (    4,    3)    C     ""
   (    4,    4)    C     "Access method for nObjectRefCount property."
   (    4,    5)    C     "CPUI"
   (    5,    1)    C     "NOBJECTREFCOUNT_ASSIGN"
   (    5,    2)    C     "Method"
   (    5,    3)    C     "m.vNewVal"
   (    5,    4)    C     "Assign method for nObjectRefCount property."
   (    5,    5)    C     "CPUI"

Dieses Beispiel enthält alle Teile der Klasse (da alle Möglichkeiten aufgelistet sind), aber auch die Flags. Sie sehen hier nur einen Teil der Ausgabe.

AMEMBERS(aMemberList, oObject, 3, "GPH#")
LIST MEMORY LIKE aMemberList
 
AMEMBERLIST         Pub            A    
   (    1,    1)    C     "ACTIVECONTROL"  
   (    1,    2)    C     "Property"
   (    1,    3)    C     ""
   (    1,    4)    C     "References the active control on an object."
   (    1,    5)    C     "GRNI"
   (    2,    1)    C     "ADDOBJECT"
   (    2,    2)    C     "Method"
   (    2,    3)    C     "cName, cClass"
   (    2,    4)    C     "Adds an object to a container object at run time."
   (    2,    5)    C     "GNI"
   (    3,    1)    C     "ADDPROPERTY"   
   (    3,    2)    C     "Method"
   (    3,    3)    C     "cPropertyName,eNewValue" 
   (    3,    4)    C     "Adds a new property to an object."
   (    3,    5)    C     "GNI"
   (    4,    1)    C     "ADDTOPROJECT"   
   (    4,    2)    C     "Method"
   (    4,    3)    C     ""
   (    4,    4)    C     "Dummy code for adding files to project."
   (    4,    5)    C     "CPUI"
   (    5,    1)    C     "AOBJECTREFS"  
   (    5,    2)    C     "Property"
   (    5,    3)    C     ""
   (    5,    4)    C     "Array of object references properties."
   (    5,    5)    C     "GUI"
   (    6,    1)    C     "BACKCOLOR"  
   (    6,    2)    C     "Property"
   (    6,    3)    C     ""
   (    6,    4)    C     "Specifies the background color used to display text and graphics in an object."
   (    6,    5)    C     "GNI"

Das Formular ShowAMembers.SCX auf der Begleitdiskette lässt Sie mit AMembers() experimentieren.

Erweiterungen der IDE

Viele der wichtigsten Änderungen in VFP 7 befinden sich in der Interaktiven Entwicklungsumgebung (IDE). Wie bereits in den früheren Versionen wurde die Programmiersprache erweitert, um die Änderungen in der IDE zu unterstützen. Zusätzlich zu den Neuerungen gibt es noch einige Sprachänderungen, die andere Bereiche der IDE betreffen.

Unterstützung für neue Features

Verschiedene neue Systemvariablen dienen der Unterstützung von Programmen und Tabellen für die neuen Features der IDE. Tabelle 6 zeigt Ihnen die neuen Systemvariablen, die die neuen Features referenzieren; Sie können diese ändern, so dass sie auf Programme oder Daten verweisen, durch die Sie die von VFP bereitgestellten ersetzen.

Tabelle 6 Finden neuer Features – Diese neuen Systemvariablen verweisen auf die neuen Applets von VFP und die dazugehörenden Daten. Diese können Sie durch Ihre eigenen ersetzen.

Variable Vorgabewert Bedeutung

_CodeSense

HOME() + "FoxCode.App"

Die Verwaltungsanwendung für IntelliSense

_FoxCode

<WinDir> + "\Profiles\" + <User> + "\<User Settings Dir>\Microsoft\Visual FoxPro\FoxCode.DBF"

Die Datentabelle für IntelliSense

_FoxTask

HOME() + "FoxTask.DBF"

Die Datentabelle der Aufgabenliste

_ObjectBrowser

HOME() + "ObjectBrowser.APP"

Die Anwendung Objekt Browser

_TaskList

HOME() + "TaskList.APP"

Die Anwendung der Aufgabenliste

Außerdem verfügt das Anwendungsobjekt _VFP über die zwei neuen Eigenschaften EditorOptions und LanguageOptions. Damit können Sie festlegen, welche der neuen Editierfeatures automatisch verfügbar sein sollen. Mit EditorOptions verwalten Sie die unterschiedlichen Features von IntelliSense, wie das Drag-and-Drop zwischen Worten und die automatische Erstellung von Hyperlinks. Auch wenn diese Features via EditorOptions abgeschaltet sind, werden sie über das Menü weiterhin angeboten. LanguageOptions lässt Sie entscheiden, ob das Strict Typing zur Laufzeit ausgeführt wird.

Die neuen Funktionen EDITSOURCE() und APROCINFO() lassen Sie von einigen anderen neuen Features profitieren. EDITSOURCE() öffnet den für eine bestimmte Datei richtigen Editor und positioniert optional an einen bestimmten Punkt innerhalb der Datei. Wenn Sie eine Datei übergeben, die zu einem der visuellen Designer gehört, müssen Sie eine Zeilennummer angeben. Ein Beispiel:

EditSource( HOME()+"FFC\_CONTROLS.VCX",3,"_MoverLists","SelectAll")

EDITSOURCE() gehört ebenso zu dem neuen Tool Aufgabenliste. Sie können einen Shortcut aus der Aufgabenliste übergeben und haben den entsprechenden Editor geöffnet und am angegebenen Shortcut positioniert.

APROCINFO() ist die programmatische Version des neuen Document View. Die Funktion füllt ein Array mit den gleichen Informationen, die auch beim interaktiven Gebrauch des Document View angezeigt werden. Die Funktion überlässt Ihnen die Wahl, wie viele Informationen Sie angezeigt bekommen wollen. Hier die Syntax:

nCount = AProcInfo( aArray, cFileName;
          [, nWhichInfo ] )

Der Parameter nWhichInfo kann die folgenden 4 Werte enthalten:

·        0 oder nicht übergeben – enthält alle Informationen

·        1 – enthält nur Klassendefinitionen

·        2 – enthält nur Methodeninformationen

·        3 – enthält nur Präprozessoranweisungen einschließlich #DEFINE

Ein Beispiel:

APROCINFO( aDefines, HOME()+"GENHTML.PRG", 3)

Dieser Code produziert das folgende Resultat (hier nur in Teilen aufgeführt):

 API               Pub            A    
   (    1,    1)  C     "VFP_DEFAULT_ID"
   (    1,    2)  N     32                      (          32.00000000)
   (    1,    3)  C     "Define"
   (    2,    1)  C     "M_CLASS_LOC"
   (    2,    2)  N     35                      (          35.00000000)
   (    2,    3)  C     "Define"
   (    3,    1)  C     "M_COULD_NOT_BE_INST_LOC"
   (    3,    2)  N     36                      (          36.00000000)
   (    3,    3)  C     "Define"
   (    4,    1)  C     "M_COULD_NOT_OPENED_EXCL_LOC"
   (    4,    2)  N     37                      (          37.00000000)
   (    4,    3)  C     "Define"
   (    5,    1)  C     "M_FILE_LOC"
   (    5,    2)  N     38                      (          38.00000000)
   (    5,    3)  C     "Define"
   (    6,    1)  C     "M_FILE_ALREADY_EXISTS_LOC"
   (    6,    2)  N     39                      (          39.00000000)
   (    6,    3)  C     "Define"
   (    7,    1)  C     "M_FILE_TYPE_LOC"
   (    7,    2)  N     40                      (          40.00000000)
   (    7,    3)  C     "Define"

In VFP 7 können viele der Systemfenster angedockt werden. Die Funktion WDOCKABLE() lässt Sie herausfinden, ob ein Systemfenster grundsätzlich angedockt werden kann und ob das auch aktuell möglich ist. Außerdem können Sie den Status der Andockbarkeit eines Fensters ändern. Übergeben Sie einfach den Namen des Fensters, um seinen Status zu prüfen. Mit .T. oder .F. als zweiten Parameter ändern Sie die Andockbarkeit des Fensters. So machen Sie das Befehlsfenster andockbar:

WDOCKABLE("Command", .T.)

Die Funktion ALANGUAGE() wurde eingeführt, um IntelliSense anzupassen. Sie füllt basierend auf dem zweiten übergebenen Parameter ein Array mit unterschiedlichen Komponenten der Sprache. Tabelle 7 zeigt die Auswahlmöglichkeiten:

Tabelle 7 Sprachkomponenten – ALANGUAGE() füllt ein in Abhängigkeit von diesen übergebenen Werten ein Array mit unterschiedlichen Teilen der Sprache von VFP.

2. Parameter Ergebnis

1

Erstellt ein eindimensionales Array mit Befehlen.

2

Erstellt ein zweidimensionales Array mit Funktionen einschließlich der Anzahl der akzeptierten Parameter. Die zweite Spalte könnte auch den Buchstaben „M“ enthalten, womit angezeigt wird, dass statt einer verkürzten Version der vollständige Funktionsname verwendet werden muss.

3

Erstellt ein eindimensionales Array der Basisklassen.

4

Erstellt ein eindimensionales Array der DBC-Ereignisse.

Hier ein Beispiel mit nur einem Teil der Ergebnisse:

ALANGUAGE( aFunctions, 2)
LIST MEMORY LIKE aFunctions
 
AFUNCTIONS              Pub            A    
   (    1,    1)                       C     "ABS"
   (    1,    2)                       C     "1"
   (    2,    1)                       C     "ACLASS"
   (    2,    2)                       C     "2"
   (    3,    1)                       C     "ACOPY"
   (    3,    2)                       C     "2-5"
   (    4,    1)                       C     "ACOS"
   (    4,    2)                       C     "1"
   (    5,    1)                       C     "ADATABASES"
   (    5,    2)                       C     "1"
   (    6,    1)                       C     "ADBOBJECTS"
   (    6,    2)                       C     "2"
   (    7,    1)                       C     "ADDBS"
   (    7,    2)                       C     "1"
   (    8,    1)                       C     "ADEL"
   (    8,    2)                       C     "2-3"
   (    9,    1)                       C     "ADIR"
   (    9,    2)                       C     "1-4"

Updates der bestehenden Sprache

Um die Entwickler von Third-Party-Tools zu unterstützen und für die Konsistenz mit anderen Befehlen unterstützen MODIFY VIEW und MODIFY PROCEDURE jetzt auch die Klausel NOWAIT. Dadurch können diese Befehle auch programmatisch genutzt werden, während das Programm weiter ausgeführt wird.

Die Methode WriteMethod hat einen neuen Parameter, der es ermöglicht, Methoden „on the fly“ zu erstellen. Wenn die Methode, die im ersten Parameter genannt wird, nicht existiert und der Parameter lCreateMethod auf .T. steht, wird die Methode erstellt. Diese Lösung funktioniert nur zur Designzeit und das Formular oder die Klasse muss nach dem Hinzufügen der Methode gespeichert werden. Diese Einschränkungen sind aber akzeptabel, da WriteMethod für den Einsatz in Buildern gedacht ist.

Als die Project Hooks in VFP 6.0 eingeführt wurden fanden die Entwickler schnell Einsatzmöglichkeiten dafür. Einige Features fehlten aber. Diese Löcher stopft VFP 7 mit drei neuen Ereignissen: QueryNewFile, Activate und Deactivate. QueryNewFile wird ausgeführt, wenn Sie mit dem Prozess des Hinzufügens einer Datei zu einem Projekt beginnen. Interaktiv geschieht dies durch Klicken auf die Schaltfläche „Neu“ im Projekt-Manager. In früheren Versionen wurde in diesem Fall kein Ereignis ausgelöst.

Die Ereignisse Activate und Deactivate des Objekts ProjectHook sind wie die anderer Klassen – sie werden ausgeführt, wenn das Objekt aktiv wird und wenn es den Fokus verliert. Im Fall von Project Hooks geschieht dies, wenn das Projekt, das dem Project Hook zugeordnet ist, aktiviert oder deaktiviert wird. Das bedeutet, dass wir jetzt die Umgebung von VFP verändern können, wenn wir zwischen Projekten hin- und herschalten. Dadurch erhalten wir die Chance, Einstellungen wie den VFP PATH und andere projektspezifische Einstellungen zu ändern.

Als in VFP 3.0 die Möglichkeit eingeführt wurde, den Feldern Überschriften zuzuordnen, wurde eine einfache Sache schwieriger. Wenn Sie auf eine Tabelle ein BROWSE absetzen, werden die Überschriften statt der Feldnamen genutzt. Für einen Entwickler, der nur mal schnell einen Blick auf eine Tabelle werfen will, ist dieses Verhalten ärgerlich. VFP bietet mit der Klausel NOCAPTIONS für den Befehl BROWSE jetzt eine einfache und schnelle Lösung dieses Problems.

Der Einsatz definierter Konstanten macht Code erheblich lesbarer. Das Zusammenfassen der Konstanten in einer Datei (auch bekannt als Header- oder .h-Datei) durch Einsatz von #INCLUDE oder den Menüpunkt Include-Datei ist eine mächtige Technik. Diese Technik war aber schwierig, da der Algorithmus der Suche nach der Include-Datei durch einen relativen Pfad angegeben wurde, was nicht immer intuitiv war. Wurde die Datei erneut kompiliert, wurden die Header-Dateien nicht immer gefunden, und Kompilierungsfehler waren die Folge.

In VFP 7 wurde die Suche nach Include-Dateien erweitert. In Klassen und Formularen ist die Suchreihenfolge für die Headerdatei:

  • Verzeichnis der Datei + #INCLUDE dateiname (einschließlich relativer Pfad)

  • CURDIR() + #INCLUDE dateiname (einschließlich relativer Pfad)

  • SET PATH + #INCLUDE dateiname (einschließlich relativer Pfad)

Die letzten beiden Suchvorgänge sind neu. In Programmen ist die neue Suchreihenfolge für Include-Dateien folgende:

  • CURDIR() + #INCLUDE dateiname (einschließlich relativer Pfad)

  • SET PATH + #INCLUDE dateiname (einschließlich relativer Pfad)

  • Verzeichnis der Datei + #INCLUDE dateiname (einschließlich relativer Pfad)

  • Verzeichnis der Datei + #INCLUDE nur dateiname (ohne Pfad)

  • Verzeichnis von VFP + #INCLUDE nur dateiname (ohne Pfad)

Der dritte Suchvorgang ist neu.

Dies und Das

Eine neue Funktion ist eine Hilfe für das Debugging. ASTACKINFO() liefert eine komplette Aufstellung des Programmstack zur der Zeit, zu der die Funktion aufgerufen wird. Die Funktion entspricht dem Aufrufstack-Fenster des Debuggers und SYS(16), bietet aber mehr Informationen als die anderen an. Das erzeugte Array verfügt über sechs Spalten, die in Tabelle 8 beschrieben sind.

Tabelle 8 Was läuft? ASTACKINFO() erstellt ein Array mit Informationen über alle zur Zeit ausgeführten Programme.

Spalte Inhalt

1

Stack, mit einer 1 für das Hauptprogramm.

2

Name der Datei, in der die ausgeführte Routine enthalten ist.

3

Name der ausgeführten Routine. Kann eine Prozedur, Funktion oder Methode sein. Bei einer Methode enthält der Eintrag auch den Objektnamen.

4

Name der Quelldatei, in der die Routine enthalten ist.

5

Zeilennummer innerhalb der Datei (nicht innerhalb der Routine)

Obwohl ASTACKINFO() scheinbar nur für das Debugging entwickelt wurde, ist es nicht auf diese Umgebung beschränkt. Die Funktion kann jederzeit eingesetzt werden, um eine Momentaufnahme der aktuellen Situation zu liefern.

Der Befehl USE hat eine neue Klausel CONNSTRING erhalten, die es Ihnen ermöglicht, einen Connectionstring für den Einsatz einer remoten Ansicht zu übergeben. Damit haben Sie die Möglichkeit, eine UserID und ein Passwort zur Laufzeit statt zur Designzeit anzugeben. Beachten Sie, dass wie in SQLStringConnect() der gesamte Connectionstring angegeben werden muss.

Zusammenfassung

Das Entwicklungsteam hat in sehr vielen Bereichen von VFP 7 Änderungen vorgenommen. Wie in früheren Versionen bieten viele dieser Änderungen die Möglichkeit, das Schreiben von Code zu verbessern. Dieses Mal gingen viele Änderungen aus den Wünschen der Entwickler hervor. Wir müssen jetzt das neue Material in unser Denken übernehmen, so dass wir bei Bedarf diese Features auch einsetzen.

Ich danke Randy Brown von Microsoft für seine Hilfe bei der Vorbereitung dieser Notizen

[1] [2] [3] [4]