AYUDA EN LÍNEA
 WINDEVWEBDEV Y WINDEV MOBILE

Este contenido se ha traducido automáticamente.  Haga clic aquí  para ver la versión en inglés.
Ayuda / WLanguage / Sintaxis WLanguage / Procedimientos WLanguage
  • Principio
  • Declaraciones y convocatorias de procedimientos internos
  • Características de los procedimientos internos
  • Uso en devolución de llamada
  • Parámetro Procedure interno
  • El acceso a las variables de una Procedure interna
  • Anidamiento de procedimientos internos
  • Procedimientos internos de los hermanos
  • Llamadas recurrentes
  • Parámetros con nombre
  • Compilación dinámica
  • Atributos internos de Procedure y de la extensión
  • Caso especial: Utilización de procedimientos internos con funciones asíncronas
  • Limitaciones
WINDEV
WindowsLinuxUniversal Windows 10 AppJavaReportes y ConsultasCódigo de Usuario (UMC)
WEBDEV
WindowsLinuxPHPWEBDEV - Código Navegador
WINDEV Mobile
AndroidWidget Android iPhone/iPadIOS WidgetApple WatchMac CatalystUniversal Windows 10 App
Otros
Procedimientos almacenados
Principio
Varias características requieren una Procedure llamada una o varias veces a través de una función de WLanguage ("Callback"). Por ejemplo, este es el caso de las siguientes funciones: fListFile, TreeListItem, AlbumPicker en iOS, etc.
Se debe crear un procedimiento para estas funciones, pero se presentan varios inconvenientes:
  • Pérdida de la localidad del código: El algoritmo final no se puede mostrar por completo. Se deben realizar varias idas y venidas entre el código de llamada y el WLanguage Procedure.
  • Dificultad para compartir información con el WLanguage Procedure: En la mayoría de los casos, se deben utilizar variables globales (para pasar parámetros a la llamada de retorno o para recuperar los resultados).
En este caso, las Procedure s internas se utilizan para simplificar la escritura de las características de la llamada de retorno y para arreglar los problemas causados cuando se utiliza un Procedure estándar.
Declaraciones y convocatorias de procedimientos internos
Se declara una Procedure interna en el código de un proceso existente (proceso asociado a un control, ventana Procedure, Procedure global o método de clase, ...).
La sintaxis es la siguiente:
INTERNAL PROCEDURE <Procedure name>()
<Procedure code>
END
Observaciones:
  • Los procedimientos internos deben ser declarados en la Process donde se utilizan.
  • La entrada asistida se habilita para los parámetros: se muestra un tooltip que especifica el tipo de parámetro esperado cuando se teclea la llamada a la Procedure interna.
  • El código de Process que se encuentra antes y después del código de declaración de la Procedure interna se ejecuta en secuencia: el código de Procedure interno no se ejecuta.
    Ejemplo:
    // Code before the internal procedure: This code is run.
    INTERNAL PROCEDURE MyInternalProcedure()
    // Code of the internal procedure.
    // This code is not run.
    END
    // Code after the internal procedure: This code is run.
  • Un Procedure interno puede ser llamado directamente por su nombre, como cualquier Procedure estándar. Esta llamada puede ser realizada antes o después de la declaración de Procedure interno.
    Ejemplo:
    // Call placed before
    MyInternalProcedure()

    // Declare the internal procedure
    INTERNAL PROCÉDURE MyInternalProcedure()
    // Code of the internal procedure run during the call to MyInternalProcedure()
    END

    // Call placed after
    MyInternalProcedure()

    Esto le permite a get un código que es fácil de leer.
  • Las excepciones activadas por los Procedure internos pueden ser procesadas fuera del Procedure interno.
Características de los procedimientos internos

Uso en devolución de llamada

El Procedure interno puede ser utilizado en funciones de WLanguage que esperan un Procedure de WLanguage como parámetro (como fListFile, TreeListItem, ...).
Atención: En este caso, el parámetro correspondiente al nombre de Procedure interno debe corresponder directamente al nombre de Procedure interno (el nombre de Procedure no debe estar entre comillas).
No hacer:
// List the "children" of the "Desserts" node in the "TREE_TVRecipe" TreeView
Res = TreeListItem(TREE_TVRecipe, "Recipes" + TAB + "Desserts", "ExpandAll")
 
INTERNAL PROCEDURE ExpandAll(TREE_TVRecipe, ChildPath, ChildFound, Level, Pointer)
...
END
Do:
// List the "children" of the "Desserts" node in the "TREE_TVRecipe" TreeView
Res = TreeListItem(TREE_TVRecipe, "Recipes" + TAB + "Desserts", ExpandAll)
 
INTERNAL PROCEDURE ExpandAll(TREE_TVRecipe, ChildPath, ChildFound, Level, Pointer)
...
END

Parámetro Procedure interno

El Procedure interno puede ser usado como parámetro en un Procedure. En este caso, el tipo de parámetro será "Procedure".
Ejemplo:
// Declare the internal procedure
INTERNAL PROCEDURE MyInternalProcedure()
// code run during the call to the procedure passed as parameter
END
 
MyOtherProcedure(MyInternalProcedure)
PROCÉDURE MyOtherProcedure(p is Procédure)

p()

El acceso a las variables de una Procedure interna

Las variables declaradas en el mismo Process que la declaración de Procedure interno pueden ser llamadas en el Procedure interno. Ya no hay necesidad de utilizar variables globales.. Este concepto se llama "Cierre"..
Ejemplo:
sElementList is string
sSeparator is string = CR
TreeListItem(TREE_TreeeViewControl, "", MyInternalProcedure)
 
INTERNAL PROCEDURE MyInternalProcedure(TreeViewName, Branch)
sElementList += [sSeparator] + Branch
END

Anidamiento de procedimientos internos

Los procedimientos internos pueden ser anidados. Cada Procedure interno puede acceder a las variables de los Procedure s que lo incluyen.
Ejemplo:
ExternalVariable is int
Trace(ExternalVariable)
MyInternalProcedure1()
INTERNAL PROCÉDURE MyInternalProcedure1()
InternalVariable1 is int
Trace(ExternalVariable + InternalVariable1)
MyInternalProcedure2()
INTERNAL PROCÉDURE MyInternalProcedure2()
InternalVariable2 is int
Trace(ExternalVariable + InternalVariable1 + InternalVariable2)
END
END

Procedimientos internos de los hermanos

Dos procedimientos internos que se encuentran en el mismo procedimiento pueden llamarse entre sí (procedimientos internos hermanos).
Ejemplo:
INTERNAL PROCÉDURE MyMainProcedure()

INTERNAL PROCÉDURE MyInternalProcedure1()
...
END

INTERNAL PROCÉDURE MyInternalProcedure2()
...
// Call the sibling procedure
MyInternalProcedure1()
END
END

Llamadas recurrentes

Una Procedure interna puede llamarse a sí misma de forma recursiva.

Parámetros con nombre

Si un Procedure interno incluye parámetros con valores por defecto, tienes la posibilidad de llamar al Procedure interno nombrando sus parámetros. Son posibles dos sintaxis:
  • Parámetros nombrados de Single-Line,
  • Parámetros con nombre de varias líneas.
Para obtener más información, consulte Parámetros nombrados en un Procedure.

Compilación dinámica

Puede utilizar un Procedure interno en un código compilado dinámicamente (con Compilar, por ejemplo).
Ejemplo:
lsCode est string = [
// Code compiled dynamically
sElementList is string
sSeparator is string = CR
TreeListItem(TREE_TreeeViewControl, "", MyInternalProcedure)
 
INTERNAL PROCEDURE MyInternalProcedure(TreeViewName, Branch)
sElementList += [sSeparator] + Branch
END
 
]
 
lsResult is string
 
lsResult = Compile("MyProc",lsCode)

Atributos internos de Procedure y de la extensión

atributos de extensión puede utilizarse con procedimientos internos. Por ejemplo, un solo proceso puede ejecutar un Procedure interno en un thread secundario, y luego llamar a un segundo Procedure en el thread principal para actualización la interfaz.
Ejemplo:
// Code of a button for example ...
AsynchronousExecution()
 
INTERNAL PROCEDURE AsynchronousExecution() <thread>
 
// Here, process run in the background
// in a secondary thread (no access to the interface)
ThreadPause(5s)
 
// Process completed, call process of main thread again
// therefore allowed to refresh the interface
AfterAsynchronousExecution()
END
 
INTERNAL PROCEDURE AfterAsynchronousExecution() <main thread>
Trace("Completed ...")
END
Caso especial: Utilización de procedimientos internos con funciones asíncronas
Los procedimientos internos se pueden utilizar como "Callback" para funciones asíncronas..
ATENCIÓN: En este caso, el código posterior a la llamada a la función que utiliza un lenguaje WL asíncrono Procedure se ejecutará ANTES que el código de Procedure interno.
Ejemplo: En este ejemplo de WINDEV Mobile, el código posterior a AlbumPicker se ejecutará ANTES que el interno de Procedure. El Procedure interno será llamado cuando el usuario valide el recolector.
AlbumPicker(albumImage, PhotoSelection)
INTERNAL PROCÉDURE PhotoSelection(sImagePath)
IMG_ImageControl = sImagePath
END
// Code run after the AlbumPicker function but
// BEFORE the code of internal procedure.
Limitaciones
  • Un Procedure interno no puede ser nombrado como los Procedure s que lo contienen.
  • Dos procedimientos internos del mismo nivel no pueden tener el mismo nombre, incluso si se declaran en bloques de código diferentes (SI ENTONCES, ....).
  • Los procedimientos internos no están disponibles en la compilación dinámica.
  • La ejecución de un Procedure interno no puede ser automatizada.
  • La gestión de errores de automatic no está disponible para los procedimientos internos.
Versión mínima requerida
  • Versión 20
Esta página también está disponible para…
Comentarios
Haga clic en [Agregar] para publicar un comentario

Última modificación: 27/05/2022

Señalar un error o enviar una sugerencia | Ayuda local