|
|
|
|
- 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
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.
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.
- 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.
Esta página también está disponible para…
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|