EXIT PROCEDURE
Declara un procedimiento de clausura
─────────────────────────────────────────────────────────────────────────
Sintaxis
EXIT PROCEDURE <idProcedimiento>
[FIELD <lista idCampo> [IN <idAlias>]]
[LOCAL <identificador> [[:= <inicializador>]]]
[MEMVAR <lista identificador>]
.
. <sentencias ejecutables>
.
[RETURN]
Argumentos
EXIT PROCEDURE declara un procedimiento que se ejecuta en la
terminación del programa.
<idProcedimiento> es el nombre del procedimiento de clausura que se
va a declarar. Los nombres de procedimientos de clausura pueden tener
cualquier longitud, pero sólo son significativos los primeros 10
caracteres. Los nombres no deben comenzar con un signo de subrayado,
pero pueden contener cualquier combinación de caracteres, números o
signos de subrayado.
Descripción
La sentencia EXIT PROCEDURE declara un procedimiento que se ejecutará
cuando finalice el programa. Los procedimientos de clausura se llaman
después de que se haya completado la última sentencia ejecutable en una
aplicación de CA-Clipper. Las sentencias EXIT PROCEDURE pueden
utilizarse para ejecutar tareas de mantenimiento habituales, como por
ejemplo, guardar los parámetros de configuración en un fichero, cerrar
un fichero de registro o concluir una sesión de comunicaciones.
La visibilidad de los procedimientos de clausura está limitada al
sistema; por lo tanto, no es posible llamar a un procedimiento de
clausura desde un procedimiento o función definido por el usuario. Los
procedimientos de clausura no reciben parámetros.
Una vez que se ha completado la última sentencia ejecutable, el control
pasa de un procedimiento de clausura al siguiente hasta que se ha
llamado a todos los procedimientos de la lista de clausura. El control
pasa seguidamente al sistema operativo.
fuente (.prg). Una vez declarado, se hace referencia a las sentencias
EXIT PROCEDURE con este identificador de módulo. Una aplicación puede
utilizar cualquier número de procedimientos de clausura, solicitando de
forma explícita mediante REQUEST sus identificadores de módulo.
Los procedimientos de clausura solicitados para una aplicación se
mencionan, de forma colectiva, como la lista de clausura. No existe un
orden de ejecución obligatorio de procedimientos en la lista de
clausura; sin embargo, si un procedimiento de clausura se declara en el
mismo módulo fuente (.prg) que la rutina principal o raíz, éste será el
primer procedimiento de clausura llamado.
La terminación de una aplicación de CA-Clipper dada puede atribuirse a
alguna de las siguientes causas:
■ RETURN desde la rutina principal o raíz
■ el mandato QUIT
■ la ejecución de un BREAK sin incluir BEGIN SEQUENCE...END
La sentencia ANNOUNCE declara un identificador de módulo para un módulo
■ error irrecuperable
No se puede garantizar la ejecución de un procedimiento de clausura
cuando el sistema detecta un error irrecuperable. Si se ha producido un
error durante un procedimiento de clausura, el sistema vuelve al DOS.
Los procedimientos de clausura pendientes no se llaman.
Ejemplos
■ En este ejemplo se ilustra la construcción de un mecanismo de
temporización simple, utilizando INIT y EXIT PROCEDURE:
// imprime la cantidad de tiempo necesario para,
// leer, ordenar y mostrar una lista de nombres
// de ficheros.
ANNOUNCE MiSistema
STATIC nInicio
PROCEDURE Main()
AEVAL( ASORT( DIRECTORY( "*.*" ) ),;
{ | aInfoFichero | QOUT( aInfoFichero[ 1 ] ) } )
RETURN
INIT PROCEDURE MiInicio()
nInicio := SECONDS()
RETURN
EXIT PROCEDURE MiClausura()
?
? "Tiempo transcurrido: "
?? SECONDS() - nInicio
RETURN
EXIT PROCEDURE
Declara un procedimiento de clausura
─────────────────────────────────────────────────────────────────────────
Sintaxis
EXIT PROCEDURE <idProcedimiento>
[FIELD <lista idCampo> [IN <idAlias>]]
[LOCAL <identificador> [[:= <inicializador>]]]
[MEMVAR <lista identificador>]
.
. <sentencias ejecutables>
.
[RETURN]
Argumentos
EXIT PROCEDURE declara un procedimiento que se ejecuta en la
terminación del programa.
<idProcedimiento> es el nombre del procedimiento de clausura que se
va a declarar. Los nombres de procedimientos de clausura pueden tener
cualquier longitud, pero sólo son significativos los primeros 10
caracteres. Los nombres no deben comenzar con un signo de subrayado,
pero pueden contener cualquier combinación de caracteres, números o
signos de subrayado.
Descripción
La sentencia EXIT PROCEDURE declara un procedimiento que se ejecutará
cuando finalice el programa. Los procedimientos de clausura se llaman
después de que se haya completado la última sentencia ejecutable en una
aplicación de CA-Clipper. Las sentencias EXIT PROCEDURE pueden
utilizarse para ejecutar tareas de mantenimiento habituales, como por
ejemplo, guardar los parámetros de configuración en un fichero, cerrar
un fichero de registro o concluir una sesión de comunicaciones.
La visibilidad de los procedimientos de clausura está limitada al
sistema; por lo tanto, no es posible llamar a un procedimiento de
clausura desde un procedimiento o función definido por el usuario. Los
procedimientos de clausura no reciben parámetros.
Una vez que se ha completado la última sentencia ejecutable, el control
pasa de un procedimiento de clausura al siguiente hasta que se ha
llamado a todos los procedimientos de la lista de clausura. El control
pasa seguidamente al sistema operativo.
fuente (.prg). Una vez declarado, se hace referencia a las sentencias
EXIT PROCEDURE con este identificador de módulo. Una aplicación puede
utilizar cualquier número de procedimientos de clausura, solicitando de
forma explícita mediante REQUEST sus identificadores de módulo.
Los procedimientos de clausura solicitados para una aplicación se
mencionan, de forma colectiva, como la lista de clausura. No existe un
orden de ejecución obligatorio de procedimientos en la lista de
clausura; sin embargo, si un procedimiento de clausura se declara en el
mismo módulo fuente (.prg) que la rutina principal o raíz, éste será el
primer procedimiento de clausura llamado.
La terminación de una aplicación de CA-Clipper dada puede atribuirse a
alguna de las siguientes causas:
■ RETURN desde la rutina principal o raíz
■ el mandato QUIT
■ la ejecución de un BREAK sin incluir BEGIN SEQUENCE...END
La sentencia ANNOUNCE declara un identificador de módulo para un módulo
■ error irrecuperable
No se puede garantizar la ejecución de un procedimiento de clausura
cuando el sistema detecta un error irrecuperable. Si se ha producido un
error durante un procedimiento de clausura, el sistema vuelve al DOS.
Los procedimientos de clausura pendientes no se llaman.
Ejemplos
■ En este ejemplo se ilustra la construcción de un mecanismo de
temporización simple, utilizando INIT y EXIT PROCEDURE:
// imprime la cantidad de tiempo necesario para,
// leer, ordenar y mostrar una lista de nombres
// de ficheros.
ANNOUNCE MiSistema
STATIC nInicio
PROCEDURE Main()
AEVAL( ASORT( DIRECTORY( "*.*" ) ),;
{ | aInfoFichero | QOUT( aInfoFichero[ 1 ] ) } )
RETURN
INIT PROCEDURE MiInicio()
nInicio := SECONDS()
RETURN
EXIT PROCEDURE MiClausura()
?
? "Tiempo transcurrido: "
?? SECONDS() - nInicio
RETURN
Modulo x.prg
static aDat
FUNCTION MiProceso()
aDat := Array(4)
aDat[1] := ...
aDat[2] := ...
....
RETU NIL
FUNCTION GetaDat()
RETU aDat
// Exit desde el mismo modulo
EXIT PROCEDURE Save()
...
RETU NIL
Modulo z.prg
EXIT PROCEDURE Save()
LOCAL aDat := GetoDat()
...
RETU NIL
*******************************
function lGetPassword()
local oDlg, oUser, oPass
local nTries := 0 //Nº de intentos que quiero permitir
local lGo := .f.
PRIVATE x_user, x_pass //Antes esto no estaba y por eso no los podia ver
x_user = UPPER(GETENV("USERNAME"))+ space(4)
x_pass = space(10)
DEFINE DIALOG oDlg ;
FROM 5, 5 TO 20, 50 ;
TITLE "Por favor identifiquese..."
@ 1, 2 BITMAP oBmp FILENAME ".\..\Bmp\Pass.Bmp" OF oDlg NOBORDER
@ 1, 10 SAY "GESTION DE PUERTAS" OF oDlg
@ 4, 1 SAY "Nombre:" OF oDlg
@ 5.3, 1 SAY "P. de Acceso:" OF oDlg
@ 4, 8 GET oUser VAR x_user picture "@!" OF oDlg SIZE 50 , 10 VALID ( oImg:LoadImage( , "..\COMU\FOTOS\"+alltrim(x_user)+".jpg" ), oImg:Refresh(), .T. )
@ 5.3, 8 GET oPass VAR x_pass picture "@!" OF oDlg PASSWORD SIZE 50 , 10
@ 2, 14 IMAGE oImg FILE "..\COMU\FOTOS\"+alltrim(x_user)+".jpg" SIZE 50, 60 ADJUST
@ 4, 4 BUTTON "&Continuar" OF oDlg ;
ACTION ( nTries++,;
lGo := ComprueboAcceso( x_user, x_pass ) ,;
If( nTries > 2 .or. lGo, oDlg:End(),;
( MsgAlert( "Datos Incorrectos..."+ Chr(13) +"Intenta otra vez" ), oUser:SetFocus(), oPass:SetFocus() ) ) )
oBmp:lTransparent = .t. // Hago el bmp transparente
ACTIVATE DIALOG oDlg CENTERED ON PAINT ( oPass:SetFocus() )
return lGo
********************************
Function ComprueboAcceso( x_user, x_pass )
//Abre la base de datos de usuarios para esta aplicación.
if !op_base("USR",.f.,1,1)
return .f.
endif
locate all for x_user= USER->user
if !found()
MsgInfo("Usuario no registrado")
use
Return .F.
elseif x_pass != USER->pasw
MsgInfo("Palabra clave incorrecta")
use
Return .F.
endif
//Me desago de la base de datos abierta y retorno acceso correcto y tomo el nivel de acceso
x_level = USER->level
use
InicioAcceso()
return .t.
*********************************
Func InicioAcceso()
if !op_base("ACC",.f.,1,1,.f.,"ACCESOS")
return .f.
endif
Select("ACCESOS")
if netapp(0)
Replace PRG with d_prg
Replace FECHAINI with date()
Replace HORAINI with time()
Replace USER with x_user
Replace LOGON with x_logon
Replace ORDENADOR with x_ord
commit
endif
clos_base("ACC",1,.f.)
Return .t.
********************************************
EXIT PROCEDURE FinalizoAcceso()
if !op_base("ACC",.f.,1,1,.f.,"ACCESOS")
return .f.
endif
Select("ACCESOS")
DBSetOrder(5)
seek alltrim(x_user) + d_Prg
LOCATE FOR USER = alltrim(x_user) .and. PRG = d_prg .and. EMPTY(FECHAFIN)
DO WHILE Found()
if rlock()
Replace FECHAFIN with date()
Replace HORAFIN with time()
commit
endif
skip
LOCATE FOR USER = alltrim(x_user) .and. PRG = d_prg .and. EMPTY(FECHAFIN)
enddo
clos_base("ACC",1,.f.)
Return .t.
Return to FiveWin para Harbour/xHarbour
Users browsing this forum: No registered users and 89 guests