Freigeben über


Prozeduren und benutzerdefinierte Funktionen

Prozeduren und Funktionen ermöglichen es Ihnen, häufig verwendeten Code an einem einzigen Ort zu speichern und ihn in der Anwendung jedes Mal aufzurufen, wenn er benötigt wird. Dadurch wird der Code leichter zu lesen und zu verwalten, da Sie Änderungen nur einmal in der Prozedur und nicht mehrmals im Programm vornehmen müssen.

In Visual FoxPro haben Prozeduren folgende Form:

PROCEDURE myproc
  * This is a comment, but it could be executable code
ENDPROC

Herkömmlicherweise enthalten Prozeduren Code, mit dem eine Operation ausgeführt wird, und Funktionen berechnen mit Hilfe einiger Operationen einen Wert und geben ihn zurück. In Visual FoxPro sind Funktionen Prozeduren sehr ähnlich:

FUNCTION myfunc
  * This is a comment, but it could be executable code
ENDFUNC

Sie können Prozeduren und Funktionen in einer eigenen Programmdatei oder am Ende einer Programmdatei zusammen mit dem "normalen" Programmcode speichern. Sie dürfen allerdings in einer Programmdatei keinen normalen, ausführbaren Programmcode hinter Prozeduren und Funktionen setzen.

Wenn Sie Prozeduren und Funktionen in eine eigene Programmdatei schreiben, können Sie diese Prozeduren und Funktionen im Programm mit Hilfe des Befehls SET PROCEDURE TO zur Verfügung stellen. Geben Sie z. B. für die Datei FUNPROC.PRG im Befehlsfenster diesen Befehl ein:

SET PROCEDURE TO funproc.prg

Aufrufen einer Prozedur oder Funktion

Es gibt zwei Möglichkeiten, innerhalb eines Programms eine Prozedur oder Funktion aufzurufen:

  • Sie können den Befehl DO verwenden. Beispiel:

    DO myproc
    

    - Oder -

  • Sie setzen ein Paar runde Klammern hinter den Funktionsnamen. Beispiel:

    myfunc( )
    

Jede dieser Methoden kann erweitert werden, indem Werte von der Prozedur oder Funktion zurückgegeben oder an diese übergeben werden.

Übergeben von Werten an eine Prozedur oder Funktion

Wenn Sie Werte an Prozeduren oder Funktionen übergeben möchten, geben Sie Parameter an. Die folgende Prozedur arbeitet z. B. mit einem einzelnen Parameter:

PROCEDURE myproc( cString )
   * The following line displays a message
   MESSAGEBOX ("myproc" + cString)
ENDPROC

Anmerkung   Wenn Sie die Parameter einer Prozedur oder Funktion in Klammern angeben, wie z. B. in PROCEDURE myproc(cString), hat der Parameter einen lokalen Gültigkeitsbereich; er gilt also nur für die jeweilige Prozedur oder Funktion. Sie können eine Funktion oder Prozedur auch mit LPARAMETERS in die Lage versetzen, Parameter mit lokalem Gültigkeitsbereich entgegenzunehmen.

Die Funktionsweise von Parametern in einer Funktion ist identisch. Um einen Wert als Parameter an diese Prozedur oder an eine Funktion zu übergeben, können Sie eine Zeichenfolge oder eine Variable verwenden, die eine Zeichenfolge enthält. Dies zeigt die nachstehende Tabelle.

Übergeben von Parametern

Code Kommentar
DO myproc WITH cTestString
DO myproc WITH "test string"
Ruft eine Prozedur auf und übergibt eine Literalzeichenfolge oder eine Zeichenvariable.
myfunc("test string")
myfunc( cTestString )
Ruft eine Funktion auf und übergibt die Kopie einer Zeichenvariablen oder einer Literalzeichenfolge.

Anmerkung   Wenn Sie eine Prozedur oder Funktion ohne den Befehl DO aufrufen, steuert die UDFPARMS-Einstellung, wie die Parameter übergeben werden. Standardmäßig ist UDFPARMS auf VALUE festgelegt, so dass Kopien des Parameters übergeben werden. Verwenden Sie jedoch DO, wird der tatsächliche Parameter verwendet (der Parameter wird als Verweis übergeben), und alle Änderungen innerhalb der Prozedur oder Funktion werden in den Originaldaten widergespiegelt, ungeachtet der Einstellung von UDFPARMS.

Sie können mehrere Werte an eine Prozedur oder Funktion übergeben, wenn Sie diese Werte durch Kommas voneinander trennen. An die folgende Prozedur müssen z. B. drei Parameter übergeben werden: ein Datum, eine Zeichenfolge und eine Zahl.

PROCEDURE myproc( dDate, cString, nTimesToPrint )
   FOR nCnt = 1 to nTimesToPrint
      ? DTOC(dDate) + " " + cString + " " + STR(nCnt)
   ENDFOR
ENDPROC

Diese Prozedur könnten Sie z. B. mit der folgenden Codezeile aufrufen:

DO myproc WITH DATE(), "Hello World", 10

Zurückgeben von Werten von einer Funktion

Der Standardrückgabewert ist Wahr (.T.), aber Sie können mit dem Befehl RETURN jeden beliebigen Wert zurückgeben lassen. Die folgende Funktion gibt z. B. ein Datum zurück, das zwei Wochen hinter dem Datum liegt, das der Funktion als Parameter übergeben wurde.

FUNCTION plus2weeks
PARAMETERS dDate
   RETURN dDate + 14
ENDFUNC

Die folgende Codezeile speichert den von der Funktion zurückgegebenen Wert in einer Variablen:

dDeadLine = plus2weeks(DATE())

In der folgenden Tabelle sind die Möglichkeiten aufgeführt, von einer Funktion zurückgegebene Werte zu speichern oder anzuzeigen.

Bearbeiten von Rückgabewerten

Code Kommentar
var = myfunc( )
Speichert den Rückgabewert einer Funktion in einer Variablen.
? myfunc( )
Zeigt den von der Funktion zurückgegebenen Wert im aktiven Ausgabefenster an.

Überprüfen von Parametern in einer Prozedur oder Funktion

Es empfiehlt sich, zu überprüfen, ob die Parameter, die Sie an Prozeduren und Funktionen übergeben, diejenigen sind, die erwartet werden. Mit Hilfe der Funktionen TYPE( ) und PARAMETERS( ) können Sie den Typ und die Anzahl der Parameter überprüfen, die an die Prozedur oder Funktion übergeben werden.

In dem Beispiel im vorherigen Abschnitt muss z. B. ein Parameter vom Typ Datum übergeben werden. Sie können mit der TYPE( )-Funktion sicherstellen, dass der Funktion ein Parameter des richtigen Typs übergeben wird.

FUNCTION plus2weeks( dDate )
   IF TYPE("dDate") = "D"
      RETURN dDate + 14
   ELSE
      MESSAGEBOX( "You must pass a date!" )
      RETURN { - - }      && Return an empty date
   ENDIF
ENDFUNC

Wenn an eine Prozedur mehr Parameter übergeben werden, als sie erwartet, zeigt Visual FoxPro eine Fehlermeldung an. Wenn Sie beispielsweise eine Prozedur, die zwei Parameter erwartet, mit drei Parametern aufrufen, erhalten Sie eine Fehlermeldung. Werden jedoch weniger Parameter an eine Prozedur übergeben, als sie erwartet, werden die überzähligen Parameter mit dem Wert Falsch (.F.) initialisiert. Da es keine Möglichkeit gibt, festzustellen, ob der letzte Parameter auf den Wert Falsch (.F.) festgelegt oder nicht angegeben wurde, können Sie mit der folgenden Prozedur sicherstellen, dass die richtige Anzahl an Parametern übergeben wurde:

PROCEDURE SaveValue( cStoreTo, cNewVal, lIsInTable )
   IF PARAMETERS( ) < 3
      MESSAGEBOX( "Too few parameters passed." )
      RETURN .F.
   ENDIF
   IF lIsInTable
      REPLACE (cStoreTo) WITH (cNewVal)
   ELSE
      &cStoreTo = cNewVal
   ENDIF
   RETURN .T.
ENDPROC

Umwandeln des Programms NUMONLY in eine Funktion

Das Beispielprogramm NUMONLY.PRG, das im Abschnitt Erstellen eines kleinen Programms erläutert wurde, kann hinsichtlich seiner Stabilität und Einsatzfähigkeit verbessert werden, indem Sie aus dem Teil des Programms, der die nichtnumerischen Zeichen aus einer Zeichenfolge entfernt, eine Funktion erstellen.

Beispielprozedur zur Rückgabe numerischer Zeichen aus einer Zeichenfolge

Code Kommentar
FUNCTION NumbersOnly( cMixedVal )
Anfang der Funktion, die eine aus Zeichen bestehende Zeichenfolge akzeptiert.
  cNumOnly = ""
  FOR nCnt = 1 TO LEN(cMixedVal)
   cCharacter = ;
  SUBSTR(cMixedVal, nCnt, 1)
    IF ISDIGIT(cCharacter)
       cNumOnly = ;
   cNumOnly + cCharacter
    ENDIF
   ENDFOR
Erstellt eine Zeichenfolge, in der sich nur noch die numerischen Zeichen der Originalzeichenfolge befinden.
RETURN cNumOnly
Gibt die Zeichenfolge zurück, die nur aus numerischen Zeichen besteht.
ENDFUNC
Ende der Funktion.

Sie können diesen Code in einer Vielzahl von Situationen verwenden; außerdem ist das Programm mit Hilfe der Funktion einfacher zu lesen:

SCAN
   REPLACE FieldName WITH NumbersOnly(FieldName)
ENDSCAN

Oder noch einfacher:

REPLACE ALL FieldName WITH NumbersOnly(FieldName)

Siehe auch

Erstellen eines kleinen Programms | Zeichenfunktionen | Grundbegriffe des Programmierens | Erstellen von Programmen im Vergleich zur manuellen Eingabe | Erstellen von Programmen | TYPE( ) | PARAMETERS( ) | RETURN