Este es el sitio web histórico de la documentación de 4D. La documentación se está trasladando progresivamente a developer.4d.com |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
4D v20 R7
Guía de declaración
|
List box tipo array | List box tipo selección | List box tipo colección/entity selection | |
List box | Array booleano | Número (no se utiliza) | colección o entity selection |
Columna de list box | Array texto | Digitación dinámica | Digitación dinámica |
Encabezado | Númerico | Númerico | Númerico |
Pie | Digitación dinámica | Digitación dinámica | Digitación dinámica |
Array de control de líneas | Array booleano (Array Entero largo aceptado) | - | - |
Estilos | Array entero largo | Entero largo | Entero largo |
Colores de fuente | Array entero largo | Entero largo | Entero largo |
Colores de fondo | Array entero largo | Entero largo | Entero largo |
Este es un ejemplo de este problema:
Variable:=5.3
Pointer:=->Variable
Pointer->:=6.4
Pointer->:=False
En este caso, su puntero desreferenciado es una variable Real. Al asignarle a esta variable un valor Booleano, se crea un conflicto de tipos.
Si necesita utilizar punteros con diferentes propósitos en el mismo método, asegúrese de que sus punteros estén definidos:
Un puntero siempre está definido con relación al objeto al cual se refiere. Por esta razón el compilador no puede detectar conflictos de tipos generados por punteros. En caso de un conflicto, no recibirá un mensaje de error mientras esté en la fase de declaración o de compilación.
Esto no significa que el compilador no tenga manera de detectar conflictos relacionados con punteros. El compilador puede verificar su uso de punteros cuando si la opción Control de ejecución no está desactivada.
Durante la compilación, el compilador analiza las definiciones de los comandos de los plug-ins utilizados en la base, es decir el número y tipo de parámetros de estos comandos. No hay peligro de confusión a nivel de declaración si sus llamadas son consistentes con la declaración del método.
Asegúrese de que sus plug-ins estén instalados en la carpeta PlugIns, en una de las ubicaciones autorizadas por 4D: junto al archivo de estructura de la base o junto a la aplicación ejecutable (Windows) / en el paquete (macOS). Para mayor información, consulte Instalación de plugins o componentes.
El compilador no duplica el archivo, pero tiene en cuenta las declaraciones de los comandos sin preguntar información adicional.
Si sus plug-ins están ubicados en otra parte, el compilador le pedirá ubicarlos durante la declaración, vía una ventana de abrir archivos.
Ciertos plug-ins, por ejemplo 4D Write, utilizan comandos que llaman implícitamente a comandos 4D.
Tomemos el ejemplo de 4D Write. La sintaxis del comando es:
WR ON EVENT(area;evento;eventoMetodo)
El último parámetro es el nombre del método que usted ha creado en 4D. Este método será llamado por 4D Write cada vez que el evento sea recibido y automáticamente recibe los parámetro siguientes:
Parámetros | Tipo | Descripción |
$0 | Entero largo | Retorno de función |
$1 | Entero largo | Área 4D Write |
$2 | Entero largo | Tecla Mayús. |
$3 | Entero largo | Tecla Alt (Windows); Tecla Opción (Mac OS) |
$4 | Entero largo | Tecla Ctrl (Windows), Tecla Comando (Mac OS) |
$5 | Entero largo | Tipo de evento |
$6 | Entero largo | Valor que depende del parámetro evento |
Para que el compilador tenga en cuenta estos parámetros, debe asegurarse de que hayan sido declarados, bien sea por la directiva de compilación, o por su uso en el método, suficientemente explícito para poder deducir claramente el tipo.
4D puede utilizarse para crear y trabajar con componentes. Un componente es un conjunto de objetos 4D representando una o varias funcionalidades agrupadas en un archivo de estructura (llamado base principal), que puede instalarse en diferentes bases (llamadas bases huésped).
Una base huésped ejecutada en modo interpretado puede utilizar indiferentemente componentes interpretados o compilados. Es posible instalar los componentes interpretados y compilados en la misma base huésped. Por el contrario, una base huésped ejecutada en modo compilado no puede utilizar componentes interpretados. En este caso, sólo pueden utilizarse componentes compilados.
Una base huésped interpretada que contiene componentes interpretados puede ser compilada y no llama a los métodos del componente interpretado. Si este no es el caso, aparece una caja de diálogo de alerta cuando la compilación no es posible.
Se puede producir un conflicto de nombre cuando un método de proyecto del componente tiene el mismo nombre que un método de proyecto de la base huésped. En este caso, cuando el código se ejecuta en el contexto de la base huésped, se llama al método de la base huésped. Este principio permite "ocultar" un método del componente con un método personalizado (por ejemplo para obtener una funcionalidad diferente). Cuando el código se ejecuta en el contexto del componente, se llama al método del componente. Este enmascaramiento es señalado como una advertencia durante la compilación de la base huésped.
Si dos componentes comparten métodos con el mismo nombre, se genera un error en el momento de la compilación de la base host.
Para mayor información sobre componentes, consulte el Manual de Diseño.
La manipulación de las variables locales sigue todas las reglas que ya han sido enunciadas. Como las otras variables, sus tipos de datos no pueden alterarse durante la ejecución del método. En esta sección, examinamos dos instancias que pueden conducir a conflictos de tipos:
Una variable no puede ser redeclarada. Sin embargo, es posible utilizar un puntero para referirse a variables de diferentes tipos de datos.
Como ejemplo, considere una función que devuelve el tamaño en memoria de un array de una dimensión. El resultado es un Real, excepto en dos casos; para arrays de tipo texto y de tipo imagen, el tamaño en memoria depende de valores que no pueden expresarse numéricamente (ver la sección Arrays y memoria).
En el caso de arrays Texto y arrays Imagen, el resultado se devuelve como una cadena de caracteres. Esta función necesita un parámetro: un puntero al array cuyo tamaño de memoria queremos conocer.
Hay dos métodos para efectuar esta operación:
$Tamaño:=Size of array($1->)
$Tipo:=Type($1->)
Case of
:($Tipo=Real array)
$0:=8+($Size*10) ` $0 es un Real
:($Tipo=Integer array)
$0:=8+($Tamaño*2)
:($Tipo=LongInt array)
$0:=8+($Tamaño*4)
:($Tipo=Date array)
$0:=8+($Tamaño*6)
:($Tipo=Text array)
$0:=String(8+($Tamaño*4))+("+Suma de las longitudes de los textos") ` $0 es un Texto
:($Tipo=Picture array)
$0:=String(8+($Tamaño*4))+("+Suma de los tamaños de las imágenes") ` $0 es un Texto
:($Tipo=Pointer array)
$0:=8+($Tamaño*16)
:($Tipo=Boolean array)
$0:=8+($Tamaño/8)
End case
En el método anterior, el tipo de $0 cambia de acuerdo al valor de $1; por lo tanto, no es compatible con el compilador.
$Tamaño:=Size of array($1->)
$Tipo:=Type($1->)
VarNum:=0
Case of
:($Tipo=Real array)
VarNum:=8+($Tamaño*10) ` VarNum es un Real
:($Tipo=Integer array)
VarNum:=8+($Tamaño*2)
:($Tipo=LongInt array)
VarNum:=8+($Tamaño*4)
:($Tipo=Date array)
VarNum:=8+($Tamaño*6)
:($Tipo=Text array)
VarText:=String(8+($Tamaño*4))+("+Suma de longitudes de texto")
:($Tipo=Picture array)
VarText:=String(8+($Tamaño*4))+("+Suma de tamaños de imágenes")
:($Tipo=Pointer array)
VarNum:=8+($Tamaño*16)
:($Tipo=Boolean array)
VarNum:=8+($Tamaño/8)
End case
If(VarNum#0)
$0:=->VarNum
Else
$0:=->VarText
End if
Estas son las principales diferencias entre las dos funciones:
• En el primer caso, el resultado de la función es la variable que se esperaba,
• En el segundo caso, el resultado de la función es un puntero a esta variable. Usted simplemente desreferencia su resultado.
El compilador administra el poder y la versatilidad de indirección sobre los parámetros. En modo interpretado, 4D le da toda toda la libertad con los números y los tipos de parámetros. Usted mantiene esta libertad en modo compilado, siempre y cuando no introduzca conflictos de tipos y que no utilice más parámetros de los pasados en el método llamado.
Para evitar posibles conflictos, los parámetros direccionados por indirección deben ser del mismo tipo.
Esta indirección es mejor manejada si usted respeta la siguiente convención: si sólo algunos parámetros son direccionados por indirección, deben pasarse después de los otros.
En el método, una dirección por indirección tiene el formato: ${$i}, donde $i es una variable numérica. ${$i} es llamado parámetro genérico.
Como ejemplo, considere una función que añade valores y devuelve la suma con el formato que se pasa como un parámetro. Cada vez que se llama este método, el número de valores a añadir puede variar. Debemos pasar los valores como parámetros al método y el formato en forma de una cadena de caracteres. El número de valores puede variar de llamado en llamado.
Esta función se llama de la forma siguiente:
Resultado:=MiSuma("##0.00";125,2;33,5;24)
En este caso, el método llamado, obtendrá la cadena “182.70”, la cual es la suma de los números, con el formato especificado. Los parámetros de funciones deben pasarse en el orden correcto: primero el formato y luego los valores.
Esta es la función MiSuma:
$Sum:=0
For($i;2;Count parameters)
$Sum:=$Sum+${$i}
End for
$0:=String($Sum;$1)
Esta función puede llamarse de varias formas:
Resultado:=MySum("##0.00";125,2;33,5;24)
Resultado:=MySum("000";1;18;4;23;17)
Al igual que con las otras variables locales, no es necesario declarar parámetros genéricos por directivas de compilación. Si es necesario (en casos de ambigüedad o por optimización), se utiliza la siguiente sintaxis:
C_LONGINT(${4})
Este comando significa que todos los parámetros a partir del cuarto (incluido) estarán direccionados por indirección y serán de tipo Entero largo. $1, $2 y $3 pueden ser de cualquier tipo. Sin embargo, si utiliza $2 por indirección, el tipo utilizado será de tipo genérico. Será de tipo Entero largo, incluso si para usted era, por ejemplo, de tipo Real.
Nota: el compilador utiliza este comando en la fase de declaración. El número en la declaración tiene que ser una constante y no una variable.
Algunas variables y constantes de 4D tiene un tipo y una identidad asignada por el compilador. Por lo tanto, no puede crear una nueva variable, método, función o comando de plug-in comando utilizando cualquiera de los nombres de esta variables o constantes. Puede probar sus valores y utilizarlos como lo hace en modo interpretado.
Esta es una lista completa de las Variables sistema de 4D con sus tipos.
Variable | Tipo |
OK | Entero largo |
Document | Texto |
FldDelimit | Entero largo |
RecDelimit | Entero largo |
Error | Entero largo |
Error method | Texto |
Error line | Entero largo |
Error formula | Texto<br/> |
MouseDown | Entero largo |
KeyCode | Entero largo |
Modifiers | Entero largo |
MouseX | Entero largo |
MouseY | Entero largo |
MouseProc | Entero largo |
Cuando crea una columna calculada en un informe, 4D crea automáticamente una variable C1 para la primera, C2 para la segunda, C3... y así sucesivamente. Esto se hace de manera transparente.
Si utiliza estas variables en métodos, recuerde que al igual que las otras variables, C1, C2, ... Cn no pueden ser redeclaradas.
La lista de constantes predefinidas en 4D se encuentra utilizando el Lista de temas de constantes. Igualmente puede ver las constantes en Explorador, en modo Diseño.
Consejos de optimización
Detalles de sintaxis
Mensajes de error
Utilización de directivas de compilación
Variables sistema
Producto: 4D
Tema: Compilador
Modificado: 4D v15 R4
Manual de lenguaje 4D ( 4D v20 R7)