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

    ActiveDoc-Objekt ProjectHook
    Kontrollkästchen-Steuerelement (Checkbox) Bezeichnungs-Steuerelement (Label)
    Spaltenobjekt Line
    Kombinationsfeld-Steuerelement (ComboBox) Listenfeld-Steuerelement (ListBox)
    Befehlsschaltfläche-Steuerelement (CommandButton) OLE-Steuerelement
    Schaltflächengruppe-Steuerelement Gebundenes OLE-Steuerelement
    Container-Objekt Optionsfeld-Steuerelement (OptionButton)
    Control-Objekt Optionsgruppen-Steuerelement (OptionGroup)
    Cursor Seitenobjekt (Page)
    Custom-Objekt PageFrame-Steuerelement
    DataEnvironment Beziehung
    Bearbeitungsfeld-Steuerelement Zwischenraum-Objekt
    Formularobjekt Sitzungsobjekt |
    Formularsatz-Objekt (FormSet) Drehfeld-Steuerelement (Spinner)
    Datenraster-Steuerelement (Grid) Textfeld-Steuerelement (TextBox)
    Kopfzeile Zeitgeber-Steuerelement
    Hyperlink Symbolleisten-Objekt
    Bild-Steuerelement  

    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 auf MyForm 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 Namen MyClass 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
          IMPLEMENTS Publisher 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]]
    ...
    ENDDEFINE

    cStatements 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