4.
Cara Caract cter eris isti tica cass de la la Prog Progra rama maci ción ón en en SQL SQLWi Wind ndow ows. s.
4.1. Variables. es.
Prefijos y Tipos de Variables.
Tipos de Datos Boolean Date/Time File Handle Long String Number SQL Handle String Window Handle
Prefijo b dt fh ls n hSql hSql s hWn hWnd
Uso Valor lógico (TRUE (TRUE / FALSE ). Fecha / Hora. Manija de de Ar Archivos. Cadena ena de de Carac aracte tere ress ma mayores res a 255. 55. Numérico. Manij anijaa para para con conex exio ione ness SQL. SQL. Cadena ena de de cara caract cter eres es menor nor o igual ual a 255. 55. Manij anijaa de Ven Venta tana nas. s.
Al igua iguall que que en los los leng lengua uaje jess trad tradic icio iona nale les, s, se recu recurre rre al uso uso de variables para almacenamiento de valores, estas variables pueden ser:
Globales Definidas en la seccion Global Declarations. Locales
Definidas en la sección Window Variables de las ventanas.
Se recomienda seguir usando us ando la notación para asignación de nombres:
Prefijo en minúsculas. Primera letra de cada palabra en myúscula.
SQLWindows
53
Los tipos de datos Handle (manija) son tipos especiales para identificar un archivo, archivo, una conexión conexión SQL o una ventana según sea el caso; no son variables con las que se pueden hacer operaciones ya que su función es sólo de identificador, se utilizan cuando se hace uso de ciertas funciones.
4.1.1. 4.1.1. Variable Variabless de SQLWindo SQLWindows ws
Variable HWndNULL HWndForm HWndItem HWndMDI Wparam MyValue BstaticsAsWindows
Tipo de Dato Menejo de Ventana Manejo Ventana Manejo Ventana Manejo Ventana Número
Boolean - cuando es
Variable SqlDatabase SqlUser SqlPassword SqlNoRecovery SqllnMessage
Tipo Dato Secuencia Secuencia Secuencia Boolean Número
puesto en TRUE, los objetos pasivos no son pintados en el formulario, sino que creados como objetos de window. Número Arreglos de Secuencias
NargCount StrArgArry[*]
(“String”)
4.1.2. 4.1.2. Califica Calificación ción de Variabl Variables. es.
Referencia Simple:
Ejemplo: Ejemplo:
SQLWindows
Set df dfDate = SalDate ateCurre urren nt()
54
Los tipos de datos Handle (manija) son tipos especiales para identificar un archivo, archivo, una conexión conexión SQL o una ventana según sea el caso; no son variables con las que se pueden hacer operaciones ya que su función es sólo de identificador, se utilizan cuando se hace uso de ciertas funciones.
4.1.1. 4.1.1. Variable Variabless de SQLWindo SQLWindows ws
Variable HWndNULL HWndForm HWndItem HWndMDI Wparam MyValue BstaticsAsWindows
Tipo de Dato Menejo de Ventana Manejo Ventana Manejo Ventana Manejo Ventana Número Boolean - cuando es
Variable SqlDatabase SqlUser SqlPassword SqlNoRecovery SqllnMessage
Tipo Dato Secuencia Secuencia Secuencia Boolean Número
puesto en TRUE, los objetos pasivos no son pintados en el formulario, sino que creados como objetos de window. Número Arreglos de Secuencias
NargCount StrArgArry[*]
(“String”)
4.1.2. 4.1.2. Califica Calificación ción de Variabl Variables. es.
Referencia Simple:
Ejemplo: Ejemplo:
SQLWindows
Set df dfDate = SalDate ateCurre urren nt()
54
Referencia Calificada :
Ejemplo: Ejemplo:
SetfrmMain.dfDate SetfrmMain.dfDate = SalDateCurrent()
Referencias Calificadas en su Totalidad (o “Window-quelified”):
Ejemplo: Ejemplo:
Seth ethWnd.dfD .dfDat atee = SalD SalDat ateC eCur urre rent nt() () (o... Set hWnd.frmMain.dfDate hWnd.frmMain.dfDate = SalDateCurrent())
SQLWindows
55
4.2. Arreglos. En SQLwindows se pueden crear arreglos unimendisionales y multidimensionales de los diferentes tipos de variables provistos. Antes de explicar como operan los arreglos multidimensionales, se deberá entender como declarar los de dimensión uno.
4.2.1. Arreglos Unidimensionales.
Arreglos Unidimensionales Estáticos.
Si se conoce el número máximo de números de elementos que un arreglo puede contener, específique el número entre corchetes
[ ], al
momento de declararlo: Arreglos Unidimensionales Dinámicos.
Si no se puede predecir el número máximo de elementos contenidos en un arreglo, se deberá utilizar un asterisco (*) en lugar de un número fijo de elementos, esto le indica a SQLWindows que es un arreglo dinámico.
Arreglos Unidimensionales Estaticos. Variables String
: sArchivo
String
: sPais
Number : nMaximo Number : nValores [4]
SQLWindows
56
Arreglos Unidimensionales Dinamicos. Variables String
: sEmpleados [4]
String
: sDeptos [4]
En el primer ejemplo sPais y nValores son arreglos (vectores) fijos de 1 dimensión, el primer elemento 0 y el último n-1. En el segundo ejemplo sEmpleados y sDeptos son de tamaño variables, el primer elemento es el 0, pero el último depende de los elementos que se almacenen en los arreglos. 4.2.2. Arreglos Multidimensionales.
Asignación de rangos en Arreglos Unidimensionales.
Variables String
: sEmpleados [1:10]
Nota: Este arreglo consta de diez elementos (1-10), no se utiliza la posición cero.
Variables String
: sEmpleados [1:*]
Nota: Este arreglo es dinámico (1-n), no se especifica la posición cero.
Por omisión, se referencia al primer elemento de un arreglo con el índice cero. Para controlar como referenciar al primer elemento de un arreglo, se deben especificar los limites inferior y superior separados por dos puntos.
Arreglos Multidimensionales Estaticos. Variables
SQLWindows
Arreglos Multidimensionales Dinámicos Variables
57
String : sEmpleados [10,3]
String : sEmpleados [*,3]
Nota : El arreglos presenta diez elementos en su
Nota : Este arreglo es dinámico en la primera
primera dimensión (0-9) y sólo tres en la segunda
dimensión (0-n) y tres elementos en la segunda
dimensión (0-2).
dimensión (0-2).
Para declarar un arreglo multidimensional estatico basta con especificar el número de elementos de la segunda y subsecuentes dimensiones después del número de la primera dimensión. Se debe de separar cada dimensión por medio de coma. En el tipo de arreglo multidimensional dinámico sólo se puede especificar la primer dimensión dinámica.
Asignación de rangos en Arreglos Multidimensionales.
Variables String
: sEmpleados [1:10 , 1:3]
Nota: Este arreglo presenta en la primera dimensión diez elementos (1-10), sin declarar
posición cero y tres elementos en la segunda dimensión.
Variables String
: sEmpleados [1:* , 1:3 , 1:10 ]
Nota: Este arreglo es dinámico (1-n) en la primera dimensión, con tres elementos en la
segunda dimensión (1-3) y diez elementos en la tercera dimensión (1-10).
Se pueden controlar los limites de los elementos para cualquier dimensión, incluso si la primera dimensión es dinámica.
SQLWindows
58
Ejercicio.
1. Identifique los tipos de variables de acuerdo a la nomenclatura.
sTitulo
_____________
nMaximo
_____________
bFin
_____________
nSqlMain
_____________
HWndPadre
_____________
2. Declare un arreglo unidimensional de 10 elementos del tipo Number.
SQLWindows
59
3. Declare un arreglo unidimensional de 50 elementos del tipo String con un límite inferior 1.
4. Declare un arreglo dinámico de tipo Boolean.
5. Declare el arreglo que representa una matriz de 10x20 iniciando sus índices a partir de 1.
6. Declare un arreglo multidimensional de orden 3, cuya primera dimensión sea dinámica y las subsecuentes sean de 10 y 20 respectivamente. en todos los casos el límite inferior de las dimensiones deberá de ser 1.
4.3. Constantes. Para definir constantes de usuario se utiliza la sección Constans de la sección Global Declaration.
No existe una nomenclatura en especial, salvo el uso extensivo de Mayúsculas.
Variables System
User Number: PAM_Activa
SQLWindows
= SAM_User + 1 60
Number: PAM_Desactiva
= SAM_User + 2
String:
= 'Error en la Aplicación'
MsgError
Ejercicio.
1. Abra una nueva aplicación SQLWindows.
2. Defina varias constantes en la aplicación.
3. En liste los tipos de constantes que se puede definir.
SQLWindows
61
4.3.1. Constantes Predefinidas
Existen en el lenguaje SQLWindows muchas constantes previamentes definidas, estas se utilizan en el llamado a ciertas funciones cuyos parámetros llevan valores restringidos, un ejemplo es la función:
SalMessageBox( sContenido, sTitulo, nOpciones )
Donde nOpciones es una constante o combinación de constantes apropiadas. Para combinarlas se utiliza el operador “ “ (barra vertical),
SQLWindows
62
Ejemplo: Call SalMessageBox ( ' Error en la aplicación ', 'Altas’, MB_IconStop MB_RetryCancel)
Las opciones pueden tener una combinación de valores, algunos de ellos son:
MB_IconAsterisk MB_IconHand MB_Ok MB_OkCancel
MB_IconExclamation MB_IconQuestion MB_IconStop MB_AbortRetryIgnore
MB_RetryCancel MB_YesNo MB_YesNoCancel
4.4. Lenguaje SAL .
Para agregar código a la aplicación los elementos del lenguaje SAL(SQLWindows Application Languaje), el cual provee de un conjunto de
instrucciones para programar acciones de la misma manera como se hace en un lenguaje de tercera generación.
4.4.1. Instrucciones del Lenguaje SAL
Set
SQLWindows
63
• Asigna a una variable ( Local o Global) el resultado de una expresión.
La expresión puede ser una expresión aritmética que involucre otras variables o incluso objetos.
Sintaxis:
Set =
Ejemplo:
Set nAvance = 100 nPuntos / nTotal
Call • Involucra a una función interna Global, Interna Local, Externa o de
SAL.
• Las funciones también pueden invocarse en forma implícita en una expresión, cuando se desea utilizar el resultado para alguna operación, como en:
Sintaxis:
Call Funcion()
Ejemplo:
Call SalSendMsg( pbSalir, PAM_Init, 0, 0 ) Set bResultado = SalNumberSin( nX )
If, Else If, Else.
Permite colocar elementos de decisión. Fig. 1 If, Else .
Fig. 2 If, Else .
Fig. 3 If, Else If , Else .
S|intaxis : If < condición > código 1 Else código 2
Sintaxis: If < condición 1> código 1 If < condición 2 > código 2 Else
Sintaxis : If < condición 1> código 1 Else If < condición 2 > código 2 Else If < condición 3 >
SQLWindows
64
código 3 Else código 2
código 3 Else código 4
El control del código se hace por identación, no se necesitan llaves o instrucciones tipo Begin-End (Fig. 1)
Las setencias pueden anidarse (Fig. 2).
La anidación de setencias If en ocasiones es díficil de leer, en ese caso se puede usar la setencia Else If (Fig. 3).
Select case.
Esta instrucción permite ejecutar una acción dependiendo de un valor numérico. Sintaxis: Select Case nNumero Case 1 código 1 Break Case 2 código 2 Break Default código n
Se debe colocar una instrucción Break al final de cada código para separar cada CASO, si se desea que ejecute
las instrucciones del
siguiente Case, bastará con omitir el Break . Por ejemplo:
SQLWindows
65
• Select Case nOpción Case 2 Case 3 Código a Break Case 4 Case 5 Código B Break
Si nValor es 2 o 3 se ejecuta el código A, si vale 4 o 5 se ejecuta el código B.
Loop y Break
La setencia Loop ejecuta el código en el siguiente nivel n veces hasta encontrar una instrucción Break o Return.
No evalúa expresiones ni incrementa valores en cada iteración en forma automática.
Pueden colocarse varias instrucciones Break. Ejemplo: Set nIndice = 0 SQLWindows
66
Loop If nIndice > 6 Break Call SalStrUpper( Dias[ nIndice ], Dias[ nIndice ] ) Set nIndice = nIndice + 1
While.
La setencia While es muy similar a Loop, sólo que no necesita una sentencia Break , ya que evalúa la expresión hasta que esta sea FALSE, sin embargo una instrucción Break o Return concluirá el ciclo en forma inmediata.
Sintaxis: While < condición > Ejemplo:
Call SqlFetchNext( hSql, nErr ) While nErr != EOF codigo 1 If < condición > Return nErr Call SqlFetchNext( hSql, nErr )
Return
La instrucción Return concluye el procesamiento de cualquier código que atiende un mensaje o bien, el código de una opción de menú.
Regresa valor a la función que invocó o bien a SQLWindows. SQLWindows
67
Si el programa encuentra la instrucción Return, ignora las instrucciones subsecuentes y regresa el control a donde se hizo el llamado.
Sintaxis: Return Ejemplo: Set nIndice = nParametro Set nResultado = nIndice Loop If nIndice < 0 Set bError = TRUE Return If nIndice > 6 Break Set nIndice = nIndice + 1 Set nResultado = nResultado * nIndice Set nResultado = nResultado / 2
Strings.
Las cadenas en SQLWindows tienen una manipulación similar a la que se usa en otros lenguajes para concatenar dos o más Strings se utiliza el operador “║“ (doble barra), como en la fig. 1.
Fig. 1 Set sVariable1 = ‘El día ’ Set sVariable2 = ‘viernes ’ Set sVariable3 = ‘ se hará el evento. ’ Set nExp1 = sVariable1 || sVariable2 || sVariable3 Set nExp2 = sVariable1 || ‘sabado ’ || sVariable3
SQLWindows
El día viernes se hará el evento. El día sabado se hará el evento.
68
Existe un error en la fig. 2, pues el compilador interpretaría Imprenta como un String, y el resto de la expresión causaría un error de compilación. Para incluir un apóstrofe dentro de un String se utiliza la diagonal inversa antes del apóstrofe o bien las dobles comillas para delimitar el inicio y el fin del string.
Fig. 2 Set sTitulo = ‘ Imprenta ’ La Hacienda ’ ’
! Marca Error
Solución: Usar \ antes de’ Set sTitulo = ‘ Imprenta \’ La Hacienda \’ ’ o bien usar “ Set sTitulo = “ Imprenta ’ La Hacienda ’ “
Si se dese incluir una diagonal inversa dentro del un string, se coloca doble diagonal inversa como muestra la fig. 3.
Fig. 3 Set sLinea = ‘ \\*****
sLinea -> \*****
Reporte Semanal *****\\ ’ Reporte Semanal *****\
Operadores.
Se siguen los mismos criterios que en lenguaje C para resolución de operaciones: primero las multiplicaciones y divisione, luego las sumas y restas, se pueden utilizar paréntesis para hacer más clara la operación.
Los operadores de comparación pueden ser usados con datos de tipo fecha, string o numéricos.
Operadores SQLWindows
69
• Aritméticos Adición: + Resta: Multiplicación: * División: / • Aritmética booleana AND & OR | • Lógicos OR AND NOT • Comparación Mayor que > Mayor o igual >= Menor que < Menor o igual <= Igual = Diferente != <>
4.4.2. Funciones del Lenguaje SAL.
Adicionalmente al conjunto de instrucciones SAL, se cuenta con una gran variedad de funciones para gran cantidad de propósitos: manipulación de Fechas, comunicación entre aplicaciones por medio de DDE, funciones de edición, manipulación de archivos, de formateo y validación, especiales para List Box y Combo Box, manipulación de arreglos y números, impresión,
ejecutar operaciones SQL, manipulación de cadenas, conversión de datos, manejo de ventanas, ect.
Ejemplo de algunas funciones: SalDisableWindow() SalEnableWindow() SalWaitCursor() SalDateYear() SalFileRead() SQLWindows
Deshabilita un objeto. Habilita un objeto. Cambia el cursor de arena o viceversa. Proporciona el año de una variable del tipo fecha. Lee datos de un archivo. 70
4.4.2.1.
Funciones internas.
Las funciones son rutinas de uso general que tienen como propósito efectuar una tarea y regresa uno o varios valores como resultado de su operación, se declaran en la seccón Internal Functions.
• Si la función va a regresar un valor, solamente se especifica el tipo del valor de retorno.
• Se pueden especificar n parámetros los cuales se utilizan como
variables locales, por default los parámetros no pueden modificarse (paso por valor), en caso de necesitar regresar más de un valor se deben definir dichos parámetros anteponiendo el tipo Receive (paso por referencia).
• La función puede tener sus propias variables (variables locales). • El código de la función utiliza el lenguaje SAL.
Ejemplo:
Internal Functions
Function: Promedio Description: Calcula el promedio de n Números SQLWindows
71
Returns Number: Parameters Number: nValores [ * ] Number: nCuantos Static Variables Local variables Number: nIndice Number: nResultado Actions Set nIndice = 0 Set nResultado = 0 While nIndice < nCuantos Set nResultado = nResultado + nValores[ nIndice ] Set nIndice = nIndice + 1 Set nResultado = nResultado / nCuantos Return nResultado
Ejercicios.
A. Calculo del Factorial. Desarrolle una aplicación que reciva un número y calcule el factorial del mismo. 1.
Cree una aplicación nueva (sin las librerias de QuickObjects).
2.
Agregue un Form Window, asignele el título Calculo del Factorial.
3.
Agregue a la forma un Data Field, asignele el nombre dfDato, y asigne el tipo de datos en Number.
4.
Arriba del Data Field, coloque un Background Text con la leyenda Dato!
5.
Agregue un Data Field, asignele el nombre dfResultado y asigne el tipo de datos Number.
6.
Arriba del Data Field, coloque un Background Text con la leyenda Resultado.
7.
Agregur un Pushbutton con nombre pbCalcular y título Calcular.
8.
En la sección User de la sección Constants defina el mensaje PAM _ Calcular con el valor SAM_USER + 1.
SQLWindows
72
9.
En la sección Internal Functions de Global Declarations dree una función nueva con nombre Factorial.
10. Defina el resultado como tipo Number. 11. Defina un parametro de tipo Number con nombre nNumero.
12. En el código de la función coloque el siguiente código. If (nNumero<1) Return 0 Else Return Factorial(nNumero-1) 13. Localice la sección Message Actions del botón pbCalcular.
14. Agregue el siguiente código: On SAM_Click Call SalSendMsg( dfResultado, PAM_Calcular, 0, 0 )
15. En el Data Field dfCalcular coloque el siguiente código: On PAM_Calcular Set MyValue = Factorial( dfDato )
16. Corra la aplicación y pruebela.
B. Conversión de Grados Centigrados a Fahrenheith. Desarrolle una aplicación que haga una conversión de grados Centígrados a grados Fahrenheit y viceversa. C = (ºF-32)* 5/9 F =
ºC*9/5 + 32
Deberá definir tres funciones internas. 1. Cree una aplicación nueva (sin las librerias de QuickObjects). 2. Agregue un Form Window, asignele el título conversión. 3. Agregue a la forma un Data Field, asignele el nombre dfCentigrados, y asigne el
tipo de datos en Number. 4. Coloque arriba del Data Field un Background Text con la leyenda C.
5. Agregue un Data Field, asignele el nombre dfFahrenheit y asigne el tipo de datos Number. 6. Coloque arriba del Data Field un Background Text con la leyenda F. 7. Agregue un Pushbutton con nombre pbCToF y tñitulo C -> F. 8. Debajo del botón anterior agregue un Pushbutton con nombre pbFToC y título F
-> C. 9. En la sección User de la sección Constans defina el mensaje PAM_Convertir
con el valor SAM_User + 1.
SQLWindows
73
10. En la sección Internal Functions de Global Declarations cree una función nueva,
con nombre CentigradosDeF. 11.
Defina el resultado como tipo Number.
12. Defina el parametro del tipo Number con nombre nGradFar.
13.
Agregue el siguiente código en la sección Actions.
Return (nGradFar-32)*5/9
14.
Defina el resultado como tipo Number.
15. Defina el parametro del tipo Number con nombre nGradFar.
16.
Agregue el siguiente código en la sección Actions.
Return (nGradFar-32)*5/9 17. Agregue otra función con nombre FahrenheitDeC.
18.
Defina el resultado como tipo Number.
19. Defina un parametro del tipo Number con nombre nGradCen.
20.
Agregue el siguiente código en la sección Actions:
Return( nGradCen * 9 / 5 - 32 ) 21. Localice la sección Message Actions del botón pbCToF.
22.
Agregue el siguiente código:
On SAM_Click Call SalSendMsg( dfFaharenheit, PAM_Convertir, 0, 0 ) 23. Localice la sección Message Actions del botón pbFToC.
24.
Agregue el siguiente código:
On SAM_Click Call SalSendMsg( dfCentigrados, PAM_Convertir, 0, 0 ) 25. Localice el Data Field dfFahrenheit y agregue el siguiente código:
On PAM_Convertir Set MyValue = dfFahrenheitDeC( dfCentigrados ) 26. Localice el Data Field dfCentigrados y agregue el siguiente código:
On PAM_Convertir Set MyValue = dfCentigradosDeF( dfFahrenheit ) 27. Corra la aplicación y pruebela.
SQLWindows
74
4.5.
Código Reusable.
Una propiedad muy importante de SQLWindows (también principio de OOP) es que nos permite reutilizar código, es decir que el código diseñado
para un objeto pueda ser utilizado igual o con ligeras modificaciones en objetos del mismo o similar tipo; para ello provee de variables de uso general como es el caso de hWndForm y hWndItem:
• hWndForm
Se refiere a la ventana Padre ( Top Level Window).
• hWndItem
Se refiere a la ventana actual (Padre o hijo).
Ejemplo: Fig. 1
SQLWindows
75
En este caso hWndItem se refiere a pbConsulta y hWndForm se refiere a la ventana que contiene a pbConsulta.
Ejemplo: Fig. 2
En este caso hWndForm se refiere a frmMain, si se usara hWndItem también se referiría a frmMain, ya que el objeto actual
es la ventana padre.
SQLWindows
76
Utilizando las variables hWndItem y hWndForm, se puede usar el mismo código en diferentes objetos, por ejemplo considere los pasos necesarios para habilitar y deshabilitar los botones ejemplificados en la Fig. 1.
Ejercicio. 1. Cargue la aplicación de captura de Clientes. 2.
Agregue los mensajes necesarios para habilitar y deshabilitar los botones, en la sección Constans en User de Global Declarations:
Number : PAM_Activa
= SAM_User + 1
Number : PAM_Desactiva = SAM_User + 2 3.
Agregue
el
código
para
que
al
inicio
los
botones
estén
encendidos/apagados según sea el caso, esto es en la sección de Message Actions de cada botón incluya la atención a los mensajes de PAM_Activa y PAM_Desactiva, con su respectivo código ya visto con anterioridad. Y
también agregue a cada botón la atención al mensaje de SAM_Create , donde al crearse el propio objeto haremos que se mande a el mismo activar o desactiva, respectivamente para cada uno según sea el caso. 4. Entonces en el caso de los botones pbConsulta, pbAyuda y pbSalir el código en el mensaje SAM_Create será el siguiente: Message Actions On SAM_Create Call SalPostMsg( hWndItem, PAM_Activa, 0, 0) SQLWindows
77
5. y en el caso de los botones pbPrimero, pbAnterior, pbSiguiente, pbUltimo, pbSuma, pbResta, pbCambio, pbBorra y pbImprime en código en el mensaje SAM_Create será el siguiente: Message Actions On SAM_Create Call SalPostMsg( hWndItem, PAM_Desactiva, 0, 0)
•
Nota: Recuerde, no dibuje lo que pueda copiar, no copie lo que pueda calcar, no
calque lo que pueda recortar y pegar.
4.6. Asociación de Acciones a Menús. Las opciones del menú estan ligadas a los botones del tool bar, es decir si el botón de consultas está habilitada el botón de consultas deberá estar deshabilitado y así sucesivamente.
Para
habilitar/deshabilitar
las
opciones,
se
usará
la
función
SalisWindowEnabled() (¿Esta habilitada la ventana?), la cual recibe el Handle del objeto y regresa un valor TRUE si el objeto está habilitado, y False en caso contrario.
En la sección Menu Actions se enviará el mensaje SAM_Click al botón correspondiente:
SQLWindows
78
Ejercicio.
Implemente el código anterior y pruebe todas las opciones del menú. • En la sección de Menu de la forma frmMain abra los MenuItems de
cada opción del menú y agregue en su respectiva sección Menu Settings de cada uno lo siguiente: Menu Actions Enable when : SalIsWindowEnable( pb...)
El prefijo (pb...) indica que en ese lugar va el nombre del botón al cual va a estar asociada esta opción del menú. • Y en la sección de Menu Actions de cada botón el siguiente código:
Menu Actions Call SalSendMsg( pb..., SAM_Click, 0, 0 ) • Para el botón de salir llame a la funcón SalQuit( ) en la sección de
Menu Actions.
SQLWindows
79
4.7. Creación de Ventanas. Como se comentó al inicio, la operación de una ventana tiene tres modalidades.
Modal
Bloque todas las ventanas de la aplicación, todo el procesamiento se centra en la ventana Modal, y
System Modal
no se restablece hasta cerrar la ventana. Bloque todas las ventanas de Windows, todo el procesamiento se centra en la ventana System
Modeless
Modal, y no se restablece hasta cerrar la ventana. Permite cambiar de ventana de trabajo en forma
indistinta.
SQLWindows
80
En SQLWindows las ventanas Form Window y Table Window son Modeless (no modales), y puede definirse que se creen automáticamente al
tiempo de inicio de ejecución, o también se pueden crear según se requiera.
Las ventanas Dialog Box pueden ser configurados en cualquiera de las tres formas, para ello se debe modificar la propiedad de Type of Dialog como se muestra en la figura.
Recuerde que el código contiene la plantilla de la ventana, para crear la ventana se debe invocar la función correspondiente.
Tipo de Ventana Modal / System
Acción Crear
Función SalModalDialog()
Modal Modeless
Cerrar Crear
SalEndDialog() SalCreateWindow()
Cerrar
SalDestroyWindow()
SQLWindows
81
4.7.1. Manejo de Ventanas
• Al crear una ventana el MSWindows establece un valor de manejo único para ese objeto.
• El valor de manejo se usa para accesar dicha ventana. • El valor de manejo de la ventana permanece durante toda la existencia de esa ventana.
• El “manejo de ventana” es un valor WORD (rango: 0 to 64K-1) • Los nombres de formatos pueden ser usados como parámetros de funciones que requieren un parámetro del tipo “manejo de ventana”
4.7.2. Variables de Manejo de Ventana
hWndNULL
Un NULL (cero) de manejo de ventana; usando para pasar, o revisar para, un número de manejo de ventana
HWndForm hWndItem
NULL. El “manejo de ventana” padre activa El item que tiene el foco, o que está recibiendo el
hWndMDI
mensaje en ese momento El “manejo de ventana” para el MDI padre activo
Ejemplo: Prototipo de Función: bOk = SalDisableWindow (Window_Handle) SQLWindows
82
Campo de Datos: dfField Acciones de Mensaje On SAM_Create Call SalDisableWindow( dfField )
!impida entrada en campo
Call SalDisableWindow( hWndItem ) !equivalenta recomendado
Ejercicio:
Cree una ventana
“Acerca de ...”, prográmela y pruébela, como se
muestra en la siguiente imagen:
Agregue el siguiente código para la llamada de la ventana:
SQLWindows
83
Cuando el botón de Ok recibe un Click , debe cerrar la ventana “Acerca de ...”
• En el Tool Box oprima el botón que dice Dialog o desde el
Customizer haga doble click en la opción de Dialog Box. • Ahora haga click derecho sobre el nuevo Dialog Box y el de la
propiedad de Type of Dialog elija Modal (si es que no está elejida).
• Ahorra configure a su gusto esta ventana, pongale un nombre (digAbout), un título,etc. • Agregele algun Background Text como “Sistema para el Control de
Producción”.
• Ahora agregue un botón (pbOk) para cerrar esta ventana que diga OK, y agreguele el siguiente código en la sección de Message Actions de dicho botón lo siguiente: On SAM_Click SalEndDialog()
SQLWindows
84
• Lo que hara cuando el usuario oprimael botón OK el Dialog Box se
cerrará. • Ahora asocie esta ventana a la opción del menú About, con el código
de la página anterior ya visto.
Modifique la forma de la ventana “Acerca de...” a no modal, y pruebela, ¿ Puede crear varias ventanas “Acerca de...” ?.
Evaluación del capítulo 4.
1. Para asignar un valor a una variable se utiliza la instrucción _______________. 2. Una función se puede invocar con una instrucción _______________ o bien en forma implícita en una expresión. 3. En la instrucción If , el control del código a ejecutar
lo determina la
______________________ de las instrucciones. 4. Una
instrucción
Loop
requiere
de
una
instrucción
__________________________ para concluir el ciclo. 5. A diferencia de la instrucción Loop la instrucción __________________ evalúa
una expresión para determinar el fin del ciclo. 6. Los
valores
que
recibe
una
función
se
definen
en
la
sección
___________________________________ de la función. 7. Mediante el uso de las variables internas _____________ y _____________ es factible hacer código que puede ser utilizado en más de un objeto. 8. La función ________________________________ recibe un Window Handle y
regresa TRUE en caso de que el objeto esté habilitado. 9. La función ___________________________ se utiliza para crear una ventana
Modal. 10. La función _________________________ se utiliza para crear una ventana
System Modal .
SQLWindows
85