DEFINE CLASS-Befehl
Erstellt eine benutzerdefinierte Klasse oder Unterklasse und legt die Eigenschaften, Ereignisse und Methoden für die Klasse oder Unterklasse fest.
DEFINE CLASS ClassName1 AS ParentClass [OF ClassLibrary] [OLEPUBLIC]
[IMPLEMENTS cInterfaceName [EXCLUDE]
IN TypeLib | TypeLibGUID | ProgID ]
[[PROTECTED | HIDDEN PropertyName1, PropertyName2 ...]
[[.]Object.]PropertyName = eExpression ...]
[ADD OBJECT [PROTECTED] ObjectName AS ClassName2 [NOINIT]
[WITH cPropertylist]]
[[PROTECTED | HIDDEN] FUNCTION | PROCEDURE Name[_ACCESS |_ASSIGN]
([cParamName [AS type] [@]])[AS type]
[HELPSTRING cHelpString] |
THIS_ACCESS(cMemberName)
[NODEFAULT]
cStatements [ENDFUNC | ENDPROC]]
[PEMName_COMATTRIB = nFlags | DIMENSION PEMName_COMATTRIB[5]
[PEMName_COMATTRIB[1] = nFlags
PEMName_COMATTRIB[2] = cHelpString
PEMName_COMATTRIB[3] = cPropertyCapitalization
PEMName_COMATTRIB[4] = cPropertyType
PEMName_COMATTRIB[5] = nOptionalParams]]
ENDDEFINE
Parameter
ClassName1
Gibt den Namen der zu erstellenden Klasse an.AS ParentClass
Gibt die übergeordnete Klasse an, auf der eine Klasse oder Unterklasse basiert. Die übergeordnete Klasse kann eine Visual FoxPro-Basisklasse, wie beispielsweise die Klasse "Form", oder eine benutzerdefinierte Klasse oder Unterklasse sein. In der folgenden Tabelle sind die Visual FoxPro-Basisklassen aufgelistet:Namen der Basisklassen
Wenn Sie Custom für ParentClass angeben, dann erstellt Visual FoxPro eine nicht-visuelle benutzerdefinierte Klasse*.*
Der folgende Beispielcode erstellt die Unterklasse
MyForm
, die auf der Formularbasisklasse basiert. Das Formular enthält eine Click-Methode, die beim Klicken aufMyForm
ein Dialogfeld anzeigt.DEFINE CLASS MyForm AS Form PROCEDURE Click = MESSAGEBOX('MyForm has been clicked!') ENDPROC ENDDEFINE
Wenn Sie Session für ParentClass angeben, dann erstellt Visual FoxPro eine nicht-visuelle benutzerdefinierte Klasse, die eine eigene, private Datensitzung verwaltet*.* Da das Sitzungsobjekt kein Container ist, ist die AddObject-Klausel nicht verfügbar, wenn Sie ParentClass für Session angeben. Die folgenden Session-Eigenschaften weisen bei Verwendung in einer privaten Datensitzung (in dieser und künftigen Versionen von Visual FoxPro) neue Standardeinstellungen auf:
- EXCLUSIVE = OFF
- TALK = OFF
- SAFETY = OFF
Wenn Sie OLEPUBLIC für eine Klasse angeben, für die für BaseClass die Einstellung Session festgelegt wurde, dann enthält die Typbibliothek, die für eine EXE oder DLL generiert wird, nur die benutzerdefinierten Eigenschaften und Methoden. Alle integrierten Eigenschaften, Methoden und Ereignisse der BaseClass-Sitzung werden von der Typbibliothek ausgeschlossen. Das Verhalten wird in dieser und künftigen Versionen von Visual FoxPro unterstützt.
OF ClassLibrary
Ermöglicht die Angabe der Klassenbibliothek für AS ParentClass, ohne dass explizit der Pfad zur Klassenbibliothek, die sie enthält, angegeben werden muss, wie z. B. bei SET CLASSLIB oder SET PROCEDURE. Bei ClassLibrary kann es sich um eine Klassenbibliothekdatei (VCX), Programmdatei (PRG) oder um eine kompilierte Programmdatei (FXP) handeln.Wenn beim Versuch, eine Instanz der Klasse zu erzeugen, die angegebene ClassLibrary nicht gefunden werden kann, tritt ein Fehler mit einer entsprechenden Meldung auf.
Die angegebene Einstellung für ClassLibrary kann einen relativen Pfad enthalten, wenn Visual FoxPro die Bibliothek über die normalen Suchpfade für Klassenbibliotheken finden kann.
Visual FoxPro fügt ClassLibrary beim Erstellen automatisch dem Projekt hinzu, wenn das Programm, das die Klasse enthält, zu dem Projekt gehört.
OLEPUBLIC
Gibt an, dass es sich bei der Klasse um einen benutzerdefinierten Automatisierungsserver handelt, auf den von einem Automationsclient zugegriffen werden kann.Wenn Sie ein Programm mit einer OLEPUBLIC-Klassendefinition zu einem Projekt hinzufügen, kann eine ausführbare Datei (EXE) oder eine Dynamic Link Library (DLL) mit der Klasse interaktiv im Projekt-Manager bzw. mit BUILD EXE, BUILD DLL oder BUILD MTDLL erstellt werden. Die EXE- oder DLL-Datei wird automatisch mit dem Betriebssystem registriert und für jeden Automatisierungsclient verfügbar.
Informationen zum Erstellen von benutzerdefinierten Automatisierungsservern finden Sie unter Erstellen von Automatisierungsservern.
[PROTECTED | HIDDEN PropertyName1, PropertyName2 ...][Object.]PropertyName = eExpression ... Erstellt eine Klassen- oder Unterklasseneigenschaft und weist der Eigenschaft einen Standardwert zu. Eigenschaften sind benannte Attribute der Klasse und definieren die Merkmale und das Verhalten der Klasse. Klassen und Unterklassen können mehrere Eigenschaften haben.
Mit = wird der Eigenschaft ein Wert zugewiesen. Im folgenden Beispiel werden eine benutzerdefinierte Klasse mit dem Namen
MyClass
und zwei Eigenschaften mit der Bezeichnung Name und Version erstellt. Die Eigenschaft Name wird mit einer leeren Zeichenfolge initialisiert, die Eigenschaft Version mit der Zeichenfolge 1.0.DEFINE CLASS MyClass AS Custom Name = '' Version = '1.0' ENDDEFINE
Der Zugriff auf eine Eigenschaft kann außerhalb der Klassen- oder Unterklassendefinition erfolgen, nachdem das Objekt mit CREATEOBJECT( ) erstellt wurde:
MyObject = CREATEOBJECT('MyClass')
Der Zugriff auf Eigenschaften erfolgt mittels der folgenden Syntax:
ObjectName.Property
Das .Object-Schlüsselwort zeigt Visual FoxPro an, dass der Wert der Eigenschaft beim Erstellen des ActiveX-Steuerelements angewendet werden soll.
Im folgenden Beispiel wird das ActiveX-Steuerelement Outline zu einem Formular hinzugefügt. Das Objekt-Schlüsselwort wird verwendet, um eine Eigenschaft für das Outline-Steuerelement vor dessen Erstellung anzugeben.
PUBLIC frmOLETest frmOLETest = CREATEOBJECT('Form') frmOLETest.Visible = .T. frmOLETest.ADDOBJECT('OCXTest', 'BlueOLEControl', ; 'MSOutl.Outline') frmOLETest.OCXTest.AddItem('Item One') frmOLETest.OCXTest.AddItem('Item Two') DEFINE CLASS BlueOLEControl AS OLEControl * Set a property of the ActiveX control .Object.Backcolor = 16776960 * Set properties of the OLE Container Control Visible = .T. Height = 100 Width = 200 ENDDEFINE
Geben Sie PROTECTED und eine Liste von Eigenschaftsnamen an, um den Zugriff auf und Änderungen an den Eigenschaften von außerhalb der Klassen- oder Unterklassendefinition zu verhindern. Innerhalb der Klassen- oder Unterklassendefinition können Methoden und Ereignisse weiterhin auf die geschützten Eigenschaften zugreifen.
Im folgenden Beispiel wird die Version-Eigenschaft geschützt, so dass außerhalb der Klassendefinition nicht auf die Eigenschaft zugegriffen und sie nicht geändert werden kann. Die Name-Eigenschaft wird dagegen nicht geschützt, so dass auf die Eigenschaft zugegriffen und sie geändert werden kann.
DEFINE CLASS MyClass AS Custom PROTECTED Version Name = '' Version = '1.0' ENDDEFINE
Geben Sie HIDDEN und eine Liste von Eigenschaftsnamen an, um den Zugriff auf und Änderungen an den Eigenschaften von außerhalb der Klassendefinition zu verhindern. Innerhalb der Klassendefinition können Methoden und Ereignisse weiterhin auf die versteckten Eigenschaften zugreifen. Während untergeordnete Klassen der Klassendefinition auf geschützte Eigenschaften zugreifen können, sind verborgene Eigenschaften nur von innerhalb der Klassendefinition aus zugreifbar.
Anmerkung Wenn Sie das Schlüsselwort HIDDEN nicht hinzunehmen, können Sie Unterklassen für die Access- und Assign-Methoden erstellen.
ADD OBJECT
Fügt aus einer Visual FoxPro-Basisklasse, einer benutzerdefinierten Klasse oder Unterklasse oder einem benutzerdefinierten ActiveX-Steuerelement ein Objekt zu einer Klassen- oder Unterklassendefinition hinzu.PROTECTED
Verhindert den Zugriff auf und Änderungen an den Objekteigenschaften von außerhalb der Klassen- oder Unterklassendefinition. Das Schlüsselwort PROTECTED muss direkt vor ObjectName stehen, andernfalls erstellt Visual FoxPro einen Syntaxfehler.ObjectName
Gibt den Namen des Objekts an und dient zum Ansprechen des Objekts aus der Klassen- oder Unterklassendefinition heraus, nachdem aus der Klassen- oder Unterklassendefinition ein Objekt erstellt wurde.AS ClassName2
Gibt den Namen der Klasse oder Unterklasse an, zu der das Objekt gehört, das Sie zur Klassendefinition hinzufügen. Mithilfe der folgenden Klassendefinition werden beispielsweise eine Befehlsschaltfläche aus der CommandButton-Basisklasse und ein Listenfeld aus der ListBox-Basisklasse hinzugefügt.DEFINE CLASS MyClass AS Custom ADD OBJECT CB1 AS CommandButton ADD OBJECT LIST1 AS ListBox ENDDEFINE
NOINIT
Gibt an, dass die Init-Methode eines Objekts beim Hinzufügen nicht ausgeführt wird.WITH cPropertyList
Gibt eine Liste von Eigenschaften und Eigenschaftswerten für das Objekt an, das Sie zur Klassen- oder Unterklassendefinition hinzufügen. In der folgenden Klassendefinition werden z. B. eine Klasse mit dem NamenMyClass
erstellt, eine Befehlsschaltfläche zur Klassendefinition hinzugefügt und die Eigenschaften Caption und BackColor für die Befehlsschaltfläche festgelegt.DEFINE CLASS MyClass AS CUSTOM ADD OBJECT CB1 AS CommandButton; WITH Caption = 'Cancel', BackColor = 2 ENDDEFINE
FUNCTION | PROCEDURE Name
| _ASSIGN] | THIS_ACCESS
Erstellt Ereignisse und Methoden für die Klasse oder Unterklasse. Ereignisse und Methoden werden als eine Gruppe von Funktionen oder Prozeduren erstellt.Sie können eine Ereignisfunktion oder -prozedur innerhalb einer Klassen- oder Unterklassendefinition erstellen, um auf ein Ereignis zu reagieren. Ein Ereignis ist eine Aktion, wie z. B. ein Mausklick, die von einem Objekt erkannt wird, das mit einer Klassen- oder Unterklassendefinition erstellt wurde. Weitere Informationen zur Verarbeitung von Ereignissen in Visual FoxPro finden Sie unter Grundlegendes zum Ereignismodell.
Ereignisse werden mithilfe der folgenden Syntax aufgerufen:
ObjectName.Event
Sie können ferner eine Methodenfunktion oder -prozedur innerhalb einer Klassen- oder Unterklassendefinition erstellen. Eine Methode ist eine Prozedur, die sich auf das mit der Klassen- oder Unterklassendefinition erstellte Objekt auswirkt. Methoden werden mithilfe der folgenden Syntax aufgerufen:
ObjectName.Method
Die Suffixe _ACCESS und _ASSIGN können an einen Prozedur- oder Funktionsnamen angehängt werden, um eine Access- oder Assign-Methode für eine Eigenschaft desselben Namens zu erzeugen. Der Code in einer Access-Methode wird immer dann ausgeführt, wenn die Eigenschaft abgefragt wird. Der Code in einer Assign-Methode wird immer dann ausgeführt, wenn Sie versuchen, den Wert der Eigenschaft zu verändern.
Darüber hinaus können Sie eine THIS_ACCESS-Prozedur oder -Funktion erstellen, die immer dann ausgeführt wird, wenn sich für ein Objektmitglied ein Wert ändert oder eine Abfrage durchgeführt wird.
Mit dem folgenden Code wird ein Objekt erstellt, dessen interne Prozeduren MyProperty_ACCESS und MyProperty_ASSIGN auf Abfragen (Access-Methode) und Änderungen von Eigenschaften (Assign-Methode) reagieren.
Beachten Sie die Verwendung einer LPARAMETERS-Anweisung zur Entgegennahme des an die Assign-Methode übergebenen Wertes. Im folgenden Beispiel wird außerdem das Erstellen von schreibgeschützten Eigenschaften gezeigt.
DEFINE CLASS MyClass AS Custom MyProperty = 100 && A user-defined property PROCEDURE MyProperty_ACCESS && Access method WAIT WINDOW 'This is the Access method'; + ' ' + PROGRAM( ) RETURN THIS.MyProperty ENDPROC PROCEDURE MyProperty_ASSIGN && Assign method LPARAMETERS tAssign && Required to accept value WAIT WINDOW 'This is the Assign method'; + ' ' + PROGRAM( ) ENDPROC ENDDEFINE
Mit dem folgenden Colde wird einer systemeigenen Visual FoxPro-Eigenschaft eine Assign-Methode hinzugefügt, die eine einfache Gültigkeitsprüfung für die Eigenschaft des Wertes durchführt.
DEFINE CLASS wird zur Erstellung einer Formularklasse mit dem Namen frmMyForm verwendet. Die Assign-Methode Left_ASSIGN, die von der PROCEDURE-Anweisung erstellt wird, wird bei jedem Versuch ausgeführt, der Eigenschaft Left des Formulars einen Wert zuzuweisen.
DEFINE CLASS frmMyForm AS Form PROCEDURE Left_ASSIGN && Assign method LPARAMETERS tAssign && Required to accept value DO CASE CASE tAssign < 0 && Left value negative WAIT WINDOW 'Value must be greater than 0' OTHERWISE && Left value not negative THIS.Left = tAssign ENDCASE ENDPROC ENDDEFINE
Wenn Sie versuchen, den Wert der Eigenschaft Left in einen negativen Wert zu ändern, wird von der Methode eine Meldung angezeigt und die Eigenschaft bleibt unverändert. Wenn Sie versuchen, den Wert der Eigenschaft Left auf einen positiven Wert zu setzen, wird die Eigenschaft auf den angegebenen Wert gesetzt.
Access- und Assign-Methoden werden für die systemeigenen Eigenschaften, Ereignisse oder Methoden von ActiveX-Steuerelementen nicht unterstützt. Allerdings werden Access- und Assign-Methoden für Eigenschaften, Ereignisse und Methoden für den OLE-Container in Visual FoxPro unterstützt, in dem das ActiveX-Steuerelement enthalten ist.
Weitere Informationen zum Erstellen von Zugriffs- und Zuweisungsmethoden mit DEFINE CLASS finden Sie unter Zugriffs- und Zuweisungsmethoden.
CParamName AS Type
Gibt den Parameter und den Parametertyp zurück, die an die Prozedur oder Funktion der definierten Klasse übergeben wurden. Mit Hilfe des @-Tokens können Sie festlegen, dass der Parameter als Verweis übergeben wird. Mit AS Type wird hier der Datentyp des benannten Parameters angegeben.Anmerkung Die AS Type-Klausel wird nur für IntelliSense- und Klassendefinitionsinformationen verwendet, die in einer Typbibliothek (OLEPUBLIC) gespeichert sind. Visual FoxPro erzwingt bei der Kompilierung oder Codeausführung nicht die Überprüfung des Typs. Die Verwendung festgelegter Typen wird auch für die gemeinsame Verwendung mit den Schnittstellenmethoden empfohlen, die von IMPLEMENTS angegeben werden.
Damit die Parameter und ihre Typen in der Typbibliothek angezeigt werden, müssen Sie statt LPARAMETERS die Inlineparametersyntax zum Deklarieren der Parameter verwenden: ex FUNCTION Publisher_ShowPrice(Bookid As Integer, Bookprice As String).
DEFINE CLASS f1 AS custom OLEPUBLIC PROTECTED myprop FUNCTION mymethod (parm1 AS integer @, parm2 AS string) ; AS integer RETURN parm1 ENDFUNC ENDDEFINE
Verwenden Sie AS VOID für den Rückgabewert einer Methode, wenn die Methode keinen Wert zurückgibt (unidirektionale Prozedur). Dieses Verfahren ist für bestimmte Technologien, wie Microsoft COM+ Services Queued Components, erforderlich.
Visual FoxPro konvertiert automatisch Werte von AS Type, wenn diese von anderen COM-Servern verwendet werden. Visual FoxPro zeigt gemäß der folgenden Tabelle auch Typinformationen für COM-Server in IntelliSense QuickInfo-Tipps an:
In VFP definierter Typ COM-Typbibliothek-Konvertierung IntelliSense Quick Info BinaryMemo VARIANT — Boolesch VARIANT_BOOL Logisch Byte unsigned char Zahl Zeichen VARIANT — Währung CURRENCY Währung Datum DATE Datum DatumZeit DATE Datum Dezimalst. wchar_t Zahl Double double Zahl Gleitkomma VARIANT — Integer (Ganzzahl) long Zahl Logisch VARIANT_BOOL Logisch Lang long Zahl Memo VARIANT — Zahl double Zahl Objekt IDispatch* Objekt Kurz long Zahl Einfach single Zahl Zeichen BSTR Zeichen Variant VARIANT — Ungültig void VOID HELPSTRING cHelpString
Gibt die Zeichenfolge an, die der Typbibliothek hinzugefügt wird, und als Beschreibung der Funktionsweise einer Methode in einem Objektkatalog oder in IntelliSense angezeigt werden kann.IMPLEMENTS InterfaceName
Gibt an, dass diese Klassendefinition die Schnittstelle (Klassendefinition) einer anderen COM-Komponente übernimmt. Eine Klasse kann mehrere IMPLEMENTS-Anweisungen enthalten.DEFINE CLASS myClass AS custom olepublic IMPLEMENTSPublisher IN"mybooksore.dll" PROCEDURE Publisher_ShowPrice(cGetID AS Long) AS Short ENDPROC ENDDEFINE
EXCLUDE
Schließt die implementierte Schnittstelle aus der Typbibliothek aus.IN TypeLib | TypeLibGUID | ProgID
Gibt den Speicherort der Schnittstelle an.Sie können das COM-Objekt mit TypeLib, der Typbibliothek der COM-Objekts TypeLibGUID, dem GUID der Typbibliothek oder durch Angabe des ProgID des Programms, das das COM-Objekt initialisiert, angeben.
DEFINE CLASS MyBooks AS Custom olepublic IMPLEMENTS Publisher IN "c:\sample4\Publisher.VB\BooksPub.dll" FUNCTION Publisher_ShowPrice(Bookid As Integer, Bookprice As String) ACTIVATE SCREEN ? TRANS(Bookid)+"-"+TRANS(Bookprice),Sys(1011),Sys(1016) ENDFUNC ENDDEFINE
Wenn Sie die Option TypeLibGUID verwenden, übergeben Sie die Option mit der Haupt- und Unterversionskennzeichnung, wie im folgenden Beispiel gezeigt:
IMPLEMENTS IDict1 IN {04BCEF93-7A77-11D0-9AED-CE3E5F000000}#1.0
Die Verwendung der Option Typelib wird für die Angabe der Typbibliothek eher nicht empfohlen, da dafür ein Dateiname erforderlich ist, dessen Pfad auf unterschiedlichen Computern verschieden sein kann. Wenn die DLL vertrieben wird, erwägen Sie die Verwendung von TypeLibGUID oder ProgID.
Beim Implementieren einer Schnittstelle müssen Sie in die Klassendefinition alle Methoden dieser Schnittstelle aufnehmen. Verwenden Sie den Schnittstellennamen als Präfix für den Methodennamen (z. B. Publisher_ShowPrice). Damit wird auch ein Konflikt zwischen zwei Schnittstellen mit gleichnamigen Methoden vermieden, da in einer Klassendefinition mehrere IMPLEMENTS-Anweisungen vorhanden sein können. Sie müssen den Schnittstellennamen genau so angeben, wie er in der Typbibliothek erscheint. Bei Schnittstellennamen, die mit einem Unterstrich (_) beginnen, wie z. B. die ADODB Recordset-Klasse, ist die Angabe des Unterstrichs optional.
Da Eigenschaften im Wesentlichen als zwei Methoden innerhalb einer Typbibliothek gespeichert werden (put und get), muss die Klassendefinition diese beiden Methoden umfassen.
Tipp Mit Hilfe des Objektkatalogs in Visual FoxPro können Sie eine Schnittstellendefinition per Drag & Drop in den Code übernehmen, um Zeit zu sparen. Die IMPLEMENTS-Anweisung wird automatisch zusammen mit allen implementierten Methoden und den richtigen Parametersignaturen geschrieben.
Bestimmte Technologien, z. B. Microsoft COM+-Ereignisse, erfordern, dass die COM-Komponente die Schnittstelle der Ereignisklasse implementiert, an die sie gebunden sind.
NODEFAULT
Verhindert, dass Visual FoxPro die für Visual FoxPro-Ereignisse und Methoden definierte Standardereignis- bzw. Standardmethodenverarbeitung durchführt. Wenn z. B. das KeyPress-Ereignis auftritt und NODEFAULT in der KeyPress-Prozedur oder -Funktion angegeben wird, schreibt Visual FoxPro den Tastendruck nicht in den Visual FoxPro-Tastaturpuffer. Dadurch kann eine KeyPress-Prozedur erstellt werden, mit deren Hilfe getestet werden kann, welche Taste gedrückt wird, ehe die Taste an den Tastaturpuffer gesendet wird.NODEFAULT kann an einer beliebigen Stelle innerhalb der Ereignis- oder Methodenprozedur abgelegt werden. Beachten Sie bitte, dass NODEFAULT auch im Formular-Designer innerhalb einer Ereignis- oder Methodenprozedur eingefügt werden kann.
cStatements
[ENDFUNC | ENDPROC]]
...
ENDDEFINEcStatements sind die Visual FoxPro-Befehle, die ausgeführt werden, wenn ein Ereignis oder eine Methode ausgeführt wird.
Ereignis- und Methodenfunktionen und -prozeduren können Werte entgegennehmen, indem Sie eine PARAMETERS- oder LPARAMETERS-Anweisung als die erste ausführbare Zeile der Funktion oder Prozedur angeben.
Im Gegensatz zu den meisten Visual FoxPro-Schlüsselwörtern können ENDFUNC und ENDPROC nicht abgekürzt werden. Dies verhindert Konflikte mit den Schlüsselwörtern ENDFOR und ENDPRINTJOB.
Im folgenden Beispiel wird gezeigt, wie Sie eine Ereignisprozedur erstellen können, die eine Meldung ausgibt, sobald die zugehörige Befehlsschaltfläche angeklickt wird. Diese Ereignisprozedur setzt das standardmäßige Befehlsschaltflächen-Click-Ereignis außer Kraft.
DEFINE CLASS MyClass AS Custom ADD OBJECT MyButton AS CommandButton ADD OBJECT MyList AS ListBox PROCEDURE MyButton.Click = MESSAGEBOX('This is my click event procedure') ENDPROC ENDDEFINE
PEMName_COMATTRIB
Erstellt ein Array, das die Typbibliothekattribute für die PEMName-Eigenschaft oder -Methode angibt. Dieses Feature bezieht sich nur auf OLEPUBLIC-Klassen. Verwenden Sie diese Option, um zusätzliche Informationen zu der Eigenschaft oder Methode anzugeben, die in die Typbibliothek geschrieben werden soll, wie z. B. eine Beschreibung oder ein schreibgeschütztes Attribut.Bei PEMName_COMATTRIB kann es sich entweder um eine Eigenschaft oder um ein Eigenschaftsarray handeln. Wird eine Eigenschaft angegeben, dann wird der Wert von nFlags (das erste Element des Arrays) zugewiesen. Visual FoxPro generiert für ungültige Werte oder Typen im Array PEMName_COMATTRIB einen Fehler. Für leere Elemente werden die Standardwerte verwendet.
COMATTRIB-Element Beschreibung Typ 1 Attributkennzeichnen Zahl 2 Hilfetext Zeichen 3 Großschreibung Zeichen 4 Typ einer Eigenschaft Zeichen 5 Anzahl der Parameter Wenn Sie weniger als die tatsächliche Anzahl von Parametern angeben, ist die Differenz zwischen der deklarierten und der tatsächlichen Anzahl optional.
Zahl
Anmerkung Im Gegensatz zu den Methoden Access und Assign werden die hier beschriebenen _COMATTRIB-Eigenschaften automatisch als versteckt gekennzeichnet. In Visual FoxPro kann nicht darauf zugegriffen werden. Sie dienen ausschließlich der Verwendung von Visual FoxPro beim Erstellen des Builds, wenn eine COM-Typbibliothek geschrieben wird.
nFlags
Gibt eine Gruppe von Attributkennzeichnen für PEMName an, wie sie in der Typbibliothek erscheint. In der folgenden Tabelle werden die gültigen Werte beschrieben.Wert für nFlag #DEFINE Beschreibung 0x1 (1) COMATTRIB_RESTRICTED Auf die Eigenschaft/Methode sollte von Makrosprachen aus nicht zugegriffen werden können. Dieses Kennzeichen ist für Funktionen auf Systemebene gedacht oder für Funktionen, die von Typkatalogen nicht angezeigt werden sollen. 0x40 (64) COMATTRIB_HIDDEN Die Eigenschaft/Methode sollte Benutzern nicht angezeigt werden, obwohl sie vorhanden und bindbar ist. 0x400 (1024) COMATTRIB_NONBROWSABLE Die Eigenschaft/Methode wird in einem Objektkatalog angezeigt, nicht jedoch in einem Eigenschaftenkatalog. Sie können jeden der folgenden Werte als gültigen Wert verwenden. Werden beide Eigenschaften verwendet, ist das so, als würde keine verwendet.
#DEFINE Value Beschreibung COMATTRIB_READONLY 0x100000 Diese Eigenschaft ist schreibgeschützt (gilt nur für Properties). Entspricht PropertyGet. COMATTRIB_WRITEONLY 0x200000 Die Eigenschaft ist lesegeschützt (gilt nur für Properties). Entspricht PropertyLet. cHelpString
Gibt einen Zeichenfolgenwert an, der in der Typbibliothek für die PEMName-Eigenschaft gespeichert werden soll*.* Verwenden Sie für Methoden die HELPSTRING cHelpString-Klausel.cPropertyCapitalization
Gibt den Eigenschaftennamen als Zeichenfolgenwert an, wie er in der Typbibliothek erscheinen soll*.* Die Groß-/Kleinschreibung wird beibehalten. Ohne diese Einstellung schreibt Visual FoxPro die Eigenschaft nur in Großschreibung in die Typbibliothek.cPropertyType
Dieser Zeichenfolgenwert ist der Eigenschaftendatentyp, wie er in der Typbibliothek erscheint (entspricht AS Type-Klausel). Gilt nur für Eigenschaften.nOptionalParms
Gibt die Anzahl optionaler Parameter in einer Methode an. Wenn dieser Wert für eine Methode mit 5 Parametern 2 lautet, sind die letzten 3 Parameter optional. Bei Clients mit später Bindung lautet der Standardwert für optionale Parameter weiterhin .F., und PCOUNT() spiegelt die tatsächliche Anzahl der übergebenen Parametern wahrheitsgemäß wider. Bei Clients mit früher Bindung werden die Standardwerte für optionale Parameter stets auf "" festgelegt, und PCOUNT() entspricht immer der Gesamtzahl von Parametern für die Methode (nicht der übergebenen Anzahl). Gilt nur für Methoden.**Anmerkung **COMATTRIB_RESRICTED bedeutet, dass makroorientierte Programmierer keinen Zugriff auf diesen Member haben. Diese Member werden in der Regel von Tools, wie z. B. Visual Basic, als _HIDDEN behandelt, wobei der Hauptunterschied darin besteht, dass Code nicht an diese Member gebunden werden kann. COMATTRIB_HIDDEN bedeutet, dass die Eigenschaft nie in Objektkatalogen, Eigenschaftenkatalogen usw. angezeigt werden soll. Diese Funktion ist nützlich, um Elemente aus einem Objektmodell zu entfernen. Über den Code kann eine Bindung zum Member hergestellt werden, der Benutzer kann jedoch nicht sehen, dass dieser Member vorhanden ist. COMATTRIB _NONBROWSABLE bedeutet, dass die Eigenschaft nicht in einem Eigenschaftenkatalog angezeigt werden soll. Es wird in den Fällen verwendet, in denen ein Fehler auftritt, wenn die Eigenschaft in einem Eigenschaftenkatalog angezeigt wird. Für frühes und spätes Binden gelten unterschiedliche Zugriffsbeschränkungen. Clients mit früher Bindung können nicht auf eine schreibgeschützte Eigenschaft schreiben und nicht eine lesegeschütze Eigenschaft lesen, weil kein Eintrag in vtable vorhanden ist. Clients mit später Bindung können für ein lese- oder schreibgeschützes PEMName auf PropertyGet zugreifen.
Hinweise
Benutzerdefinierte Klassen sind eine Reihe von Befehlen, die, ähnlich wie eine Prozedur, in eine Programmdatei gestellt werden. Die Befehle, die der Klassen- oder Unterklassendefinition folgen, definieren die Eigenschaften, Ereignisse und Methoden für die Klasse oder Unterklasse.
Anmerkung Sie dürfen in einer Programmdatei keinen normalen, ausführbaren Programmcode hinter Prozeduren und Funktionen stellen. Hinter dem ersten DEFINE CLASS-, PROCEDURE- oder FUNCTION-Befehl innerhalb der Datei dürfen nur Klassendefinitionen, Prozeduren und benutzerdefinierte Funktionen stehen.
Mit DEFINE CLASS erstellte Klassen- und Unterklassendefinitionen können nicht in strukturierte Programmierbefehle wie IF ... ENDIF oder DO CASE ... ENDCASE eingefügt werden. Auch in Schleifen wie DO WHILE ... ENDDO oder FOR ... ENDFOR können sie nicht aufgenommen werden.
Wenn Sie aus einer Klassen- oder Unterklassendefinition ein Objekt erstellen möchten, geben Sie CREATEOBJECT( ) mit dem Namen der Klasse oder Unterklasse ein.
Wenn Sie die IMPLEMENTS-Klausel verwenden, müssen Sie alle Methoden der angegebenen Schnittstelle mit aufnehmen. Visual FoxPro erzwingt keine Eingaben mit festgelegten Datentypen, deshalb müssen Sie sicherstellen, dass Sie gültige Datentypen verwenden. Da Eigenschaften in Form von zwei Methoden (PUT und GET) gespeichert werden, muss die Klassendefinition beide Methoden umfassen.
Access- und Assign-Methoden sind standardmäßig geschützt. Sie können von außerhalb der Klasse, in der die Access- oder Assign-Methode erstellt worden ist, weder auf eine Access- oder Assign-Methode zugreifen, noch Änderungen an derselben vornehmen.
Sie können sich den Code für Access- und Assign-Methoden im Testfenster des Debugger-Fensters ansehen. Allerdings lassen sich Access- und Assign-Methoden weder vom Überwachungsfenster noch vom Fenster Aktuelle Variablen des Debugger-Fensters aus ausführen.
Arrays werden an Access- und Assign-Methoden auf dieselbe Weise übergeben wie bei standardmäßigen Visual FoxPro-Prozeduren.
Wenn Sie SET UDFPARMS TO REFERENCE setzen oder dem Array-Namen einen @ voranstellen, wird das gesamte Array an eine Access- oder Assign-Methode übergeben. Das erste Element des Arrays wird als Wert übergeben, wenn Sie SET UDFPARMS TO VALUE eingeben oder den Arraynamen in runde Klammern setzen. Arrayelemente werden immer als Wert übergeben. Weitere Informationen zur Übergabe von Werten und Arrays finden Sie unter SET UDFPARMS.
Beispiel
Im folgenden Beispiel werden mittels DEFINE CLASS und CREATEOBJECT( ) aus der Visual FoxPro-Basisklasse Form zwei angepasste Klassen namens FormChild und FormGrandChild erstellt. Mit ACLASS( ) wird ein Array mit Namen gaNewarray
erstellt, das die Klassennamen enthält, die anschließend angezeigt werden.
CLEAR
frmMyForm = CREATEOBJECT("FormGrandChild")
FOR nCount = 1 TO ACLASS(gaNewarray, frmMyForm) && Creates an array
? gaNewarray(nCount) && Displays the names of the classes
ENDFOR
RELEASE frmMyForm
DEFINE CLASS FormChild AS FORM
ENDDEFINE
DEFINE CLASS FormGrandChild AS FormChild
ENDDEFINE
Im folgenden Codebeispiel wird ein Array mit Typbibliotheksattributen mit Hilfe des _COMATTRIB-Parameters definiert.
#INCLUDE foxpro.h
DEFINE CLASS myclass AS CUSTOM olepublic
* Define property
MyProperty = 5.2
* Set the COM attributes for MyProperty
DIMENSION MyProperty_COMATTRIB[4]
myproperty_COMATTRIB[1] = COMATTRIB_READONLY
myproperty_COMATTRIB[2] = "Helptext displayed in object browser"
myproperty_COMATTRIB[3] = "MyProperty"&& Proper capitalization.
myproperty_COMATTRIB[4] = "Float"&& Data type
ENDDEFINE
Soll nur das Element nFlags festgelegt werden, brauchen Sie die _COMATTRIB-Eigenschaft nicht als Array zu dimensionieren.
#INCLUDE foxpro.h
DEFINE CLASS myclass AS SESSION olepublic
* Define property
MyProperty = "Test"
* Only set the nFlags attribute for MyProperty
myproperty_comattrib = COMATTRIB_READONLY
ENDDEFINE
Siehe auch
:: Geltungsbereich-Auflösungs-Operator | ADD CLASS | _BROWSER | CREATE CLASS | CREATE CLASSLIB | CREATEOBJECT( ) | DODEFAULT( )-Funktion | EVENTHANDLER( ) | GETOBJECT( ) | MODIFY CLASS | Objektkatalog | RELEASE CLASSLIB | Sitzungsobjekt | SET CLASSLIB | WITH ... ENDWITH