Professional Documents
Culture Documents
SC10-3067-04
AS/400e
SC10-3067-04
Importante Antes de utilizar esta informacin y el producto al que hace referencia, asegrese de leer la informacin general en Avisos en la pgina 451.
Quinta edicin (Abril 2000) Esta edicin corresponde a la Versin 4, Release 5, Nivel de modificacin 1, de IBM WebSphere Development Tools para AS/400 (Programa 5769-CL3) y a todos los releases y modificaciones posteriores hasta que se indique lo contrario en nuevas ediciones. Esta edicin sustituye a la publicacin SC10-3067-03. Los cambios o adiciones realizados en el texto o en las ilustraciones se indican mediante una lnea vertical a la izquierda del cambio o adicin. Haga sus pedidos de publicaciones a travs de su representante de IBM o de la sucursal de IBM de su localidad. En la direccin que figura ms abajo no hay existencias de publicaciones. IBM agradece sus comentarios. Puede enviar los comentarios a: IBM, S.A. National Language Solutions Center Avda. Diagonal, 571 08029 Barcelona Espaa Tambin puede enviar sus comentarios por fax: Desde Espaa: 933 216 134 Desde otros pases: 34 933 216 134 Si tiene acceso a Internet, puede enviar sus comentarios electrnicamente a: hojacom@vnet.ibm.com Consulte el apartado Cmo enviar comentarios en la pgina xi para ver una descripcin de los mtodos. Cuando enva informacin a IBM, otorga a IBM un derecho no exclusivo de utilizar o distribuir la informacin de cualquier manera que considere adecuada, sin incurrir en ninguna obligacin hacia usted. Copyright International Business Machines Corporation 1994, 2000. Reservados todos los derechos.
Contenido
Acerca de este manual . . . . . . . . ix
A quin va dirigido este manual . . . Prerrequisitos e informacin relacionada . Cmo utilizar este manual . . . . . La biblioteca VisualAge RPG . . . . . Cmo enviar comentarios . . . . . . Acceso a la informacin en lnea . . . Utilizacin de manuales en lnea . . Publicaciones en formato PDF . . . Utilizacin de ayuda en lnea . . . . ix . ix . ix . . . . x . . . . xi . . . . xii . . . . xii . . . . xii . . . . xii . . . . . . . . . Mantener informados a los usuarios . Utilizar un estilo coherente . . . . Anticipar cuestiones de traduccin . . . . . . . . . . . . . . 21 . 22 . 22
. . . . . . .
. . . . . . .
. . . . . . .
19 19 19 20 20 20 21
iii
Barra de desplazamiento horizontal . . . . . . 80 Imagen . . . . . . . . . . . . . . . . 81 Creacin del componente de imagen . . . . . 82 Establecimiento del nombre de archivo . . . . 82 Control del panel de ampliacin . . . . . . 82 Ejemplo de imagen . . . . . . . . . . . 83 Bean Java . . . . . . . . . . . . . . . 87 Adicin de beans al proyecto . . . . . . . 87 Ubicacin de los archivos JAR de bean . . . . 88 Establecimiento de la classpath de JAR . . . . 88 Establecimiento/Obtencin de las propiedades del JavaBean e invocacin de mtodos . . . . 89 Recuadro de lista . . . . . . . . . . . . 90 Adicin y establecimiento de la secuencia inicial de elementos . . . . . . . . . . . . . 90 Adicin de elementos en tiempo de ejecucin . . 91 Actualizacin de elementos de una lista . . . . 91 Establecimiento del principio de la lista . . . . 91 Eliminacin de elementos. . . . . . . . . 91 Seleccin y deseleccin de elementos . . . . . 91 Tipos de seleccin . . . . . . . . . . . 91 Recuperacin de elementos de la lista . . . . 92 Utilizacin de las teclas . . . . . . . . . 92 Sealizacin de eventos . . . . . . . . . 92 Ejemplo de recuadro de lista . . . . . . . 93 Ejemplo de bsqueda . . . . . . . . . . 96 Medios . . . . . . . . . . . . . . . . 99 Especificacin de un nombre de archivo . . . . 99 Establecimiento de AudioMode . . . . . . 100 Establecimiento de Volume . . . . . . . . 100 Establecimiento de Position. . . . . . . . 100 Utilizacin del componente Panel de medios 100 Sealizacin de eventos . . . . . . . . . 100 Panel de medios . . . . . . . . . . . . 101 Creacin de un componente panel de medios 101 Enlace con otros componentes . . . . . . . 101 Sealizacin de eventos . . . . . . . . . 102 Barra de mens . . . . . . . . . . . . 103 Creacin de mens desplegables . . . . . . 103 Elemento de men . . . . . . . . . . . 104 Colocacin de una marca de seleccin junto a una opcin de men . . . . . . . . . . 104 Establecimiento del texto de men . . . . . 104 Establecimiento de un nemotcnico . . . . . 104 Habilitacin de elementos de men . . . . . 105 Sealizacin de eventos . . . . . . . . . 105 Subarchivo de mensajes . . . . . . . . . . 106 Visualizacin de mensajes predefinidos . . . . 106 Visualizacin de texto suministrado en el programa. . . . . . . . . . . . . . 106 Utilizacin de variables de sustitucin . . . . 106 Eliminacin de mensajes. . . . . . . . . 107 Ejemplo de subarchivo de mensajes . . . . . 108 Edicin de mltiples lneas . . . . . . . . . 110 Obtencin y establecimiento del texto . . . . 110 Manipulacin de lneas de texto en un componente de edicin de mltiples lneas . . 110 Manipulacin de caracteres en un componente de edicin de mltiples lneas . . . . . . . 111 Manipulacin de partes seleccionadas del texto en un componente edicin de mltiples lneas . 111
iv
Cambio de color . . . . . . . . . . Eleccin de fonts . . . . . . . . . . Cmo evitar la entrada de datos por parte del usuario . . . . . . . . . . . . . Ejemplo de edicin de mltiples lneas . . . Cuaderno. . . . . . . . . . . . . . Cambio del nfasis del font. . . . . . . Pgina de cuaderno . . . . . . . . . . Mostrar el texto del separador . . . . . . Establecimiento de un nemotcnico . . . . Pgina de cuaderno con lienzo . . . . . . Interfaz ODBC/JDBC . . . . . . . . . . Conexin a una base de datos ODBC . . . Creacin de un conjunto de registros . . . Acceso a los datos de una tabla . . . . . Tipos de datos . . . . . . . . . . . Recuperacin de las filas de una tabla . . . Actualizacin de los datos de una fila . . . Supresin de una fila . . . . . . . . . Ejemplo de componente Interfaz ODBC/JDBC Recuadro de contorno . . . . . . . . . Valores de altura (Height) y anchura (Width) especiales. . . . . . . . . . . . . Men emergente . . . . . . . . . . . Barra de progreso . . . . . . . . . . . Ejemplo de barra de progreso . . . . . . Pulsador . . . . . . . . . . . . . . Establecimiento de un pulsador por omisin Establecimiento de un nemotcnico . . . . Asignacin de teclas de mandato . . . . . Sealizacin de eventos . . . . . . . . Botn de seleccin. . . . . . . . . . . Establecimiento de un nemotcnico . . . . Agrupacin de botones de seleccin . . . . Establecimiento del estado de un botn de seleccin . . . . . . . . . . . . . Sealizacin de eventos . . . . . . . . Graduador . . . . . . . . . . . . . Obtencin y establecimiento del valor del graduador . . . . . . . . . . . . Sealizacin de eventos . . . . . . . . Ejemplo de graduador . . . . . . . . Selector cclico . . . . . . . . . . . . Establecimiento de valores del selector cclico Obtencin del valor del selector cclico . . . Cmo evitar la entrada de datos por parte del usuario . . . . . . . . . . . . . Ejemplo de selector cclico . . . . . . . Texto esttico . . . . . . . . . . . . Cambio del texto de un componente texto esttico . . . . . . . . . . . . . Obtencin de valores de texto esttico . . . Obtencin y establecimiento de informacin para una ventana . . . . . . . . . . Edicin de la salida . . . . . . . . . Barra de estado. . . . . . . . . . . . Ejemplo de Barra de estado . . . . . . Subarchivo . . . . . . . . . . . . . Creacin de un componente subarchivo . . Nmero mximo de campos por subarchivo .
. 111 . 111 . . . . . . . . . . . . . . . . 111 112 115 115 116 116 116 117 118 119 119 120 121 121 122 122 123 . 131 131 132 133 133 134 134 134 135 135 136 136 136
. . . . . . . . . . .
Cdigos de operacin para manipular componentes subarchivo . . . . . . Carga de un subarchivo . . . . . . . Determinacin del tamao de subarchivo . Obtencin de la cuenta de registros . . . Lectura y actualizacin de registros . . . Cambio de campos de subarchivo . . . Campos ocultos . . . . . . . . . Formato de campos de subarchivo . . . Habilitacin de la tabulacin . . . . . Ejemplo de subarchivo . . . . . . . Sealizacin de eventos . . . . . . . Submen . . . . . . . . . . . . . Temporizador . . . . . . . . . . . Visualizacin del icono Temporizador . . Establecimiento del intervalo . . . . . Generacin de eventos Tick. . . . . . Obtencin del valor de temporizador . . Control del temporizador utilizando modalidades de temporizador . . . . . Ejemplo de temporizador . . . . . . Barra de desplazamiento vertical . . . . . Ventana . . . . . . . . . . . . . Ventana con lienzo . . . . . . . . . Visualizacin de una ventana . . . . . Cambio del tamao de una ventana . . . Establecimiento del foco . . . . . . . Lista de ventanas . . . . . . . . . Terminacin de un programa . . . . . Borrado de campos en una ventana . . . Ejemplo de un componente ventana . . . *Component . . . . . . . . . . . . Utilizacin del componente *component . Visualizar un dilogo Abrir/Guardar como Archivo . . . . . . . . . . . . Seleccionar una impresora . . . . . . Utilizacin de conectores . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . de . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
153 153 153 154 154 154 155 155 155 155 165 166 167 167 167 168 168 168 168 174 175 176 176 178 181 181 182 183 183 184 184
. 146 . 146 . 149 . 149 . 149 . . . . . . . 150 150 151 151 152 153 153
Servidores utilizados en el AS/400 . . . . Utilizacin del archivo de seguridad para los applets . . . . . . . . . . . . .
. .
. 198 . 198
Decisin del tipo de ayuda que se va a proporcionar . . . . . . . . . Adicin de ayuda segn el contexto . Creacin de un pulsador de ayuda . Creacin de enlaces de hipertexto .
. . . .
. . . .
. . . .
. . . .
247
. . . . . . . . 247 248 249 249 249 250 250 251 251
Captulo 13. Consejos para crear ayuda en lnea con IPF . . . . . . . 235
Creacin de ayuda en lnea . . . . . Utilizacin de IPF . . . . . . . . Soporte de ayuda para otros idiomas . Adicin de grficos a la ayuda en lnea. . . . . . . . . . . . . . . . . 235 235 235 236
vi
Captulo 18. Cmo invocar mtodos Java desde programas VisualAge RPG . . . . . . . . . . . . . . . 269
El tipo de datos de objeto y la palabra clave CLASS . . . . . . . . . . . . . . Cmo realizar el prototipo de un mtodo Java . Ejemplos de cmo realizar el prototipo de un mtodo Java . . . . . . . . . . . . Cmo crear objetos . . . . . . . . . . Cmo invocar mtodos Java . . . . . . . Otras consideraciones . . . . . . . . . . 269 . 270 . . . . 271 273 273 276
Captulo 23. Fusin de cdigo en la aplicacin . . . . . . . . . . . . . 367 Captulo 24. Conectores de proveedor 371
Adicin de conectores de proveedor . . . Invocacin de un conector de proveedor . Gestin de conectores de proveedor . . . . . . . . . . 371 . 371 . 371
373
. . . . 373 373 379 381 395
. 395 . 395
Captulo 20. Llamada a funciones del sistema al compilar para Java . . . . 283
Una llamada sencilla . . . . . . . . . . Paso y recepcin de parmetros . . . . . . Tipos de parmetro . . . . . . . . . Paso de matrices . . . . . . . . . . Devolucin de un valor de tipo carcter . . Devolucin de un valor de tipo decimal con zona . . . . . . . . . . . . . . Devolucin de un valor de tipo empaquetado Devolucin de un valor de tipo binario. . . Devolucin de un valor de tipo entero . . . Devolucin de un valor entero sin signo . . Devolucin de un valor de fecha, hora o indicacin de la hora . . . . . . . . . Devolucin de un valor de tipo flotante . . Devolucin de un valor de tipo carcter de longitud variable . . . . . . . . . . Devolucin de valores de matriz . . . . . . . . . . 283 285 285 306 322
Captulo 27. Instalacin del cdigo de tiempo de ejecucin y las aplicaciones para Windows NT/95/98 . 407
Instalacin del cdigo de tiempo de ejecucin . Nota acerca del SQL incorporado. . . . . Instalacin de una aplicacin . . . . . . . Mantenimiento del cdigo de tiempo de ejecucin y las aplicaciones . . . . . . . . . . . Instalacin desde la LAN . . . . . . . . Instalacin silenciosa desde la LAN . . . . . . 407 . 407 . 407 . 407 . 408 . 408
Contenido
vii
El programa servidor . . . . . . . . . . Aplicaciones de ejemplo que utilizan colas de datos La aplicacin de cliente . . . . . . . . . El programa servidor . . . . . . . . . . Otras implementaciones posibles . . . . . . . Ejemplo de programa servidor reutilizable . . .
Glosario
. . . . . . . . . . . . . 437
ndice. . . . . . . . . . . . . . . 453
viii
El centro de informacin de AS/400 contiene temas importantes como, por ejemplo, particiones lgicas, sistemas en cluster, Java, TCP/IP, servidores Web y redes seguras. Tambin contiene enlaces de Internet a pginas Web como AS/400 Online Library y AS/400 Technical Studio. En el centro de informacin hay un enlace que describe a grandes rasgos las diferencias de informacin entre el centro de informacin y la biblioteca en lnea. Para obtener una versin en soporte software de las publicaciones de AS/400, consulte la publicacin CD-ROM AS/400e Biblioteca en soporte software, SK3T-1325-04 (SK3T-0118-04).
ix
Para obtener esta informacin, consulte los manuales VisualAge RPG Manual de consulta del lenguaje y VisualAge RPG Manual de consulta de componentes. Cmo trabajar con datos de AS/400 Esta parte del manual trata sobre cmo configurar la aplicacin para poder acceder a datos en un servidor AS/400 y sobre cmo volver a utilizar aplicaciones AS/400 existentes convirtindolas a aplicaciones VisualAge RPG que se ejecutan en una estacin de trabajo programable (PWS). Temas avanzados Esta parte del manual resalta las numerosas caractersticas que puede aadir a la aplicacin VisualAge RPG. Es la seccin a la que debe dirigirse si desea informacin sobre temas tales como imprimir desde la aplicacin, editar la salida, utilizar el depurador, utilizar archivos de imgenes y sonido, crear ayuda en lnea, aadir mensajes y ejecutar la aplicacin en un sistema DBCS. Tambin describe las diversas formas en que las aplicaciones VisualAge RPG pueden compartir datos y comunicarse. Distribucin de la aplicacin Esta parte del manual analiza cmo empaquetar el cdigo de tiempo de ejecucin de VisualAge RPG y la aplicacin. Tambin describe cmo instalar el cdigo de tiempo de ejecucin y la aplicacin en la PWS de un usuario.
Esta publicacin proporciona informacin acerca del lenguaje RPG IV tal como se implementa en el compilador VisualAge RPG. Contiene: v Conceptos bsicos del lenguaje como el juego de caracteres, nombres simblicos y palabras reservadas, directivas del compilador e indicadores. v Tipos y formatos de datos v Manejo de errores y de excepciones v Especificaciones v Funciones incorporadas, expresiones y cdigos de operacin. Para obtener una lista de publicaciones relacionadas, consulte la bibliografa al final de esta publicacin. Gua de aprendizaje de VA RPG y CODE/400 Hay disponible una gua de aprendizaje en formato HTML en el URL siguiente:
http://www.ibm.com/software/ad/varpg/download/#interactive
Esta gua de aprendizaje interactiva registra la evolucin del usuario para poder volver fcilmente al ltimo ejercicio realizado. Hay unas pruebas al final de cada leccin que sirven de ayuda para comprobar los conocimientos adquiridos en la unidad. Nota: Para poder utilizar esta gua de aprendizaje, necesitar un navegador que admita marcos, Java y Javascript. Tambin necesitar una herramienta de extraccin de archivos, como WinZip, que pueda tratar nombres largos de archivos. Tambin puede encontrar la informacin ms reciente sobre VA RPG y CODE/400 en la siguiente fuente en lnea: La pgina de presentacin de VisualAge RPG y CODE/400 http://www.ibm.com/software/ad/varpg/
xi
Comentarios sobre el centro de informacin de AS/400: RCHINFOC@us.ibm.com Asegrese de indicar lo siguiente: v El ttulo del libro v El nmero de la publicacin v El nmero de pgina o el tema al que hace referencia el comentario.
xii
de entrada puede estar en elementos de men, ventanas, recuadros de dilogo y cuadernos de propiedades, o en componentes especficos de los mismos. Para obtener ayuda segn contexto en los recuadros de dilogo, pulse el botn sobre el signo de interrogacin (si est disponible) en el extremo superior derecho de la ventana. Aparece un signo de interrogacin al lado de la flecha del ratn. Pulse el botn sobre una palabra o un campo y aparecer la informacin de ayuda sobre ese determinado campo.
Utilizacin de hipertexto
Algunas ventanas contienen palabras, frases o grficos que aparecen resaltados. Son enlaces de hipertexto que llevan de un tema a otro. Para visualizar ayuda especfica de un tema resaltado, pulse en l. Cuando siga un enlace de hipertexto, puede aparecer un botn Sincronizar en la esquina superior derecha del tema de ayuda. (Quizs deba retroceder pginas para verlo). Si pulsa el botn Sincronizar, la lista de temas del marco izquierdo se renueva a fin de mostrarle el lugar que ocupa el tema actual en la tabla de contenido general.
xiii
xiv
xv
xvi
c: es la unidad en la que ha instalado el producto y HOSTNAME es el nombre del sistema AS/400 en el que ha creado el archivo de salvar. (En lugar del nombre, puede utilizar la direccin TCP/IP del AS/400). c. Entre el ID de usuario del AS/400 cuando as se lo solicite. d. Entre la contrasea cuando as se lo solicite. e. Una vez haya iniciado la sesin, haga que USER sea la biblioteca actual. Entre:
ftp>cd user
Aparecer el mensaje 200 Representation type is binary IMAGE. g. Transfiera el archivo de salvar. Entre:
ftp>put VIDEOSTORE.sav
El mensaje File transfer completed successfully. indica que se ha subido el archivo VIDEOSTORE.sav. h. Entre: ftp>quit El archivo de salvar VIDEOSTORE debe estar ahora en la biblioteca USER del sistema AS/400. i. Utilice el mandato RSTLIB para restaurar la biblioteca y conservar el mismo nombre, VIDEOSTORE, en el sistema AS/400. De lo contrario, cambie el parmetro REMOTE_FILE_NAME del archivo Catalog.rst por el nombre con el que ha restaurado el archivo de salvar. j. En el archivo Catalog.rst file, cambie el parmetro REMOTE_LOCATION_NAME de modo que apunte al nombre de la ubicacin remota del sistema AS/400. 3. Cree la aplicacin de ejemplo Video Store Catalog. Seleccione Construir>Windows NT/95/98 o Construir>Java en el men emergente de la carpeta del proyecto Video Store Catalog de la carpeta Proyectos de ejemplo de VisualAge RPG. Cuando se construye satisfactoriamente el proyecto, se crea un programa ejecutable, CATALOG.EXE para Windows, o CATLAOG.CLASS para Java, en la carpeta del proyecto Video Store Catalog. 4. Construya el componente Preview asociado. Seleccione Construir>Windows NT/95/98 o Construir>Java en el men emergente de la carpeta del proyecto Preview. Cuando el proyecto se construye satisfactoriamente, se crea una biblioteca de enlace dinmico (COMMON.DLL) para Windows, o bien un archivo COMMON.CLASS para Java. Utilice uno de los mtodos siguientes para ejecutar la aplicacin Catlogo de vdeos: v Seleccione Ejecutar>Windows NT/95/98 o Ejecutar>Java en el men emergente de la carpeta del proyecto Video Store Catalog. v Abra la carpeta de proyecto Catlogo de vdeos y efecte una doble pulsacin en el icono CATALOG.EXE. v Escriba catalog en una lnea de mandatos. Notas: 1. Los aspectos multimedia de esta aplicacin requieren un hardware y un software adicionales. Para ejecutar el audio en la previsualizacin, debe tener una tarjeta de sonido en el sistema. Para ejecutar la secuencia de vdeo en la previsualizacin, debe tener instalado Media Player. Las aplicaciones Java deben tener instalada la API JMF (Java Media Framework). 2. Las secuencias de vdeo son archivos AVI (para Windows) o bien MOV (para Java) que estn almacenados en la carpeta Preview.
3. Para construir y ejecutar aplicaciones Java, debe tener instalado el Java 2 Software Development Kit (J2SDK) Versin 1.2, o superior, de Sun, en la estacin de trabajo. Si no tiene el J2SDK, puede bajarlo de Sun Microsystems en el URL siguiente:
http://www.javasoft.com/products/
Tras instalar el J2SDK, establezca la variable de entorno PATH de modo que apunte a la ubicacin tanto del compilador Java como del Java Runtime Environment (JRE). Por ejemplo, si el directorio inicial de J2SDK es c:\jdk1.2, aada la siguiente sentencia en la variable PATH: c:\jdk1.2\bin
Al seleccionar Help Catalog se visualiza la ventana Get Help on using the Catalog. Si acciona uno de los otros pulsadores, se visualiza otra ventana desde la que podr realizar otras acciones, tales como ver listas, previsualizar secuencias del vdeo o generar un pedido de compra.
Para seleccionar una categora, el cliente acciona su pulsador asociado. Esto hace que se visualice la ventana Video Titles, que lista los ttulos de esa categora. Los clientes pueden visualizar previamente algunos de los ttulos, aadir un ttulo a su pedido, suprimirlo del pedido si han cambiado de opinin, y someter su pedido al cajero.
Previsualizacin de ttulos
Los clientes pueden tener informacin previa de un vdeo que est en la lista leyendo un resumen del mismo o, si tienen el hardware y el software apropiados, pueden ver una secuencia del vdeo con el audio asociado.
Generacin de pedidos
Cuando los clientes generan sus pedidos, deben proporcionar su nombre, direccin y nmero telefnico en la ventana Video Catalog Order Reference. Esta informacin se almacena en una base de datos en el AS/400.
Al accionar el pulsador Comedy en la ventana Video Catalog Categories se visualiza la ventana Video Catalog Comedy.
Al pulsar el botn Preview despus de seleccionar un ttulo en la ventana Video Catalog Comedy se visualiza una ventana Preview.
Si desea ver el diseo de la aplicacin de ejemplo, seleccione Editar en el men emergente de la carpeta del proyecto Video Store Catalog en la carpeta Proyectos de ejemplo de VisualAge RPG. Esta accin visualiza la ventana de proyecto de la aplicacin y la paleta de componentes. La ventana de proyecto muestra todas las ventanas definidas en la aplicacin. Efecte una doble pulsacin en cualquier entrada para ver su ventana de diseo con los componentes asociados. Para ver el cdigo fuente VARPG del proyecto, seleccione Proyecto>Editar cdigo fuente en la ventana del proyecto.
La ventana Comedy visualiza la lista de vdeos de comedias que los clientes pueden adquirir. Esta seccin describe cmo puede crear una ventana que se parezca a sta.
Creacin de la GUI
Seleccione una ventana con componente lienzo desde la paleta de componentes con el botn derecho del ratn, mueva el icono del puntero sobre la vista de proyecto del Diseador GUI, y vuelva a pulsar el botn derecho del ratn. Se convierte en la ventana de diseo, en la que situar los siguientes componentes de la paleta: recuadro de grupo, pulsador, texto esttico y subarchivo.
Captulo 1. Creacin de una aplicacin Cliente/Servidor
Atributos de ventana
Puede seleccionar los elementos que desea que aparezcan en la ventana (tales como el men del sistema, la barra de ttulo y los botones de minimizar y maximizar) y configurar el borde de la ventana. Por omisin, la ventana utiliza el font del sistema y tiene un fondo blanco. Puede cambiar el font y el color.
Atributos de lienzo
Por omisin, el componente lienzo utiliza el font del sistema, y el fondo es el mismo que el de la carpeta. Puede cambiar el font y el color de fondo del componente lienzo. Tambin puede colocar un grfico en el componente lienzo.
Atributos de subarchivo
Por omisin, el componente subarchivo se crea sin columnas. Si conoce los nombres de campo de base de datos, puede crear campos de entrada de subarchivo mediante el Diseador GUI. De lo contrario, puede hacer referencia a los campos existentes en la base de datos de AS/400 siguiendo estos pasos: 1. Seleccione Definir campos de referencia del men Servidor. Aparece la ventana Definir campos de referencia. 2. Especifique la informacin de AS/400 y biblioteca para ver la informacin de campos de base de datos. 3. Seleccione los campos adecuados del recuadro de lista Campos con el botn derecho del ratn, mueva el icono del puntero sobre el componente subarchivo de la ventana de diseo, y vuelva a pulsar el botn derecho del ratn. El nuevo campo de entrada de subarchivo hereda los atributos del campo original: Length se establece en la anchura de columna y Type en el tipo de datos. Establezca el estilo y el tipo de datos para un campo de entrada de subarchivo mediante el cuaderno de propiedades adecuado. Por ejemplo, puede establecer la longitud o el tipo de datos.
Atributos de pulsador
Etiquete cada uno de los pulsadores para indicar al usuario la finalidad del pulsador. Para crear un carcter nemotcnico para cada pulsador, coloque el identificador del nemotcnico antes de dicho carcter en la etiqueta. En Windows NT, utilice el smbolo &. Observe que se han puesto unos puntos suspensivos ( ... ) en la etiqueta del pulsador Review/submit order con el fin de que los usuarios sepan que deben proporcionar ms informacin despus de pulsar el botn para generar el pedido.
Para cada pulsador, especifique qu accin se producir cuando un usuario lo accione. Por ejemplo, para el pulsador Preview se realizar una subrutina de accin; para el pulsador Help, se visualizar ayuda para la ventana. Puede establecer esta informacin en el separador Accin del cuaderno de propiedades del pulsador. (Consulte Creacin de la ayuda en lnea en la pgina 15 para obtener informacin relacionada.)
2. Escriba la lgica de programa para leer los ttulos de vdeos de comedia de la base de datos de AS/400 y rellene el componente subarchivo con la lista de ttulos. Llame a la subrutina dspbrowse para comprobar si la base de datos est vaca o no. Si la base de datos no est vaca, establezca el ttulo de la ventana de examinar para que visualice los ttulos de comedias encontrados. De lo contrario, visualice el nmero de mensaje MSG0001 para informar al usuario de que no se ha encontrado ninguna coincidencia en la base de datos. Consulte Figura 3 en la pgina 10.
Captulo 1. Creacin de una aplicacin Cliente/Servidor
********************************************************************* * * * Subrutina de usuario: brComedy * * Descripcin : Mostrar ventana Browse con vdeo Comedy * * * ********************************************************************* C C C C C C C C C C C C C C . . . ********************************************************************* * * * Subrutina de usuario: dspbrowse * * Descripcin : Comprobar si el subarchivo de examinar est * * vaco. Si es as, mostrar mensaje MSG00001. * * * ********************************************************************* C C C C C C C C C dspbrowse items *MSG0001 BEGSR eval ifeq dsply else eval eval endif ENDSR items=%getatr('BROWSEW':'BROWSESF':'Count') 0 msgrsp 9 0 %setatr('BROWSEW': 'BROWSEW': 'VISIBLE')=1 %setatr('BROWSEW': 'BROWSEW': 'FOCUS')=1 BEGSR clear browsesf Obtener registros de vil0004, el archivo lgico en el AS/400 para vdeos de tipo Comedy. *start setll vil0004 read vil0004 61 *IN61 doweq '0' exsr ckcriteria read vil0004 61 end exsr dspbrowse Las siguientes tres lneas definen el texto de la barra de ttulo de la ventana Browse. movel *blanks vdocatstl movel stlcmdy vdocatstl eval %setatr('browsew':'browsew':'Label') = vdocatttl ENDSR brComedy
* *
* *
10
********************************************************************* * Cuando se selecciona el pulsador Preview de la ventana Browse, se inicia * el componente comn. Este componente muestra la ventana Preview * de un vdeo. * * C PREVIEWPB BEGACT PRESS BROWSEW C READS BROWSESF 55 C *IN55 ifeq '0' C start 'common' C parm brsfpart C endif C ENDACT
La ventana Preview utiliza las posibilidades multimedia del sistema operativo para proporcionar a los clientes una visualizacin breve de una secuencia del vdeo. Esta seccin describe cmo puede crear una ventana que se parezca a sta. Nota: Para ejecutar el audio en la previsualizacin, debe tener una tarjeta de sonido en el sistema. Para ejecutar la secuencia de vdeo, debe tener instalado Media Player. Las aplicaciones Java deben tener instalada la API JMF (Java Media Framework).
Creacin de la GUI
Seale y pulse los siguientes componentes a un componente ventana con lienzo para crear una ventana que se parezca a la ventana Preview: v Componente medios v Componente edicin de mltiples lneas v Componentes pulsador v Componentes texto esttico
Captulo 1. Creacin de una aplicacin Cliente/Servidor
11
12
********************************************************************* * Fvideo if e k disk remote BLOCK(*YES) * DFlg s 1 inz(*OFF) DFldx s 12 * ********************************************************************* * C *entry PLIST C parm partno 5 0 * ********************************************************************* * Subrutinas de enlace de accin para PREVIEWW * ********************************************************************* * C PREVIEWW BEGACT CREATE PREVIEWW C partno setll video 50 C N50*msg0001 DSPLY msgrsp 9 0 C read video 51 C *IN51 IFEQ '0' C 'TITLEST' SETATR vititle 'label' C 'DIRST' SETATR vidirect 'label' * C viactr1 CAT viactr2:1 actors 41 C 'ACTST' SETATR actors 'label' * C 'ABSTMLE' SETATR vireview 'text' * * Si es para Java, utilizar el archivo .mov /If defined(COMPILE_JAVA) * C vibitmap CAT '.mov':0 videofil 13 * Si no es para Java, utilizar el archivo .avi /else C vibitmap CAT '.avi':0 videofil 13 /EndIf C endif *significa que videofil no se ha cargado todava en Audio C move 'N' loaded * C ENDACT * *
13
********************************************************************* * C PBPLAY BEGACT PRESS PREVIEWW * C if loaded='N' C eval %setatr('previeww':'audo':'FileName') C =videofil C move 'Y' loaded 1 C endif * C eval %setatr('previeww':'audo':'audioMode')=2 * C ENDACT * * ********************************************************************* * C PBPAUSE BEGACT PRESS PREVIEWW * C eval %setatr('previeww':'audo':'audioMode')=1 C ENDACT * * ********************************************************************* * C PBRECORD BEGACT PRESS PREVIEWW * C eval %setatr('previeww':'audo':'audioMode')=3 C ENDACT * * ********************************************************************* * C PBSTOP BEGACT PRESS PREVIEWW * C eval %setatr('previeww':'audo':'audioMode')=4 C ENDACT * * ********************************************************************* * C CANCELPB BEGACT PRESS PREVIEWW * C move *on Flg C STOP C ENDACT * * ********************************************************************* * C PREVIEWW BEGACT CLOSE PREVIEWW * C if Flg=*ON C eval Fldx='*DEFAULT' C else C eval Fldx='*NODEFAULT' C endif C ENDACT Fldx *
14
Creacin de mensajes
Para aadir mensajes, seleccione ProyectoDefinir mensajes en el Diseador GUI. Aparecer la ventana Definir mensajes. Seleccione Create, y luego seleccione el tipo de mensaje que desea crear (por ejemplo, informacin o aviso). Escriba el texto del mensaje y cualquier informacin adicional o ayuda de segundo nivel en los espacios que se proporcionan. VisualAge RPG genera automticamente un ID de mensaje para el mensaje que crea. Haga referencia a ese ID de mensaje en el cdigo. Por ejemplo, en la Figura 3 en la pgina 10, el cdigo de operacin DSPLY utiliza MSG0001.
:h1 res=01. es un cdigo de cabecera que contiene un identificador de recurso. El identificador de recurso se genera automticamente no edite este texto. La cabecera aparece justo despus de este cdigo; se utiliza en el panel de ayuda y se lista en el ndice de ayuda en tiempo de ejecucin. Por omisin, el nombre del componente para el que se aade texto se utiliza como cabecera. Debe sustituirlo por una cabecera que identifique el propsito del panel de ayuda y que sea ms significativa para los usuarios. Escriba el texto de ayuda despus del cdigo :p. Por omisin aparece la palabra Ayuda en la sesin de edicin. En la Figura 8 se muestra un ejemplo de texto de ayuda de la aplicacin Catlogo de vdeos. El panel de ayuda que se genera a partir de ese cdigo fuente y se visualiza en tiempo de ejecucin se muestra en la Figura 9 en la pgina 16.
:h1 res=12.Browse by Category :p.Seleccione esto para buscar vdeos por categoras.
15
16
Figura 11. Ejemplo de ayuda para una ventana que contiene un enlace de hipertexto
Si desea obtener ms informacin acerca de la creacin de ayuda en lnea para la aplicacin, puede consultar los siguientes temas: v Captulo 13. Consejos para crear ayuda en lnea con IPF en la pgina 235 v Captulo 14. Consejos para la creacin y utilizacin de ayuda Windows en la pgina 239 v Captulo 15. Consejos para la creacin de JavaHelp en la pgina 243
17
Cada componente responde a un conjunto de eventos predefinidos. Habitualmente, los eventos se generan como resultado de una interaccin del usuario con la GUI. Por ejemplo, seleccionar un pulsador seala un evento Press. El programa tambin puede generar eventos. Por ejemplo, el componente cliente DDE genera un evento Timeout si no puede iniciar una conversacin con un programa servidor dentro de un perodo de tiempo predeterminado. Responda a eventos en el programa codificando los cdigos de operacin BEGACT (iniciar accin) y ENDACT (finalizar accin). El cdigo entre estos cdigos de operacin, denominado subrutina de accin, se ejecuta para un evento en particular. Si no codifica una subrutina de accin, no se emprende ninguna accin cuando se produce el evento. 5. Adicin de mensajes y ayuda en lnea Adems de crear la GUI y escribir parte de la lgica de programa para que se ejecute, puede aadir mensajes y ayuda en lnea a la aplicacin.
18
19
Ayuda para tareas Informacin acerca de tareas que el usuario puede realizar con la aplicacin. Ayuda para herramientas Globos de ayuda acerca de las herramientas disponibles para el usuario. Ayuda a nivel de ventana Informacin acerca del contenido de una ventana. Tambin se puede ayudar a los usuarios proporcionndoles toda la informacin que necesitan para completar una tarea y suministrar solicitudes y etiquetas con significado en los componentes de GUI. Puede utilizar puntos suspensivos (...) para indicar que se necesita ms informacin antes de poder realizar una accin determinada. (Por ejemplo, utilice Visualizar... para que los usuarios sepan que se les solicitar ms informacin antes de que se lleve a cabo la accin de visualizar). No utilice puntos suspensivos en una etiqueta si la accin se realizar inmediatamente despus de pulsar el botn. Por ejemplo, el botn Ayuda no necesita puntos suspensivos en la etiqueta, porque la informacin de ayuda se visualiza en cuanto se pulsa el botn. Tambin puede proporcionar ayuda en forma de un campo de texto esttico que se actualiza cuando el puntero del ratn se mueve sobre diferentes componentes de la interfaz. Puede minimizar la cantidad de informacin que los usuarios tienen que proporcionar estableciendo valores por omisin. Por ejemplo, puede utilizar un recuadro de combinacin para dar a los usuarios la opcin de seleccionar elementos en una lista de opciones utilizadas habitualmente. Esto evita errores de tecleo durante la ejecucin.
Nmero de ventanas
Es aconsejable tener una ventana principal desde la que el usuario pueda iniciar todas las tareas principales. Proporcione ventanas secundarias para obtener informacin adicional que los usuarios deben especificar para completar una tarea. Evite que haya muchas ventanas anidadas, porque demasiadas capas hacen que una tarea sencilla parezca compleja. Recuerde tambin que demasiadas ventanas llenarn toda la pantalla del usuario, especialmente si ste est ejecutando ms de una aplicacin. Los usuarios tambin pueden desorientarse si tienen muchas ventanas en la pantalla. Intente minimizar el nmero de componentes de cada ventana. Esto aumentar el rendimiento cuando se visualicen ventanas. Una aplicacin con muchas ventanas y pocos componentes por ventana funcionar mejor que la misma aplicacin con pocas ventanas y muchos componentes por ventana.
20
Utilice imgenes grficas e iconos para identificar tareas o para complementar las palabras de la ventana. Asegrese de que todo el texto est escrito correctamente. Site los componentes en las ventanas de una manera ordenada y lgica. No es preciso que planifique la posicin de algunos componentes, porque su posicin est predeterminada. Por ejemplo, un componente barra de mens siempre se ubica justo debajo de la barra de ttulo de una ventana. Si las ventanas tienen componentes comunes, debe visualizar esos componentes en una ubicacin coherente. Esto facilita a los usuarios encontrar informacin comn.
21
22
23
24
25
se crea la ventana donde estn. Al crear una ventana o un componente, se carga en la memoria. Cualquier intento de hacer referencia a un componente que todava no se ha creado da como resultado un mensaje Componente no encontrado.
Respuesta a eventos
Cada componente responde a un conjunto de eventos predefinidos. Puede utilizar uno de los siguientes mtodos para obtener una lista de eventos predefinidos: 1. Consulte el manual VisualAge RPG Manual de consulta de componentes si desea ver una lista completa. 2. Pulse F1 cuando el foco est en el componente de la paleta o del catlogo para obtener una descripcin general del componente y una lista de los atributos y eventos asociados con ese componente. 3. En el Diseador GUI, invoque el men emergente para el componente y seleccione el elemento Eventos. Habitualmente, los eventos se generan como resultado de alguna interaccin con la interfaz de usuario. Por ejemplo, al accionar un pulsador se seala un evento Press. El programa tambin puede generar eventos. Por ejemplo, el componente cliente DDE genera un evento Timeout si no puede iniciar una conversacin con un programa servidor dentro de un perodo de tiempo predeterminado. Si el programa cambia el valor del texto de un componente campo de entrada, el campo de entrada seala un evento Change. Responda a eventos en el programa codificando los cdigos de operacin BEGACT (iniciar accin) y ENDACT (finalizar accin). El cdigo entre estos cdigos de operacin, denominado subrutina de accin, se ejecuta para un evento en particular. Cuando se crea una subrutina de accin para un evento especfico, se define un enlace de accin. Si no codifica una subrutina de accin para un evento en particular, no se emprende ninguna accin cuando se produce el evento. El cdigo en una subrutina de accin se ejecuta hasta que se alcanza el cdigo de operacin ENDACT. Por consiguiente, si ha codificado cdigos de operacin EXSR dentro de una subrutina de accin, estas subrutinas (denominadas subrutinas de usuario) tambin se ejecutan. No puede invocar una subrutina de accin utilizando el cdigo de operacin EXSR. Sin embargo, puede invocar una subrutina de accin en particular mediante ms de una accin. Por ejemplo, puede tener un cdigo que se ejecuta cuando se acciona un pulsador o cuando se selecciona un elemento de men. Puede revisar los eventos que tienen subrutinas de accin y modificar eventos de enlace a subrutinas de accin en la ventana Subrutinas de accin. Para visualizar la ventana Subrutinas de accin: 1. Seleccione Editar cdigo fuente del men Proyecto en el Diseador GUI. Esto inicia una sesin de edicin. 2. Desde la sesin de edicin, seleccione EditarSubrutinas de accin. Aparece la ventana Subrutinas de accin. Los atributos de evento contienen datos que son relevantes para un evento. Por ejemplo, el evento MouseMove almacena las coordenadas X e Y para indicar dnde estaba ubicado el ratn cuando se produjo el evento. Antes de que pueda utilizar atributos de evento en el programa, deben definirse en especificaciones de definicin. El nombre del atributo de evento es el nombre de la entidad en la especificacin de definicin. Dado que el compilador no verifica la longitud de la variable y algunos atributos tienen longitudes variables, asegrese de especificar una longitud lo bastante grande para contener el valor esperado.
26
Nota: El programa no puede cambiar los atributos de evento. Por consiguiente, no pueden aparecer en un campo de resultado como el campo destino para una operacin EVAL. En el manual VisualAge RPG Manual de consulta de componentes se describen todos los atributos de evento. El siguiente ejemplo muestra cmo los atributos de evento %MouseX y %MouseY pueden definirse y utilizarse en un programa.
* * Definir atributos de evento de coordenadas x e y del ratn * DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords++++++++++++++++++++++++ D%MouseX S 4P 0 D%MouseY S 4P 0 * * Comprobar si las coordenadas del ratn estn en el rango: * CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq... CSRN01Factor1+++++++Opcode(E)+Extended-factor2++++++++++++++++++++++++++ C %MouseX ifgt 100 C %MouseY andgt 100 C .. C endif * ***** Fin de fuente
Atributos de sistema
Los atributos de sistema pertenecen a la aplicacin y no a un componente especfico. Como sucede con los atributos de evento, los atributos de sistema deben definirse en una especificacin de definicin. El programa no puede modificar los atributos de sistema. VisualAge RPG soporta los siguientes atributos de sistema:
Tabla 1. Atributos de sistema
Atributo %DspHeight Descripcin Tipo Longitud 4
Devuelve la altura de Numrico la pantalla, en tiempo de ejecucin, en pixels. Devuelve la anchura de la pantalla, en tiempo de ejecucin, en pixels. Numrico
%DspWidth
27
realiza en tiempo de ejecucin. Si define un campo de tipo carcter para un atributo de evento numrico, este error slo se detecta en tiempo de ejecucin. Los atributos del sistema pueden utilizarse en cualquier lugar del programa, porque no estn enlazados con ningn evento en particular. La comprobacin de tipos en los atributos de evento se realiza en tiempo de compilacin. Los atributos de evento y de sistema deben definirse en una especificacin de definicin antes de que puedan utilizarse en todo el componente lgico VisualAge RPG. El compilador los trata como campos de slo lectura en el almacenamiento automtico. Cualquier subrutina de accin anidada y activa tiene su propia copia de un atributo de evento. Por ejemplo, suponga que la subrutina de accin ENT0000A+CHANGE+WIN1 est enlazada a la ventana WIN1, al componente campo de entrada ENT0000A y al evento CHANGE.
CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq.. CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++ C ENT0000A BEGACT CHANGE WIN1 C . C . C %PART dsply boxid reply * Se visualiza 'ENT0000A'. C . C . C endact
Suponga tambin que la subrutina PSB0000A+PRESS+WIN1 est enlazada a la ventana WIN1, al componente pulsador PSB0000A y al evento PRESS.
CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq.. CSRN01Factor1+++++++Opcode(E)+Extended-factor2++++++++++++++++++++++++ C PSB0000A BEGACT PRESS WIN1 C . C %PART dsply boxid reply * Se visualiza 'PSB0000A'. C . C ENT0000A SETATR 10 TEXT * Desencadena el evento CHANGE para el campo de entrada ENT0000A * que hace que se invoque la subrutina de accin ENT0000A+CHANGE+WIN1. * C . C . C %PART dsply boxid reply * Se visualiza 'PSB0000A'. C . C . C endact
Cuando se acciona el pulsador PSB0000A, se invoca la subrutina de accin PSB0000A+PRESS+WIN1. Cuando se ejecuta la operacin SETATR, se desencadena el evento CHANGE para el componente campo de entrada ENT0000A. Esto invoca la subrutina de accin ENT0000A+CHANGE+WIN1. Cada subrutina de accin tiene su propio almacenamiento para %PART porque los campos de atributo de evento estn en el almacenamiento automtico: v En la subrutina de accin PSB0000A+PRESS+WIN1, %PART contiene PSB0000A. v En la subrutina de accin ENT0000A+CHANGE+WIN1, %PART contiene ENT0000A.
28
v Cuando se completa la subrutina de accin ENT0000A+CHANGE+WIN1 y la subrutina de accin PSB0000A+PRESS+WIN1 sigue ejecutndose, %PART contiene PSB0000A, no ENT0000A.
29
En general, es aconsejable utilizar una subrutina de accin enlazada al evento Create para establecer valores que deben aparecer en la pantalla cuando se abre una ventana.
30
entrada. Esto puede variar de una construccin a otra, de manera que cuando varios componentes comparten el mismo campo, no debe dependerse del campo que tenga un valor inicial especfico, a menos que se establezcan todos los valores iniciales como iguales. Ejecutar una operacin en una de las ventanas que contiene uno de estos componentes, o en uno de los componentes, da como resultado que el campo de entrada contenga un valor que coincida con el valor de pantalla del componente implicado en la operacin. No obstante, el campo contiene un valor que probablemente no coincide con los valores de pantalla de los otros componentes en otras ventanas que comparten este campo. Aunque varios componentes comparten el mismo campo, una operacin en cualquiera de estos componentes slo afecta al componente especificado en la operacin o contenido en la ventana especificada en la operacin. Los otros componentes que comparten el campo no se ven afectados.
Ejemplo
El siguiente ejemplo muestra lo que puede suceder cuando se establece el valor de uno de los componentes en un valor de otro componente cuando stos comparten un campo. 1 Definicin de los campos: El campo de entrada A01 en la ventana W1 se define como de 10 caracteres, al igual que en la ventana W2. El valor en la pantalla para W1 es 78893, y el valor en la pantalla para W2 es 885364. El campo A01 contiene el valor 0000000000. Estos son los valores iniciales.
W1
A01
78893
W2
A01
885364
Pr ogr am Fi el d
A01
0000000000
2 Ejecucin de una operacin READ en W1: El campo A01 contiene ahora 78893. Coincide con el campo de entrada A01 en W1.
W1
A01
78893
W2
A01
885364
Pr ogr am Fi el d
A01
78893
3 Ejecucin de una operacin WRITE en W2: El valor de pantalla del campo de entrada A01 en W2 es ahora 78893.
W1
A01
78893
W2
A01
78893
Pr ogr am Fi el d
A01
78893
4 Ejecucin de una operacin CLEAR en W2: El campo A01 contiene ahora blancos. Coincide con el campo de entrada A01 en W2. Campo de entrada A01 en W1 - el valor en pantalla es 78893. Campo de entrada A01 en W2 - el valor en pantalla es un blanco.
31
W1
A01
78893
W2
A01
Pr ogr am Fi el d
A01
5 Ejecucin de una operacin GETATR en el campo de entrada A01 de W1 con el campo destino A01: El campo A01 contiene ahora 78893. Coincide con el campo de entrada A01 en W1.
W1
A01
78893
W2
A01
Pr ogr am Fi el d
A01
78893
Si desea que todos los componentes que comparten un campo visualicen el mismo valor, tiene que ejecutar operaciones SETATR en todos los componentes utilizando el campo como valor fuente, o ejecutar operaciones WRITE en todas las ventanas que contengan uno de estos componentes. Es recomendable dar nombres exclusivos a todos los componentes campo de entrada en el componente lgico, para impedir que se establezca accidentalmente el valor de uno de los componentes como el valor de otro.
32
33
Notas: 1. * Este ejemplo requiere datos en un sistema AS/400. 2. ** Tambin muestra cmo utilizar los atributos BackMix y ForeMix.
Antes de empezar
Antes de ejecutar e instalar las aplicaciones de ejemplo, debe instalar VisualAge RPG. Consulte el manual Instalacin de VisualAge RPG y CODE/400 para AS/400, para obtener informacin y ejemplos de instalacin. Antes de utilizar los ejemplos, lea los comentarios del programa de ejemplo. Estos comentarios contienen consejos y requisitos, as como posibles restricciones. Para construir y ejecutar aplicaciones Java, debe tener instalado el Java 2 Software Development Kit (J2SDK) Versin 1.2, o superior, de Sun, en la estacin de trabajo. Si no tiene el J2SDK, puede bajarlo de Sun Microsystems en el URL siguiente:
http://www.javasoft.com/products/
Tras instalar el J2SDK, establezca la variable de entorno PATH de modo que apunte a la ubicacin tanto del compilador Java como del Java Runtime Environment (JRE). Por ejemplo, si el directorio inicial de J2SDK es c:\jdk1.2, aada la siguiente sentencia en la variable PATH: c:\jdk1.2\bin
34
Atributo PartName
Todos los componentes tienen un nombre. VisualAge RPG genera automticamente este nombre cuando se crea el componente. Puede cambiar el nombre del componente en su cuaderno de propiedades o editndolo directamente en la vista de rbol de la ventana de proyecto del Diseador GUI. El nombre de componente *componente lgico no puede editarse. Nota: No puede cambiar el nombre de componente en tiempo de ejecucin. Cada ventana debe tener un nombre exclusivo y todos los componentes en una ventana dada deben tener un nombre exclusivo. Los componentes de ventanas diferentes pueden tener el mismo nombre, salvo los nombres de componente subarchivo, que deben ser exclusivos en todo el componente lgico. Implcitamente, el compilador define un nombre de campo para el campo de entrada y los componentes texto esttico mediante el atributo PartName. Puede utilizar ese nombre en el programa si desea referirse al valor de estos componentes. Para obtener ms informacin, vea el Captulo 3. Programacin con componentes en la pgina 25. Si cambia el nombre de un componente, debe cambiar todas las referencias a ese componente en el fuente del programa. Si intenta hacer referencia al nombre antiguo de un componente que se ha redenominado, obtendr errores de compilacin o un error de tiempo de ejecucin indicando que no ha podido encontrarse el componente.
Atributo ParentName
El atributo ParentName devuelve el nombre del componente padre. El padre es la ventana donde se coloca un componente. Para un componente ventana, el padre es la misma ventana.
Atributo PartType
Puede utilizar el atributo PartType para determinar el tipo de componente en el programa. PartType devuelve el tipo del componente tal como lo define VisualAge RPG. El valor devuelto para los componentes VisualAge RPG consiste en la serie FVDES seguida del tipo de componente. Por ejemplo, para un componente campo de entrada el tipo de componente sera FVDESEntryField. Una excepcin es el componente referencia a componente lgico, que tiene el prefijo FVDESV. La Tabla 3 en la pgina 36 resume el valor del atributo PartType para cada componente VisualAge RPG.
35
36
Atributos de color
Puede cambiar el color de la mayora de componentes mediante los atributos BackColor y ForeColor. Los valores de atributo son nmeros que representan colores especficos. El compilador proporciona un conjunto de constantes representativas, tales como *RED y *GREEN, que pueden utilizarse para establecer los colores. Puede dirigirse a la publicacin VisualAge RPG Manual de consulta del lenguaje si desea consultar estos nombres. Puede especificar una mezcla de colores para el componente mediante los atributos ForeMix y BackMix. El valor de estos atributos representa una mezcla de los colores primarios rojo, verde y azul. Suele hacerse referencia a esto como el valor de color RGB. Este valor RGB es una serie que se compone de tres valores separados por signos de dos puntos (:). Cada valor representa la intensidad de rojo, verde y azul, por este orden. El valor de cada color est entre 0 y 255. En el siguiente ejemplo de cdigo, la mezcla de colores de fondo de un componente texto esttico se establece en un tono medio de azul:
CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq.. * C 'ST1' setatr '000:000:128' 'BackMix'
Para ver un ejemplo ms detallado sobre cmo especificar los atributos ForeMix y BackMix, vea Graduador en la pgina 139.
Atributo Enabled
Cuando se habilita un componente, puede responder a la interaccin del usuario y generar eventos. Por ejemplo, cuando se acciona un pulsador habilitado, genera un evento Press que, a continuacin, el programa puede manejar. Puede que no desee que se habilite un componente hasta que exista una cierta condicin. En caso del pulsador, puede que desee que el usuario pueda pulsarlo slo cuando se ha seleccionado un elemento en un recuadro de lista. Cuando un componente no est habilitado, no responde a la interaccin de usuario y su etiqueta se atena. Para habilitar un componente, establezca su valor de atributo Enabled en 1. Si no desea que un componente est habilitado, establezca este valor en 0.
37
posicin de los componentes en esa ventana, de manera que sigan centrados dentro de la misma. Si no lo hace, los componentes seguirn siendo relativos a la esquina superior izquierda de la ventana. v Si la aplicacin se ejecuta en sistemas que utilizan monitores con resoluciones diferentes, puede utilizar los atributos del sistema %DspWidth y %DspHeight para asegurar que las ventanas sean visibles sin importar la resolucin de pantalla. Puede que desee situar la ventana en el centro de la pantalla o en otra coordenada. ste es un clculo que puede realizarse en el evento Create para una ventana. Este ejemplo calcula las coordenadas adecuadas para centrar una ventana denominada Window1 y luego mueve la ventana a una nueva coordenada antes de visualizarla en la pantalla.
* DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++ * * Declarar atributos de sistema de tamao de pantalla D%DspHeight S 4P0 D%DspWidth S 4P0 * CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq * * Manejar evento de crear para Window1. * Obtiene tamao de pantalla y calcula coordenadas de pixels * para situar la ventana en el centro de la pantalla. * C WINDOW1 BEGACT CREATE WINDOW1 * * Obtener dimensiones de las ventanas: C 'Window1' GETATR 'Width' winWidth 4 0 C 'Window1' GETATR 'Height' winHeight 4 0 * * Calcular nuevas coordenadas para centrar la ventana C %DspWidth SUB winWidth newLeft 4 0 C %DspHeight SUB winHeight newBottom 4 0 C newLeft DIV 2 newLeft C newBottom DIV 2 newBottom * * Centrar la ventana y hacerla visible C 'Window1' SETATR newLeft 'Left' C 'Window1' SETATR newBottom 'Bottom' C 'Window1' SETATR 1 'Visible' C ENDACT *
Atributo Visible
Puede utilizar el atributo Visible para especificar cundo desea que se visualice un componente o una ventana. Por ejemplo, puede que desee que aparezca un pulsador en la pantalla solamente en tiempo de ejecucin. Para ello, al crear el pulsador en el Diseador GUI, vaya al cuaderno de propiedades del componente y desactive el distintivo de visible. Luego, en tiempo de ejecucin, establezca el valor de atributo Visible en 1 cuando desee que aparezca el pulsador.
Atributo Focus
El rea de una ventana donde un usuario puede interactuar con la interfaz tiene el foco de entrada. El componente que tiene el foco de entrada debe habilitarse para responder a las acciones del usuario, tales como pulsar una tecla o un botn.
38
Hay ocasiones en que desear que el foco est en un componente del programa para que el usuario pueda utilizarlo de inmediato. Por ejemplo, si marca varios campos de entrada y requiere que el usuario vuelva a entrar informacin en un campo de entrada en particular, establecer el valor de atributo de Focus en 1 para ese campo de entrada. Cuando establezca el atributo, el cursor aparecer en el lugar donde el usuario pueda empezar a escribir datos en el campo de entrada. Adems de proporcionar un foco a un componente concreto, puede determinar si un componente ha obtenido el foco. Un componente obtiene el foco cuando el usuario lo selecciona, avanzado hasta el mismo con el tabulador o seleccionndolo con el ratn. Cuando esto ocurre, se genera un evento GotFocus para el componente. Y viceversa, se genera un evento LostFocus cuando un componente pierde el foco.
Atributo UserData
Todos los componentes soportan el atributo UserData. Utilice este atributo para asignar cualquier serie de texto a un componente. Esta serie no tiene efecto en el valor de cualquier otro atributo del componente y no se visualiza. El atributo UserData puede contener un mximo de 65.535 caracteres.
Atributo Label
Varios componentes tienen un atributo Label. Es texto descriptivo que explica el propsito del componente. El texto que aparece en un pulsador es un ejemplo de este atributo. Los siguientes componentes tienen un atributo Label: v Recuadro de seleccin v Contenedor v Recuadro de grupo v Elemento de men v Pulsador v Botn de seleccin v Texto esttico v Ventana v Ventana con lienzo
Sustitucin de etiqueta
Puede sustituir el texto de una etiqueta utilizando un smbolo cuando establezca los atributos Label, TabLabel o InfoLabel. Esto es particularmente til si est desarrollando aplicaciones para utilizarlas con otros idiomas, porque le permite traducir las etiquetas y los mensajes que ha definido en el Diseador GUI. Cuando especifique la sustitucin de etiquetas para un componente, se realizar una entrada en el archivo de mensajes del componente. Varios componentes pueden utilizar la misma sustitucin de etiqueta (por ejemplo, |OK). Se utiliza la misma entrada de archivo de mensajes para todas las referencias. Defina una etiqueta de sustitucin para un componente en su cuaderno de propiedades, especificando una serie, sin blancos intercalados, precedida del smbolo (|). Esto aade un mensaje al archivo de mensajes. Seleccione ProyectoDefinir mensajes... para invocar el editor de mensajes y aada el texto de mensaje con que desea sustituir el atributo Label cuando se ejecute la aplicacin.
Captulo 5. Atributos comunes
39
40
Campo de entrada Recuadro de lista Subarchivo de mensajes Edicin de mltiples lneas Texto esttico
41
42
********************************************************************* * * * Ventana. . : MAIN * * * * Componente : EF2 * * * * Evento . . : DROP * * * * Descripcin: Esta subrutina de accin obtendr el control cuando * * se ha transferido un valor al campo de entrada EF2 * * Al comprobar el atributo de evento %Data, * * determinar si se permite el valor transferido para * * el campo de entrada y aadir el mensaje * * correspondiente al componente subarchivo de * * mensajes. * * * ********************************************************************* * C EF2 BEGACT DROP MAIN * * Borrar el subarchivo de mensajes C 'Msg1' setatr 0 'RemoveMsg' * * Comprobar que el valor transferido est permitido * C if %Data <> 'Yes ' and C %Data <> 'No ' and C %Data <> 'Maybe' * C 'Msg1' setatr 1 'AddMsgID' C endif * C ENDACT ********************************************************************* * * * Ventana. . : MAIN * * * * Componente : EF2 * * * * Evento . . : CHANGE * * * * Descripcin: * * * ********************************************************************* * C EF2 BEGACT CHANGE MAIN * C ENDACT
43
44
45
primer lugar para iniciar la construccin de la aplicacin y luego para aadir otros componentes a medida que sea necesario. Si desea obtener ms informacin acerca de los atributos de componente, eventos y atributos de evento, puede consultar el tema VisualAge RPG Manual de consulta de componentes. Para aprender consejos de programacin adicionales, vea el Captulo 3. Programacin con componentes en la pgina 25.
ActiveX
* Restriccin: Este componente no est soportado en las aplicaciones Java. Utilice el componente ActiveX para aadir objetos de control ActiveX al proyecto. Las aplicaciones podrn acceder a los atributos y supervisar los eventos. (Otros proveedores se encargan del desarrollo y suministro de los controles ActiveX.) Debe estar familiarizado con los controles ActiveX que aade. El Diseador GUI de VARPG no puede controlar las funciones que proporcionan estos componentes. Nota: VARPG slo trabaja con controles ActiveX que tengan interfaces escritas en C++. Consulte con su suministrador de controles ActiveX para asegurarse de que VARPG funcionar con el control ActiveX que desea utilizar.
46
Atributos de componente
Activate HasPrpPage OCXProp PartType Top AddEvent Height OCXValue Refresh UserData Bottom Left ParentName RmvEvent Visible DeActivate Method PartName ShowProp Width
Establecimiento de propiedades
Puede establecer las propiedades de un control ActiveX en tiempo de construccin o ejecucin. Para establecer propiedades durante el tiempo de construccin, abra el cuaderno de propiedades del componente ActiveX en la ventana de diseo. Pulse con el botn derecho del ratn en el icono de ActiveX en la ventana de diseo y seleccione Propiedades. Si est disponible un editor de propiedades para el control ActiveX, tambin se visualizar. A continuacin, puede editar directamente los valores de las propiedades. Las propiedades, mtodos y eventos del control ActiveX aparecen en la pgina Informacin del cuaderno de propiedades del componente ActiveX. Seleccione el botn de seleccin apropiado para ver las opciones disponibles. El establecimiento u obtencin de una propiedad durante el tiempo de ejecucin requiere dos pasos. En primer lugar, establezca el atributo OCXProp del componente ActiveX en la propiedad Name del control ActiveX que est utilizando. Utilice el atributo OCXValue para establecer u obtener la propiedad. El siguiente ejemplo establece la propiedad Depth de un control de diagrama circular ActiveX:
C C 'PieChart' 'PieChart' Setatr Setatr 'Depth' DepthValue 'OCXProp' 'OCXValue'
Nota: El atributo OCXValue toma un valor de tipo serie. El tiempo de ejecucin de VisualAge RPG manejar las conversiones adecuadas antes de reenviar el valor al control ActiveX.
47
Llamada a mtodos
El IDE de VisualAge para RPG intenta compilar una lista de mtodos disponibles para el control ActiveX. Esta lista est disponible en la pgina Informacin del cuaderno de propiedades del componente ActiveX. Para cada mtodo, los parmetros se muestran entre corchetes que contienen IN para un parmetro de entrada, OUT para un parmetro de salida o nada si no se dispone de informacin. Nota: Quizs no sea posible para el constructor descubrir todos los mtodos disponibles del control ActiveX. Consulte la documentacin del control para obtener una lista completa. La llamada a los mtodos de un control ActiveX se realiza en tiempo de ejecucin estableciendo el atributo Method del componente ActiveX. El atributo Method toma un valor de tipo serie que contiene el nombre del mtodo, seguido de cero o ms valores de parmetro separados mediante una coma. La sintaxis es:
nombre_mtodo, valor1, valor2, ...
El siguiente ejemplo llama al mtodo AboutBox de un control de grfico circular ActiveX. El mtodo no utiliza parmetros.
C 'PieChart' Setatr 'AboutBox' 'Method'
El siguiente ejemplo llama al mtodo AddData de un control de grfico circular ActiveX. Este mtodo acepta dos parmetros: una etiqueta de tipo serie y un valor de tipo flotante.
D datax C 'PieChart' C Setatr datax const('AddData, ItemX, 3.0') 'Method'
48
Respuesta a eventos
VisualAge RPG puede responder a todos los eventos generados por el control ActiveX que se est utilizando. VisualAge para RPG acepta los eventos del control ActiveX como un OCXEvent. Puede utilizar el evento %RealName para recuperar el nombre real del evento. Para recibir un evento desde un control ActiveX, primero debe registrar el evento en el tiempo de ejecucin de VisualAge RPG. Establezca el atributo AddEvent del componente ActiveX en el nombre de tipo serie del evento que debe recibirse. Tambin puede establecer el atributo AddEvent en *ALL para recibir todos los eventos que genere el control ActiveX. Para eliminar el registro de un evento, establezca el atributo RmvEvent en el nombre de tipo serie del evento.
* Declarar el atributo del evento D %RealName s 20a C C C * Registrar el evento en el tiempo de ejecucin de VisualAge para RPG 'DataQ' Setatr 'Click' 'AddEvent'
* Responder a OCXEvent DATAQ BEGACT OCXEVENT FRA000000B if %RealName = 'Click' * Realizar las acciones oportunas C endif
49
Control de animacin
En las aplicaciones de Windows, el componente control de animacin reproduce los archivos de vdeo con la extensin AVI. Este componente se distingue del componente medios en que el vdeo se reproduce independientemente de la lgica del programa. Un uso habitual de este componente es visualizar un archivo AVI que muestre un progreso como, por ejemplo, un archivo que se traspasa de una carpeta a otra. El componente control de animacin reproduce archivos de vdeo sin sonido. El archivo AVI no puede estar en formato comprimido a menos que se haya comprimido con el mtodo RLE (Running-Length Encoded). En las aplicaciones Java, el componente control de animacin se utiliza para reproducir una secuencia de archivos GIF utilizando el atributo NbrOfImage. Atributos de componente |
FileName Mode PartType FrameRate NbrOfImage Top Handle* ParentName UserData Left PartName Visible
*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Create Destroy
50
Calendario
El componente calendario representa un calendario por meses. Al efectuar una pulsacin sobre una de las flechas de los meses, el usuario puede navegar por el calendario y desplazarse al mes anterior o posterior. Tambin tiene un control del programa absoluto sobre el calendario para desplazarse hasta una fecha especfica, determinar qu fecha ha seleccionado el usuario y aadir breves comentarios de texto a das individuales en el calendario. Atributos de componente
Border ClearMonth ColorMix DateUnder DayNumPos FontArea FontSize Handle* Month OutlineRcl Refresh Top WeekDay YearIdx Bottom ClearYear Date Day DayNumRect FontBold FontStrike* Height MonthArrow ParentName ShowRects UserData WeekDayIdx YearLen ClearAll Color DateIdx DayIdx DayStart FontItalic FontUnder* HRule MonthIdx PartName ShowText Visible Width ClearDate ColorArea DateText DayLen Enabled FontName FrmtString Left MonthLen PartType TipText VRule Year
* Nota:: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Click MouseDown MouseUp Create MouseEnter MthChange Destroy MouseExit YearChange DblClick MouseMove
51
C * C
'Cal1'
Getatr
'DateUnder'
AAAAMMDDA
* Si el ratn est sobre un da... If AAAAMMDDA <> *Blanks * * Ponga la fecha en nmeros C Move AAAAMMDDA AAAAMMDD * * Procese la fecha * ... * ... C EndIf *
8 0
52
Lienzo
Utilice el componente lienzo con una ventana o una pgina de cuaderno si desea incluir ms de un componente en la ventana o en la pgina. Puede colocar diversos componentes en el lienzo sealndolos y pulsando el botn del ratn y cambiarlos de posicin para crear una interfaz grfica de usuario. El componente lienzo ocupa el rea de cliente de una ventana o de una pgina de cuaderno. Si en la ventana o en la pgina de cuaderno no hay lienzo, slo puede colocar un componente en el rea de cliente, a menos que sean extensiones de la ventana, como barras de mens y subarchivos de mensajes. A menudo crear ventanas y pginas de cuaderno que contendrn ms de un componente. En este caso, deber utilizar la pgina de cuaderno y la ventana con el componente lienzo. De este modo se ahorrar un paso, ya que estos componentes ya contienen el lienzo. A la hora de construir, tambin puede incluir una imagen de bitmap a modo de fondo del lienzo; para ello, especifique el atributo FileName. Esta imagen puede ponerse en mosaico estableciendo el atributo Tile. En las aplicaciones Java, puede incluir imgenes GIF o JPG como fondo. Notas: 1. Los componentes lienzo, ventana (sin lienzo) y pgina de cuaderno (sin lienzo) se encuentran en el catlogo de componentes, no en la paleta de componentes. Si va a utilizarlos con frecuencia, puede trasladarlos del catlogo a la paleta de componentes. 2. Si los componentes situados en un componente lienzo tienen especificado el valor de font por omisin (Font del sistema por omisin), heredarn la definicin de font especificada en el componente lienzo. Para aplicar un font determinado a la mayor parte de componentes de un lienzo, especifique ese font en el componente lienzo en lugar de hacerlo en cada componente individual. Para obtener informacin relacionada, consulte el apartado: v Ventana en la pgina 175 v Ventana con lienzo en la pgina 176 v Pgina de cuaderno en la pgina 116 v Pgina de cuaderno con lienzo en la pgina 117.
53
Atributos de componente
BackColor FileName FontSize Height PartType Top* BackMix FontBold FontStrike* Left ReadOnly UserData Bottom* FontItalic FontUnder* ParentName Refresh Width Enabled FontName Handle* PartName Tile
* Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Click MouseDown Create MouseMove DblClick MouseUp Destroy Popup
54
Recuadro de seleccin
Utilice el componente recuadro de seleccin si desea que el usuario elija entre dos estados claramente diferenciados; por ejemplo, activado y desactivado. Una etiqueta asociada con el recuadro de seleccin describe el valor del mismo cuando se selecciona. Normalmente, se utiliza un grupo de recuadros de seleccin para proporcionar una lista de opciones. El usuario puede seleccionar uno, varios o ningn recuadro. Las opciones no se excluyen mutuamente; por lo tanto, al marcar un recuadro de seleccin, el resto de recuadros de seleccin de la ventana no resulta afectado. Si desea que el usuario pueda seleccionar slo una opcin de un grupo de dos o ms, es necesario utilizar botones de seleccin. Consulte el apartado Botn de seleccin en la pgina 136 para obtener ms informacin. Para definir el estado de un recuadro de seleccin, el usuario puede pulsar el botn del ratn en el mismo, pulsar la barra espaciadora cuando el recuadro tenga el foco o pulsar la tecla correspondiente al nemotcnico (si le ha asignado una). Atributos de componente
AddLink* Bottom FontBold FontStrike* Handle* Left Refresh Top AllowLink* Checked FontItalic FontUnder* Height ParentName RemoveLink* UserData BackColor Enabled FontName ForeColor Highlight* PartName ShowTips Visible BackMix Focus FontSize ForeMix Label PartType TipText Width
*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Create MouseMove Destroy Popup MouseEnter Select MouseExit
55
Establecimiento de un nemotcnico
Nota: Los nemotcnicos no estn soportados en las aplicaciones Java. Para especificar una clave nemotcnica para el recuadro de seleccin, coloque el identificador nemotcnico delante de un carcter en la etiqueta del recuadro de comprobacin. En Windows NT/95/98, se utiliza el smbolo &. Este carcter es la clave nemotcnica y se visualizar en la interfaz con un subrayado (por ejemplo, Visible). El subrayado informa a los usuarios que pueden seleccionar el recuadro de seleccin pulsando la tecla subrayada en el teclado.
Sealizacin de eventos
Cuando el usuario selecciona un recuadro de seleccin para activar o desactivar el estado, se seala un evento Select.
56
Recuadro de combinacin
Un recuadro de combinacin ofrece al usuario la opcin de escribir informacin especfica o de seleccionarla en una lista de opciones utilizadas con frecuencia. Consiste en un campo de entrada con un recuadro de lista asociado que presenta una lista de valores que el usuario puede seleccionar. Si el usuario selecciona uno de estos valores, el valor aparecer en el campo de entrada y sustituir al texto que hubiese previamente. Tambin puede escribir un valor, que no ha de coincidir con ninguno de los que estn en la lista, directamente en el campo de entrada. Los recuadros de combinacin tienen diferentes estilos. Puede seleccionar el estilo que desee en el cuaderno de propiedades del componente. Para obtener informacin relacionada, consulte los apartados: v Recuadro de lista en la pgina 90 v Campo de entrada en la pgina 72 Atributos de componente
AddItemEnd Bottom DeSelect* FieldExit FontItalic FontUnder* Handle* ItemKey PartType Search* Sequence* SizeToFit* UseDelim AutoScroll* Case* DragEnable* FirstSel FontName ForeColor Height Left ReadOnly SearchType* SetItem Text UserData BackColor Count DropEnable* Focus FontSize ForeMix Index ParentName Refresh Selected SetTop* TipText Visible BackMix DelimChar Enabled FontBold FontStrike* GetItem InsertItem* PartName RemoveItem SelectItem Showtips Top Width
*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones.
57
*Nota: Consulte la descripcin del evento si desea saber cules son las restricciones.
58
Eliminacin de elementos
Utilice el atributo RemoveItem y el valor Index del elemento que desea eliminar. Los valores de Index comienzan en el 1. Cuando se elimina un elemento de la lista, todos los elementos que siguen al elemento eliminado ascienden una posicin en la lista. Si desea eliminar todos los elementos de la lista, especifique el valor 0 en Index.
59
El usuario tambin puede escribir un valor en la parte de campo de entrada del recuadro de combinacin. Este valor no tiene que ser necesariamente uno de los valores de la lista. Si desea que el usuario pueda seleccionar slo aquellos elementos que estn en la lista, establezca el valor 0 en el atributo ReadOnly. Puede utilizar el atributo Count para determinar si hay elementos que recuperar.
Utilizacin de claves
Tanto el recuadro de lista como el recuadro de combinacin le permiten aadir elementos a la lista que constan de una parte clave y de una parte de datos. Cuando se aaden elementos a la lista, slo se visualiza la parte de datos del elemento. Si el usuario selecciona un elemento, podr recuperar mediante el programa la parte clave del elemento. Para habilitar las claves de una lista, deber seleccionar el recuadro de seleccin Utilizar separador en la pgina Separador del cuaderno de valores de los componentes y especificar un carcter separador. El carcter separador por omisin es el punto y coma (;). Los elementos de la lista constan de la parte clave, seguida de un separador, seguida de la parte de datos. Por ejemplo:
01;Envo
Como ejemplo, supongamos que desea mostrar una lista de departamentos en una lista que permita al usuario hacer una seleccin. En la base de datos, almacenar los departamentos como un campo de 2 caracteres, sin embargo quiere que el usuario pueda ver la descripcin. Deber aadir los siguientes datos a la lista: v 01;Envo v 02;Fabricacin v 03;Nminas v 04;Distribucin Nota: Con el recuadro de combinacin podr aadir la lista por omisin en la pgina Datos de su cuaderno de valores. Cuando el usuario hace una seleccin de la lista, podr utilizar el siguiente cdigo para obtener la parte clave del elemento.
C C C 'Combo1' 'Combo1' 'Combo1' Getatr Setatr Getatr 'FirstSel' X 'ItemKey' X 'Index' Key 2 0
60
Sealizacin de eventos
El evento Select se seala cuando: v Un usuario selecciona un elemento que est en un recuadro de combinacin. v Se selecciona un elemento de la lista en el programa. v El usuario selecciona un elemento que ya ha sido seleccionado. El evento Enter se seala cuando: v El usuario efecta una doble pulsacin sobre un elemento que est en el recuadro de combinacin. v Se pulsa la tecla Intro cuando el recuadro de lista tiene el foco y se ha seleccionado un elemento. En la subrutina de accin de estos eventos, puede utilizar el atributo Selected para determinar qu elemento se ha seleccionado.
61
El componente referencia a componente lgico permite que un componente lgico de VARPG se comunique con otro. Utilice el componente referencia a componente lgico para afectar a un componente del otro componente lgico. El componente lgico al que se hace referencia debe estar ejecutndose en la misma aplicacin que el componente referencia a componente lgico. El componente referencia a componente lgico tambin supervisa un evento especificado en el otro componente lgico. Cuando se produce el evento supervisado, el componente referencia a componente lgico seala un evento Notify. Atributos de componente |
AddSrcEvt Left ParentName RefParent Visible AttrValue NotSrcEvt PartName RefPart Bottom NotSrcPart PartType RmvSrcEvt CompName NotSrcWin RefAttr UserData
62
* * Cambiar el bitmap para el componente imagen IMG1 en * la ventana WIN01 del componente lgico COMPB C 'CR1' Setatr 'COMPB' 'CompName' C 'CR1' Setatr 'WIN01' 'RefParent' C 'CR1' Setatr 'IMG1' 'RefPart' C 'CR1' Setatr 'FILENAME' 'RefAttr' C 'CR1' Setatr 'D:\PIC.BMP' 'AttrValue' *
63
Contenedor
Utilice el componente contenedor para almacenar registros relacionados. Los registros se pueden mostrar en una vista de iconos, de rbol, de rbol de texto o de detalles. Atributos de componente
AddRcd BlankChar Collapsed EditItem Focus FontSize ForeMix GetRcdText Label ParentList ReadOnly Selected SetRcdText SortDesc View* Width Arrange Bottom ColNumber Enabled FontBold FontStrike* GetNewID Handle* Left ParentName RecordID SelectRcd SetTop* TipText Visible BackColor ChildCount Count ExtSelect* FontItalic FontUnder* GetRcdFld Height MiniIcon PartName Refresh SetRcdFld ShowTips Top VisTitle BackMix ChildList DeSelect FirstSel FontName ForeColor GetRcdIcon InUse* ParentId PartType RemoveRcd SetRcdIcon SortAsc UserData VisTitlSep
*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Click DblClick GotFocus MouseEnter Popup Collapsed Destroy KeyPress MouseExit Select ColSelect Enter LostFocus MouseMove VKeyPress Create Expanded MouseDown MouseUp
64
texto en tiempo de ejecucin pulsando la tecla Alt y seleccionando el campo con el ratn. Para obtener el valor de esta columna, utilice el atributo GetRcdText. Icono de objeto Una columna de icono de objeto visualiza el archivo de icono que se especifica cuando se crea el registro. Puede cambiar el nombre de archivo de icono en tiempo de ejecucin mediante el atributo SetRcdIcon. Texto El texto es una serie que contiene informacin adicional. Una columna de texto puede contener cualquier serie de caracteres. El texto no puede contener espacios en blanco. Si desea que aparezca un blanco en tiempo de ejecucin, utilice en la serie el carcter de subrayado ( _ ). Utilice el atributo SetRcdFld para cambiar este texto en tiempo de ejecucin. Los usuarios pueden cambiar el texto en tiempo de ejecucin pulsando la tecla Alt y seleccionando el campo con el ratn. Para obtener el valor de esta columna, utilice el atributo GetRcdFld. Un icono muestra informacin de registro grfico adicional. Una columna de icono visualiza un archivo de icono. Utilice SetRcdIcon para cambiar el nombre del archivo de icono en tiempo de ejecucin.
Icono
Puede aadir un mximo de veinte columnas a un componente contenedor. De ellas, quince como mximo pueden ser una combinacin de texto de objeto y de columnas de texto, y cinco como mximo pueden ser de icono de objeto y de icono. Tenga en cuenta que, en Windows, slo la primera columna puede contener un icono. El nmero de columnas y de tipos de columna no puede cambiarse en tiempo de ejecucin. Si aade registros que tienen ms campos que el nmero de columnas en el contenedor, se pasan por alto los campos extra.
Los blancos se utilizan como delimitadores. Los parmetros son: ID Un valor numrico exclusivo que se da a un registro. Este nmero debe ser mayor que cero. Para asegurarse de que se asigna un ID exclusivo a cada registro que se cree, utilice el atributo GetNewID. El texto que se visualiza con el icono de objeto. Puede cambiarse en tiempo de ejecucin mediante el atributo SetRcdText.
Texto
FileName El nombre de un archivo que contiene la imagen de icono para una columna de icono de objeto. Este icono se visualiza en las vistas de iconos y de rbol del contenedor. Puede cambiar el nombre de archivo de icono en tiempo de ejecucin mediante el atributo SetRcdIcon. ParentID El ID exclusivo del registro bajo el que aparecer este registro. Si este registro no tiene un registro padre, coloque un 0 en este campo. Datos_campo Informacin adicional para un registro que se visualiza en una columna de texto o de icono. Cada valor de datos_campo actualiza la columna
Captulo 7. Utilizacin de componentes
65
correspondiente en el componente contenedor. Si desea tener una columna de contenedor de icono o de texto vaca, debe especificar un subrayado ( _ ) en el parmetro datos_campo. El siguiente fragmento de cdigo muestra los parmetros que se especifican para aadir un registro de ejemplo a un contenedor. En este ejemplo no se aaden datos de columna. Utilice el atributo Count para determinar cuntos registros hay en un contenedor.
* * No es un registro hijo C Eval Parent = '0' * * Utilizar texto de icono especificado en Diseador GUI C Eval IconText = '_' * * Establecer nombre de archivo de icono a utilizar para este registro C Eval IconFile = '.\\TOM.ICO' * * Obtener nuevo ID de registro de contenedor y hacerlo de caracteres C 'CT1' Getatr 'GetNewId' NextIDN 6 0 C Move NextIDN NextID 6 * * Crear estructura de registro de contenedor C Eval NextRcd = NextID + ' ' + C IconText + ' ' + C IconFile + ' ' + C Parent * * Aadir el registro al contenedor C 'CT1' Setatr NextRcd 'AddRcd' *
66
Si desea que el nuevo valor de columna contenga blancos intercalados, utilice el carcter de subrayado para representar cada blanco. Los caracteres de subrayado se sustituyen por blancos cuando se actualiza la columna. Por ejemplo:
* * 'New data' se establece en la columna C 'CT1' Setatr 'New_data' *
'SetRcdFld'
Utilice el atributo GetRcdFld para recuperar el contenido de un campo de registro. Establezca el atributo RecordID en el ID exclusivo del registro y el atributo ColNumber en el nmero de columna deseado.
Vista de iconos
En una vista de iconos, cada registro se representa mediante un icono con texto por debajo. Los registros hijos no se visualizan en la vista de iconos. Debe especificar el nombre de archivo de icono y el texto descriptivo en la estructura de registro cuando aada el registro al contenedor. Puede cambiar el icono y el texto de icono en tiempo de ejecucin utilizando los atributos SetRcdIcon y SetRcdText. Para visualizar los iconos en filas en el contenedor, establezca el valor 1 en el atributo Arrange. Para utilizar mini iconos, establezca el atributo MiniIcon en 1 o seleccione el recuadro Mini icono de la pgina Estilo del cuaderno de propiedades.
67
Vista de rbol
En una vista de rbol, los registros se presentan en forma jerrquica. La vista rbol de iconos muestra cada registro con su icono y el texto de icono a su lado. Si un registro tiene registros hijos, se visualiza un signo ms junto al icono. Al seleccionar el signo ms se muestran todos los registros relativos a este registro. El rbol de texto muestra registros de la misma forma que la vista de rbol de iconos, pero slo en modalidad de texto, sin iconos. Se dibujan lneas de conexin entre registros relacionados para mostrar su relacin.
68
Vista de detalles
En una vista de detalles, los registros se muestran de uno en uno visualizndose cada columna (de manera similar a un subarchivo). Los registros hijos no se visualizan en este tipo de vista.
69
Si el contenedor no es lo bastante grande para visualizar todos los registros a la vez, se aaden automticamente barras de desplazamiento. Para cambiar la vista, utilice el atributo View.
Miniiconos
Esta opcin permite al programador especificar si los iconos que hay dentro del componente contenedor se visualizarn como iconos normales o mini. Slo afecta a la vista de iconos; las vistas de rbol y de detalles no sufrirn cambio alguno.
70
Cliente DDE
* Restriccin: Este componente no est soportado en las aplicaciones Java. Utilice el componente cliente DDE para intercambiar datos con otras aplicaciones (por ejemplo, hojas de clculo), que den soporte al protocolo de intercambio dinmico de datos (DDE). Este intercambio recibe el nombre de conversacin DDE. La aplicacin que inicia la conversacin es el cliente y la aplicacin que responde es el servidor. Para determinar si una aplicacin da soporte a DDE, consulte la documentacin que se ha entregado con ella. El componente cliente DDE da soporte a las conversaciones de enlace esttico y enlace dinmico. Una conversacin de enlace esttico consta de un programa cliente que realiza peticiones explcitas al programa servidor. Una conversacin de enlace dinmico consta de un programa servidor que actualiza automticamente el programa cliente cuando se modifican sus datos. Puede configurar conversaciones de enlace esttico o dinmico en el cuaderno de propiedades del componente cliente DDE y en la lgica del programa. Atributos de componente
AppName DDERmvLink Left Poke Topic Bottom Execute ParentName Request UserData DDEAddLink Format PartName TimeOut Visible DDEMode Item PartType Top
71
Campo de entrada
Utilice el componente campo de entrada si desea que el usuario pueda especificar valores que no se pueden predecir. Un campo de entrada es un rea en la que el usuario puede escribir o colocar texto. Sus lmites suelen estar indicados. El usuario puede desplazarse por el texto del campo de entrada si hay ms informacin disponible de la que resulta visible. Puede configurar el componente campo de entrada para que acepte datos de tipo carcter, numricos o de doble byte (DBCS). Tambin puede hacer que el campo de entrada sea de slo lectura, para que el usuario no pueda modificar la informacin que contiene directamente. Puede sealar y pulsar un componente campo de entrada en la paleta de componentes y despus pulsar el botn del ratn en el componente subarchivo para crear un campo de entrada de subarchivo. Atributos de componente
AddLink* AutoSelect CapsLock DataType Enabled FontItalic FontUnder* Height ParentName ReadOnly Text TextStart Visible Alignment BackColor Copy Delete FieldExit FontName ForeColor InsertMode* PartName Refresh TextEnd TipText Width AllowLink* BackMix CsrAtEnd DragEnable* Focus FontSize ForeMix Left PartType RemoveLink* TextLength Top AutoScroll* Bottom Cut DropEnable* FontBold FontStrike* Handle* Masked Paste ShowTips TextSelect UserData
*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones.
72
*Nota: Consulte la descripcin del evento si desea saber cules son las restricciones.
Comprobacin de validez
Puede utilizar el cuaderno de propiedades para especificar que un campo de entrada slo debe aceptar los datos que satisfagan los criterios que especifique. Para asegurar que los datos coinciden con ciertos valores, establezca los valores de Compare. Para asegurar que los datos estn comprendidos en un intervalo de valores predefinidos, establezca los valores de Range. Nota: VisualAge RPG utiliza el orden de clasificacin ASCII para la comprobacin de validez. En esto difiere del sistema AS/400, que utiliza el orden de clasificacin EBCDIC. Por consiguiente, los resultados pueden variar entre los sistemas. Para que se realice la comprobacin de validez, debe tener por lo menos un pulsador o un pulsador grfico en la ventana que tenga establecido el atributo Validate. Cuando se acciona el pulsador, se realiza la comprobacin de validez para cada campo de entrada que tenga definida la comprobacin de validez. Si la comprobacin de validez es anmala en algn campo de entrada, se visualiza una ventana de mensaje y no se seala ningn evento de pulsar en el programa.
Captulo 7. Utilizacin de componentes
73
Tambin puede utilizar el campo que hay en la parte superior del cuaderno de propiedades para establecer el mensaje que se visualizar si falla la comprobacin de validez. Entre el texto del mensaje que ha de visualizarse o bien el nombre del archivo de mensajes (como, por ejemplo, *MSG0001) que contiene el mensaje correspondiente. Si se deja en blanco este texto, cuando falle la comprobacin de validez se visualizar el mensaje por omisin del sistema. Nota: Este campo tiene un lmite mximo de 15 caracteres.
74
Grfica
El componente grfica le permite crear y disear un grfico en el proyecto. Durante la ejecucin podr enviar datos al grfico y modificar los atributos de grfico y el tipo de grfico. El componente grfica da soporte a los tipos de grfica circular, de lneas, de barras y de lneas y barras. Los tipos de grfica de barras y de lneas permiten utilizar el control de texto ToolTip. Si est habilitado, al mover el ratn sobre un punto de datos se visualiza el control de texto de ayuda flotante. Para utilizar este soporte en la lgica del programa, debe establecer el valor del punto en el atributo TipText y activar el atributo ShowTips para la ventana que contiene el componente grfica. Atributos de componente
AutoInc ColorArea DataValue FontBold FontStrike* GraphType Height Left PartType Title UseData XAxisLabel BarLabel ColorMix Enabled FontItalic FontUnder* GroupLabel HitItem* LegendType Refresh TitlePlace UserData YAxisLabel Bottom DataGroup FillStyle* FontName GnEqGrpCol GrphHiLite HlitPoints* ParentName StartNew Top Visible YInc Color DataPoint FontArea FontSize GnEqPntCol Handle* LabelPlace PartName TipText UnderPoint* Width
*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Click MouseDown MouseUp Create MouseEnter Destroy MouseExit DblClick MouseMove
75
un bucle, establezca el DataValue de todos los DataPoint en el valor de la temperatura mnima. Para completar el grfico repita los mismos pasos para las temperaturas mximas estableciendo DataGroup en 2. Enviar datos al grfico no lo actualiza. Deber establecer el atributo UseData para visualizar los datos. El siguiente fragmento de cdigo muestra cmo hacerlo:
C C C C C C C C C C C C * * * * 'Graph1' 'Graph1' 'Graph1' 'Graph1' * * * 'Graph1' Do Setatr Do Setatr If Setatr Else Setatr Endif EndDo EndDo Setatr 1 'UseData' 2 Group 12 Point Group = 1 Low(Point) High(Point) Group 'DataGroup' Point 'DataPoint' 'DataValue' 'DataValue' 2 0 2 0
76
Pulsador grfico
Utilice pulsadores grficos para proporcionar un acceso fcil a las acciones utilizadas con frecuencia. El pulsador grfico proporciona la misma funcin que un pulsador. Indica una accin que se iniciar cuando el usuario lo seleccione, pero en lugar de visualizar una etiqueta que describa su funcin, muestra una imagen. El atributo FileName especifica el nombre de la imagen que debe utilizarse. Los formatos vlidos de imgenes de Windows son: v Bitmaps de Windows y OS/2 (BMP, VGA, BGA, RLE, DIB, RL4, RL8) v Icono (ICO) v TIF, TIFF (Formato de Archivo de Imagen Codificada) de Microsoft/Aldus v GIF (Formato de Intercambio de Grficos) de CompuServe v PCX (Formato de Archivo de Imagen) de ZSoft PC Paintbrush v TGA, VST, AFI (Bitmap Targa/Vista) de Truevision v IFF, ILBM (Formato de Bitmap Intercalado) de Amiga v XBM (Bitmap) de X Windows v PSE, PSEG, PSEG38PP, PSEG3820 (Segmento de Pgina de Impresora) de IBM Los formatos vlidos de imgenes Java son: v GIF (Formato de Intercambio de Grficos) de CompuServe v Formato Joint Photographic Experts Group (JPG, JPEG) Para obtener informacin relacionada, consulte el apartado Pulsador en la pgina 134.
77
Atributos de componente
Bottom Handle* Left Refresh UserData Enabled Height ParentName ShowTips Validate FileName HelpEnable PartName TipText Visible Focus HighLight PartType Top Width
* Nota:: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Create MouseEnter Press Destroy MouseExit GotFocus MouseMove LostFocus Popup
Definicin de la imagen
Para definir la imagen que se visualiza en un pulsador grfico, utilice el atributo FileName y especifique un nombre de archivo de bitmap (.BMP) o de icono (.ICO) vlido. Debe almacenar los archivos de icono y de bitmap especficos del sistema en el directorio de tiempo de ejecucin adecuado. Si desea ms informacin, consulte Captulo 12. Utilizacin de archivos de imgenes, de sonido y de vdeo en la pgina 233.
Sealizacin de eventos
Cuando se acciona el pulsador, se seala un evento Press en el programa.
78
Recuadro de grupo
Utilice un recuadro de grupo para distinguir visualmente un grupo de componentes de una ventana. Un recuadro de grupo es un rectngulo trazado alrededor de un grupo de componentes para indicar que estn relacionados. Por lo general, es recomendable poner una etiqueta a un recuadro de grupo. Si no se precisa una etiqueta, puede utilizar un recuadro de contorno. Atributos de componente
Bottom FontName ForeColor Label PartType Visible Enabled FontSize ForeMix Left Refresh Width FontBold FontStrike* Handle* ParentName Top FontItalic FontUnder* Height PartName UserData
Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Create Destroy
79
Utilice el componente barra de desplazamiento horizontal para poder desplazarse por un panel de informacin de izquierda a derecha o viceversa. La informacin puede ser una lista de archivos, los registros de una base de datos, las columnas de un documento y otros elementos. Puede utilizar el atributo Range para representar el nmero total de los objetos por los que se efectuar el desplazamiento y el atributo PageSize para determinar el nmero de objetos que pueden visualizarse en una pgina. Atributos de componente
Bottom Height PageSize Position Top Enabled Left ParentName PrevLine UserData Focus NextLine PartName PrevPage Visible Handle* NextPage PartType Range Width
*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Create Destroy Scroll
80
Imagen
Utilice el componente imagen para visualizar dibujos. El atributo FileName especifica el nombre de la imagen que debe utilizarse. Los formatos vlidos de imgenes de Windows son: v Bitmaps de Windows y OS/2 (BMP, VGA, BGA, RLE, DIB, RL4, RL8) v Icono (ICO) v TIF, TIFF (Formato de Archivo de Imagen Codificada) de Microsoft/Aldus v GIF (Formato de Intercambio de Grficos) de CompuServe v PCX (Formato de Archivo de Imagen) de ZSoft PC Paintbrush v TGA, VST, AFI (Bitmap Targa/Vista) de Truevision v IFF, ILBM (Formato de Bitmap Intercalado) de Amiga v XBM (Bitmap) de X Windows v PSE, PSEG, PSEG38PP, PSEG3820 (Segmento de Pgina de Impresora) de IBM Los formatos vlidos de imgenes Java son: v GIF (Formato de Intercambio de Grficos) de CompuServe v Formato Joint Photographic Experts Group (JPG, JPEG) Estos archivos residen en la estacin de trabajo programable (PWS), no en el sistema principal. Debe almacenar los archivos de bitmap y de icono especficos del sistema en el directorio de tiempo de ejecucin adecuado (RT_JAVA o RT_WIN32) para que el programa de utilidad de empaquetado los incluya al crear el paquete de la aplicacin. Nota: El componente imagen slo se puede soltar en una pgina de cuaderno con lienzo o en una ventana con lienzo.
81
Atributos de componente
AddLink* Border Handle* Panel Print TipText Width AllowLink* Bottom Height ParentName Refresh Top BackColor Enabled Left PartName RemoveLink* UserData BackMix FileName Magnify PartType ShowTips Visible
* Nota:: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Click Link* Create MouseEnter DblClick MouseExit Destroy MouseMove
* Nota:: Consulte la descripcin del evento si desea saber cules son las restricciones.
82
Ejemplo de imagen
En este ejemplo, se lee un archivo del sistema AS/400. Cada registro del archivo contiene un campo de nmero de componente, que se inserta en el recuadro de lista a medida que se lee cada registro. Cuando el usuario selecciona un nmero de componente en el recuadro de lista y acciona el pulsador Ver, el nmero de componente se concatena con la serie .BMP para formar un nombre de archivo. Entonces se utiliza el nombre de archivo para establecer el atributo FileName del componente imagen para visualizar la imagen. El atributo Label del componente texto esttico PINFO se actualiza para indicar el resultado de establecer el atributo de nombre de archivo. Accione el pulsador Close para terminar el programa.
83
********************************************************************* * * * ID de program. : IMAGE * * * * Descripcin . : Ejemplo del componente imagen * * * * Este programa de ejemplo muestra cmo puede * * implementarse el componente imagen en VARPG * * Client. * * * * El ejemplo da por supuesto que hay un archivo * * en el sistema principal AS/400 denominado PARTS. * * Ese formato de archivo se compone de un campo * * denominado PARTNO. * * * * Cuando se inicie la aplicacin, se invoca el * * evento Create para la ventana WIN1, que lee * * todos los registros del archivo e inserta el * * valor de campo PARTNO en el recuadro de lista LB1* * * * Cuando el usuario accione el pulsador View, * * el nombre de archivo de imagen se construir * * y se utilizar para establecer el atributo * * FILENAME del componente imagen IMG1. * * * ********************************************************************* *
DISK
84
********************************************************************* * * * Ventana . : WIN1 * * * * Componente : Close * * * * Evento . . : Press * * * * Descripcin: Terminar el programa * * * ********************************************************************* * C CLOSE BEGACT PRESS WIN1 * C move *on *inlr * C ENDACT ********************************************************************* * * * Ventana . : WIN1 * * * * Componente : WIN1 * * * * Evento . . : Create * * * * Descripcin: Esta subrutina de accin se ejecuta cuando se crea * * la ventana WIN1. * * Rellenar el recuadro de lista con los valores de * * nmero de componente del archivo PARTS. * * * ********************************************************************* * C WIN1 BEGACT CREATE WIN1 * * Rellenar el componente recuadro de lista con elementos de la base * de datos C read produc1 9999 * C *in99 doweq *off C 'LB1' setatr partno 'InsertItem' C read produc1 9999 C enddo * C ENDACT *
85
********************************************************************* * * * Ventana . : WIN1 * * * * Componente : VIEW * * * * Evento . . : PRESS * * * * Descripcin: Visualizar la imagen para el componente seleccionado * * * ********************************************************************* * C VIEW BEGACT PRESS WIN1 * * Obtener ndice del elemento seleccionado C 'LB1' getatr 'FirstSel' x 4 0 * * Si se ha seleccionado un elemento, construya el nombre de archivo * de bitmap C x ifgt *zero C 'LB1' setatr x 'Index' C 'LB1' getatr 'GETITEM' tmp20 20 C movel tmp20 part 5 C endif * C move *blanks fullpath 64 C move *blanks tmp64 64 C path cat part:0 tmp64 C tmp64 cat '.gif':0 fullpath * * Establecer el nombre de archivo en el atributo FILENAME * de imagen para visualizar la imagen C 'IMG1' setatr fullpath 'FILENAME' 80 * * Si el indicador 80 es "on", la operacin de establecer el nombre * del archivo de imagen es fallida, es decir, no se ha encontrado el * archivo. * Establecer el atributo Label del componente de texto esttico PINFO * para indicar el estado C *in80 ifeq *on C 'PINFO' setatr nopic 'Label' * C else C 'PINFO' setatr *BLANKS 'Label' C endif * C ENDACT *
86
Bean Java
* Restriccin: Este componente no est soportado en las aplicaciones Windows. Utilice el componente bean Java para aadir beans JavaBeans al proyecto. Los beans Java sirven para llamar de forma directa a mtodos Java. Si desea obtener ms informacin sobre las llamadas a mtodos Java, consulte la publicacin Captulo 18. Cmo invocar mtodos Java desde programas VisualAge RPG en la pgina 269. Para desarrollar aplicaciones que utilicen el componente bean Java, debe tener instalado Java 2 Software Development Kit (J2SDK), Standard Edition, versin 1.2 o superior, de JavaSoft, en la estacin de trabajo. Si no tiene el J2SDK, puede bajarlo de Sun Microsystems en el URL siguiente:
http://www.javasoft.com/products/
Tras instalar el J2SDK, establezca la variable de entorno PATH de modo que apunte a la ubicacin tanto del compilador Java como de jvm.dll, que forma parte del J2SDK y del JRE (Java Runtime Environment). Por ejemplo, si el directorio inicial de J2SDK es x:\jdk1.2, aada las siguientes sentencias en la variable PATH:
x:\jdk1.2\bin x:\jdk1.2\jre\bin\classic
Atributos de componente
AddEvent Left RmvEvent Visible Bottom ParentName ShowProp Width Enabled PartName Top Height PartType UserData
87
Propiedades. Las propiedades, mtodos y eventos de un bean aparecen en la pgina Informacin. Elija el botn de seleccin apropiado para ver las opciones disponibles. No todos los eventos del bean se soportan. Los eventos soportados por VARPG se marcan con un asterisco (*) en la lista de Eventos.
88
dondestrComponentName es el nombre del componente que contiene el componente de bean, strParentName es el nombre de la ventana que contiene el componente de bean y strPartName es el nombre del componente de bean. El llamador debe comprobar las posibles referencias nulas que pueda devolver el mtodo, para asegurarse de que la llamada sea satisfactoria. Para encontrar la especificacin de mtodo real para el establecimiento u obtencin de las propiedades e invocacin de mtodos, consulte la documentacin de los beans que proporciona el proveedor o consulte la pgina Informacin del cuaderno de propiedades del componente bean Java.
89
Recuadro de lista
Utilice el componente recuadro de lista para proporcionar al usuario una lista de elementos de los que se pueden seleccionar uno o ms. Un recuadro de lista consta de elementos de slo lectura. Un elemento de un recuadro de lista es una serie de caracteres. Las barras de desplazamiento verticales y horizontales permiten al usuario ver partes de la lista que no estn visualizadas. Puede configurar el recuadro de lista de modo que el usuario pueda seleccionar un solo elemento o varios. Puede utilizar los atributos Search, SearchType y Case para buscar fcilmente en la lista un elemento determinado. Atributos de componente
AddItemEnd BackMix DelimChar Enabled FontBold FontStrike* GetItem InsertItem* NbrOfSel Refresh SearchType* Sequence* SizeToFit UserData AddLink* Bottom DeSelect ExtSelect* FontItalic FontUnder* Handle* ItemKey ParentName RemoveItem Selected SetItem TipText Visible AllowLink* Case* DragEnable* FirstSel FontName ForeColor Height Left PartName RemoveLink* SelectItem SetTop Top Width BackColor Count DropEnable* Focus FontSize ForeMix Index MultSelect PartType Search* SelectList ShowTips UseDelim
* Nota:: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Create GotFocus MouseExit VKeyPress Destroy KeyPress MouseMove Drop* LostFocus Popup Enter* MouseEnter Select
* Nota:: Consulte la descripcin del evento si desea saber cules son las restricciones.
90
atributo Sequence en ascendente, descendente o ndice, antes de aadirlos. Con ello, los elementos se ordenan segn la secuencia de clasificacin ASCII a medida que se van aadiendo. No puede utilizar el atributo Sequence para cambiar el orden de los elementos que ya estn en el recuadro de lista.
Eliminacin de elementos
Utilice el atributo RemoveItem para eliminar elementos de la lista. Utilice el valor de ndice para especificar el elemento que va a eliminarse. Los valores de Index comienzan en el 1. Cuando se elimina un elemento de la lista, todos los elementos que siguen al elemento eliminado ascienden una posicin en la lista. Para eliminar todos los elementos de la lista, especifique un valor de Index de 0.
Tipos de seleccin
Puede utilizar atributos para especificar cmo se seleccionan los elementos en un recuadro de lista. Estn disponibles la seleccin nica, mltiple y ampliada. Seleccin nica La seleccin nica (el valor por omisin) slo permite que se seleccione un
Captulo 7. Utilizacin de componentes
91
elemento de una lista a la vez. Si un elemento ya est seleccionado, se deseleccionar cuando se seleccione otro elemento. Seleccin mltiple El usuario puede seleccionar cualquier nmero de objetos o no seleccionar ninguno. Seleccin ampliada Este tipo de seleccin es el adecuado para la seleccin de un slo objeto, pero si es necesario el usuario puede ampliar la seleccin a ms de un objeto.
Sealizacin de eventos
El evento Select se seala cuando: v Un usuario selecciona un elemento que est en un recuadro de lista. v Se selecciona un elemento de la lista en el programa. v El usuario selecciona un elemento que ya ha sido seleccionado. El evento Enter se seala cuando: v Un usuario efecta una doble pulsacin sobre un elemento que est en el recuadro de lista. v Un usuario pulsa la tecla Intro cuando el recuadro de lista tiene el foco y se ha seleccionado un elemento. En la subrutina de accin para estos eventos, puede utilizar el atributo Selected o FirstSel para determinar qu elemento se ha seleccionado.
92
93
********************************************************************* * * * ID de programa : LISTBOX * * * * Descripcin . : Programa de ejemplo que muestra el componente * * cuadro de lista. * * * ********************************************************************* * ********************************************************************* * * * Ventana. . : MAIN * * * * Componente : CLEAR * * * * Evento . . : PRESS * * * * Descripcin: Borrar el recuadro de lista y el campo de entrada. * * Poner el foco en el componente campo de entrada. * * * ********************************************************************* * C CLEAR BEGACT PRESS MAIN * C 'LB1' setatr 0 'RemoveItem' C 'EF1' setatr *blanks 'Text' C 'EF1' setatr 1 'Focus' * C ENDACT ********************************************************************* * * * Ventana . : FRA0000B * * * * Componente : CLOSE * * * * Evento . . : PRESS * * * * Descripcin: Terminar el programa * * * ********************************************************************* * C CLOSE BEGACT PRESS MAIN * C move *on *INLR * C ENDACT
94
********************************************************************* * * * Ventana. . : MAIN * * * * Componente : REMOVE * * * * Evento . . : PRESS * * * * Descripcin: Eliminar el elemento seleccionado del recuadro de * * lista. Se utiliza el atributo 'FirstSel' para * * determinar el ndice del primer elemento * * seleccionado. * * * ********************************************************************* * C REMOVE BEGACT PRESS MAIN * C 'LB1' getatr 'FirstSel' Index 3 0 * C Index ifgt *zero C 'LB1' setatr Index 'RemoveItem' C endif * C ENDACT ********************************************************************* * * * Ventana . : FRA0000B * * * * Componente : ADD * * * * Evento . . : PRESS * * * * Descripcin: Aade el valor del componente campo de entrada como * * nuevo elemento al componente recuadro de lista. * * * ********************************************************************* * C ADD BEGACT PRESS MAIN * C 'EF1' getatr 'TEXT' tmp 30 * C tmp ifne *blanks C 'LB1' setatr tmp 'InsertItem' C 'EF1' setatr *blanks 'Text' C 'EF1' setatr 1 'Focus' C endif * C ENDACT
95
********************************************************************* * * * Ventana. . : MAIN * * * * Componente : SELECT * * * * Evento . . : PRESS * * * * Descripcin: Recupera el elemento seleccionado del recuadro de * * lista y lo copia en el campo de entrada. * * * ********************************************************************* * C SELECT BEGACT PRESS MAIN * C 'LB1' getatr 'FirstSel' x 3 0 * C x ifgt *zero C 'LB1' setatr x 'Index' C 'LB1' getatr 'GetItem' temp 20 C 'EF1' setatr temp 'Text' C endif * C ENDACT ********************************************************************* * * * Ventana. . : MAIN * * * * Componente : EF1 * * * * Evento . . : CHANGE * * * * Descripcin: Para sucesos notify en ejemplos CRP * * * ********************************************************************* * C EF1 BEGACT CHANGE MAIN * C ENDACT *
Ejemplo de bsqueda
Puede utilizar los atributos Search, SearchType y Case para buscar un elemento concreto de la lista. Es ms rpido utilizar estos atributos que leer cada elemento en el programa y comparar para encontrar valores especficos. El ejemplo siguiente muestra cmo localizar un nombre de cliente en un recuadro de lista escribiendo un nombre en el campo de entrada. La ventana se denomina MAIN, el recuadro de lista es LB1 y el campo de entrada es EF1. La interfaz de usuario es la siguiente:
96
En el evento Create de la ventana, el atributo Case del recuadro de lista se establece en 0 para indicar que la bsqueda no es sensible a las maysculas y minsculas. El atributo SearchType se establece en 1 para indicar que slo queremos comparar el nmero de caracteres de la serie de bsqueda con los primeros caracteres del elemento de la lista. El resto del cdigo consiste en rellenar el recuadro de lista con registros de la base de datos del sistema AS/400.
C C C C C C C C C C * * * 'LB1' * * MAIN 'LB1' 'LB1' BEGACT Setatr Setatr Read DoW Setatr Read EndDo Setatr ENDACT CREATE 0 1 Custom01 NOT *in99 CustNa Custom01 1 'AddItemEnd' MAIN 'Case' 'SearchType' 99
99
'LB1'
'SelectItem'
El cdigo siguiente es la subrutina de acciones para el evento Change del campo de entrada EF1. Cada vez que se escribe un carcter en el campo de entrada, se invoca a esta subrutina de acciones. Se recupera el valor del atributo Text del campo de entrada y, si no est en blanco, se utiliza ese valor como la serie de bsqueda para el atributo Search del recuadro de lista. Si se encuentra una coincidencia (el atributo Index es mayor que 0), se selecciona el elemento encontrado y se mueve al principio del recuadro de lista con el atributo SetTop .
C C C C * * * EF1 'EF1' 'LB1' BEGACT Getatr If Setatr CHANGE 'Text' MAIN Search 40
97
C C C C C C C C C C C C
If Eval Eval * 'LB1' 'LB1' 'LB1' EndIf Else Setatr Setatr Setatr EndIf ENDACT
* *
1 1 1
Si el campo de entrada est en blanco, se mueve el primer elemento del recuadro de lista al principio y se selecciona. El atributo INDEX se establece en 1 para que las bsquedas siguientes empiecen al principio de la lista.
98
Medios
Utilice el componente medios para reproducir o grabar informacin de audio o para reproducir archivos de vdeo. El componente medios ofrece a los programas la posibilidad de procesar archivos de ondas (.WAV), MIDI (.MID) y QuickTime Movie (.MOV). Si desea utilizar estos archivos de audio, el PC debe estar equipado con una tarjeta de sonido que pueda procesar estos archivos. Para grabar un archivo de sonido, necesitar un micrfono o algn otro dispositivo de entrada soportado por la tarjeta de sonido. Los archivos MIDI no pueden grabarse con el componente medios. Las aplicaciones Java deben tener instalada la API JMF (Java Media Framework). El componente medios slo permite reproducir los archivos de audio y de vdeo en el entorno Java. Los formatos de archivo de vdeo que se pueden procesar son: MPEG (*.mpg), QUICKTIME Movie (*.mov), *.dat y *.avi de Microsoft Video para Windows en Windows NT/95/98. Para reproducir estos archivos de vdeo, el sistema debe tener los controladores adecuados. Atributos de componente
AddLink* Bottom Left PartName Top Volumen AllowLink* FileName Length PartType Treble* AudioMode Handle* Panel Position UserData Bass* InPlace ParentName RemoveLink* Visible
*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Complete Create Destroy Link*
*Nota: Consulte la descripcin del evento si desea saber cules son las restricciones.
99
Establecimiento de AudioMode
Para procesar un archivo, establezca el atributo AudioMode en uno de los valores siguientes: Valor 1 2 3 4 Descripcin Pausa Suspende el proceso del archivo Reproducir Reproduce el archivo Grabar Graba un archivo Parar Detiene el proceso del archivo
Establecimiento de Volume
Utilice el atributo Volume para establecer el volumen del componente medios y la salida de ondas y el sintetizador del sistema.
Establecimiento de Position
Utilice el atributo Position para determinar la posicin inicial del archivo que va a procesarse. Exprese el valor del atributo en milisegundos.
Sealizacin de eventos
Cuando un componente medios ha procesado un archivo por completo, se seala un evento Complete.
100
Panel de medios
Nota: Este componente no se utiliza en las aplicaciones Java. Utilice el componente panel de medios para proporcionar un acceso rpido a las acciones ms utilizadas. Tambin puede utilizarlo para dar al usuario control sobre otros componentes sin necesidad de crear lgica de programa. Por ejemplo, puede utilizarlo para crear pulsadores o controles de graduador que controlen el volumen o la modalidad de un componente medios. En el cuaderno de propiedades del componente panel de medios, puede indicar lo siguiente: v Qu botones, de un grupo definido, contendr el panel de medios v Si los graduadores de posicin y volumen se visualizarn Nota: El componente panel de medios slo se puede soltar en una pgina del cuaderno con lienzo o en una ventana con lienzo. Atributos de componente
AddLink Bottom Left PartName Top Width AllowLink Enabled PanelItem PartType UserData BackColor Handle PanelMode Position Visible BackMix Height ParentName RemoveLink Volume
101
Cuando se crea un enlace desde el componente panel de medios con otro componente, slo ciertos botones se habilitan en el componente panel de medios. Para habilitar todos los botones, tambin debe crear un enlace desde el otro componente hasta el componente panel de medios. Consulte la descripcin de AddLink de la publicacin VisualAge RPG Manual de consulta de componentes, SC10-3065-02 (SC09-2450-02) para obtener ms informacin sobre los componentes que puede enlazar con un componente panel de medios.
Sealizacin de eventos
Cuando se mueve el graduador de volumen o el graduador de posicin, se seala un evento Change. Utilice el atributo PanelItem para determinar el graduador que se cambi. Utilice el atributo Volume para determinar el valor del graduador de volumen y el atributo Position para determinar el valor del graduador de posicin. Cuando se acciona un pulsador en el panel de medios, se seala un evento Press. Utilice el valor numrico devuelto por el atributo PanelItem para determinar qu botn caus el evento Press. Consulte la publicacin VisualAge RPG Manual de consulta de componentes, SC10-3065-02 (SC09-2450-02) para ver la lista de los valores posibles.
102
Barra de mens
Utilice el componente barra de mens para proporcionar a los usuarios acceso a los mens desplegables. Puede aadir componentes submen y opcin de men a la barra de mens. Las barras de mens aparecen en la parte superior del marco de la ventana, debajo de la barra de ttulo. Cuando el usuario selecciona un men en ella, aparece un men desplegable con todas sus opciones. Al seleccionar una de ellas se inicia inmediatamente la accin que describe. Nota: Las propiedades, los eventos y otros elementos de este componente slo se pueden manipular desde su men emergente de la vista de rbol de proyectos. Para obtener informacin relacionada, consulte el apartado: v Elemento de men en la pgina 104 v Submen en la pgina 166 v Men emergente en la pgina 132 Atributos de componente
PartType PartName ParentName UserData
103
Elemento de men
Utilice las opciones de men para crear mens desplegables o emergentes. Una opcin de men describe una accin que se inicia cuando el usuario selecciona esa opcin. Para crear un men: 1. Suelte un componente submen en una barra de mens o en un men emergente. 2. Suelte opciones de men en el submen. Nota: Las propiedades, los eventos y otros elementos de este componente slo se pueden manipular desde su men emergente de la vista de rbol de proyectos. Para obtener informacin relacionada, consulte el apartado: v Barra de mens en la pgina 103 v Men emergente en la pgina 132 v Submen en la pgina 166 Atributos de componente
Checked ParentName Enabled PartName FileName PartType Label UserData
Establecimiento de un nemotcnico
Nota: Las aplicaciones Java no soportan nemotcnicos.
104
Para especificar una clave nemotcnica para el elemento de men, coloque el identificador nemotcnico delante de un carcter en el texto del atributo Label. En Windows NT/95/98, se utiliza el smbolo &. El carcter al que se ha asignado la clave nemotcnica se visualiza en la interfaz con un subrayado, por ejemplo, Visualizar. El subrayado informa a los usuarios que pueden seleccionar el elemento de men pulsando la tecla del carcter subrayado en el teclado.
Sealizacin de eventos
Cuando el usuario selecciona un elemento de men, se seala un evento MenuSelect. Nota: Slo los elementos de men sealan un evento MenuSelect. Los submens (como los mens en cascada), que estn asociados a otros mens no lo sealan.
105
Subarchivo de mensajes
Utilice el componente subarchivo de mensajes para visualizar mensajes predefinidos o para visualizar texto proporcionado en la lgica del programa: por ejemplo, informacin de error o de estado. Este componente est situado siempre en la parte inferior de la ventana y ocupa la anchura de la ventana. No se puede cambiar la anchura de este componente; sin embargo, s se puede cambiar la altura para que se visualicen ms mensajes. En tiempo de ejecucin, los usuarios pueden utilizar las barras de desplazamiento para ver todos los mensajes. Atributos de componente
AddMsgID DropEnable* FontItalic FontUnder* Handle* NbrOfSel RemoveMsg UserData AddMsgText Enabled FontName ForeColor Height ParentName Selected Visible Count FirstSel FontSize ForeMix Index PartName ShowTips DragEnable* FontBold FontStrike* GetItem MsgSubText PartType TipText
* Nota:: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Create MouseEnter Select Destroy MouseExit Drop MouseMove Enter Popup
106
de que el usuario aada el mensaje. Los datos de sustitucin del mensaje se aplican a los atributos AddMsgID y AddMsgText. Los datos de sustitucin de mensaje son una serie de palabras separadas por blancos. Cada palabra de sustitucin sustituye a la variable de sustitucin correspondiente antes de que se aada el mensaje al componente subarchivo de mensajes. Para establecer los datos de sustitucin del mensaje, utilice el atributo MsgSubText antes de establecer el atributo AddMsgID. Nota: Los datos de sustitucin siguen vigentes hasta que se utiliza otro atributo MsgSubText.
Eliminacin de mensajes
Utilice el atributo RemoveMsg para eliminar un mensaje del componente subarchivo de mensajes. Especifique el nmero de ndice del mensaje que se va a eliminar. Para eliminar todos los mensajes, utilice un valor de ndice 0.
107
********************************************************************* * * * ID de programa : MESSAGE * * * * Descripcin . : Programa de ejemplo que muestra el componente * * subarchivo de mensajes. * * * ********************************************************************* * ********************************************************************* * * * Ventana. . : MAIN * * * * Componente : PB_CLOSE * * * * Evento . . : PRESS * * * * Descripcin: Terminar el programa * * * ********************************************************************* * C PB_CLOSE BEGACT PRESS MAIN * C move *on *inlr * C ENDACT
Figura 21. Ejemplo de cdigo en el que se utiliza el componente subarchivo de mensajes (Pieza 1 de 2)
108
********************************************************************* * * * Ventana. . : MAIN * * * * Componente : PB_OK * * * * Evento . . : PRESS * * * * Descripcin: Comprobar que el valor entrado est permitido. De lo * * contrario, aada un mensaje al componente subarchivo * * de mensajes. * * * * Se utiliza el valor entrado como texto de * * sustitucin en el mensaje. * * * ********************************************************************* * C PB_OK BEGACT PRESS MAIN * * Borrar el subarchivo de mensajes * C 'Msg1' setatr 0 'RemoveMsg' * * Obtener el nmero de componente * C 'PartNum' getatr 'Text' tmp4 4 0 * * Si el nmero de componente no es vlido, aada un mensaje * al componente mensaje. El nmero de componente entrado por * el usuario se utiliza como texto de sustitucin. * Dado que el texto de sustitucin debe ser una serie, mueva * el valor numrico de nmero de componente a un campo de * caracteres y utilcelo como texto de sustitucin. C tmp4 ifle *zero C tmp4 orgt 1999 C move tmp4 char4 4 C 'Msg1' setatr char4 'MsgSubText' C 'Msg1' setatr 1 'AddMsgID' * * Dar FOCO al campo de entrada PartNum para que el cursor * regrese al mismo. C 'PartNum' setatr 1 'Focus' * * El nmero de componente est bien, seguir procesando C else * ... * ... * ...
Figura 21. Ejemplo de cdigo en el que se utiliza el componente subarchivo de mensajes (Pieza 2 de 2)
109
Utilice el componente edicin de mltiples lneas si desea que el usuario pueda escribir varias lneas de texto. El componente edicin de mltiples lneas tiene lmites definidos. A veces no se visualiza todo el texto que contiene. El usuario puede desplazar el texto vertical y horizontalmente para ver la parte que no se visualiza. Atributos de componente
AddLineEnd Bottom CsrLine DragEnable* FontBold FontStrike* Handle* Left ParentName ReadOnly TextEnd TextString Undo WordWrap AddOffset CanUndo CsrPos DropEnable* FontItalic FontUnder* Height LineNumber PartName Refresh TextLength TipText UserData BackColor CharOffset Cut Enabled FontName ForeColor InsertLine LineText PartType ShowTips TextSelect Top Visible BackMix Copy Delete Focus FontSize ForeMix InsertText NbrOfLines Paste Text TextStart TopLine Width
* Nota:: Consulte la descripcin del atributo para conocer las restricciones. Eventos a los que puede aplicarse
Change Destroy LostFocus MouseMove Click Drop MouseDown MouseUp Create GotFocus MouseEnter Popup DblClick KeyPress MouseExit VKeyPress
110
1. Establezca el atributo LineNumber en el nmero de lnea despus del cual desea insertar texto. 2. Utilice el atributo InsertLine. El texto se inserta despus de la lnea que se especifica. Cualquier lnea que est por debajo de la lnea que ha especificado se desplazar hacia abajo para dejar espacio para el texto insertado.
Cambio de color
Si existe un componente edicin de mltiples lneas en un componente lienzo con el color de fondo establecido en el valor por omisin del sistema, cambia al color de fondo del lienzo que el componente edicin de mltiples lneas heredar. Los componentes edicin de mltiples lneas adicionales aadidos al lienzo no heredarn el color de fondo del lienzo. Para corregirlo, difiera el establecimiento del color de fondo del lienzo hasta que haya colocado todos los componentes edicin de mltiples lneas en el lienzo. Como alternativa, puede hacer que los componentes edicin de mltiples lneas hereden el color estableciendo el color del lienzo en el valor por omisin del sistema, y luego otra vez en el valor del color RGB predefinido. Si arrastra y suelta un color en la barra de desplazamiento de un componente edicin de mltiples lneas, ese color no se guardar. El componente edicin de mltiples lneas cambiar al nuevo color, pero cuando se cierre la ventana y vuelva a abrirse, el color volver a ser el original.
Eleccin de fonts
No todos los fonts estn soportados por el componente edicin de mltiples lneas. Despus de seleccionar un font para este componente, se ajustar para visualizar la coincidencia ms prxima para el font seleccionado.
111
v Establezca el atributo ReadOnly en 0. v Establezca el atributo Enabled en 0. (Esto tambin impide que el componente edicin de mltiples lneas responda a eventos tales como Change y GotFocus.) Sigue siendo posible cambiar el valor del componente edicin de mltiples lneas en el programa.
112
********************************************************************* * * * ID de programa : MLE * * * * Descripcin . : Programa de ejemplo que muestra el componente * * edicin de mltiples lneas. * * * ********************************************************************* ********************************************************************* * * * Ventana. . : MAIN * * * * Componente : PB_CLOSE * * * * Evento . . : PRESS * * * * Descripcin: Terminar el programa * * * ********************************************************************* * C PB_CLOSE BEGACT PRESS MAIN * C move *on *inlr * C ENDACT ********************************************************************* * * * Ventana. . : MAIN * * * * Componente : PB_COPY * * * * Evento . . : PRESS * * * * Descripcin: Copiar el texto seleccionado en el MLE al componente * * edicin de mltiples lneas. * * * ********************************************************************* * C PB_COPY BEGACT PRESS MAIN * C 'EF1' setatr *blanks 'Text' C 'MLE1' getatr 'TextStart' start 5 0 C 'MLE1' getatr 'TextSelect' selected 128 * C start ifgt *zero C 'ef1' setatr selected 'Text' C endif * C ENDACT
Figura 22. Ejemplo de cdigo en el que se utiliza el componente edicin de mltiples lneas (Pieza 1 de 2)
113
********************************************************************* * * * Ventana . : Main * * * * Componente : Top * * * * Evento . . : Press * * * * Descripcin: Establecer la 5 lnea del componente edicin de * * mltiples lneas como lnea superior * * * * Cambios . : * * * ********************************************************************* * C TOP BEGACT PRESS MAIN * C eval %setatr('MAIN':'MLE1':'TOPLINE') = 5 C ENDACT ********************************************************************* * * * Ventana . : Main * * * * Componente : Bottom * * * * Evento . . : Press * * * * Descripcin: Establecer la parte inferior * * * ********************************************************************* * C BOTTOM BEGACT PRESS MAIN * C eval %setatr('MAIN':'MLE1':'TOPLINE') = 0 C ENDACT
Figura 22. Ejemplo de cdigo en el que se utiliza el componente edicin de mltiples lneas (Pieza 2 de 2)
114
Cuaderno
Utilice el componente cuaderno para presentar datos que se pueden agrupar lgicamente por temas: por ejemplo, informacin de cliente dividida en categoras tales como Nombre, Direccin de envo, Pedidos y Crditos. Un componente cuaderno es una representacin grfica en forma de cuaderno. (En aplicaciones Windows, recibe el nombre de control de separadores). Puede aadir pginas al cuaderno y agruparlas en secciones separadas por separadores. Si la pgina de cuaderno tiene lienzo, puede aadir ms de un componente a la misma. Si no tiene lienzo, slo se puede aadir un componente. El usuario puede pasar las pginas de un cuaderno para ir de una pgina a otra o ir directamente a una seccin del cuaderno pulsando el botn del ratn sobre la pestaa. Puede aadir pginas de cuaderno del modo siguiente: v Utilizando el cuaderno de propiedades del componente cuaderno v Sealando y pulsando (o arrastrando y soltando) una pgina de cuaderno o una pgina de cuaderno con lienzo en el componente cuaderno. Para obtener informacin relacionada, consulte el apartado: v Pgina de cuaderno en la pgina 116 v Pgina de cuaderno con lienzo en la pgina 117 Atributos de componente
BackColor Enabled FontName ForeColor Left PartType UserData BackMix Focus FontSize ForeMix PageNumber Refresh Visible Bottom FontBold FontStrike* Handle* ParentName ShowTabs* Width Count FontItalic FontUnder* Height PartName Top
*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Create Destroy
115
Pgina de cuaderno
Utilice el componente pgina de cuaderno para aadir pginas a un cuaderno. Solamente puede aadir un componente a una pgina de cuaderno; el tamao del mismo se adaptar a la pgina. Si desea aadir ms de un componente en una pgina, debe colocar un componente lienzo en la pgina de cuaderno. Tambin puede utilizar el componente pgina de cuaderno con lienzo para ahorrarse un paso. Nota: Las propiedades, los eventos y otros elementos de este componente slo se pueden manipular desde su men emergente de la vista de rbol de proyectos. El usuario puede pulsar las teclas de flecha izquierda y derecha para ir de una pgina a otra. Para obtener informacin relacionada, consulte el apartado v Cuaderno en la pgina 115 v Pgina de cuaderno con lienzo en la pgina 117 Atributos de componente
Enabled Refresh Visible ParentName TabImage PartName TabLabel PartType UserData
Establecimiento de un nemotcnico
Para especificar una clave nemotcnica para el elemento de men, coloque el identificador nemotcnico delante de un carcter en el texto del atributo Label. El carcter al que se ha asignado la clave nemotcnica se visualiza en la interfaz con un subrayado (por ejemplo, Visualizar). Tenga en cuenta que para Windows NT/95/98, las claves nemotcnicas se visualizan, pero no funcionan en pginas del cuaderno. Nota: Las aplicaciones Java no soportan nemotcnicos
116
Utilice la pgina de cuaderno con lienzo para aadir pginas a un componente cuaderno. El componente lienzo ocupa el rea de cliente de un componente pgina de cuaderno. Si se aaden componentes al lienzo se puede crear una interfaz grfica de usuario. Si slo desea aadir un componente a la pgina, puede utilizar el componente pgina de cuaderno en lugar del componente pgina de cuaderno con lienzo. Puesto que dicho componente no tiene lienzo, el tamao del componente que se aada se ajustar automticamente. Para obtener informacin relacionada, consulte el apartado: v Pgina de cuaderno en la pgina 116 v Cuaderno en la pgina 115 Atributos de componente
Enabled TabImage ParentName TabLabel PartName UserData PartType Visible
117
Interfaz ODBC/JDBC
El componente Interfaz ODBC/JDBC proporciona la posibilidad de procesar archivos de base de datos que den soporte a la API ODBC de Windows o la API JDBC de JavaSoft. Foxpro, Access y Paradox son ejemplos de estos tipos de archivos de base de datos. Para desarrollar aplicaciones que puedan utilizar el componente Interfaz ODBC/JDBC, debe estar familiarizado con SQL y tener instalado el SDK ODBC de Windows o el Java 2 Software Development Kit (J2SDK), Standard Edition, de JavaSoft en la estacin de trabajo. Si no tiene el SDK ODBC, puede bajarlo de Microsoft en el URL siguiente:
http://www.microsoft.com/odbc/download.htm
El soporte de JDBC forma parte del Java 2 Software Development Kit (J2SDK) Versin 1.2 para Windows. Si no tiene el J2SDK, puede bajarlo de Sun Microsystems en el URL siguiente:
http://www.javasoft.com/products/
Las aplicaciones que acceden y manipulan datos de una base de datos JDBC necesitan el controlador de conformidad con JDBC 2.0 adecuado. Puede encontrar el controlador JDBC y ms informacin en el URL siguiente:
http://java.sun.com/products/jdbc/
Nota: JDBC no se puede utilizar en applets. Una base de datos ODBC o JDBC se compone de una o varias tablas. Los datos se almacenan en una tabla como una serie de filas. Cada fila, o registro, contiene un nmero de columnas con datos. El programa puede someter sentencias SQL junto con los atributos del componente Interfaz ODBC/JDBC para manipular filas, o para traspasar datos entre campos del programa y columnas de tablas. Para poder procesar una base de datos existente, el programa VARPG debe conectarse antes a la base de datos e indicar a qu tabla hace referencia. Para manipular las filas de una tabla, el programa debe crear un conjunto de registros que identifique los registros que el componente interfaz ODBC/JDBC debe devolver y mantener. Para acceder a los datos de una fila, debe enlazar cada una de las columnas utilizadas en la fila de la tabla con un campo del programa. En las aplicaciones Java no se pueden utilizar los punteros. Una columna est enlazada a un componente; para enlazar slo se pueden utilizar los componentes texto esttico y campo de entrada. Si crea una aplicacin Java que utiliza el componente Interfaz ODBC/JDBC, los usuarios finales que ejecuten la aplicacin deben instalar el archivo varpgjdb.jar en sus estaciones de trabajo y aadir su ubicacin en la sentencia classpath. El programa de utilidad de empaquetamiento no incluye este archivo JAR. El archivo JAR est ubicado en el subdirectorio adtswin\java.
118
Atributos de componente
AllowChg* BufferLen* Column Columnas ConnectStr Fetch Handle* Left Refresh SQLQuery UserData BindPart BufferPtr* ColumnDec ColumnType CurrentRow FetchNext Height ParentName Rows* Top Visible Bottom BufferType* ColumnLen Connect DeleteRow FetchPrior InsertRow PartName SQLError UnBind Width BufferDec* CharData ColumnName Connected ExecuteSQL GetTables IsData PartType SQLMsgBox UpdateRow
*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Create Destroy
119
utilizando los atributos SQLQuery y ExecuteSQL. La sentencia SELECT identifica cul es la tabla de la base de datos a la que se accede y cul es el grupo de registros de la tabla que se va a procesar. El segmento de cdigo siguiente es un ejemplo de creacin de un conjunto de todos los registros de la tabla CUSTOMERS:
D SelAll * C 'ODBC' C 'ODBC' C Setatr Setatr SelAll 1 'Select * From "Customers"' 'SQLQuery' 'ExecuteSQL'
Tambin puede utilizar el %ADDR incorporado directamente en las especificaciones C para evitar codificar las especificaciones D para definir los punteros:
120
Eval
%Setatr(Main':'ODBC1':'BufferPtr')=%Addr(first)
Tipos de datos
Utilice el atributo BufferType para indicar el tipo de datos del campo de programa al que hace referencia el atributo BufferPtr. El componente Interfaz ODBC/JDBC utiliza el atributo BufferType para realizar la conversin de datos correcta al traspasar datos entre el campo del programa y la columna de la tabla. Es importante establecer correctamente este atributo, ya que no se comprueba si los tipos de campo son adecuados. Establezca el atributo Column antes de utilizar el atributo BufferType. Si el campo de programa est asociado a un componente de la interfaz, el atributo DataType se puede utilizar para obtener el tipo de almacenamiento intermedio. Utilice el siguiente diagrama para establecer el tipo de datos VARPG en el correspondiente tipo de datos SQL soportado. Especifique los atributos BufferLen y BufferDec slo como se listan en el diagrama. Para los tipos de datos carcter, entero o entero pequeo, especifique slo el atributo BufferLen. Tenga en cuenta que los tipos de datos doble, flotante y real pueden definirse en VARPG, como flotante (F) o decimal con zona. Si los define como decimal con zona, el tiempo de ejecucin de VARPG slo utilizar el nmero de posiciones decimales que especifica el atributo BufferDec cuando traslade datos de la columna. Esto puede provocar una prdida de precisin si el origen de datos tiene ms posiciones decimales que las especificadas por el atributo BufferDec. Si define estos campos como flotantes (F), NO especifique los atributos BufferLen ni BufferDec.
Tipo de datos SQL Tipo de datos VARPG Especifica la longitud del campo de programa (utilice BufferLen) X X X X X X X X X X Especifica las posiciones decimales de la columna del almacenamiento intermedio (utilice BufferDec)
Carcter Decimal Entero Entero pequeo Doble Doble Coma flotante Coma flotante Real Real
CHAR Decimal con Decimal con Decimal con 8F Decimal con 4F Decimal con 4F Decimal con
Si una columna contiene un tipo de datos que el componente Interfaz ODBC/JDBC no soporta, establezca el atributo AllowChg en 0 para esa columna. El componente Interfaz ODBC/JDBC no traspasar datos entre ningn campo de programa y la columna. No se efectuar ningn cambio en los datos.
121
para el componente Interfaz ODBC/JDBC utilizando los atributos SQLQuery y ExecuteSQL. Primero, el atributo SQLQuery se establece en la sentencia SQL que se ejecutar. Despus, el atributo ExecuteSQL se establece en 1 para ejecutar la consulta. En el ejemplo siguiente, todos los registros se seleccionan de la tabla Customers:
D SelAll * C 'ODBC1' C 'ODBC1' C Setatr Setatr SelAll 1 'Select * From "Customers"' 'SQLQuery' 'ExecuteSQL'
Para determinar el nmero de filas que se han devuelto como resultado de un atributo SQLQuery, puede comprobar el valor del atributo Rows. Una vez devuelto el conjunto de registros, se puede procesar cada una de las filas utilizando los atributos FetchNext y FetchPrior. Establezca el atributo FetchNext en 1 para devolver la fila siguiente del conjunto de registros. Establezca el atributo FetchPrior en 1 para devolver la fila anterior del conjunto de registros. Para determinar si un atributo FetchNext o FetchPrior ha devuelto correctamente una fila, compruebe el valor del atributo IsData. El valor 1 indica que se han devuelto datos. De lo contrario, el valor de IsData se establece en 0. En el ejemplo siguiente, se leen todos los registros de un conjunto de registros y se aade el valor de la columna 1 (primer campo) al recuadro de lista LB1.
C C C C C C * 'ODBC1' 'ODBC1' 'LB1' 'ODBC1' Setatr Getatr DoW Setatr Getatr EndDo 1 'IsData' Temp = 1 first 'IsData' 'FetchNext' Temp 'AddItemEnd' Temp 1 0
122
En el ejemplo siguiente, el usuario ha pulsado Suprimir para suprimir un registro que se acaba de buscar y que aparece visualizado en una ventana.
C C C C * * PB_Delete 'ODBC1' 'ODBC1' BEGACT Getatr Setatr ENDACT PRESS Main 1 0 'CurrentRow' Row Row 'DeleteRow'
123
* D ConnectStr C D D D * Variables de trabajo DRow S 6 0 * * Definir punteros a almacenamientos * DP_001 S * DP_002 S * DP_003 S * DP_004 S * DP_005 S * DP_006 DP_007 DP_008 DP_009 DP_010 DP_011 S S S S S S * * * * * *
intermedios de campos Nmero Nombre Nmero rep. Contacto Telfono Fax Direccin Ciudad Pas Cdigo postal Localidad postal
124
********************************************************************* * * * Ventana . : Main * * * * Componente : Main * * * * Evento . . : Create * * * * Descripcin: Enlazar campos de programa a columnas y conectar con * * tabla de base de datos CUSTOMERS * * * ********************************************************************* * C Main BEGACT CREATE Main * * Enlazar campos a columnas * Enlazar columna: Nmero * C 'ODBC' SetAtr 1 'Column' C 'ODBC' SetAtr 7 'BufferLen' C 'ODBC' SetAtr 1 'BufferType' C Eval P_001=%Addr(Number) C 'ODBC' SetAtr P_001 'BufferPtr' * * Enlazar columna: Nombre * C 'ODBC' SetAtr 2 'Column' C 'ODBC' SetAtr 40 'BufferLen' C 'ODBC' SetAtr 1 'BufferType' C Eval P_002=%Addr(Name) C 'ODBC' SetAtr P_002 'BufferPtr' * * Enlazar columna: Nmero rep. * C 'ODBC' SetAtr 3 'Column' C 'ODBC' SetAtr 5 'BufferLen' C 'ODBC' SetAtr 1 'BufferType' C Eval P_003=%Addr(Rep_number) C 'ODBC' SetAtr P_003 'BufferPtr' * * Enlazar columna: Contacto * C 'ODBC' SetAtr 4 'Column' C 'ODBC' SetAtr 30 'BufferLen' C 'ODBC' SetAtr 1 'BufferType' C Eval P_004=%Addr(Contact) C 'ODBC' SetAtr P_004 'BufferPtr' *
125
* * Enlazar columna: * C 'ODBC' C 'ODBC' C 'ODBC' C C 'ODBC' * * Enlazar columna: * C 'ODBC' C 'ODBC' C 'ODBC' C C 'ODBC' * * Enlazar columna: * C 'ODBC' C 'ODBC' C 'ODBC' C C 'ODBC' * * Enlazar columna: * C 'ODBC' C 'ODBC' C 'ODBC' C C 'ODBC' * * Enlazar columna: * C 'ODBC' C 'ODBC' C 'ODBC' C C 'ODBC' * * Enlazar columna: * C 'ODBC' C 'ODBC' C 'ODBC' C C 'ODBC' *
Telfono SetAtr SetAtr SetAtr Eval SetAtr Fax SetAtr SetAtr SetAtr Eval SetAtr Direccin SetAtr SetAtr SetAtr Eval SetAtr Ciudad SetAtr SetAtr SetAtr Eval SetAtr Pas SetAtr SetAtr SetAtr Eval SetAtr 9 'Column' 20 'BufferLen' 1 'BufferType' P_009=%Addr(Country) P_009 'BufferPtr' 8 'Column' 30 'BufferLen' 1 'BufferType' P_008=%Addr(City) P_008 'BufferPtr' 7 'Column' 40 'BufferLen' 1 'BufferType' P_007=%Addr(Address) P_007 'BufferPtr' 6 'Column' 17 'BufferLen' 1 'BufferType' P_006=%Addr(Fax) P_006 'BufferPtr' 5 'Column' 17 'BufferLen' 1 'BufferType' P_005=%Addr(Phone) P_005 'BufferPtr'
Cdigo postal SetAtr SetAtr SetAtr Eval SetAtr 10 'Column' 10 'BufferLen' 1 'BufferType' P_010=%Addr(Zip_Postal) P_010 'BufferPtr'
126
* * Enlazar columna: Localidad postal * C 'ODBC' SetAtr 11 'Column' C 'ODBC' SetAtr 5 'BufferLen' C 'ODBC' SetAtr 1 'BufferType' C Eval P_011=%Addr(Zip_loc) C 'ODBC' SetAtr P_011 'BufferPtr' C 'ODBC' SetAtr ConnectStr 'ConnectStr' * * Conectar a la base de datos y seleccionar todos los registros * C 'ODBC' SetAtr 1 'Connect' C 'ODBC' SetAtr SelAll 'SQLQuery' C 'ODBC' SetAtr 1 'ExecuteSQL' * * Buscar la primera fila de datos y visualizarla en la ventana * C 'ODBC' SetAtr 1 'FetchNext' C Write 'Main' * C ENDACT ********************************************************************* * * * Ventana . : Main * * * * Componente : PB_Prev * * * * Evento . . : Press * * * * Descripcin: Buscar la fila anterior y visualizarla * * * ********************************************************************* * C PB_PREV BEGACT PRESS Main * C 'ODBC' SetAtr 1 'FetchPrior' C Write 'Main' * C ENDACT *
127
********************************************************************* * * * Ventana . : Main * * * * Componente : PB_Next * * * * Evento . . : Press * * * * Descripcin: Buscar la fila siguiente y visualizarla * * * ********************************************************************* * C PB_NEXT BEGACT PRESS Main * C 'PB_Next' Setatr 0 'Enabled' C 'ODBC' SetAtr 1 'FetchNext' C Write 'Main' C 'PB_Next' Setatr 1 'Enabled' * C ENDACT * ********************************************************************* * * * Ventana . : Main * * * * Componente : PB_Insert * * * * Evento . . : Press * * * * Descripcin: * * * ********************************************************************* * C PB_INSERT BEGACT PRESS Main * C Read 'Main' C 'ODBC' SetAtr 1 'InsertRow' * C ENDACT *
128
********************************************************************* * * * Ventana . : Main * * * * Componente : PB_Delete * * * * Evento . . : Press * * * * Descripcin: Suprimir la fila actual * * * ********************************************************************* * C PB_DELETE BEGACT PRESS Main * * Confirmar supresin de fila C *MSG0001 Dsply mRC 9 0 * C If mRC=*YesButton C 'ODBC' GetAtr 'CurrentRow' Row C 'ODBC' SetAtr Row 'DeleteRow' C EndIf * C ENDACT * ********************************************************************* * * * Ventana . : Main * * * * Componente : PB_Update * * * * Evento . . : Press * * * * Descripcin: Actualizar la fila actual * * * ********************************************************************* * C PB_UPDATE BEGACT PRESS Main * C Read 'Main' C 'ODBC' GetAtr 'CurrentRow' Row C 'ODBC' SetAtr Row 'UpdateRow' * C ENDACT *
129
********************************************************************* * * * Ventana . : Main * * * * Componente : PB_Close * * * * Evento . . : Press * * * * Descripcin: Finalizar el programa * * * ********************************************************************* * C PB_CLOSE BEGACT PRESS Main * C Move *ON *INLR * C ENDAC *
130
Recuadro de contorno
Utilice un recuadro de contorno alrededor de un grupo de componentes para indicar que estn relacionados. Un recuadro de contorno no tiene etiqueta. Si en el recuadro debe aparecer una etiqueta, utilice el componente recuadro de grupo en lugar de ste. Para obtener informacin relacionada, consulte el apartado Recuadro de grupo en la pgina 79. Atributos de componente
Bottom ParentName Top Handle* PartName UserData Height PartType Visible Left Refresh Width
Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Create Destroy
131
Men emergente
Utilice el componente men emergente para visualizar las opciones que pertenecen a un componente determinado de la interfaz. Puede aadir opciones de men y submens a los mens emergentes. Este men se llama emergente porque aparece cuando el usuario pulsa la tecla o el botn del ratn adecuados. Nota: Las propiedades, los eventos y otros elementos de este componente slo se pueden manipular desde su men emergente de la vista de rbol de proyectos. Para obtener informacin relacionada, consulte el apartado: v Barra de mens en la pgina 103 v Elemento de men en la pgina 104 v Submen en la pgina 166 Atributos de componente
Handle* PartName X InvName PartType Y InvPName UserData ParentName Visible*
*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse No hay eventos para este componente.
132
Barra de progreso
Utilice el componente barra de progreso para indicar de forma grfica el progreso de un proceso como, por ejemplo, copiar archivos, cargar una base de datos, etc. Por ejemplo, para mostrar el progreso de copiar 100 archivos, puede establecer el atributo PBRange en 100 y el atributo PBStepSize en 10. El cdigo podra supervisar el proceso de copiar archivos y el indicador de barra de progreso avanzara en pasos por cada diez archivos copiados. En las aplicaciones Java, si el ancho de la barra de progreso es menor que la altura, la barra de progreso ser vertical. Atributos de componente
Bottom ParentName PBSetPos UserData Handle* PartName PBStep Visible Height PartType PBStepSize Width Left PBRange Top
*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Create Destroy
133
Pulsador
Utilice pulsadores para proporcionar acceso a las acciones ms utilizadas. Cada componente pulsador controla una accin determinada. Cuando el usuario lo pulsa, la accin se inicia inmediatamente. La etiqueta de texto del pulsador describe la accin que ste realiza. Comprese con el apartado Pulsador grfico en la pgina 77. Atributos de componente
BackColor Enabled FontName ForeColor HelpEnable ParentName ShowTips Validate BackMix Focus FontSize ForeMix HighLight PartName TipText Visible Border* FontBold FontStrike* Handle* Label PartType Top Width Bottom FontItalic FontUnder* Height Left Refresh UserData
*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Create MouseEnter Press Destroy MouseExit GotFocus MouseMove LostFocus Popup
Establecimiento de un nemotcnico
Nota: Las aplicaciones Java no soportan nemotcnicos. Para cada pulsador, utilice el atributo Label para asociar el texto a un pulsador especfico. Ese texto aparece en el botn. Para especificar una clave nemotcnica para el elemento de men, coloque el identificador nemotcnico delante de un carcter en el texto del atributo Label. En Windows NT/95/98, se utiliza el smbolo &. El carcter al que se ha asignado la
134
clave nemotcnica se visualiza en la interfaz con un subrayado (por ejemplo, Cancelar). El subrayado informa a los usuarios que pueden seleccionar el pulsador presionando la tecla del carcter subrayado en el teclado.
Sealizacin de eventos
Un evento Press se seala en el programa cuando: v el usuario selecciona un pulsador. v el usuario pulsa la tecla Intro si se ha definido un pulsador por omisin. v el usuario pulsa una tecla de mandato que se ha asignado a un pulsador.
135
Botn de seleccin
Utilice botones de seleccin si desea que el usuario seleccione slo una opcin de un grupo de opciones relacionadas pero que se excluyen mutuamente. Cuando el usuario efecta una seleccin, la opcin seleccionada anteriormente en el grupo se deselecciona. Un botn de seleccin tiene forma circular y a su lado hay texto. Cuando est seleccionado, contiene un punto. No utilice botones de seleccin si desea que el usuario pueda seleccionar ms de una opcin al mismo tiempo. En este caso, consulte el apartado Recuadro de seleccin en la pgina 55. Atributos de componente
BackColor Enabled FontName ForeColor HighLight* PartName ShowTips Visible BackMix Focus FontSize ForeMix Label PartType TipText Width Bottom FontBold FontStrike* Handle* Left Refresh Top Checked FontItalic FontUnder* Height ParentName SelectIdx UserData
*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Create MouseExit Destroy MouseMove Enter Popup MouseEnter Select
Establecimiento de un nemotcnico
Para especificar una clave nemotcnica para el pulsador, coloque el identificador nemotcnico delante de un carcter en el texto del atributo Label. En Windows NT/95/98, se utiliza el smbolo &. El carcter al que se ha asignado la clave nemotcnica se visualiza en la interfaz con un subrayado (por ejemplo, Azul). El subrayado informa a los usuarios que pueden seleccionar el botn de seleccin pulsando la tecla del carcter subrayado en el teclado. Nota: Las aplicaciones Java no soportan nemotcnicos.
136
figura siguiente muestra cmo se pueden agrupar estos botones de seleccin en la ventana de diseo :
Para organizar los botones de seleccin en grupos lgicos: 1. Organice los botones de seleccin como desee y, opcionalmente, coloque un recuadro de grupo alrededor de cada grupo. (Consulte el apartado Recuadro de grupo en la pgina 79.) 2. Seleccione el componente lienzo en la ventana de diseo y pulse el botn 2 del ratn. 3. Seleccione Tabuladores y Grupos... del men emergente. Aparece la ventana Personalizar tabuladores y grupos mostrando una lista de todos los componentes de la ventana de diseo. Si es necesario, cambie el tamao de esta ventana para ver todos los componentes. 4. Pulse el botn 1 del ratn para seleccionar el botn de seleccin que ser el primer botn del primer grupo. En este ejemplo, RB1 es el primer botn de seleccin del grupo 1. 5. Pulse el botn 2 del ratn para obtener el men emergente para este componente botn de seleccin, y seleccione Marca de grupo. Aparece una marca de verificacin X junto al botn de seleccin bajo la columna Marca de grupo. Nota: Tambin puede establecer la marca de grupo en el cuaderno de propiedades para el componente. 6. Utilice Control+Flecha arriba y Control+Flecha abajo para colocar RB2 despus de RB1. Tenga en cuenta que tambin puede colocar estos botones dentro de la vista de rbol o utilizando los elementos de men mover arriba y mover abajo. Asegrese de que el atributo Group mark no se ha establecido para RB2. Esto especifica que RB2 es el segundo botn de seleccin del grupo 1. 7. Pulse Aceptar para cerrar la ventana. Nota: No cierre la ventana utilizando el men del sistema, o no se guardarn los cambios.
137
Ahora se considera que RB1 y RB2 forman parte de un grupo, de forma que seleccionar uno de ellos slo afectar al otro. Repita el mismo proceso para RB3 y RB4. La siguiente figura muestra la ventana Personalizar tabuladores y grupos despus de haber agrupado los componentes:
Nota: Los topes de tabulador y las marcas de grupo tambin pueden establecerse para componentes concretos desde el cuaderno de propiedades de un componente.
Sealizacin de eventos
Cuando el usuario selecciona un elemento de men, se seala un evento Select.
138
Graduador
Utilice el componente graduador si desea que el usuario visualice, establezca o modifique un valor moviendo el eje del graduador. Los graduadores suelen utilizarse para valores con incrementos habituales, como los segundos o los grados, o con el fin de mostrar qu porcentaje se ha realizado de una tarea. Por omisin, el graduador se sita horizontalmente en el centro de un recuadro con su eje en el lado izquierdo. Se puede visualizar una escala para mostrar las unidades de medida del graduador. Utilice el cuaderno de propiedades del componente graduador para: v Definir el rango de valores que un graduador puede devolver. v Colocar el graduador en posicin vertical u horizontal en una ventana. v Proporcionar una escala para indicar la unidad de medida del graduador. Atributos de componente
AddLink* Bottom FontItalic FontUnder* Height ParentName RemoveLink* TipText Visible AllowLink* Enabled FontName ForeColor Left PartName ShowTips Top Width BackColor Focus FontSize ForeMix Maximum PartType TickLabel UserData BackMix FontBold FontStrike* Handle* Minimum Refresh TickNumber Value
*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Change Link* MouseMove Create LostFocus Popup Destroy MouseEnter GotFocus MouseExit
*Nota: Consulte la descripcin del evento si desea saber cules son las restricciones.
139
Sealizacin de eventos
El evento Change se seala cuando cambia la posicin del nivel del graduador. Si utiliza botones de incremento para desplazar el nivel del graduador, el evento Change se seala continuamente mientras permanezcan pulsados los botones. Si utiliza el ratn para desplazar el nivel del graduador, se produce el evento Change despus de haber soltado el botn del ratn.
Ejemplo de graduador
Este ejemplo muestra cmo el componente graduador puede utilizarse para controlar el color de otros componentes utilizando el atributo BackMix. A medida que se desplaza cada graduador, se utiliza su valor para determinar la mezcla de color de fondo y su componente texto esttico correspondiente, para mostrar la intensidad de dicho color. El color de fondo del texto esttico con la etiqueta Ejemplo se actualiza para mostrar la mezcla de color combinado de los tres colores.
140
********************************************************************* * * * ID de programa : SLIDER * * * * Descripcin . : Programa de ejemplo que muestra el componente * * graduador. * * * * Al mover cada nivel del graduador, se seala un * * evento CHANGE para ese graduador. * * La subrutina de accin CHANGE recupera el valor * * del graduador y actualiza la mezcla de color de * * fondo de su componente texto esttico * * correspondiente para mostrar la intensidad de * * ese color. * * * * La mezcla de color de fondo del componente * * texto esttico 'SAMPLE' tambin se actualiza * * para mostrar el resultado de mezclar todos los * * valores de colores. * * * ********************************************************************* *
* ********************************************************************* * * * Ventana. . : MAIN * * * * Componente : PB_EXIT * * * * Evento . . : PRESS * * * * Descripcin: Terminar el programa * * * ********************************************************************* * C PB_EXIT BEGACT PRESS MAIN * C move *on *inlr * C ENDACT
141
********************************************************************* * * * Ventana. . : MAIN * * * * Componente : GREEN * * * * Evento . . : CHANGE * * * * Descripcin: Actualizar el valor de color verde. * * * ********************************************************************* * C GREEN BEGACT CHANGE MAIN * C 'green' getatr 'Value' val 3 0 C move val grnmix 3 C move *blanks mix 11 C movel '000:' mix C mix cat grnmix:0 mix C mix cat ':000':0 mix C 'STGreen' setatr mix 'BackMix' C exsr update * C ENDACT ********************************************************************* * * * Ventana. . : MAIN * * * * Componente : BLUE * * * * Evento . . : CHANGE * * * * Descripcin: Actualizar el valor de color azul. * * * ********************************************************************* * C BLUE BEGACT CHANGE MAIN * C 'blue' getatr 'Value' val C move val blumix 3 C move *blanks mix C movel '000:000:' mix C mix cat blumix:0 mix C 'STBlue' setatr mix 'BackMix' C exsr update * C ENDACT
142
********************************************************************* * * * Subrutina . . : UPDATE * * * * Descripcin . : Actualiza la mezcla de color de fondo del * * componente de texto esttico 'Sample' para * * mostrar el resultado de combinar los valores * * de colores de los tres graduadores. * * * ********************************************************************* * C UPDATE BEGSR * C move *blanks smpmix 11 C movel redmix smpmix C smpmix cat ':':0 smpmix C smpmix cat grnmix:0 smpmix C smpmix cat ':':0 smpmix C smpmix cat blumix:0 smpmix C 'Sample' setatr smpmix 'BackMix' * C ENDSR ********************************************************************* * * * Ventana. . : MAIN * * * * Componente : RED * * * * Evento . . : CHANGE * * * * Descripcin: Actualizar el valor de color rojo. * * * ********************************************************************* * C RED BEGACT CHANGE FRA0000B * C 'red' getatr 'Value' val C move val redmix 3 C move *blanks mix C movel redmix mix C mix cat ':000:000':0 mix C 'STRed' setatr mix 'BackMix' C exsr update * C ENDACT
143
********************************************************************* * * * Ventana. . : MAIN * * * * Componente : MAIN * * * * Evento . . : CREATE * * * * Descripcin: Inicializar la mezcla de color * * * ********************************************************************* * C MAIN BEGACT CREATE MAIN * C move '000' grnmix C move '000' blumix C move '000' redmix * C ENDACT
144
Selector cclico
Utilice el componente selector cclico para visualizar, de forma secuencial, un grupo de opciones relacionadas, pero que se excluyen mutuamente, que tienen un orden consecutivo lgico; por ejemplo, los meses del ao. Las opciones se visualizan como si estuvieran organizadas en forma de anillo. El usuario puede mover (o girar) las opciones pulsando la flecha hacia arriba para ir al valor superior siguiente o la flecha hacia abajo para ir al valor inferior siguiente. Tambin puede escribir una opcin directamente en el campo de entrada del selector cclico. Atributos de componente
AddItemEnd Bottom FontItalic FontUnder* Height ParentName Refresh TipText Visible Alignment* Enabled FontName ForeColor Left PartName RemoveItem Top Width BackColor Focus FontSize ForeMix Maximum PartType ShowTips UserData BackMix FontBold FontStrike* Handle* Minimum ReadOnly Text Value
*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Change Link* MouseMove SpinUp Create LostFocus Popup Destroy MouseEnter SpinDown GotFocus MouseExit SpinEnd
*Nota: Consulte la descripcin del evento si desea saber cules son las restricciones.
145
146
********************************************************************* * * * ID de programa : SPIN * * * * Descripcin . : Programa de ejemplo que muestra el componente * * selector cclico. * * * * Se utiliza un selector cclico de caracteres y * * otro numrico para mostrar cmo se inicializan * * y cmo se recuperan sus valores. * * * ********************************************************************* *
* DDAY S 10A DIM(7) PERRCD(1) CTDATA * ********************************************************************* * * * Ventana. . : MAIN * * * * Componente : PB_COPY * * * * Evento . . : PRESS * * * * Descripcin: Copiar el valor de cada botn selector cclico a * * su componente campo de entrada correspondiente. * * * ********************************************************************* * C PB_COPY BEGACT PRESS MAIN * C 'SPB1' Getatr 'Value' tmp2N 2 0 C 'EF1' Setatr tmp2N 'Text' * C 'SPB2' Getatr 'Text' tmp 10 C 'EF2' Setatr tmp 'Text' * C ENDACT
Figura 25. Ejemplo de cdigo en el que se utiliza el componente selector cclico (Pieza 1 de 2)
147
********************************************************************* * * * Ventana. . : MAIN * * * * Componente : MAIN * * * * Evento . . : CREATE * * * * Descripcin: Centrar la ventana en la pantalla e * * inicializar los selectores cclicos. * * * ********************************************************************* * C MAIN BEGACT CREATE MAIN * * Inicializar el selector cclico de caracteres con los das * de la semana a partir de la matriz DAY C Do 7 I 2 0 C 'SPB2' Setatr day(i) 'AddItemEnd' C EndDo * * Inicializar el selector cclico numrico C 'SPB1' Setatr 1 'Minimum' C 'SPB1' Setatr 10 'Maximum' * C ENDACT ********************************************************************* * * * Ventana. . : MAIN * * * * Componente : PB_EXIT * * * * Evento . . : PRESS * * * * Descripcin: Terminar el programa * * * ********************************************************************* * C PB_EXIT BEGACT PRESS MAIN * C Move *On *INLR * C ENDACT **CTDATA DAY Domingo Lunes Martes Mircoles Jueves Viernes Sbado
Figura 25. Ejemplo de cdigo en el que se utiliza el componente selector cclico (Pieza 2 de 2)
148
Texto esttico
Utilice el componente texto esttico como etiqueta de otros componentes, por ejemplo, como solicitud de un componente campo de entrada. Los componentes texto esttico no aceptan la entrada de datos por parte del usuario. En las aplicaciones Java, el texto esttico se visualiza nicamente en una sola lnea. Atributos de componente
Alignment DataType FontBold FontStrike* Handle* ParentName ShowTips Visible BackColor DragEnable* FontItalic FontUnder* Height PartName TipText Width BackMix DropEnable* FontName ForeColor Label PartType Top Bottom Enabled FontSize ForeMix Left Refresh UserData
*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Click Drop MouseExit Create Link* MouseMove DblClick MouseDown MouseUp Destroy MouseEnter Popup
*Nota: Consulte la descripcin del evento si desea saber cules son las restricciones.
149
Edicin de la salida
Puede editar el contenido de un componente texto esttico si el tipo de datos es numrico. Consulte el Captulo 11. Edicin de la salida en la pgina 229 para obtener una descripcin de la edicin.
150
Barra de estado
Utilice el componente barra de estado para proporcionar informacin adicional sobre un proceso o una accin de la ventana. Puede crear hasta cinco paneles para la barra de estado. El componente barra de estado proporciona al componente ventana mayor flexibilidad que el atributo StatusBar. Por omisin, la barra de estado se crea en la parte inferior de la ventana. No obstante, puede utilizar el cuaderno de propiedades para colocarla en la parte superior. Tambin puede establecer el estilo del borde, el nmero de paneles y la alineacin del texto. Atributos de componente
Handle* SBIndex Visible ParentName SBLabel PartName SBPanes PartType UserData
*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Create Destroy
151
Subarchivo
Utilice el componente subarchivo para visualizar una lista de registros, cada uno de los cuales consta de uno o ms campos. La funcin del componente subarchivo es similar a la de un subarchivo de AS/400 . El usuario puede desplazar el contenido de la lista en sentido horizontal o vertical utilizando las barras de desplazamiento del subarchivo. Para crear un campo de entrada de subarchivo, aada un campo de la ventana Definir campos de referencia o de la paleta de componentes en el componente subarchivo. Tambin puede aadir campos utilizando el cuaderno de propiedades. Nota: El componente subarchivo slo se puede colocar en una pgina de cuaderno con lienzo o en una ventana con lienzo. Atributos de componente
AddItemEnd BackMix ButtonTip CellFGClr ColFGClr Count ExtSelect* FontBold FontStrike* Handle* HdgFGMix Hidden Left PageSize RemoveItem RowFGMix SelectList SizeToFit TopRecord Width AllowEdit Bottom CapsLock CellFGMix ColFGMix DeSelect FirstSel FontItalic FontUnder* HdgBGClr HdgIdx HRule MultSelect ParentName RowBGClr Scale SetTop StartAt UserData AutoSelect ButtonIdx CellBGClr ColBGClr ColNumber EnableBtn Focus FontName ForeColor HdgBGMix HdgText Index NbrOfSel PartName RowBGMix Selected SflNxtChg TipText Visible BackColor Buttons CellBGMix ColBGMix ColWidth Enabled FontArea FontSize ForeMix HdgFGClr Height ItemCount OpenEdit PartType RowFGClr SelectItem ShowTips Top VRule
* Nota:: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Change Enter LastRec MouseMove PageTop Select ColSelect FirstRec LostFocus NextRec PageUp VKeyPress Create GotFocus MouseEnter PageDown Popup Destroy KeyPress MouseExit PageEnd PrevRec
152
Carga de un subarchivo
Para visualizar informacin en un componente subarchivo, la informacin se graba de registro en registro en el componente subarchivo. Los campos de subarchivo que se definieron en el Diseador GUI para el componente subarchivo se establecen en los valores deseados, y la operacin WRITE se realiza en el formato de registro de subarchivo.
153
tamao de pgina de subarchivo (es decir, el nmero de registros que se muestran a la vez) se determina al crear el subarchivo en el Diseador GUI.
C C C
* * * * * * * * * *
REPORT
BEGACT READS
WIN1 99
*IN99
DOWEQ
Para el registro seleccionado, procesarlo y marcarlo como 'Informado' en la pantalla de subarchivo. MOVEL UPDATE READS END ENDACT '(Reported)' SUBF1 SUBF1 99 SF1NAME
C C C C C
154
1. El usuario selecciona el campo con el puntero del ratn y pulsa el botn 1 del ratn mientras mantiene pulsada la tecla Alt. A continuacin, el usuario puede utilizar las teclas de tabulador y retroceso de tabulador para desplazarse por diferentes campos en el mismo registro, y utilizar las teclas de flecha arriba y flecha abajo para desplazarse a registros distintos. 2. Para abrir un campo para editarlo en el programa: a. Utilice el atributo Index para indicar qu registro contiene el campo que va a editarse. b. Establezca el atributo ColNumber para indicar el nmero de columna del campo que va a editarse. c. Establezca el valor del atributo OpenEdit en 1 para abrir el campo con el propsito de editarlo. (Puede establecer este valor del atributo en 0 para cerrar cualquier campo que est abierto actualmente para editarse.) Utilice la operacin READC para determinar si el usuario ha cambiado algn campo en el subarchivo.
Campos ocultos
En el cuaderno de propiedades del componente subarchivo, puede establecer que campos de subarchivo estn Ocultos para que no se visualicen. Por ejemplo, un registro de subarchivo puede contener informacin de clave de registro en un campo oculto. El campo oculto no puede verse, pero se devuelve al programa con el registro de subarchivo.
Habilitacin de la tabulacin
Utilice el dilogo Personalizar tabuladores y grupos para habilitar la tabulacin en un componente subarchivo. Pulse con el botn derecho del ratn en el componente lienzo de la ventana que contiene el componente subarchivo. Seleccione Tabuladores y grupos en el men emergente. Aparecer el dilogo Personalizar tabuladores y grupos. Para establecer o borrar el valor de tabulacin, pulse con el botn derecho del ratn en el nombre del componente y seleccione la opcin de men Tabulador.
Ejemplo de subarchivo
En el siguiente ejemplo, se utiliza un componente subarchivo para visualizar registros de un archivo de base de datos en un sistema AS/400. En lugar de rellenar el subarchivo con todos los registros de la base de datos, se proporcionan pulsadores de navegacin (FirstRec, LastRec, PageTop, PageUp, PageDown, PrevPage, NextPage) con el fin de controlar el desplazamiento por los registros dentro del subarchivo. Cuando accione el pulsador Select, se utiliza el cdigo de operacin READS para determinar qu registro se ha seleccionado, y el valor del campo CUSTNO se visualiza en el componente texto esttico. Adems se abre el primer campo del registro para editarlo.
Captulo 7. Utilizacin de componentes
155
H FCUSTOMER IF E DISK REMOTE INFDS(INFDS) BLOCK(*Yes) * * INFDS para el archivo de base de datos. FileSize contendr * el nmero de registros en el archivo cuando ste se abri. DINFDS DS DFileSize 156 159B 0 * ********************************************************************* * * * Subrutina . . : *INZSR * * * * Descripcin . : Inicializar las variables de trabajo. * * * ********************************************************************* * C *INZSR BEGSR * C Z-Add 10 PageSize 2 0 C Z-Add 1 CurRec 6 0 C FileSize Sub PageSize LastPage 6 0 C Add 1 LastPage * C ENDSR * *
********************************************************************* * * * ID de programa : SUBFILE * * * * Descripcin . : Programa de ejemplo que muestra el componente * * subarchivo. * * * * Este programa de ejemplo requiere un archivo * * fsico de base de datos en el AS/400 * * denominado CUSTOMER. * * * ********************************************************************* *
156
********************************************************************* * * * Subrutina . . : NEXTPAGE * * * * Descripcin . : Obtener la pgina siguiente de los registros * * de la base de datos. * * * ********************************************************************* * C NEXTPAGE BEGSR * C add PageSize CurRec * C CurRec IfGt FileSize C Sub PageSize CurRec * C Else C Exsr FillPage C 'SFl1' setatr 2 'BUTTONIDX' C 'SFL1' setatr 1 'ENABLEBTN' C EndIf * C ENDSR
157
********************************************************************* * * * Subrutina . . : PREVPAGE * * * * Descripcin . : Devolver la pgina anterior de registros de la * * base de datos. * * * ********************************************************************* * C PREVPAGE BEGSR * C Sub PageSize CurRec * C CurRec IfLe *zero C Add PageSize CurRec * C Else C Exsr FillPage C 'SFl1' setatr 5 'BUTTONIDX' C 'SFL1' setatr 1 'ENABLEBTN' C EndIf * C ENDSR ********************************************************************* * * * Subrutina . . : FILLPAGE * * * * Descripcin . : Rellenar el componente subarchivo con una pgina * * de registros de la base de datos. * * * ********************************************************************* * C FILLPAGE BEGSR * C Clear Sfl1 C CurRec Setll customer C Z-Add 1 count 2 0 C Read customer 9999 * C *in99 DoWeq *off C count AndLE PageSize C Write Sfl1 * C If %Getatr('Main':'HILITE':'Checked')=1 C 'SFL1' Setatr Count 'Index' C 'SFL1' Setatr 1 'ColNumber' C 'SFL1' Setatr *DarkGreen 'CellFGClr' C 'SFL1' Setatr 2 'ColNumber' C 'SFL1' Setatr *DarkPink 'CellFGClr' C 'SFL1' Setatr 3 'ColNumber' C 'SFL1' Setatr *DarkBlue 'CellFGClr' C EndIf
158
C C C C C C C C C C C C C C C C C C C C C C C C C C
* * CurRec 'SFl1' 'SFL1' 'SFl1' 'SFL1' 'SFl1' 'SFL1' 'SFl1' 'SFL1' *in99 CurRec 'SFl1' 'SFL1' 'SFl1' 'SFL1' 'SFl1' 'SFL1' 'SFl1' 'SFL1'
Add Read EndDo Read ifeq setatr setatr setatr setatr setatr setatr setatr setatr endif ifeq oreq setatr setatr setatr setatr setatr setatr setatr setatr endif ENDSR
count
9999 9999
* ********************************************************************* * * * Ventana. . : MAIN * * * * Componente : MAIN * * * * Evento . . : CREATE * * * * Descripcin: Obtener la primera pgina de los registros. * * * ********************************************************************* * C MAIN BEGACT CREATE MAIN * C Exsr FillPage * C 'SFL1' Setatr *Green 'HdgBGClr' C 'SFL1' Setatr *Black 'HdgFGClr' C 'SFL1' Setatr 1 'ColNumber'
159
C C C C C C C C C C C C C C C C
ENDACT * * ********************************************************************* * * * Ventana. . : MAIN * * * * Componente : PB_SELECT * * * * Evento . . : PRESS * * * * Descripcin: Leer el registro de subarchivo seleccionado. * * Se actualiza el componente de texto esttico * * 'Selected' para mostrar el nmero de cliente * * seleccionado. * * Se abre el primer campo del subarchivo para su * * edicin. * * * ********************************************************************* * C PB_SELECT BEGACT PRESS MAIN * C Reads sfl1 27 * C *in27 IfEq *off C 'Selected' Setatr custno 'Label' C 'SFL1' Setatr 1 'ColNumber' C 'SFL1' Setatr 1 'OpenEdit' C EndIf * C ENDACT
'MAIN' 'SFL1' 'SFL1' 'SFL1' 'SFL1' 'SFL1' 'SFL1' 'SFL1' 'SFL1' 'SFL1' 'SFL1' 'SFL1' 'SFL1' 'SFL1' 'SFL1'
Setatr Setatr Setatr Setatr Setatr Setatr Setatr Setatr Setatr Setatr Setatr Setatr Setatr Setatr Setatr
'Visible' 'BUTTONIDX' 'BUTTONTIP' 'ENABLEBTN' 'BUTTONIDX' 'BUTTONTIP' 'ENABLEBTN' 'BUTTONIDX' 'ENABLEBTN' 'BUTTONIDX' 'ENABLEBTN' 'BUTTONIDX' 'BUTTONTIP' 'BUTTONIDX' 'BUTTONTIP'
160
********************************************************************* * * * Ventana. . : MAIN * * * * Componente : HRULE * * * * Evento . . : MENUSELECT * * * * Descripcin: * * * ********************************************************************* * C HRULE BEGACT MENUSELECT MAIN * C If %Getatr('Main':'HRULE':'Checked')=1 C 'SFL1' Setatr 0 'HRule' C 'HRULE' Setatr 0 'Checked' * C Else C 'SFL1' Setatr 1 'HRule' C 'HRULE' Setatr 1 'Checked' C EndIf * C ENDACT ********************************************************************* * * * Ventana. . : MAIN * * * * Componente : VRULE * * * * Evento . . : MENUSELECT * * * * Descripcin: * * * ********************************************************************* * C VRULE BEGACT MENUSELECT MAIN * C If %Getatr('Main':'VRULE':'Checked')=1 C 'SFL1' Setatr 0 'VRule' C 'VRULE' Setatr 0 'Checked' * C Else C 'SFL1' Setatr 1 'VRule' C 'VRULE' Setatr 1 'Checked' C EndIf * C Exsr FillPage * C ENDACT
161
********************************************************************* * * * Ventana. . : MAIN * * * * Componente : HILITE * * * * Evento . . : MENUSELECT * * * * Descripcin: * * * ********************************************************************* * C HILITE BEGACT MENUSELECT MAIN * C If %Getatr('Main':'HILITE':'Checked')=1 C Eval %Setatr('Main':'HILITE':'Checked')=0 * C Else C Eval %Setatr('Main':'HILITE':'Checked')=1 C EndIf * C Exsr FillPage * C ENDACT ********************************************************************* * * * Ventana. . : MAIN * * * * Componente : SFL1 * * * * Evento . . : PAGETOP * * * * Descripcin: * * * ********************************************************************* * C SFL1 BEGACT PAGETOP MAIN * C Z-Add 1 CurRec C Exsr FillPage * C ENDACT
162
********************************************************************* * * * Ventana. . : MAIN * * * * Componente : SFL1 * * * * Evento . . : PAGEUP * * * * Descripcin: * * * ********************************************************************* * C SFL1 BEGACT PAGEUP MAIN * C exsr PrevPage * C ENDACT * ********************************************************************* * * * Ventana. . : MAIN * * * * Componente : SFL1 * * * * Evento . . : LASTREC * * * * Descripcin: * * * ********************************************************************* * C SFL1 BEGACT LASTREC MAIN * C FileSize Sub PageSize CurRec C Add 1 CurRec * C CurRec IfLt 1 C Z-Add 1 CurRec C EndIf * C Exsr FillPage * C 'SFL1' setatr 1 'BUTTONIDX' C 'SFL1' setatr 1 'ENABLEBTN' C 'SFL1' setatr 2 'BUTTONIDX' C 'SFL1' setatr 1 'ENABLEBTN' C 'SFL1' setatr 5 'BUTTONIDX' C 'SFL1' setatr 0 'ENABLEBTN' C 'SFL1' setatr 6 'BUTTONIDX' C 'SFL1' setatr 0 'ENABLEBTN' C ENDACT
163
********************************************************************* * * * Ventana. . : MAIN * * * * Componente : SFL1 * * * * Evento . . : PAGEDOWN * * * * Descripcin: * * * ********************************************************************* * C SFL1 BEGACT PAGEDOWN MAIN * C Exsr NextPage * C ENDACT ********************************************************************* * * * Ventana. . : MAIN * * * * Componente : SFL1 * * * * Evento . . : FIRSTREC * * * * Descripcin: * * * ********************************************************************* * C SFL1 BEGACT FIRSTREC MAIN * C Z-Add 1 CurRec C Exsr FillPage * C 'SFL1' setatr 1 'BUTTONIDX' C 'SFL1' setatr 0 'ENABLEBTN' C 'SFL1' setatr 2 'BUTTONIDX' C 'SFL1' setatr 0 'ENABLEBTN' C 'SFL1' setatr 5 'BUTTONIDX' C 'SFL1' setatr 1 'ENABLEBTN' C 'SFL1' setatr 6 'BUTTONIDX' C 'SFL1' setatr 1 'ENABLEBTN' C ENDACT
164
********************************************************************* * * * Ventana. . : MAIN * * * * Componente : EXIT * * * * Evento . . : MENUSELECT * * * * Descripcin: * * * ********************************************************************* * C EXIT BEGACT MENUSELECT MAIN * C Move *on *inlr * C ENDACT
Sealizacin de eventos
El evento Select se seala cuando: v Un usuario selecciona un elemento que ya est en un subarchivo. v Selecciona un elemento de la lista en el programa. v Un usuario selecciona un elemento que ya ha sido seleccionado. El evento Enter se seala cuando: v Un usuario efecta una doble pulsacin sobre un elemento que est en el subarchivo. v Un usuario pulsa la tecla Intro cuando el subarchivo tiene el foco y se ha seleccionado un elemento. En la subrutina de accin para estos eventos, puede utilizar el cdigo de operacin READS para determinar qu elemento se ha seleccionado.
165
Submen
Utilice un submen para: v Iniciar un men en cascada nuevo a partir de una opcin de men de un men ya existente. v Iniciar un men desplegable a partir de una opcin de men de la barra de mens. Tras crear un submen, puede aadirle opciones de men colocando componentes opcin de men, pero solamente en la vista de rbol. Nota: Las propiedades, los eventos y otros elementos de este componente slo se pueden manipular desde su men emergente de la vista de rbol de proyectos. Para obtener informacin relacionada, consulte el apartado Elemento de men en la pgina 104. Atributos de componente
ParentName PartName PartType UserData
166
Temporizador
Utilice el componente temporizador si el programa debe realizar determinadas operaciones en intervalos de tiempo preestablecidos. Por ejemplo, puede utilizarlo para cerrar una ventana o para finalizar una aplicacin despus de un periodo determinado de inactividad. El componente temporizador cuenta unidades de tiempo, hace un seguimiento del intervalo de tiempo preestablecido que transcurre entre dos eventos y desencadena el segundo evento cuando haya pasado el tiempo necesario. Cuando se crea un componente temporizador en el constructor GUI, el componente aparece en forma de icono en la ventana de diseo. Sin embargo, en el cuaderno de propiedades de un componente temporizador, puede especificar que no desea que el icono se visualice mientras el programa se ejecuta. Nota: No utilice el componente temporizador cuando precise un control exacto del tiempo. El evento Tick puede no producirse en el intervalo exacto que ha especificado, ya que hay otros programas ejecutndose en el sistema. Atributos de componente
AddLink* Left PartType Top AllowLink* Multiplier RemoveLink* UserData Bottom ParentName TimerMode Visible Interval PartName TimerTicks
* Nota:: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Create Destroy Link* Tick
* Nota:: Consulte la descripcin del evento si desea saber cules son las restricciones.
167
El componente temporizador tiene un atributo Multiplier. Al establecer este atributo, puede determinar cuntas veces transcurre el valor del intervalo antes de que se genere un evento Tick de temporizador. El valor de multiplicador se establece en 1, de manera que el temporizador genere un evento Tick al final de cada intervalo.
Ejemplo de temporizador
En este ejemplo, un componente texto esttico se desplaza en la ventana para cada evento Tick de temporizador. Al accionar el pulsador Start, la modalidad de temporizador se establece en 1. Esto inicia el temporizador y genera eventos Tick. Durante el proceso del evento Tick, se calculan nuevas coordenadas para el componente texto esttico y el componente se establece en la nueva ubicacin. Cuando accione el pulsador Detener, TimerMode se establecer en 2. Esto detiene el temporizador. Accione el pulsador Close para terminar el programa.
168
********************************************************************* * * * ID de programa : TIMER * * * * Descripcin . : Programa de ejemplo que muestra el componente * * temporizador moviendo un componente texto * * esttico en una ventana cada vez que se produce * * un 'Tick' en el temporizador. * * * ********************************************************************* *
* * Declarar atributos de sistema de tamao de pantalla D%DspHeight S 4 0 D%DspWidth S 4 0 * * Declarar nuevos atributos de evento de tamao D%NewHeight S 4 0 D%NewWidth S 4 0 * * Definir variables de trabajo DminX S 4 0 INZ(0) DmaxX S 4 0 DminY S 4 0 DmaxY S 4 0 DxChange S 4 0 INZ(5) DyChange S 4 0 INZ(5) *
169
********************************************************************* * * * Ventana . : FRA0000B * * * * Componente : FRA0000B * * * * Evento . . : CREATE * * * * Descripcin: Centrar la ventana en la pantalla. * * * * Calcular los valores iniciales. * * Dado que el atributo de altura del componente * * ventana incluye la barra de ttulo, restamos la * * altura de la barra de ttulo para que el componente * * texto esttico permanezca dentro del marco de la * * ventana. * * * * Para SVGA, este valor es de unos 20 pixels. * * Puede ajustarse para otras resoluciones. * * * ********************************************************************* * C FRA0000B BEGACT CREATE FRA0000B * * Obtener altura y anchura de ventana inicial C 'FRA0000B' getatr 'Height' winHeight 4 0 C 'FRA0000B' getatr 'Width' winWidth 4 0 * * Centrar la ventana en la pantalla C eval %setatr('FRA0000B': C 'FRA0000B': C 'Left')=(%DspWidth-winWidth)/2 * C eval %setatr('FRA0000B': C 'FRA0000B': C 'Bottom')=(%DspHeight-winHeight)/2 * * Obtener coordenadas iniciales del componente texto esttico C 'ST1' getatr 'Left' picX 4 0 C 'ST1' getatr 'Bottom' picY 4 0 * * Obtener las dimensiones del componente texto esttico C 'ST1' getatr 'Height' picHeight 4 0 C 'ST1' getatr 'Width' picWidth 4 0 * * Calcular las coordenadas Y mnimas y mximas C 'Start' getatr 'Height' startH 4 0 C 'Start' getatr 'Bottom' startB 4 0 C eval minY = startB + startH C eval maxY = winHeight - picHeight - 20 *
170
* Calcular la coordenada X mxima eval maxX = winWidth - picWidth * C ENDACT ********************************************************************* * * * Ventana . : FRA0000B * * * * Componente : START * * * * Evento . . : PRESS * * * * Descripcin: Iniciar el temporizador. * * * ********************************************************************* * C START BEGACT PRESS FRA0000B * C 'Timer1' setatr 1 'TimerMode' * C ENDACT ********************************************************************* * * * Ventana . : FRA0000B * * * * Componente : STOP * * * * Evento . . : PRESS * * * * Descripcin: Detener el temporizador. * * * ********************************************************************* * C STOP BEGACT PRESS FRA0000B * C 'Timer1' setatr 2 'TimerMode' * C ENDACT C
171
********************************************************************* * * * Ventana . : FRA0000B * * * * Componente : CLOSE * * * * Evento . . : PRESS * * * * Descripcin: Terminar el programa * * * ********************************************************************* * C CLOSE BEGACT PRESS FRA0000B * C eval *inlr = *on * C ENDACT ********************************************************************* * * * Ventana . : FRA0000B * * * * Componente : TIMER1 * * * * Evento . . : TICK * * * * Descripcin: Responder a los eventos tick del temporizador * * moviendo el componente texto esttico de la ventana. * * * * Si el componente texto esttico se mueve fuera del * * marco de la ventana, sus valores xChange e yChange * * se multiplican por -1 para invertir la direccin. * * * *********************************************************************
172
TIMER1 BEGACT TICK FRA0000B * * Calcular nuevas coordenadas de texto esttico C eval picX = picX + xChange C eval picY = picY + yChange * * Comprobar que el texto esttico permanece dentro de la ventana C select * C picX whenlt 0 C eval xChange = xChange * -1 C eval picX = minX + xChange * C picX whengt maxX C eval xChange = xChange * -1 C eval picX = maxX + xChange * C picY whenlt minY C eval yChange = yChange * -1 C eval picY = minY + yChange * C picY whengt maxY C eval yChange = yChange * -1 C eval picY = maxY + yChange * C endsl * * Mover el texto esttico a nuevas coordenadas C 'ST1' setatr picX 'Left' C 'ST1' setatr picY 'Bottom' * * C ENDACT
173
Utilice el componente barra de desplazamiento vertical para poder desplazarse por un panel de informacin de arriba abajo. La informacin puede ser una lista de archivos, los registros de una base de datos, las columnas de un documento, y otros elementos. Puede utilizar el atributo Range para representar el nmero total de los objetos por los que se efectuar el desplazamiento y el atributo PageSize para determinar el nmero de objetos que pueden visualizarse en una pgina. Atributos de componente
Bottom Height PageSize Position Top Enabled Left ParentName PrevLine UserData Focus NextLine PartName PrevPage Visible Handle* NextPage PartType Range Width
*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Create Destroy Scroll
174
Ventana
Las ventanas son el medio primordial que tiene el usuario de interactuar con el programa. Las aplicaciones deben contener al menos una ventana. Slo puede aadir un componente al rea de cliente de una ventana, con la excepcin de los componentes que son extensiones del marco de la ventana, como las barras de mens, los mens emergentes y los subarchivos de mensajes. El tamao del componente que aada se ajusta automticamente al rea de cliente. Si desea que una ventana contenga ms de un componente, deber aadirle un componente lienzo. El componente ventana con lienzo sirve tambin para ahorrarse un paso. Nota: El componente ventana se encuentra en la seccin Marcos del catlogo de componentes, no en la paleta de componentes. Para obtener informacin relacionada, consulte el apartado: v Lienzo en la pgina 53 v Ventana con lienzo en la pgina 176 Atributos de componente |
Bottom Focus* FontSize* Height MouseIcon* PartType PBStepSize SBLabel StatusBar Width Center FontBold* FontStrike* IconHandle* MouseShape* PBRange Print SBPosition Top WindowMode* Enabled FontItalic* FontUnder* Label ParentName PBSetPos ProgresBar SBStyle UserData FileName* FontName* Handle* Left PartName PBStep Refresh ShowTips Visible
*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Activate Destroy ReSize Close LClickTray ShutDown Create Moved DeActivate RClickTray
175
Las ventanas son el medio primordial que tiene el usuario final de interactuar con el programa. El lienzo, en un componente ventana con lienzo, le permite aadir varios componentes a la ventana. Puede colocar diversos componentes en el lienzo sealndolos y pulsando el botn del ratn y cambiarlos de posicin para crear una interfaz grfica de usuario. Tambin puede aadir componentes que sean extensiones del marco de la ventana, como barras de mens, mens emergentes y subarchivos de mensajes. Si slo precisa colocar un componente en el rea de cliente de la ventana, no necesita el componente ventana con lienzo: en lugar de ste, debe usar el componente ventana (que se encuentra en la seccin Marcos del catlogo de componentes). Sin lienzo, el tamao del componente aadido se ajusta automticamente al rea de cliente. Para obtener informacin relacionada, consulte los apartados: v Lienzo en la pgina 53 v Ventana en la pgina 175 Atributos de componente |
Bottom Focus* FontSize* Height MouseIcon* PartType PBStepSize SBLabel StatusBar Width Center FontBold* FontStrike* IconHandle* MouseShape* PBRange Print SBPosition Top WindowMode* Enabled FontItalic* FontUnder* Label ParentName PBSetPos ProgresBar SBStyle UserData FileName* FontName* Handle* Left PartName PBStep Refresh ShowTips Visible
*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Activate Destroy ReSize Close LClickTray ShutDown Create Moved DeActivate RClickTray
176
Open Immediately de acuerdo a esto. Si no cambia los valores por omisin, aparecern todas las ventanas cuando el usuario inicie la aplicacin.
Referencia
Los componentes de una ventana se crean cuando se crea la ventana. Por consiguiente, si intenta hacer referencia a algn componente de una ventana que no se ha cargado o a un atributo de ventana antes de que se cree la ventana, obtendr el mensaje Componente no encontrado.
177
Sugerencia Si se visualiza una ventana y no puede pulsar el botn en la barra de ttulo de dicha ventana, utilice este mtodo para moverla: 1. Site el cursor del ratn en un lugar de la parte visible de la ventana. 2. Pulse y suelte el botn 1 del ratn. 3. Pulse la combinacin de teclas Alt-espacio. A continuacin pulse M. 4. Utilice las teclas con flecha para volver a situar la ventana. 5. Cuando la ventana est en la posicin deseada, pulse Intro.
178
********************************************************************* * * * ID de programa : ReSize * * * * Descripcin . : Programa de ejemplo que muestra cmo asegurar * * que los componentes permanecen en una ventana * * despus de haber ajustado su tamao. * * * * Se pone un pulsador en la esquina superior * * derecha de la ventana. Si se reduce el tamao * * de la ventana, el pulsador dejar de ser * * visible, ya que todos los componentes mantienen * * su relacin con la esquina inferior izquierda * * de la ventana. * * El evento RESIZE se utiliza para asegurar que * * el pulsador tambin mantiene su posicin en * * relacin con la esquina superior derecha de * * la ventana. * * * ********************************************************************* *
Figura 29. Comprobacin de que los componentes se visualizan correctamente tras ajustar el tamao de una ventana (Pieza 1 de 3)
179
* Declarar los atributos de evento %NewHeight y %NewWidth. * Contendrn la anchura y la altura de la ventana despus de haber * ajustado su tamao. D%NewHeight S 4 0 D%NewWidth S 4 0 ********************************************************************* * * * Ventana . : FRA0000B * * * * Componente : FRA0000B * * * * Evento . . : RESIZE * * * * Descripcin: Asegurar que el componente pulsador 'PB1' sigue * * visible. * * * ********************************************************************* * C FRA0000B BEGACT RESIZE FRA0000B * C %NewWidth sub HOffset NewLeft 4 0 C %NewHeight sub VOffset NewBottom 4 0 C 'PB1' setatr NewLeft 'Left' C 'PB1' setatr NewBottom 'Bottom' * C ENDACT ********************************************************************* * * * Ventana . : FRA0000B * * * * Componente : PSB0000D * * * * Evento . . : PRESS * * * * Descripcin: Terminar el programa * * * ********************************************************************* * C PSB0000D BEGACT PRESS FRA0000B * C move *on *inlr * C ENDACT
Figura 29. Comprobacin de que los componentes se visualizan correctamente tras ajustar el tamao de una ventana (Pieza 2 de 3)
180
********************************************************************* * * * Ventana . : FRA0000B * * * * Componente : FRA0000B * * * * Evento . . : CREATE * * * * Descripcin: Centrar la ventana en la pantalla. * * Obtener la coordenada actual del pulsador PB1 y su * * desplazamiento desde la esquina superior derecha * * de la ventana. * * * ********************************************************************* * C FRA0000B BEGACT CREATE FRA0000B * C 'FRA0000B' getatr 'Height' winHeight 4 0 C 'FRA0000B' getatr 'Width' winWidth 4 0 C %DspWidth sub winWidth diffWidth 4 0 C %DspHeight sub winHeight diffHeight 4 0 * C eval %setatr('FRA0000B': C 'FRA0000B': C 'Left') = diffWidth / 2 * C eval %setatr('FRA0000B': C 'FRA0000B': C 'Bottom') = diffHeight / 2 * * Calcular los desplazamientos del componente pulsador 'PB1' * desde la esquina superior derecha de la ventana. Estos valores * se utilizan para mantener este desplazamiento si se ajusta el * tamao de la ventana. C 'PB1' getatr 'Left' PBLeft 4 0 C 'PB1' getatr 'Bottom' PBBottom 4 0 C 'FRA0000B' getatr 'Width' WinWidth 4 0 C 'FRA0000B' getatr 'Height' WinHeight 4 0 C WinWidth sub PBLeft HOffset 4 0 C WinHeight sub PBBottom VOffset 4 0 * C ENDACT
Figura 29. Comprobacin de que los componentes se visualizan correctamente tras ajustar el tamao de una ventana (Pieza 3 de 3)
Lista de ventanas
En el cuaderno de propiedades para un componente ventana, puede indicar si la ventana debe aparecer en la lista de ventanas. Esta lista aparece cuando pulsa Control+Alt+Delete en Windows NT/95/98. Por omisin, los componentes de ventana no aparecen en la lista de ventanas. Debe establecer como mnimo la ventana principal para que aparezca en la lista de ventanas. Puede utilizar la lista de tareas para volver a visualizar la ventana.
Captulo 7. Utilizacin de componentes
181
Terminacin de un programa
Si el usuario selecciona la opcin Cerrar del men del sistema en una ventana, el sistema operativo cierra la ventana pero no termina necesariamente el programa. Para evitar que esto suceda, puede realizar una de las acciones siguientes: v Seleccione el recuadro de seleccin Terminar al cerrar en la segunda pgina de Estilo del cuaderno de propiedades de la ventana. Esto terminar el programa cuando el usuario cierre la ventana. v En la primera pgina de Estilo del cuaderno propiedades de la ventana, deseleccione el recuadro de seleccin Men del sistema para que las ventanas se creen sin un Men del sistema. (Por omisin, todas las ventanas se crean con un men del sistema.) v Utilice el evento Close. Este evento se seala cuando el usuario selecciona Cerrar en el men del sistema. En la subrutina de accin del evento Close, puede activar el indicador LR o solicitar al usuario que confirme que debe cerrarse esta ventana y establecer el punto de retorno ENDACT de acuerdo a ello. Por ejemplo, al establecer el valor de retorno en *NODEFAULT, la peticin de cerrar se pasa por alto y la ventana no se cierra.
* * Definir variables del recuadro de mensajes Dstyle M button(*yesbutton: *nobutton) D style(*WARN) Dmsg M msgtext('Are sure you want to exit?') * ********************************************************************* * * * Ventana . : FRA0000B * * * * Componente : FRA0000B * * * * Evento . . : CLOSE * * * * Descripcin: Manejar el evento Close desde el men del sistema * * para ver si el usuario desea cerrar esta ventana. * * * ********************************************************************* * C FRA0000B BEGACT CLOSE FRA0000B * * Solicitud para cerrar C msg dsply style rc 9 0 * * Si Yes, terminate program, se puede cerrar C rc ifeq *YESBUTTON C move *on *inlr C movel '*DEFAULT 'return 12 * * Else no cierra esta ventana C else C movel '*NODEFAULT 'return C endif * C ENDACT return
182
183
*Component
Este componente permite a los programadores acceder y utilizar atributos de componente lgico y del sistema. Un componente *component es la representacin del componente del componente lgico. Para cada componente lgico se crea un componente *component; no se ve y no est en la paleta. Atributos de componente
Active* ClipBoard DlgOwner FileName MsgFile* OS Platform PlugRC* ShData ShowMsgID Alarm CurrentDir DoEvents* HelpWindow MsgID Parent PlugCmd* PlugResult* ShDataLen SwitchTo* AppData Dialog DspHeight LookNFeel* MsgText PartCount PlugDLL* Printer* ShDataName WrkStnName* Button DIRName* DspWidth MsgData Name PartList PlugID* SelPrinter* ShDataPos
*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse Este componente no tiene eventos asociados.
184
* * Visualizar el dilogo Abrir de Archivo C '*Component' Setatr 1 * * Esta ventana es el propietario C '*Component' Setatr 'Main Main' * * Mostrar slo los archivos .DAT C '*Component' Setatr '*.DAT' * * Pulsar el botn C '*Component' Getatr 'Button' * * Utilizar el pulsador Aceptar C If Button = 1 * * Usuario cancelado C Else * C EndIf
Utilizacin de conectores
Los atributos PlugDLL, PlugID, PlugCmd, PlugRC y PlugResult le darn la posibilidad de ampliar la funcionalidad del Diseador GUI. Proporcione la funcionalidad complementaria a un programa que haya desarrollado. Una vez la aplicacin est registrada en el Preparador GUI mediante el men Proveedor, la aplicacin puede interactuar con el Diseador GUI. Consulte el captulo 20 para conocer ms detalles sobre cmo crear conectores.
185
186
187
188
189
Nota: El primer servidor listado en la pgina de servidores del cuaderno Definir informacin de AS/400 se conoce como servidor por omisin. Se requiere por lo menos un servidor por cada programa que utilice un servidor AS/400.
Configuracin de un servidor
Debe configurar un servidor cuando est desarrollando la aplicacin, de manera que pueda acceder al servidor mientras se edita, compila y depura la aplicacin. Cuando empaquete y distribuya la aplicacin a otras estaciones de trabajo, tambin tendr que configurar un servidor si la aplicacin en ejecucin accede a un servidor distinto del utilizado durante el tiempo de diseo. Siempre que configure un servidor, asegrese de que la lista de bibliotecas del trabajo de servicio contiene el recurso remoto con el que desea trabajar.
190
especial para que se ejecute el mandato CL en el trabajo de servicio DDM AS/400. El programa especial es QCMDDDM. Esta interfaz es la misma que la interfaz para llamar a QCMDEXC. La diferencia entre QCMDEXC y QCMDDDM es que QCMDEXC se ejecuta en un trabajo AS/400 distinto que se utiliza para dar servicio a peticiones de llamada remota y peticiones de rea de datos. Puede utilizarse QCMDDDM para cambiar la lista de bibliotecas del trabajo de servicio DDM para asegurar que la biblioteca que contenga los archivos de base de datos AS/400 est presente en la lista de bibliotecas del trabajo DDM.
Asegrese de que se ha inicializado el rea de datos antes de intentar utilizarla. Se emite una excepcin de tiempo de ejecucin si un rea de datos en el servidor no contiene un valor decimal empaquetado vlido al intentar recuperarlo en una estructura de datos de rea de datos con un subcampo decimal empaquetado en un programa VisualAge RPG.
191
********************************************************************* * * * Id. de programa: dtaaraex.vpg * * * * Descripcin . : Segmento de cdigo para obtener el contenido de * * un rea de datos de AS/400. * ********************************************************************* * D dtaara S 6P 0 DTAARA ********************************************************************* * * * Ventana. . : WIN1 * * * * Componente : PSB0000C * * * * Evento . . : PRESS * * * * Descripcin: Obtener el contenido del rea de datos de AS/400. * ********************************************************************* * C PSB0000C BEGACT PRESS WIN1 C IN dtaara C ENDACT
192
En el tiempo de ejecucin de la aplicacin, la pgina Archivo se utiliza para localizar los archivos de base de datos de AS/400 remotos que estn utilizndose realmente. El nombre pseudnimo de archivo utilizado en el programa VisualAge RPG se usa para buscar una entrada adecuada en la pgina Archivo. Si no existe ninguna entrada en la pgina Archivo, se utiliza la lista de bibliotecas del primer servidor definido en la pgina del servidor para buscar un archivo con el mismo nombre que el archivo del programa VisualAge RPG. Mantener el nombre de archivo real separado del nombre de archivo utilizado en el programa VisualAge RPG le permite cambiar el destino del archivo real. Puede dirigirlo a un archivo diferente en el mismo sistema AS/400 o en un sistema AS/400 diferente sin modificar el programa VisualAge RPG. La Figura 32 en la pgina 194 contiene un ejemplo que muestra: v La asociacin de nombres de archivo con entradas de archivo en la pgina Archivo en el cuaderno Definir informacin de AS/400. v Nombres de componente coincidentes con campos. Nota: La informacin sobre NAME (NOMBRE) y ADDRESS (DIRECCIN) debe entrarse en la ventana de la aplicacin. La informacin se entra en la base de datos de AS/400 cuando se acciona el pulsador Aceptar.
193
********************************************************************* * * * Id. de programa: ioex.vpg * * * * Descripcin . : Crear registros con datos de la ventana. * * * * Archivos . . . : FILE1 * * * ********************************************************************* * FFILE1 UF A E DISK REMOTE USROPN ********************************************************************* * * * Ventana. . : WIN1 * * * * Componente : *INZSR * * * * Evento . . : Rutina de inicializacin * * * * Descripcin: Abrir archivo de base de datos (FILE1). * * * ********************************************************************* * C *INZSR BEGSR C OPEN FILE1 C ENDSR ********************************************************************* * * * Ventana. . : WIN1 * * * * Componente : PSB0000D * * * * Evento . . : PRESS * * * * Descripcin: Fin de creacin de registros. Fin de aplicacin. * * * ********************************************************************* * C PSB0000D BEGACT PRESS WIN1 C SETON LR C ENDACT
194
********************************************************************* * * * Ventana. . : WIN1 * * * * Componente : PSB0000C * * * * Evento . . : PRESS * * * * Descripcin: Leer informacin de campo de la pantalla y aadir * * registro a archivo de base de datos de AS/400. * * * * * ********************************************************************* * C PSB0000C BEGACT PRESS WIN1 C READ 'WIN1' C WRITE FORMAT1 C ENDACT
FILE1 en la especificacin de archivo se utiliza como pseudnimo de archivo, ya que existe una entrada en la pgina Archivo del cuaderno Definir informacin de AS/400 asociado. Durante la apertura de archivo se utiliza el primer miembro de FILE1 de la biblioteca LIB1 en el servidor TORAS180. FILE1 en el nombre remoto no tiene que coincidir con el nombre de alteracin temporal en la entrada de archivo. El nombre de alteracin temporal representa un enlace entre la entrada de archivo en la pgina Archivo y el nombre de archivo utilizado en el programa VisualAge RPG. Los nombres de componente de los dos campos de entrada son NAME y ADDRESS. VisualAge RPG crea campos con los mismos nombres y los mismos atributos. En este ejemplo, NAME y ADDRESS son campos de 20 caracteres. El archivo de base de datos de AS/400 tambin contiene dos campos denominados NAME y ADDRESS, ambos de 20 caracteres. A continuacin ver las DDS correspondientes a estos campos:
A A R RECORD100 NAME ADDRESS 20A 20A
Cuando coinciden los nombres de campo con sus atributos, slo se crea un campo. En este ejemplo se leen los datos de la ventana.
C* N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq.. C READ 'WIN1'
Cuando se ejecuta este READ, los datos se mueven automticamente de la pantalla a los dos campos NAME y ADDRESS. Dado que los datos estn ahora en los campos adecuados, estos datos pueden escribirse directamente en la base de datos de AS/400 sin ningn otro movimiento de campo.
C* N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq.. C WRITE FORMAT1
195
En este ejemplo, los datos de los dos campos NAME y ADDRESS se mueven al almacenamiento intermedio de salida antes de emitir el mandato de escribir a la base de datos de AS/400.
Comprobacin de nivel
VisualAge RPG soporta la comprobacin de nivel entre un programa VisualAge RPG y los archivos de base de datos de AS/400 que estn utilizndose. El compilador siempre proporciona la informacin que la comprobacin de nivel necesita. La comprobacin de nivel se produce sobre la base de formato de registro cuando el archivo se abre, a menos que se especifique LVLCHK(*NO) al crear o cambiar el archivo de base de datos de AS/400. Nota: Si se produce una comprobacin de nivel, se trata como un error de E/S. Si desea ms informacin, consulte la publicacin VisualAge RPG Manual de consulta del lenguaje.
CallExecDDM
196
C C C C C C
CallExecDDM
BEGSR EVAL Call Parm Parm ENDSR QCMDDDM_Parm2 = %LEN(QCMDDDM_Parm1) QCMDDDM QCMDDDM_Parm1 QCMDDDM_Parm2
197
FFILE1 F . . . . . . C C FLD2
IF
K DISK
BLOCK(*YES) REMOTE
SETLL READ
REC1 REC1 10
Si utiliza BLOCK(*NO) en una descripcin de archivo y vuelve a compilar el programa, no se crearn bloques de registros, ni siquiera los bloques de registros por omisin que VisualAge RPG soporta.
198
directorio. Anote el nombre y el directorio del archivo de polticas que aparece en el mensaje. sta ser la ubicacin donde guardar el archivo de polticas en un paso posterior. b. En el dilogo Policy Tool, pulse el botn Add Policy Entry. Aparecer el dilogo Policy Entry. En el campo de entrada CodeBase, escriba:
"http://xxxx/-",
donde xxxx es el URL y el directorio que contiene el applet que debe recibir permisos para el archivo de seguridad. c. Pulse el botn Add Permission. Complete el dilogo Permissions tal como se indica a continuacin: v En el recuadro combinado Permissions, elija RuntimePermission. v En el recuadro combinado Target, elija loadLibrary.<nombre biblioteca>. v En el campo de entrada situado inmediatamente a la derecha del recuadro combinado Target, cambie loadLibrary.<nombre biblioteca> por loadLibrary.fvdcjava. v Pulse OK para regresar al dilogo Policy Entry. d. En el dilogo Policy Entry, vuelva a pulsar el botn Add Permission. Complete el dilogo Permissions tal como se indica a continuacin: v En el recuadro combinado Permissions, elija FilePermission. v En el campo de entrada situado inmediatamente a la derecha del recuadro combinado Target, escriba el nombre del archivo de seguridad. Este archivo se encuentra ubicado en el subdirectorio ibmcom del directorio de Windows. Por ejemplo:
c:\windows\ibmcom\fvdcsec.txt
donde el directorio de Windows es c:\windows. v En el recuadro combinado desplegable Actions, elija read. v Pulse OK para regresar al dilogo Policy Entry. v Pulse Done para regresar al dilogo Policy Tool. e. En el dilogo Policy Tool, elija File y, a continuacin, Save as en el men. Guarde el archivo de polticas que acaba de crear en el nombre de archivo y directorio que anot en el paso 2a en la pgina 198. Ahora elija File y, a continuacin, Exit para salir de PolicyTool. Si todava se le solicita el ID de usuario y la contrasea, vuelva a utilizar PolicyTool para verificar que ha especificado correctamente todos los parmetros.
199
200
Situacin de reutilizacin
Puede utilizar VisualAge RPG para modificar aplicaciones que se ejecutan en el AS/400 de manera que se ejecuten en una PWS, acceder a datos en el sistema principal y tener una interfaz grfica de usuario. Esta seccin proporciona una visin general de los pasos relacionados en el proceso. Importacin de archivos de pantalla: El programa de utilidad de Importacin convierte los archivos de pantalla AS/400 existentes en una interfaz grfica de usuario en una PWS. Despus de importar un archivo de pantalla, los formatos de registro se convierten en componentes definidos por usuario y se almacenan en la pgina Importado del catlogo de componentes. Puede mover los componentes a la paleta de componentes mientras trabaja en la aplicacin, y luego almacenarlos en el catlogo de componentes cuando termine de trabajar en la aplicacin, hasta que vuelva a necesitarlos. Por ejemplo, si importa la pantalla 5250 que se muestra en la Figura 34 en la pgina 202 obtendr como resultado la GUI que se muestra en la Figura 35 en la pgina 203. Los registros se convierten en un grupo de componentes, los campos se convierten en componentes campo de entrada y las constantes se convierten en componentes texto esttico. Todas las teclas de mandato se convierten en componentes pulsador y las etiquetas de pulsador reflejan la palabra clave de tecla de mandato original.
201
OOO OO OOOO
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
Status: OOOOOOO
Purchase Order Header Maintenance P.O. Number: 666666 -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-. Vendor Number: 99999 OOOOOOOOOOOOOOOOOOOOOOOOO OOOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOO 66666666-666-6666 OOOOOOOOOOOOOOOOO OOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO Print : B (Y,N) Ship Via: BBBBBBBBBB Date Entered: OOO OO OOOO F.O.B.: BBBBBBBBBBBBBBB Date Revised: OOO OO OOOO Terms Code : BBBB OOOOOOOOOOOOOOO OOO OO OOOO Password : Originator : OOOOOOOOOOOOOOO Prep./Collect/Chg : B (P,C,X) Confirm./Orig. : B (C,O) Warehouse: BB OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO Requested by: BBBBBBBBBBBBBBB Work Order #: 9999999 -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-. Cmd1 Exit Cmd3 PO Notes Cmd4 Lookup Cmd5 Material Status Cmd9 Vendor Maint. Cmd11 Delete Cmd15 Vendor Notes Cmd16 Vendor Quotes Ship to: 9999
202
Nota: Los nuevos componentes conservan los nombres de campo originales, pero el usuario puede redenominarlos si lo desea. Conservar el mismo nombre de campo mejora la productividad al manipular la lgica de programa para una nueva utilizacin. Tal vez desee personalizar los componentes importados para aprovechar los temas de diseo bsico analizados en el Captulo 2. Planificacin de la aplicacin en la pgina 19. Personalizacin de la GUI:
203
La Figura 36 muestra qu aspecto podra tener la ventana importada si efecta los siguientes cambios en la interfaz: v Sustituya las teclas de mandato con una barra de mens y los elementos de men asociados. Por ejemplo, un men Vendor (Proveedor) contiene acciones que originalmente se convirtieron en pulsadores. Esto da a los usuarios acceso libre a las acciones realizadas con frecuencia y lanza ventanas relacionadas. v Agrupe la informacin relacionada mediante componentes recuadro de grupo para proporcionar una gua visual a los usuarios. Por ejemplo, un recuadro de grupo con la etiqueta Shipment Information (Informacin de envo) contiene campos de entrada que pertenecen a la informacin de envo. v Utilice los botones de seleccin agrupados para obtener informacin que requiera que un usuario seleccione entre varias opciones conocidas. Por ejemplo, slo son posibles tres mtodos de pago (prepago, cobro y cargo); por consiguiente, los usuarios slo tienen que seleccionar un botn de seleccin para indicar el mtodo que est utilizndose. Los botones de seleccin estn en un recuadro de grupo con la etiqueta Payment (Pago). Estos cambios aprovechan las posibilidades grficas que ofrece VisualAge RPG. Reutilizacin de la ayuda en lnea: Cuando vuelva a utilizar una aplicacin, tal vez tambin desee usar de nuevo la ayuda del User Interface Manager (UIM) existente. Tendr que modificarla un poco para reflejar el aspecto de la nueva GUI; no obstante, podra ahorrarle el trabajo necesario para crear ayudas desde cero. Puede personalizar la ayuda de UIM convertida y aadir nuevos tipos de ayuda utilizando IPF (Recurso de Presentacin de Informacin). Puede escribir ayuda para cada ventana y ayuda segn contexto para cada componente, y puede enlazar la informacin de ayuda creando enlaces de hipertexto en el fuente de ayuda. Vea
204
Reutilizar ayuda UIM en la pgina 212 y Captulo 13. Consejos para crear ayuda en lnea con IPF en la pgina 235 para obtener ms informacin. Cmo escribir lgica de programa: Puede reutilizar la lgica escrita en RPG IV porque el compilador est basado en ese lenguaje. Basta con que corte y pegue el cdigo existente para reutilizarlo. Tambin tiene que escribir lgica de programa adicional utilizando la programacin dirigida por eventos. Para cada evento asociado a un componente, hay una subrutina de accin que describe cmo el programa responde a un evento. Los cdigos de operacin de procedimiento para el control de programa no son necesarios; el control del programa est implcito. Algunos cdigos de operacin de VisualAge RPG exclusivos de las aplicaciones VisualAge RPG son: BEGACT Empieza una subrutina de accin ENDACT Finaliza una subrutina de accin SETATR Establece el valor de un atributo de componente GETATR Recupera el valor de un atributo de componente SHOWWIN Visualiza una ventana CLSWIN Cierra una ventana La Figura 37 en la pgina 206 contiene una subrutina de accin de una aplicacin de ejemplo de pedidos de compra. Cuando se llama a SHOWWIN desde una ventana determinada para visualizar la ventana PUR570R2, se codifica una subrutina de accin para el evento Create con el fin de preparar la ventana para la siguiente accin de un usuario. Si es un pedido de compra nuevo (#PONUM = 0), los elementos de men change, delete, print y fax se establecen para no responder al evento MENUSELECT. Para cada uno de los elementos de men, se utiliza la funcin %setatr para establecer el atributo enabled en 0. El cdigo de operacin BEGACT indica el inicio de la subrutina de accin y ENDACT indica su final.
205
********************************************************************* ********************************************************************* * * Ventana . : PUR570R2 PO Header Maintenance * * * ********************************************************************* ********************************************************************** C PUR570R2 BEGACT CREATE PUR570R2 c* c* C if #PONUM = 0 C eval %setatr('pur570r2':'m2_change':'enabled')=0 C eval %setatr('pur570r2':'m2_delete':'enabled')=0 C eval %setatr('pur570r2':'m2_print':'enabled')=0 C eval %setatr('pur570r2':'m2_fax':'enabled')=0 C end C exsr POCHECK C write 'PUR570R2' C ENDACT *********************************************************************-
Conexin al sistema principal: Si la aplicacin utiliza campos de base de datos de AS/400 o importa archivos de pantalla de AS/400 cuando se est construyendo la aplicacin, debe definir el sistema AS/400 que utiliza. Puede comunicar con el sistema principal en cualquier momento, siempre y cuando la informacin de conexin a servidores est definida de la manera adecuada. Consulte el manual Iniciacin a VisualAge RPG y CODE/400 para obtener ms informacin acerca de la definicin de informacin de servidor.
206
4. Si no desea utilizar el nombre de componente por omisin, teclee un nombre de componente en el campo de entrada Nombre de componente. 5. Si no desea utilizar el icono por omisin, puede accionar el pulsador Find para utilizar la ventana Find an Icon. 6. Seleccione uno de los elementos siguientes para indicar dnde desea que resida el componente: Catlogo solamente El componente se aade a la pgina importada del catlogo. Catlogo y paleta El componente se aade a la pgina Importado del catlogo y el icono del componente importado aparece en la paleta. 7. Elija Importar.
Formatos de registro
La siguiente lista describe cmo los formatos de registro de pantalla se convierten en componentes. MNUBAR El formato de registro MNUBAR se convierte en un componente de barra de mens que puede soltarse en una ventana con lienzo. PULLDOWN El formato de registro PULLDOWN se utiliza con el formato de registro MNUBAR para crear un componente submen. El formato de registro PULLDOWN se convierte en componentes opcin de men para el formato de registro MNUBAR al que hace referencia. RECORD El formato de registro RECORD se convierte en un grupo de componentes que pueden soltarse en una ventana con lienzo. SFL, SFLCTL Estos formatos de registro se convierten en un componente subarchivo que puede soltar en una ventana con lienzo. Las constantes de los registros SFL no se convierten. WINDOW El formato de registro de definicin WINDOW se convierte en un
207
componente ventana con lienzo. El formato de registro de referencia WINDOW se convierte en un grupo de componentes que pueden soltarse en una ventana con lienzo. Los registros de formato que no se convierten son: ERRSFL, PDNSFL, SFLMSG, USRDFN y WDWSFL.
Entradas de posicin
La siguiente tabla describe de qu manera las entradas de posicin de DDS utilizadas para crear un archivo de pantalla determinan cmo se convierten los formatos y los campos.
Tabla 6. Entradas de posicin y conversin
Columnas 8-16 Significado Indicadores Entrada y resultados de la conversin No se convierten
17
Tipo de registro
R H
19-28
Nombre
29
Referencia
No se convierten
30-34
Longitud
35
Modalidad de teclado
A E G I J O
Se convierte a carcter Tipo de datos establecido como DBCS cualquiera Tipo de datos establecido como Slo DBCS Slo lectura, inhabilitado Tipo de datos establecido como Slo DBCS Tipo de datos establecido como DBCS mixto
Determina el nmero de posiciones decimales del componente convertido. Si se especifica, establece el tipo de datos como Numrico.
208
39-41
Ubicacin
45-80
Palabras clave
DFTVAL El valor de la palabra clave DFTVAL se convierte al valor por omisin del componente. DSPATR Si el atributo de pantalla DSPATR es: v HI, el color de fondo se vuelve ms brillante.
Captulo 9. Reutilizar aplicaciones AS/400
209
v ND, el campo convertido se establece como no visible. v PR, el campo convertido se establece como inhabilitado. Los dems atributos de pantalla no se convierten. HELP La palabra clave HELP se convierte en un pulsador con la etiqueta HELP. La funcin de ayuda no se convierte. MLTCHCFLD Si se utiliza la palabra clave MLTCHCFLD en un registro PULLDOWN, cada una de las palabras clave CHOICE asociadas con ella se convierte en un componente opcin de men de un componente submen. La parte de opcin de men convertida tendr una marca de seleccin para indicar que est activa. Si la palabra clave MLTCHCFLD se utiliza fuera de un registro PULLDOWN, cada palabra clave CHOICE se convierte en un componente recuadro de seleccin. Los recuadros de seleccin se colocan en sentido horizontal, dejando entre ellos el mismo espacio. No se agrupan. MNUBAR El formato de registro MNUBAR se convierte en un componente men. MNUBARCHC Cada MNUBARCHC se convierte en un elemento de men. PRINT La palabra clave PRINT se convierte en un pulsador con la etiqueta PRINT. La funcin de impresin no se convierte. PSHBTNCHC, PSHBTNFLD La palabra clave PSHBTNFLD se convierte en un componente pulsador. El texto asociado con la palabra clave PSHBTNCHC se convierte en la etiqueta de un componente pulsador. PULLDOWN El formato de registro PULLDOWN se utiliza con el formato de registro MNUBAR para crear un componente submen. El formato de registro PULLDOWN se convierte en los componentes elemento de men del formato de registro MNUBAR al que hace referencia. RANGE La palabra clave RANGE se convierte en el atributo de rango del componente. SFL, SFLCTL Estos formatos de registro se convierten en un componente subarchivo. SFLPAG Ejerce influencia en la altura inicial del componente subarchivo. SNGCHCFLD Si se utiliza la palabra clave SNGCHCFLD dentro de un registro PULLDOWN, cada palabra clave CHOICE asociada con ella se convierte en un componente elemento de men de un componente submen. Si la palabra clave SNGCHCFLD se utiliza fuera de un registro PULLDOWN, cada palabra clave CHOICE asociada con ella se convierte en un componente recuadro de seleccin. Los botones de seleccin se disponen horizontalmente, dejando entre ellos el mismo espacio. No se agrupan.
210
SYSNAME La palabra clave SYSNAME se convierte en un componente texto esttico. TIME La palabra clave TIME se convierte en un componente texto esttico. USER La palabra clave USER se convierte en un componente texto esttico. VALUES La palabra clave VALUES hace que el campo se convierta en un componente recuadro de combinacin desplegable. Los valores asociados con la palabra clave VALUES se utilizan en la lista desplegable. WDWTITLE La palabra clave WDWTITLE se utiliza para determinar la etiqueta y los atributos de un componente ventana con lienzo. v Si el texto del ttulo se asigna a un campo de programa a sistema, no se convierte. v Si el texto del ttulo se asigna a un campo literal, este texto se asigna a la etiqueta del componente ventana con lienzo. WINDOW El formato de registro de definicin WINDOW se convierte en un componente ventana con lienzo. El formato de registro de referencia WINDOW se convierte en un grupo de componentes que pueden soltarse en una ventana con lienzo. No se convierten ms palabras clave.
Salida
Entrada
Entrada o E/S
Entrada o E/S
Teclado inhibido
211
Nota: E/S = entrada y salida La codificacin por colores le permite determinar visualmente los atributos establecidos para el componente campo de entrada. Por ejemplo, si se visualiza un campo de entrada verde claro, sabr que lo utiliza el programa para visualizar datos y que no puede recibir ninguna entrada de usuario. Si se visualiza un campo rojo claro, sabr que puede recibir entradas de usuario pero que no est habilitado porque se trata de un campo protegido de la aplicacin original.
212
213
:XH2.
:XH3.
:XH4.
214
215
216
Figura 38. Las ventanas Fuente VisualAge RPG y Control de sesin de depuracin
Cuando se arranca el depurador, ste busca el miembro fuente VisualAge RPG y lo visualiza en la ventana Fuente. Una vez que el fuente se ha visualizado, puede efectuar tareas de depuracin. Nota: Un nmero de lnea resaltada indica la posicin actual del programa en ejecucin. Aqu est resaltada la primera lnea del miembro fuente.
217
Para corregir este problema, asegrese de que el cdigo fuente VisualAge RPG (archivo .VPG) reside en la estacin de trabajo.
Esto le devuelve a la sesin de depuracin. Cuando la vista del fuente ensamblador se visualice de nuevo, pulse la tecla R para reanudar la ejecucin del programa. Cuando la DLL se carga, el sistema visualiza un mensaje y el nombre de la aplicacin se visualiza en la ventana de control. Ahora puede pulsar el botn en la aplicacin para que el fuente se visualice. Si el fuente no se visualiza significa que lo ha perdido o eliminado.
218
Si la aplicacin utiliza el cdigo de opcin START para iniciar otro componente, tendr que utilizar este procedimiento para cargar la DLL del otro componente. Esto le permitir establecer puntos de interrupcin dentro de otros componentes.
219
Seleccione Puntos de interrupcinLista para visualizar esta ventana. Para cada punto de interrupcin se proporciona la siguiente informacin: v El estado de habilitacin v El tipo de punto de interrupcin v La posicin del punto de interrupcin v La condicin debido a la que se activa el punto de interrupcin
220
221
Tambin puede reanudar la ejecucin del programa de maneras diferentes. Realice una de las acciones siguientes: v Pulse la letra R. v Mueva el ratn al men desplegable Ejecutar y seleccione Ejecutar. v Mueva el ratn al icono de ejecucin en la barra de herramientas y efecte una sola pulsacin con el botn 1 del ratn.
Icono
Funcin
Recorrer principal Ejecuta la lnea actual (resaltada) en el programa, pero no entra en ninguna funcin llamada. Recorrer todo Ejecuta la lnea actual (resaltada) en el programa y entra en cualquier programa o funcin llamados. Recorrer depuracin Ejecuta la lnea actual (resaltada) en el programa. El depurador efecta una ejecucin de pasos externos en cualquier funcin para la que no hay informacin de depuracin disponible, y efecta una ejecucin de pasos internos en cualquier funcin para la que hay informacin de depuracin disponible.
222
Retorno de recorrido Ejecuta de forma automtica las lneas de cdigo hasta la sentencia de retorno inclusive de la funcin actual. Ejecutar Empieza la ejecucin del programa en la lnea actual (resaltada). Detener Para la ejecucin del programa. Vistas Conmuta a la vista siguiente. Supervisar expresin Visualiza una variable o una expresin en una ventana de supervisin. Pila de llamadas Visualiza las funciones activas de la pila de llamadas de una lnea de ejecucin. Registros Visualiza los registros de las lneas de ejecucin en la ventana de registros. Almacenamiento Visualiza el contenido del almacenamiento en la ventana de almacenamiento. Puntos de interrupcin Lista todos los puntos de interrupcin que se han establecido. Control de sesin de depuracin Visualiza la ventana de control de sesin de la depuracin.
223
Despus de pulsar Intro, el campo o la estructura de VisualAge RPG se visualiza en la ventana Supervisor de programa, tal como se muestra en la Figura 48.
Modificacin de la representacin
El depurador le permite modificar la representacin de cualquier variable visualizada en el supervisor del programa. Los tipos de representacin de una variable o de una estructura pueden ser decimal, hexadecimal, binaria o de serie. Para modificar la representacin, seleccione una variable en la ventana Supervisor de programa. A continuacin, seleccione una representacin en el men EditarRepresentacin. El contenido de la variable se visualiza ahora en la representacin que ha seleccionado.
224
225
226
Establecimiento de fonts
Existen muchas opciones disponibles en el depurador que le permiten personalizar la sesin de depuracin. Por ejemplo, puede establecer los fonts que desee. La Figura 51 visualiza la ventana de fonts. Para visualizar la ventana de fonts, seleccione OpcionesValores de ventanaFonts. En la ventana de fonts, seleccione el font, el estilo y el tamao que desee, y a continuacin seleccione Bien. El font modifica la visualizacin en la sesin de depuracin.
227
228
Cdigos de edicin
Estn soportados varios cdigos de edicin para formatear los datos en formatos predefinidos. Estos formatos insertan los separadores de millares y decimales adecuados y determinan cmo se visualiza un nmero negativo, proporcionando un signo menos fijo o flotante, o el smbolo CR (Crdito). Opcionalmente, puede especificar proteccin por asteriscos o un smbolo de moneda flotante con los cdigos de edicin. Cuando se especifica la proteccin por asteriscos, se visualiza un asterisco por cada cero que se suprime. Cuando se especifica el smbolo de moneda flotante, dicho smbolo aparece a la izquierda del primer dgito significativo. El smbolo no visualiza un saldo cero cuando se utiliza un cdigo de edicin que suprime el saldo cero. El sistema operativo determina los caracteres reales que se van a utilizar para los separadores de millares y decimales y para el smbolo de moneda cuando se ejecuta la aplicacin.
229
La siguiente tabla resume los cdigos de edicin soportados y la edicin que proporcionan, y muestra algunos ejemplos. Nota: El compilador no soporta cdigos de edicin definidos por usuario. Los cdigos de edicin definidos por usuario se definen y se almacenan en el sistema AS/400 y no estn disponibles para los programas VisualAge RPG.
Tabla 11. Cdigos de edicin VisualAge RPG
Cd. edic. Punto Signo para saldo Ejemplo de Comas decimal negativo nmero positivo S S S S S S S S S S S S S S S S S S Sin signo Sin signo Sin signo Sin signo CR CR CR CR -(menos) -(menos) -(menos) -(menos) -(menos flotante) -(menos flotante) -(menos flotante) -(menos flotante) 0123456789 124,567.89 124,567.89 124567.89 124567.89 124,567.89 124,567.89 124567.89 124567.89 124,567.89 124,567.89 124567.89 124567.89 124,567.89 124,567.89 124567.89 124567.89 1984-12-25 No Sin signo 1234567 1234567 Ejemplo de Saldo nmero negativo cero 0123456789124,567.89 124,567.89 124567.89 124567.89 124.567,89CR 124.567,89CR 124567,89CR 124567,89CR 124.567,89124.567,89124567,89124567,89-124.567,89 -124.567,89 -124567,89 -124567,89 .00 .00 .00 .00 .00 .00 .00 .00
Notas: 1. Todos los cdigos de edicin suprimen los ceros iniciales 2. El cdigo de edicin Y se utiliza para editar campos de fecha. El campo de fecha debe definirse como campo numrico. La salida de este cdigo de edicin tiene el formato nnnn-nn-nn. Este formato no puede modificarse. El sistema operativo determina el carcter de separador de fecha cuando se ejecuta la aplicacin. 3. El cdigo de edicin Z elimina los signos + o .
Palabras de edicin
Puede utilizar palabras de edicin si ninguno de los cdigos de edicin suministrados satisface sus requisitos de edicin. Una palabra de edicin es un modelo que se aplica a los datos antes de colocarlos en el componente. Con las palabras de edicin, puede especificar: v Supresin de ceros iniciales v Asteriscos iniciales
230
v El smbolo de moneda fijo/flotante v La posicin de los separadores de millares y decimales. Nota: Cuando utilice palabras de edicin, asegrese de que especifica correctamente los smbolos de moneda, decimales y de millares. Si los smbolos no coinciden con la palabra de edicin, obtendr una salida formateada incorrectamente, pero ningn error de tiempo de ejecucin. Estos smbolos se sustituyen por los valores del sistema operativo de tiempo de ejecucin cuando se ejecuta la aplicacin.
Asterisco Puede utilizarse un asterisco en lugar de un cero como carcter de detener supresin de ceros. Esto se denomina proteccin por asteriscos y cada cero que se suprime se sustituye por un asterisco. Cualquier asterisco o cero situado a la derecha del carcter de detener supresin de ceros es una constante y se visualizar tal cual. Smbolo de modeda Si codifica un smbolo de moneda inmediatamente a la izquierda del carcter de detener supresin de ceros, se insertar un smbolo de moneda en la posicin situada a la izquierda del primer dgito significativo. Se denomina smbolo de moneda flotante cuando se utiliza de esta manera. Si codifica un smbolo de moneda en la posicin situada ms a la izquierda de la palabra de edicin, es fijo y se visualiza siempre en la misma ubicacin. Se denomina smbolo de moneda fijo.
231
Separador de millares y separadores decimales Los separadores de millares y decimales se visualizan en las mismas posiciones relativas en las que se codificaron en la palabra de edicin. Todos los dems caracteres se visualizan si estn a la derecha de los dgitos significativos de la palabra de edicin. Si estn a la izquierda del dgito significativo de orden alto en la palabra de edicin, se rellenan con blancos o se sustituyen por un asterisco si est utilizndose la proteccin por asteriscos.
232
233
Para asegurarse de que estos archivos estn localizables en tiempo de ejecucin, utilice la serie Directorio actual (\): un punto y una barra inclinada invertida seguida del nombre de archivo. En tiempo de ejecucin, el archivo se encuentra en el directorio actual desde el que se ejecuta la aplicacin. Por ejemplo, en el cuaderno de propiedades para un pulsador grfico, especifique lo siguiente como nombre de archivo para un icono denominado EXIT.ICO, de tal manera que se encuentre en tiempo de ejecucin en el directorio actual.
.\\EXIT.ICO
Nota: Para las aplicaciones que se ejecutan en Windows, debe especificarse el directorio actual en el archivo AUTOEXEC.BAT. Durante el tiempo de construccin, debe copiar los archivos de imgenes al directorio de tiempo de construccin para acceder a estos archivos. Antes de empaquetar la aplicacin para su distribucin, copie todos los archivos de imgenes y sonido asociados en el subdirectorio de tiempo de ejecucin adecuado (RT_JAVA o RT_WIN32) del proyecto, porque es este directorio el que se empaqueta y distribuye a otros usuarios. Vea Parte 5. Distribucin de la aplicacin en la pgina 397 para obtener instrucciones sobre el empaquetado de la aplicacin.
234
Utilizacin de IPF
El fuente de los mdulos de ayuda de aplicaciones VisualAge RPG est en formato IPF. IPF le permite crear informacin en lnea, especificar cmo aparecer en la pantalla, conectar varias partes de la informacin y proporcionar informacin de ayuda que el usuario puede solicitar. Las caractersticas del IPF incluyen: v Un lenguaje de codificacin que formatea texto, proporciona maneras de conectar unidades de informacin y personaliza ventanas. v Un compilador que crea documentos en lnea y ventanas de ayuda. v Un programa que visualiza documentos en lnea formateados.
235
:h1 res=01 es un identificador de recurso que se genera automticamente. No edite este texto. Escriba una cabecera despus de este cdigo que identifique el propsito del panel de ayuda y escriba el texto de ayuda despus del cdigo :p..
236
ventana de diseo y vuelva a pulsar el botn derecho del ratn. Seleccione Texto de ayuda en el men emergente del pulsador para editar la informacin de ayuda. Establezca el atributo Help Enable para ese pulsador y el atributo Label para la palabra Ayuda.
237
238
En el mercado existen numerosas herramientas, tanto comerciales como shareware, que proporcionan entornos completos de montaje de ayudas. Adems, existen varios libros que describen cmo utilizar la herramienta Help Compiler Workshop. Muchos de estos libros incluyen un CD-ROM con el Help Compiler Workshop como, por ejemplo, Microsoft Windows 95 Help Authoring Kit ISBN1-55615-892-0. Pasos para la creacin de ayuda Windows Los pasos bsicos que deben seguirse para utilizar ayuda Windows en la aplicacin son los siguientes: 1. Establecer el ID de recurso para cada componente que tendr ayuda. 2. Escribir el texto de ayuda. 3. Crear el archivo de proyecto de la ayuda. 4. Compilar el archivo de ayuda.
239
Durante el proceso de la construccin, VisualAge RPG genera una entrada de tabla de ID de recurso para cada componente para el que haya creado ayuda utilizando la opcin de men Texto de ayuda del men emergente del componente. El motor de ayuda de Windows utiliza esta tabla para determinar el ID de recurso del componente, a fin de poder visualizar la ayuda correcta. Para que el componente tenga ayuda Windows, debe crear el texto de ayuda de cada componente de esta forma. Actualmente, VisualAge RPG no crea automticamente esta entrada de tabla. Si sigue este proceso, no se visualizar ninguna ayuda y no se generar ningn mensaje de error.
240
documento nuevo en el procesador de textos, escriba un ttulo en la parte superior de la pgina como, por ejemplo, Ayuda para el campo de entrada. A continuacin del ttulo, escriba el cuerpo del texto de ayuda. Cada tema debe tener un ID de tema. Un ID de tema es una nota al pie con el smbolo #. A continuacin se indican los pasos para la creacin de la nota al pie necesaria en WordPro. Siga los pasos correspondientes a su procesador de textos para crear notas al pie con el smbolo #: 1. Coloque el cursor justo delante de la cabecera del tema. 2. Seleccione Crear-Nota al pie/Nota final... 3. En el dilogo Pies de nota, pulse Aceptar. 4. El cursor se colocar al final del documento en la seccin de notas al pie. 5. Escriba el ID de tema: HelpForEF. 6. Coloque el cursor al principio del ID de tema. 7. Pulse el botn derecho del ratn y seleccione Propiedades del texto en el men emergente. 8. En el dilogo Propiedades, seleccione la pestaa Vietas y nmeros. 9. Marque el recuadro de seleccin Editar en pgina. 10. Escriba un carcter # delante del ID de tema. 11. Cierre el dilogo Propiedades del texto. El documento debe tener un aspecto similar al siguiente. Los datos que aparecen a continuacin de la lnea es la nota al pie:
#Ayuda para el campo de entrada Esta es la ayuda para el componente campo de entrada. Ms texto ... ________________________________________ #HelpForEF
En un archivo de temas puede tener varios temas. Cada tema debe empezar en una pgina nueva. Una vez haya escrito el texto de ayuda, guarde el archivo de temas en formato RTF.
241
10. Cuando aparezca el dilogo Add Map Entry, escriba HelpForEF en el campo Topic ID y 12 en el campo de valor numrico Mapped. Pulse OK. 11. Pulse OK para cerrar el dilogo Map. 12. Guarde y compile el archivo de proyecto. De este modo se crear el archivo de ayuda (HLP). Copie el nuevo archivo HLP en el directorio RT_WIN32 del proyecto VARPG.
Prueba de la ayuda
Inicie la aplicacin VARPG. Cuando aparezca la ventana, vaya al campo de entrada y pulse F1. La ayuda debe visualizarse en una ventana de ayuda Windows. Tambin puede visualizar la ayuda como ayuda Qu es esto?. Para ello, abra el cuaderno de propiedades de la ventana. En la pgina Estilo, marque el recuadro de seleccin Contexto. Deben quitarse las marcas de los recuadros de seleccin Minimizar y Maximizar. Para hacer que la ayuda se visualice en una ventana emergente en lugar de una ventana de ayuda, marque la opcin Emergente.
242
243
Donde: <title> Es el nombre del HelpSet. Corresponde al ttulo de la ventana de ayuda. <homeID> Especifica el nombre del ID (por omisin) que se visualiza cuando se llama a la ayuda sin especificar explcitamente un ID. <data> Especifica la va de acceso de los datos que utiliza el navegador. En nuestro ejemplo, la vista TOC. El nombre del archivo TOC est en maysculas y la extensin xml en minsculas. El archivo TOC debe existir en el directorio de la ayuda.
244
target Especifica el ID del componente de VARPG. El ID de componente lo asigna automticamente el Diseador GUI al componente. Puede recuperarlo del cuaderno de propiedades del componente. url Especifica la va de acceso al archivo de temas HTML que contiene el texto de la ayuda. La va puede ser relativa o absoluta.
Donde: tocitem La primera entrada TOC especifica el ttulo de la tabla de contenido. (Puede anidar entradas TOC dentro de una entrada de nivel superior). text Especifica el texto que debe utilizarse en las siguientes entradas TOC.
245
target Especifica el ID del tema HTML que debe visualizarse cuando el usuario elija esta entrada en el TOC. El ID corresponde al ID de componente que se identifica en el archivo Map.
Donde SOURCE_FILE_NAME es el nombre especificado en el campo Archivo fuente de la ventana Guardar como aplicacin - VisualAge para RPG. El nombre de archivo debe acabar en HS y debe escribirse en maysculas. La extensin jar debe estar en minsculas. Emita el mandato desde el directorio ms alto que contenga la jerarqua de la ayuda. Por ejemplo, si la estructura del directorio de la ayuda es la siguiente:
javahelp (directorio) Map.jhm CATALOG.hs VIDCTOC.xml help (subdirectorio) browse.htm catalog.htm new.htm search.htm top10.htm welcome.htm
Copie el archivo jar resultante en el subdirectorio RT_JAVA del proyecto. Construya y ejecute el proyecto con la opcin Java (Construir>Java o Ejecutar>Java, respectivamente).
246
247
4. 5.
6.
7.
248
8. Seleccione un pulsador por omisin seleccionando el botn de seleccin Botn 1, Botn 2 o Botn 3. Cuando se visualice la ventana de mensaje y el usuario pulse la tecla Intro, se realizar la accin asociada con el pulsador por omisin. Por ejemplo, si ha seleccionado enterCancelButton en el recuadro desplegable Pulsadores y desea que el botn por omisin sea Cancelar, debera seleccionar el botn de seleccin Botn 2. 9. Seleccione Guardar para conservar el mensaje o Cancelar para desecharlo. Nota: Los identificadores de mensaje (ID de mensaje) van de MSG0001 a MSG9999 y los asigna VisualAge RPG. Si se utilizan todos los ID de mensaje del rango, VisualAge RPG enva un error cuando se intenta crear un nuevo mensaje, y no se puede crear ningn mensaje nuevo hasta que suprime uno. Una vez que ha suprimido un mensaje, puede crear uno nuevo que utilice el ID de mensaje del suprimido.
Edicin de un mensaje
Para editar un mensaje: 1. Seleccione ProyectoDefinir mensajes en el Diseador GUI. Aparecer la ventana Definir mensajes. 2. Seleccione un mensaje de la lista que se visualiza. Si no encuentra el que desea, siga las instrucciones del apartado Bsqueda de un mensaje. 3. Elija Editar en la ventana Editar mensajes. Se abre la ventana Editar mensaje, mostrando el mensaje que se ha seleccionado. 4. Cambie la informacin sobre el tipo, el texto, la ayuda o la ventana de mensaje. 5. Seleccione Guardar para conservar los cambios o Cancelar para desecharlos.
Supresin de un mensaje
Para suprimir un mensaje: 1. Seleccione ProyectoDefinir mensajes en el Diseador GUI. Se abrir la ventana Definir mensajes. 2. Seleccione un mensaje de la lista que se visualiza. Si no encuentra el que desea, siga las instrucciones del apartado Bsqueda de un mensaje. 3. Elija el pulsador Suprimir.
Bsqueda de un mensaje
A continuacin se facilitan algunas sugerencias para localizar un mensaje: v Si sabe cul es el ID de mensaje, utilice la caracterstica Clasificar por ID de mensaje de la ventana Definir mensajes. Los mensajes se clasifican por ID de mensaje en orden ascendente. v Si sabe el tipo de mensaje que est buscando, utilice la funcin Clasificar por tipo de la ventana Definir mensajes. Los mensajes se clasifican por grupos y por ID de mensaje en orden ascendente: 1. Mensajes que se pueden establecer en la ejecucin: a. Informacin b. Aviso c. Accin d. Grave 2. Mensajes que no puede establecer durante la ejecucin (etiquetas de sustitucin).
249
Puede desplazarse por la lista de mensajes utilizando las teclas de flecha o las barras de desplazamiento. Si la lista de mensajes es extensa, la barra de desplazamiento es la forma ms rpida de encontrar lo que se busca.
Los campos CUSNO y FILE se definen en otro lugar del programa. Suponga que el texto del mensaje *MSG0001 es:
No se ha encontrado el nmero de cliente %1 en el archivo %2.
Para visualizar el mensaje con la operacin DSPLY y llevar a cabo la sustitucin, codifique lo siguiente en la especificacin C:
CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq C notFound DSPLY rc 9 0
Para obtener ms informacin sobre el cdigo de operacin DSPLY, consulte el manual VisualAge RPG Manual de consulta del lenguaje, SC10-3066-01 (SC09-2451-01).
250
Modifique nicamente el texto que figura detrs de los dos puntos ( : ). El primer registro identifica el prefijo de mensaje y cada uno de los registros siguientes identifica un mensaje de la aplicacin. Cada mensaje tiene un prefijo de mensaje, MSG, un identificador o nmero de ID de cuatro dgitos y una letra que describe el tipo de mensaje. En este ejemplo, el mensaje nmero 1 es un mensaje informativo y el mensaje nmero 2 es un mensaje de aviso. No haga lo siguiente: v Modificar el ID de mensaje. Si lo hiciese, los resultados seran imprevisibles. Sin un ID de mensaje, no puede visualizarse el mensaje. v Aadir un mensaje. El estilo del mensaje no se definir y ste nunca se visualizar en la ventana Definir mensajes. v Suprimir un mensaje. La ventana Definir mensajes seguir visualizndolo todo acerca del mensaje, excepto su texto de mensaje.
Si el nmero del mensaje no puede encontrarse en el archivo de mensajes del componente, la aplicacin busca el archivo de mensajes indicado mediante el atributo MsgFile del *componente lgico para el nmero del mensaje. Si el nmero del mensaje no existe en el archivo de mensajes, el identificador del mensaje (MSG0001 en este ejemplo) aparece como el texto de la etiqueta.
251
252
Enlace de componentes
Los siguientes componentes pueden enlazarse mediante VisualAge RPG: v Recuadro de seleccin v Campo de entrada v Imagen v Recuadro de lista v Medios v Panel de medios v Graduador v Temporizador Un componente que notifica a otro componente cuando se modifica se denomina componente origen y el componente que recibe la notificacin del cambio se denomina componente destino. Una manera de establecer comunicacin entre un componente fuente y un componente destino es utilizar la pgina Enlace del cuaderno de propiedades del componente origen. En los campos que se proporcionan debe escribir el nombre del componente destino y el nombre de la ventana en el que reside. Si desea que el destino emita un evento Link cuando recibe la notificacin del componente fuente, seleccione el recuadro de seleccin Habilitar destino de notificacin. Tambin puede configurar el enlace de comunicaciones en el programa estableciendo el atributo AddLink y el destino con el formato NombreVentana|NombreComponente. Si desea que el destino emita un evento Link,
Copyright IBM Corp. 1994, 2000
253
establezca el atributo AllowLink en 1. La Figura 56 muestra el cdigo de ejemplo utilizado para enlazar un componente panel de medios, MMP1, con un componente medios, AUDIO1.
C C * * 'MMP1' 'MMP1' SETATR SETATR 'WIN2|AUDIO1' 'AddLink' 1 'AllowLink'
Figura 56. Cdigo de ejemplo que muestra un componente enlazado con otro
Nota: Slo puede establecer un enlace para un componente origen en el Diseador GUI, pero puede establecer mltiples enlaces en el cdigo.
AppName
Es el nombre de la aplicacin servidor: SERVER.EXE.
Topic
Es el nombre del componente lgico servidor, seguido de una barra vertical, seguido del nombre de instancia de componente lgico. Para VisualAge RPG, en la mayora de los casos el nombre de componente lgico es el mismo que el nombre de instancia de componente lgico y que el nombre ejecutable. En este ejemplo, el nombre del componente lgico es SERVER|SERVER.
Item
Es el nombre del componente servidor. Para los programas VisualAge RPG es el nombre de la ventana, seguido de una barra vertical, seguido del nombre de componente. En este ejemplo, el valor del atributo del elemento es WINDOW_S|ENTRY_S.
254
DDEAddLink
Es el nombre del componente cliente. Se compone del nombre de la ventana, seguido de una barra vertical, seguido del nombre de componente. En este ejemplo, el atributo DDEAddLink es WINDOW_C|STTEXT_C.
DDEMode
Establezca DDEMode en 1 para empezar la conversacin e iniciar el enlace dinmico entre el servidor y el cliente. Para terminar la conversacin, establezca DDEMode en 2. Esto seala el evento Terminate en la aplicacin cliente.
255
#include <stdio.h> * /*Las dos lneas siguientes slo son necesarias si se compila */ /*el OBJ con el compilador IBM C/C++. Estas lneas */ /*no son necesarias si la funcin se exporta desde una DLL. */ int _CRT_init(void); void _CRT_term(void); * /* imprimir los parmetros str y age en un archivo */ void MYFUNC(char *str, int *age) { FILE *fp; int j; * /*La lnea siguiente slo es necesaria si se compila */ /*el OBJ con el compilador IBM C/C++. Esta lnea */ /*no es necesaria si la funcin se exporta desde una DLL. */ _CRT_init(); * fp=fopen("myfunc.log", "a"); * /* imprimir los datos de caracteres en un archivo */ for (j=0; j<10; ++j) { fprintf(fp, "%c", str[j]); } * /* si se da el parmetro age, imprimir el valor */ if ( age == NULL ) { fprintf(fp, "no hay valor para age\n"); } else { fprintf(fp, "num = %d\n", *age); } * fclose(fp); * /*La lnea siguiente slo es necesaria si se compila */ /*el OBJ con el compilador IBM C/C++. Esta lnea */ /*no es necesaria si la funcin se exporta desde una DLL. */ _CRT_term(); }
256
DConst1 C CONST('MYFUNC') Dwilma s 80a inz('misdatos') Dage s 9b 0 inz(32) * * C *inzsr begsr c*********************************************************************** c*********** *** CALLB en VRPG con una PLIST *** ***************** c*********************************************************************** C myplist plist C parm wilma C parm age C CALLB Const1 myplist C seton lr C endsr
s s
lr
lr
257
s s s
lr
Utilice la palabra clave CLTPGM con el nombre de sistema del programa como parmetro. Si el programa espera parmetros, utilice una especificacin de definicin para cada parmetro inmediatamente despus de la especificacin de definicin de PR. Estas especificaciones deben consistir en el nombre, la longitud y el tipo de parmetro. Especifique la precisin de los parmetros numricos. Especifique siempre la palabra clave VALUE. Tambin puede especificar las palabras clave ASC, DATFMT, DESC, DIM, LIKE, NOOPT, OPTIONS y TIMFMT en las definiciones de parmetros. La Figura 62 define pgm1 para VisualAge RPG. Pueden pasarse dos parmetros al programa; el segundo es optativo.
D pgm1 D parm1 D parm2 PR CLTPGM('testprog') 20A VALUE 6B 3 OPTIONS(*NOPASS) VALUE
258
En la Figura 63, el cdigo de operacin CALLP llama a pgm1 con los parmetros f1d1 y 22,4.
C CALLP pgml(f1d1:224)
Para obtener ms informacin sobre procedimientos, consulte Utilizacin de mltiples procedimientos en la pgina 264.
Si F2 es un nombre de variable, se supone que es el nombre de componente a menos que se defina la variable en una especificacin de definicin con LINKAGE(*CLIENT) indicado. Puede utilizarse cualquier variable definida de esta manera como cualquier otro campo RPG. En la Figura 65, el primer cdigo de operacin START intentar iniciar un componente y el segundo cdigo de operacin START intentar iniciar un programa local.
D name1 D name2 * C C S S START START 20A 20A name1 name2 LINKAGE(*CLIENT)
259
START puede seguir teniendo una PLIST especificada en el campo de resultado o puede ir seguido de una lista de PARMS. Estos PARMS se pasan al componente o al programa local.
RESTRICCIONES
PARA
CALLP
START
Tenga en cuenta estas restricciones al utilizar cdigos de operacin CALLP y START con programas locales: v La variable de entorno PATH se utiliza para encontrar el programa local si el nombre de programa no se especifica con el nombre de va de acceso completo. v El programa puede tener un mximo de 20 parmetros. En algunos casos, este mximo es menos de 20 porque la serie de mandato no debe exceder de 1024 bytes. (La serie de mandato se compone del nombre de programa y de los parmetros convertidos a caracteres.) v Los punteros y los punteros de procedimiento no estn permitidos como parmetros. Todos los parmetros deben pasarse por valor. v Cuando se utiliza START con un indicador de error para llamar a programas locales, el indicador de error se establece en ON si no puede iniciarse el programa local. v LINKAGE(*SERVER) no es vlido con el cdigo de operacin START. v Al especificar el nombre de un programa que va a llamar, incluya la extensin si es distinta de EXE. Si no proporciona una extensin, se supone que es EXE. Por ejemplo, CLTPGM(superc2) Llama a SUPERC2.EXE CLTPGM(rexxpgm) Llama a REXXPGM.EXE CLTPGM(rexxpgm.cmd) Llama a REXXPGM.CMD Esto se aplica al especificar el nombre de programa como una constante con nombre para START, o al pasar el nombre de programa como una variable.
Inicio de un componente
El cdigo de operacin START inicia un componente nuevo en la aplicacin. Cuando se realiza la operacin, tanto los componentes lgicos que se estn iniciando como los ya iniciados, junto con cualquier otro componente lgico activo de la aplicacin, estn listos para recibir acciones de usuario en todos los componentes actualmente habilitados por todos los componentes lgicos. El cdigo de operacin START es similar al cdigo de operacin CALL en lo siguiente: v Pueden pasarse parmetros a un componente lgico. v Los parmetros se correlacionan con los parmetros *ENTRY PLIST del componente lgico destino.
260
v En el componente origen, el factor 2 del cdigo de operacin PARM se copia al campo de resultado del mismo cdigo de operacin PARM. Cuando el control se devuelve al componente lgico de origen, el campo de resultado se copia en el factor 1. v En el componente lgico de destino, el campo de resultado se copia en el factor 1. Cuando el control se devuelve al componente lgico de origen, el factor 2 se copia en el campo de resultado si el componente lgico de destino completa un inicio satisfactorio. v No se realizan comprobaciones ni conversiones en los parmetros. El cdigo de operacin START es diferente del cdigo de operacin CALL en lo siguiente: v Los trminos llamado y de llamada se utilizan con el cdigo de operacin CALL. Un programa llamado es un programa cuya ejecucin se solicita desde otro programa. Un programa de llamada es un programa que solicita la ejecucin de otro programa. Con el cdigo de operacin START, se utilizan los trminos destino (llamado) y origen (de llamada). v CALL invoca un programa, lo ejecuta y luego vuelve al programa de llamada con el factor 1, factor 2 y el campo de resultado tal como se ha descrito anteriormente. START inicializa un componente lgico, ejecuta su *INZSR y vuelve al componente lgico origen con el factor 1, factor 2 y el campo de resultado copiado tal como se ha descrito anteriormente. La diferencia es que con el cdigo de operacin START, el factor 2 del programa destino se copia al campo de resultado al final de *INZSR (si *INZSR es satisfactorio), no al final del programa. v Una vez que la operacin START ha terminado de inicializar el componente lgico de destino, la subrutina de accin del componente lgico de origen contina ejecutndose y el componente lgico de destino permanece activo con sus subrutinas de accin habilitadas para recibir eventos. v Dado que los parmetros se pasan por direccin, los componentes lgicos de origen y de destino pueden acceder a los parmetros pasados despus de que la operacin START inicial ha finalizado. Esto quiere decir que los componentes lgicos de origen y de destino pueden continuar compartiendo informacin utilizando los campos de parmetro.
Finalizacin de un componente
El cdigo de operacin STOP termina la ejecucin de un componente lgico. Si no especifica el nombre del componente lgico en el factor 2, se termina el componente lgico que se ejecuta actualmente. Cuando se termina un componente lgico, los componentes hijos que puedan iniciarse son los primeros en terminar. Cuando se realiza una operacin STOP que afecta al componente lgico de ejecucin actual, no se ejecutan las operaciones que siguen a STOP. En otras palabras, el resultado de STOP es inmediato. Por ejemplo, si COMPA inicia COMPB, y COMPB es el componente lgico que se est ejecutando actualmente y emite un STOP para COMPA, en primer lugar finaliza COMPB y despus COMPA. No se realizan ms operaciones a continuacin de STOP. La finalizacin de un componente lgico con STOP se considera una terminacin normal y se invoca *TERMSR para cualquier proceso de usuario final.
261
262
********************************************************************* * * * ID de programa : rcallex.vpg * * * * Descripcin . : Segmento de cdigo para llamar a un programa * * remoto en el AS/400. * * * ********************************************************************* * * REMPGM es el nombre de alias del programa remoto D as400pgm S 6A INZ('REMPGM') LINKAGE(*SERVER) * Las variables siguientes son parmetros que se pasan al programa * remoto * student_id - input * name - output D student_id S 6S 0 INZ(32533) D name S 20A ********************************************************************* * * * Ventana. . : WIN1 * * * * Componente : PSB0000C * * * * Evento . . : PRESS * * * * Descripcin: Llame a un programa remoto en el AS/400 para obtener * * el nombre de la persona asociada al id. de estudiante* * * ********************************************************************* * C PSB0000C BEGACT PRESS WIN1 C CALL as400pgm C PARM student_id C PARM name C ENDACT
Nota: Si el programa que est en el AS/400 contiene un archivo de estacin de trabajo, causar una anomala cuando el sistema intente abrirlo. Dado que el mandato de llamada remota se realiza a travs del servidor DDM, el dispositivo de pantalla es desconocido para la gestin de datos de la estacin de trabajo. Un procedimiento que puede utilizar consiste en crear el archivo de estacin de trabajo en el servidor AS/400 con el valor de Dispositivo de pantalla establecido en el nombre de la sesin (OMXxxxx) y establecer el parmetro Nmero mximo de dispositivo en un valor mayor que 1. Esto permitir que puedan pasarse parmetros al programa AS/400. No intente obtener la sesin de manera explcita con una sentencia ACQ. Esto ocasionar un conflicto que producir un error. An no puede adquirir ningn dispositivo de pantalla de emulador 5250 en la estacin de trabajo, porque causar un punto muerto que slo puede finalizarse rearrancando la estacin de trabajo.
263
Llamadas de prototipo
Para llamar a un subprocedimiento, debe utilizar una llamada de prototipo. Tambin puede llamar a cualquier programa o procedimiento que se haya escrito en cualquier lenguaje mediante una llamada de prototipo. Una llamada de prototipo es aquella en la que la interfaz de llamadas se comprueba en el tiempo de compilacin utilizando un prototipo. Un prototipo es una definicin de la interfaz de llamadas. Incluye la informacin siguiente: v Si la llamada es enlazada (procedimiento) o dinmica (programa). v La manera de buscar el programa o el procedimiento (el nombre externo). v El nmero y la naturaleza de los parmetros. v Los parmetros que deben pasarse y los que se pasan de manera opcional. v El tipo de datos del valor de devolucin, si hay alguno (para un procedimiento). El compilador utiliza el prototipo para llamar al programa o al procedimiento correctamente y para asegurarse de que el emisor pasa los parmetros correctos. La Figura 67 en la pgina 265 muestra un prototipo para el procedimiento FmtCust, que formatea varios campos de un registro de manera legible. Tiene dos parmetros de salida.
264
* Prototipo para el procedimiento FmtCust (Vea PR en la * especificacin de la definicin). Tiene dos parmetros. D FmtCust PR D Nombre 100A D Direccin 100A
Para producir los campos de salida formateados, FmtCust llama al procedimiento NumToChar. NumToChar tiene un parmetro de entrada numrico que se pasa por valor y devuelve un campo de tipo carcter. La Figura 68 muestra el prototipo para NumToChar.
* Prototipo para el procedimiento NumToChar * El valor devuelto es un campo de tipo carcter de * 31 caracteres de longitud. D NumToChar PR 31A * El parmetro de entrada se empaqueta con 30 dgitos y 0 * posiciones decimales y se pasa por valor. D NUMPARM 30P 0 VALUE
Si el programa o el procedimiento son de prototipo, y desea utilizar el valor de devolucin, debe invocarlos con CALLP o en una expresin. Al pasar parmetros de una lista, sta debe seguir al nombre del prototipo, por ejemplo: nombre (parm1 : parm2 : ...). La Figura 69 muestra una llamada a FmtCust. Tenga en cuenta que los nombres de los parmetros, que se muestran en la Figura 67, no coinciden con los de la sentencia de llamada. Los nombres de los parmetros de un prototipo slo se utilizan a efectos de documentacin. El prototipo sirve para describir los atributos de la interfaz de llamadas. La definicin real de los parmetros de llamada tienen lugar dentro del procedimiento mismo.
C CALLP FmtCust(RPTNAME : RPTADDR)
Utilizando llamadas de prototipo, puede llamar (con la misma sintaxis) a: v Programas que estn en el sistema en el tiempo de ejecucin. v Procedimientos exportados a otros mdulos. v Subprocedimientos del mismo mdulo. Al objeto de formatear el nombre y la direccin adecuadamente, FmtCust llama a NumToChar para convertir el nmero de cliente en un campo de tipo carcter. Puesto que FmtCust utiliza el valor de devolucin, la llamada a NumToChar tiene lugar en una expresin. La Figura 70 en la pgina 266 muestra la llamada.
265
*-------------------------------------------------------------* CUSTNAME y CUSTNUM se han formateado para tener este aspecto: * A&P Electronics (Nmero de cliente 157) *-------------------------------------------------------------C EVAL Name = CUSTNAME + ' ' C + '(Nmero de cliente ' C + %trimr(NumToChar(CUSTNUM)) + ')'
La utilizacin de procedimientos para valores de devolucin, le permite escribir cualquier funcin definida por el usuario que necesite. Adems, utilizar una interfaz de llamadas de prototipo abre una serie de opciones para pasar parmetros. v Los parmetros de prototipo pueden pasarse de varias maneras: por referencia, por valor (slo para procedimientos) o por referencia de slo lectura. El mtodo por omisin para RPG es pasar por referencia. Sin embargo, pasar por valor o por referencia de slo lectura proporciona ms opciones para pasar parmetros. v Si el prototipo indica que est permitido para un parmetro determinado, puede efectuar una o ms de las acciones siguientes: Pasar *OMIT. Omitir un parmetro por completo. Pasar un parmetro ms corto del especificado (para parmetros de tipo carcter y grfico y para parmetros de matriz).
266
v Los nombres de los procedimientos de VisualAge RPG estn en maysculas. Al llamar a estos procedimientos, debe asegurarse de especificar los nombres en mayscula.
v Los subprocedimientos DLL de VisualAge RPG no son externos. El compilador ha especificado que estos subprocedimientos son slo internos. Los puntos de entrada no son externos para otros mdulos. Cualquier intento de enlazar estos subprocedimientos ocasionar un error en el paso de enlace. v La palabra clave EXPORT no est permitida en especificaciones de procedimiento puesto que los procedimientos no pueden exportarse desde una DLL de VisualAge RPG.
v El EXE se crea cuando se proporciona la palabra clave EXE en la especificacin de control. v El EXE se compone slo de procedimientos.
267
v v
v v
Todas las subrutinas (BEGSR) deben ser locales para un procedimiento. El EXE debe contener un procedimiento cuyo nombre coincida con el nombre del archivo fuente. ste ser el punto de entrada principal para el EXE (por ejemplo, el procedimiento principal). No se permiten cdigos de operacin GUI en el fuente. Esto incluye START, STOP, SETATR, GETATR, %SETATR, %GETATR, SHOWWIN, CLSWIN y READS. Se puede utilizar DSPLY. *inzsr y *termsr no estn permitidos. *ENTRY parms no est permitido. Si hay parmetros de entrada, estn especificados en la definicin de parmetros del procedimiento principal y deben pasarse por VALUE (la palabra clave VALUE debe especificarse para cada parmetro). La palabra clave EXPORT no est permitida en la especificacin P Begin. El tratamiento de excepciones se diferencia de la DLL de VRPG. El manejador de excepciones por omisin no se invoca nunca desde un EXE. Si se produce una excepcin en el EXE y no hay ningn indicador de errores ni *PSSR, tiene lugar un exit() y la informacin sobre la excepcin se graba en el archivo FVDCERRS.LOG.
268
Captulo 18. Cmo invocar mtodos Java desde programas VisualAge RPG
Esta seccin describe cmo invocar mtodos Java desde programas VARPG que se han convertido a cdigo fuente Java, as como los elementos adicionales del lenguaje VARPG que dan soporte a estas funciones. Para invocar mtodos Java, el compilador VARPG necesita la siguiente informacin: v El nombre del mtodo v La clase que contiene el mtodo v La clase del objeto devuelto si el mtodo devuelve un objeto v Si el mtodo es esttico o no v Los tipos de datos de los parmetros pasado al mtodo Adems, si el mtodo no es esttico, debe crearse una instancia para un objeto para poder invocar el mtodo. Si el mtodo devuelve un objeto, el compilador debe tener dnde almacenarlo. Si el mtodo acepta un objeto como parmetro, debe haber alguna forma de crear ese objeto. Estos requisitos han conducido a los siguientes elementos adicionales en el lenguaje VARPG: v El tipo de datos de objeto v La palabra clave CLASS v La extensin de la palabra clave EXTPROC
*JAVA identifica el objeto como objeto Java. El nombre de clase especifica la clase del objeto. Debe ser literal en los caracteres y el nombre de clase debe ser totalmente calificado. El nombre de clase es sensible a las maysculas y minsculas. Por ejemplo, para declarar un campo que contendr un tipo de objeto BigDecimal:
D bdnum S O CLASS(*JAVA:'java.math.BigDecimal')
Observe que ambos nombres de clase estn totalmente calificados y que el uso de maysculas y minsculas coincide exactamente con el de la clase Java. Los campos de tipo O no pueden definirse como subcampos de estructuras de datos. Es posible disponer de matrices de campos de tipo O, pero no estn permitidas las tablas de tipo O porque deben cargarse en tiempo de ejecucin. Las palabras clave siguientes no pueden utilizarse con la palabra clave CLASS:
269
ALIGN, ALT, ASCEND, BASED, BUTTON, CLTPGM, CONST, CTDATA, DATFMT, DESCEND, DTAARA, EXTFLD, EXTFMT, EXTNAME, FROMFILE, INZ, LINKAGE, MSGDATA, MSGNBR, MSGTEXT, MSGTITLE, NOOPT, NOWAIT, OCCURS, OPTIONS, OVERLAY, PACKEVEN, PERRCD, PREFIX, PROCPTR, STYLE, TIMFMT, TOFILE, VALUE, VARYING
*JAVARPG identifica el mtodo como un mtodo Java generado por VARPG. *JAVA identifica el mtodo como un mtodo Java que ha sido generado de cdigo escrito inicialmente en Java y no generado por VARPG. Esta distincin es importante porque los mtodos generados a partir de *JAVARPG permitirn que ciertos tipos de datos sean pasados por referencia cuando normalmente no podran pasarse por referencia en Java. Ello permite que pueda utilizarse el mismo cdigo fuente al dirigirse a Windows y al generar cdigo fuente Java. Tanto el nombre de clase como el del mtodo deben ser literales en el uso de maysculas y minsculas. El nombre de clase debe ser un nombre de clase Java totalmente calificado y es sensible a las maysculas y minsculas. El nombre de mtodo debe ser el nombre del mtodo que debe invocarse y es sensible a las maysculas y minsculas. La forma extendida de la palabra clave EXTPROC slo puede utilizarse al invocar mtodos Java. Si se dirige a Windows, el uso de esta forma de la palabra clave EXTPROC dar como resultado un error del compilador. Los tipos de datos de los parmetros y el valor de retorno del mtodo estn especificados de la misma forma que la realizacin de un prototipo de un subproceso. La nica observacin al respecto es que los tipos de datos se correlacionan a tipos de datos Java. El compilador correlaciona tipos de datos VARPG a tipos de datos Java segn se muestra a continuacin:
Tipo de datos Java char[] boolean byte[] byte int short long float double Tipo de datos VARPG grfico o Unicode indicador (N) alfanumrico (A de cualquier longitud) entero (3I) entero (10I) entero (5I) entero (20I) coma flotante (4F) coma flotante (8F)
270
Los tipos de datos con zona, empaquetados, binarios y sin signo no estn disponibles en Java. Si pasa un campo con zona, empaquetado, binario o sin signo como parmetro, el compilador realizar la conversin apropiada, pero es muy posible que provoque truncamiento y/o prdida de precisin. Si el mtodo que est invocando ha sido generado por VARPG, es decir, que ha sido especificado como primer parmetro de una palabra clave EXTPROC, entonces los tipos de datos con zona, empaquetados, binarios y sin signo pueden especificarse como tipo de datos de los parmetros y los valores de retorno. Los mtodos generados por cdigo escrito inicialmente en Java no pueden utilizar tipos de datos con zona, empaquetados, binarios y sin signo en el prototipo para parmetros o valores de retorno. Al invocar un mtodo, el compilador acepta matrices como parmetros si ste es un prototipo que utiliza la palabra clave DIM. En caso contrario, slo se aceptarn los campos escalares, las estructuras de datos y las tablas. Actualmente, no puede invocar mtodos que esperen estos tipos de datos de Java o que devuelvan estos tipos de valores: byte, char y long. Si el valor de retorno de un mtodo es un objeto, entonces usted debe proporcionar la clase del objeto codificando la palabra clave CLASS en el prototipo. El nombre de clase especificado ser el del objeto que se devuelve. Utilice la palabra clave EXTPROC para especificar la clase del mtodo que se invoca. Si el mtodo invocado es esttico, entonces debe especificar la palabra clave STATIC en el prototipo. En Java, los tipos de datos siguientes slo pueden pasarse por valor:
byte int short long float double
Estos tipos de parmetros deben tener asignada una especificacin de la palabra clave VALUE en el prototipo. Si el mtodo que est invocando ha sido generado por VARPG, es decir, que ha sido especificado como primer parmetro de una palabra clave EXTPROC, entonces estos tipos de datos pueden pasarse por referencia y la palabra clave VALUE no es necesaria. Observe que slo se puede pasar los objetos por referencia. La palabra clave VALUE no puede especificarse con tipo O. Debido a que java percibe las matrices como objetos, los parmetros que correlaciones a matrices deben tambin pasarse por referencia. Esto incluye a las matrices de bytes.
271
Ejemplo 1
La clase Integer de Java contiene un mtodo esttico llamado toString, que acepta un parmetro int y devuelve un objeto String. Se declara en Java de la siguiente forma:
String Integer.toString(int)
La palabra clave EXTPROC identifica el mtodo como no generado por VARPG. Tambin indica que el nombre del mtodo es toString, y que se encuentra en la clase java.lang.Integer. El O en la columna 40 y la palabra clave CLASS informan al compilador de que el mtodo devuelve un objeto, cuya clase es java.lang.String. La palabra clave STATIC indica que el mtodo es esttico, es decir, que no es necesario un objeto Integer para invocar este mtodo. El tipo de datos del parmetro se especifica como 10I, que correlaciona al tipo de datos Java int. Al ser el parmetro un int, debe pasarse por valor, y se precisa la palabra clave VALUE.
Ejemplo 2
La clase Integer de Java contiene un mtodo esttico llamado getInteger, que acepta objetos String e Integer como parmetros y devuelve un objeto Integer. En Java se declara de la siguiente forma:
Integer Integer.getInteger(String, Integer)
O O
Este mtodo acepta dos objetos como parmetros. O est codificado en la columna 40 de la especificacin D y la palabra clave CLASS especifica la clase de cada parmetro de objeto.
Ejemplo 3
La clase Integer de Java contiene un mtodo llamado shortValue, que devuelve la representacin corta del objeto Integer utilizado para invocar el mtodo. Se declara en Java de la siguiente forma:
short shortValue()
272
La palabra clave STATIC no se especifica porque el mtodo no es esttico. El mtodo no utiliza parmetros, por lo que no se codifica ninguno. El valor devuelto se especifica como 5I, que correlaciona al tipo de datos short de Java.
Ejemplo 4
La clase Integer de Java contiene un mtodo llamado equals, que acepta un objeto como parmetro y devuelve un valor booleano. Se declara en Java de la siguiente forma:
boolean equals(Object)
El valor devuelto se especifica como N, que correlaciona al tipo de datos boolean de Java.
4F
Observe que el parmetro debe pasarse por valor porque correlaciona al tipo de datos float de Java.
273
Ejemplo 1 En este ejemplo, el objetivo es aadir dos valores BigDecimal. Para llevarlo a cabo, deben crearse instancias para dos objetos BigDecimal invocando el constructor para la clase BigDecimal, deben declararse los campos para el almacenamiento de los objetos BigDecimal y debe invocarse el mtodo add() en la clase BigDecimal.
* * * * Prototipo del constructor BigDecimal que acepta un parmetro String. Devuelve un nuevo objeto BigDecimal.
D bdcreate1 PR O EXTPROC(*JAVA: D 'java.math.BigDecimal': D *CONSTRUCTOR) D CLASS(*JAVA:'java.math.BigDecimal') D str O CLASS(*JAVA:'java.lang.String') * * Prototipo del constructor BigDecimal que acepta un parmetro * doble. 8F correlaciona al tipo de datos double de Java y, por ello, * debe pasarse por VALUE. Devuelve un objeto BigDecimal. * D bdcreate2 PR O EXTPROC(*JAVA: D 'java.math.BigDecimal': D *CONSTRUCTOR) D CLASS(*JAVA:'java.math.BigDecimal') D double 8F VALUE * * Define los campos en los que almacenar los objetos BigDecimal. * D bdnum1 S O CLASS(*JAVA:'java.math.BigDecimal') D bdnum2 S O CLASS(*JAVA:'java.math.BigDecimal') * * * * * * * Ya que uno de los constructores que estamos utilizando requiere un objeto String, tambin necesitamos construir uno. Realice un prototipo del constructor String que acepta una matriz de bytes como parmetro. Devuelve un objeto String.
D makestring PR O EXTPROC(*JAVA: D 'java.lang.String': D *CONSTRUCTOR) D CLASS(*JAVA:'java.lang.String') D bytes 10A * * Define un campo en el que almacenar el objeto String. * D string S O CLASS(*JAVA:'java.lang.String') * * Prototipo del mtodo add BigDecimal. Acepta un objeto BigDecimal * como parmetro y devuelve un objeto BigDecimal (la suma del parmetro * y del objeto BigDecimal utilizado para invocar). * D add PR O EXTPROC(*JAVA: D 'java.lang.BigDecimal': D 'add') D CLASS(*JAVA:'java.math.BigDecimal') D bd1 O CLASS(*JAVA:'java.math.BigDecimal') * * Define un campo en el que almacenar el resultado de la suma. * D sum S O CLASS(*JAVA:'java.math.BigDecimal') D D double S 8F INZ(1.1) D fld1 S 10A
274
C C* C* C* C* C* C C* C* C* C* C C* C* C* C* C C* C* C* C* C* C* C* C* C* C C* C*
MOVEL
'mystring'
fld1
10
Invoca al constructor para la clase String, para crear un objeto String desde fld1. Al estar invocando al constructor, no necesitamos pasar un objeto String como primer parmetro. EVAL string = makestring(fld1)
Invoca al constructor BigDecimal que acepta un parmetro String, utilizando el objeto String para el que acabamos de crear una instancia. EVAL bdnum1 = bdcreate1(string)
Invoca al constructor BigDecimal que acepta double como parmetro. EVAL bdnum2 = bdcreate2(double)
Sume los dos objetos BigDecimal invocando el mtodo add. El prototipo indica que add acepta un parmetro, pero al no ser add un mtodo esttico, tambin debemos pasar un objeto BigDecimal para realizar la llamada. Adems debe pasarse como primer parmetro. bdnum1 es el objeto que estamos utilizando para invocar y bdnum2 es el parmetro. EVAL sum = add(bdnum1:bdnum2) sum ahora contiene un objeto BigDecimal con el valor bdnum1 + bdnum2.
Ejemplo 2 Este ejemplo muestra cmo realizar un TRIM en Java utilizando el mtodo trim() como alternativa a la funcin %TRIM incorporada en VARPG. El mtodo trim() en la clase String no es un mtodo esttico, por lo que se necesita un objeto String para invocarlo.
* * * Define un campo en el que almacenar el objeto String que deseamos ajustar.
D str S O CLASS(*JAVA:'java.lang.String') * * Prototipo de constructor para la clase String. El * constructor espera una matriz de bytes. * D makestring PR O EXTPROC(*JAVA: D 'java.lang.String': D *CONSTRUCTOR) D CLASS(*JAVA:'java.lang.String') D parm 10A D * * Prototipo de mtodo String getBytes que convierte un String en una matriz * de bytes. A partir de ah, podremos almacenar esta matriz de bytes en un * campo alpha. * D makealpha PR 10A EXTPROC(*JAVA: D 'java.lang.String': D 'getBytes') * * Prototipo de mtodo String trim. No necesita parmetros, pero * al no ser un mtodo esttico, debe invocarse utilizando un objeto * String. * D trimstring PR O EXTPROC(*JAVA: D 'java.lang.String':
Captulo 18. Cmo invocar mtodos Java desde programas VisualAge RPG
275
D fld
Ajusta la serie invocando el mtodo String trim(). Volveremos a utilizar el campo str para almacenar el resultado. EVAL str = trimstring(str)
Vuelve a convertir la serie en una matriz de bytes y la almacena en fld. EVAL fld = makealpha(str)
Los mtodos estticos se invocan de la misma forma, excepto que no se necesita un objeto para realizar la llamada. Si el mtodo makealpha() mostrado ms arriba fuese esttico, la llamada sera:
C EVAL fld = makealpha()
Otras consideraciones
El compilador no intentar resolver las clases durante la compilacin. Si una clase no puede localizarse durante el tiempo de ejecucin, aparecer un error de ejecucin. ste indicar que se ha recibido un objeto UnresolvedLinkException del entorno Java. El compilador no escribe las comprobaciones de parmetros durante la compilacin. Si se produce un conflicto entre el prototipo y el mtodo que se invoca, se recibir un error durante la ejecucin. Es muy importante que se especifique *JAVARPG como primer parmetro de EXTPROC si el mtodo invocado no ha sido generado por VARPG. En caso contrario, es posible que se produzca una de las dos situaciones de error descritas ms arriba.
276
277
Tipos de archivo: v SPECIAL Operaciones con archivos: v Grabar registros por nmero de registro relativo
5. Los caracteres *, # y @ no pueden utilizarse en identificadores Java. Debido a ello, todas las apariciones de *, # y @ en nombre VARPG deber cambiarse a _. Es posible que esta conversin d como resultado nombre duplicados. 6. Si una operacin COMMIT o ROLBK est codificada en una aplicacin que carece de archivos, se emitir un mensaje de gravedad 30 (RNF7833). 7. A causa de la forma en que un *PSSR local se convierte a Java, no es posible invocar un *PSSR local. Observe tambin que, al no soportarse GOTO, la nica forma de dejar un *PSSR local y evitar el manejador por omisin es codificar una operacin RETURN. 8. No hay posibilidad de cortocircuitar expresiones lgicas. Esto significa que no puede preverse el orden en que se ejecutar una expresin lgica compuesta. 9. Los campos de longitud variable se implementan como una clase al convertir a Java. Ello significa que no se almacenan como documentados en la
278
10.
11. 12.
13.
14.
15.
publicacin VARPG Language Reference. El cdigo que depende de que estos campos se almacenen de una cierta forma no funcionar. Los subcampos de estructura de datos no se inicializarn a espacios en blanco si no se provee de un valor inicial, pero se inicializarn a un valor por omisin dependiendo del tipo de datos del subcampo. El valor por omisin es 0 para numricos, espacios en blanco para carcter y *LOVAL para fecha, hora e indicacin de la hora. La longitud de los campos de longitud variable se establecer en 0. Los valores *HIVAL y *LOVAL no se permiten en los campos de tipo grfico y UCS-2. Si se especifica una longitud para una estructura de datos, debe coincidir con la longitud total de los subcampos que contiene, en caso contrario el compilador emitir un mensaje de diagnstico de gravedad 30. Las subrutinas no pueden definirse en los subprocedimientos. La nica excepcin a ello que un *PSSR puede definirse en un subproceso. Todas las subrutinas contenidas en subprocedimientos deberan trasladarse fuera de ellos. Si la subrutina accede a campos locales en el subprocedimiento, entonces los campos deben convertirse en globales o bien la subrutina debe cambiarse a un subprocedimiento que acepte campos locales como parmetros. Sentencias incondicionales LEAVE en bucles DO no se soportan. Se producir un error del compilador Java si se da esta situacin. Un LEAVE incondicional en un bucle DO significa que el bucle se ejecutar una sola vez, por lo que LEAVE debera suprimirse y cambiarse el cdigo para eliminar los cdigos de la operacin de bucle. El uso de atributos de evento en instancias condicionales compuestas modificadas provoca errores de compilacin en Java. En su lugar, debiera utilizarse la expresin libre equivalente. Ejemplo de cdigo que podra provocar errores de compilacin en Java:
C C C C %mousex %mousey IFEQ ANDEQ ... ENDIF x y
16. Una operacin RETURN incondicional no puede codificarse a menos que sea la ltima instancia de una subrutina de usuario, una subrutina de accin o un subprocedimiento. En caso contrario, el compilador Java puede informar de errores. 17. Una operacin LEAVESR incondicional no puede codificarse a menos que sea la ltima sentencia de una subrutina de usuario o una subrutina de accin. En caso contrario, el compilador Java puede informar de errores. 18. Las instancias SELECT pueden provocar errores del compilador Java cuando aparecen en subprocedimientos, cuando contienen operaciones RETURN y no se ha codificado ningn RETURN en el cuerpo principal del subprocedimiento. Ejemplo de cdigo que podra provocar errores de compilacin en Java:
C C C C C C C C x x SELECT WHENEQ RETURN WHENEQ RETURN OTHER RETURN ENDSL y 1 z 2 0
279
En general, una operacin RETURN debera codificarse para todas las posibles vas de acceso de cdigo de un subprocedimiento, en caso contrario, el compilador Java emitir errores. 19. Las matrices no pueden pasarse por valor a subprocedimientos.
280
entonces se informar del error al llamante y ser ste el que se encargue de l. Cuando se procesa en Windows, la aplicacin se interrumpir. 13. Nunca se emitir un error de estado 50 cuando se ejecuten aplicaciones Java. Java no proporciona mensajes de diagnstico para las conversiones de caracteres que no puede manejar. Java puede emitir un estado 100 para una conversin no satisfactoria o para una ArrayIndexOutOfBoundsException cuando se utiliza la serie convertida. 14. El posicionamiento de un archivo de sistema principal en registros con valores nulos cuando se ha especificado ALWNULL(*NO) da como resultado CPF5035.
Restricciones de applet
Los siguientes elementos del lenguaje no estn soportados cuando se ejecuta una applet VARPG y dar como resultado errores de Java en tiempo de ejecucin: v Archivos de impresora v Archivos locales v Llamadas a funciones C, subprocedimientos externo, archivos EXE. v Las aplicaciones NOMAIN y EXE no pueden ejecutarse como applets.
Sin embargo, el texto impreso puede no ser exactamente como se esperaba. Este problema se resolver cuando se arregle el problema con J2SDK 1.2, sin necesidad de actualizar VARPG.
281
282
283
********************************************************************** * Archivo fuente: VCOMP1.VPG * * Demostracin de la llamada a un procedimiento externo mediante JNI. * ********************************************************************** * Declarar un procedimiento llamado 'sub1' que hace referencia a * una funcin llamada 'proc1' de la DLL 'VSUB.DLL' d sub1 pr dll('VSUB') extproc('proc1') dll('VSUB')
* Sin la palabra clave EXTPROC d sub2 pr C C C c C *INZSR BEGSR callp callp seton ENDSR sub1 sub2
lr
* Esta subrutina de accin se enlaza con un evento Create de la ventana. * Hace que el componente finalice tras ejecutar INZSR. C C C CREATE1 BEGACT seton ENDACT LR
En la plataforma Windows, la funcin nativa se codifica de modo que utilice el enlace de programa StdCall. La funcin se codifica como funcin exportada en la DLL. El nombre de la funcin exportada debe coincidir con el nombre que dicta la especificacin JNI. El formato de la especificacin JNI es el siguiente:
Java_VARPGComponentName_ExternalProcedureName_OverloadedNativeMethods
Los nombres completos de las funciones nativas son Java_VCOMP1_proc1 y Java_VCOMP1_SUB2 en este ejemplo. El mtodo nativo sobrecargado no se necesita en este ejemplo. La interfaz JNI dicta los dos primeros parmetros: un puntero a interfaz y un puntero al objeto this. Los parmetros adicionales corresponden a los parmetros declarados de los procedimientos. El archivo de cabecera jni.h se incluye en el programa fuente de lenguaje C para proporcionar las definiciones de interfaz. Este archivo lo proporciona J2SDK. Quizs deba actualizar la variable de entorno INCLUDE en el compilador C para que incluya el directorio que contiene los archivos de cabecera de lenguaje C para J2SDK. Por ltimo, el archivo fuente C de ejemplo se compila en una DLL.
284
// Archivo fuente:
VSUB.C
// Aadir (d:\jdk12\include;d:\jdk12\include\win32) al valor INCLUDE para // poder encontrar jni.h al compilar. // Compilado con: IBM VisualAge(TM) para C++ para Windows(R), Versin 3.5 // Mandato de compilacin: icc /q /ss /ge- /fe vsub.dll vsub.c #include <stdio.h> #include <string.h> #include <jni.h> //--------------------------------------------------------------void _Export __stdcall { printf(" llamada a proc1 satisfactoria.\n"); } //--------------------------------------------------------------void _Export __stdcall { } Java_VCOMP1_SUB2( void *je , void *jc) Java_VCOMP1_proc1( void *je , void *jc)
Tipos de parmetro
Carcter
VisualAge RPG implementa los campos de tipo carcter como matrices de bytes en Java, incluyendo un campo de tipo carcter de longitud uno. La funcin GetByteArrayElements de la interfaz JNI devuelve el valor del parmetro de matriz de bytes. Puede modificarse el valor y devolverlo a la funcin que efecta la llamada mediante la funcin ReleaseByteArrayElements de la interfaz. Nota: Tras llamar a la funcin de liberacin no debe utilizarse el valor en la funcin nativa. El primer parmetro de la funcin nativa del fuente de lenguaje C se ha cambiado de un puntero void a un puntero JNIEnv. Apunta a una tabla de punteros de funcin para las funciones de la interfaz JNI. Los prototipos de los parmetros del
Captulo 20. Llamada a funciones del sistema al compilar para Java
285
procedimiento externo se aaden a los parmetros de la funcin nativa, despus de los dos punteros JNI estndares. Los parmetros de tipo carcter se declaran como tipos jbyteArray en la funcin nativa. Se utiliza la funcin GetByteArrayElements de la interfaz para obtener el valor de la matriz de bytes Java para el campo de tipo carcter de VARPG. Puede modificarse el valor obtenido y devolverse al llamador Java mediante la funcin ReleaseByteArrayElements de la interfaz. Una vez liberado, no debe accederse al valor obtenido. Nota: Es posible que el valor obtenido sea el valor real del objeto Java, no una copia en memoria. Los cambios efectuados en l pueden reflejarse en el llamador Java aunque no se llame a la funcin de liberacin. Consulte la funcin GetByteArrayElements en la documentacin de JNI para obtener ms informacin.
286
********************************************************************** * Archivo fuente: VCOMP1.VPG * * Demostracin de la llamada a un procedimiento externo mediante JNI. * ********************************************************************** * Declarar un procedimiento llamado 'sub1c' que hace referencia a * una funcin llamada 'proc1c' de la DLL 'VSUBC.DLL' * Con 1 parmetro de tipo carcter d sub1c pr d 1 dll('VSUBC') extproc('proc1c')
* Sin la palabra clave EXTPROC * Con 2 parmetros de tipo carcter d sub2c pr dll('VSUBC') d 4 d 10 d c1 d c4 d c10 d mb1 d rc C C C c c c C *INZSR s s s m s BEGSR callp callp sub1c(c1) sub2c(c4:c10) 9 0 1 4 10 inz('J') inz('blue') inz('abcdefghij') style(*info) button(*OK)
* Visualizar los valores cambiados por las llamadas c4 dsply mb1 rc c10 dsply mb1 rc seton ENDSR lr
* Esta subrutina de accin se enlaza con un evento Create de la ventana. * Hace que el componente finalice tras ejecutar INZSR. C C C CREATE1 BEGACT seton ENDACT LR
287
// Archivo fuente: VSUBC.C // Funcin nativa con parmetros de tipo carcter // Compilado con: IBM VisualAge(TM) para C++ para Windows(R), Versin 3.5 // Mandato de compilacin: icc /q /ss /ge- /fe vsubc.dll vsubc.c #include <stdio.h> #include <string.h> #include <jni.h> //--------------------------------------------------------------void _Export __stdcall { Java_VCOMPC_proc1c( JNIEnv *je , void *jc, jbyteArray p1)
char
*c1;
printf(" llamada a proc1c satisfactoria.\n"); c1 = (char *) (*je)->GetByteArrayElements( je, p1, NULL); printf(" c1 = \'%c\'\n", c1[0]); } //--------------------------------------------------------------void _Export __stdcall { char char *c4; *c10; Java_VCOMPC_SUB2C( JNIEnv *je , void *jc, jbyteArray p1, jbyteArray p2)
printf(" llamada a SUB2C satisfactoria.\n"); c4 = (char *) (*je)->GetByteArrayElements( je, p1, NULL); c10 = (char *) (*je)->GetByteArrayElements( je, p2, NULL); printf(" c4 = %.4s.\n", c4); printf(" c10 = %.10s.\n", c10); // Ahora cambiamos los valores memcpy( c4, "Gray", 4); memcpy(c10, ">Received<", 10); // Actualizar los valores y devolverlos al llamador Java // Cuarto parm. = 0 tambin hace que se libere el alm. de la variable, // por lo que no puede accederse a ellas tras llamar a esta funcin.
(*je)->ReleaseByteArrayElements( je, p1, (signed char *) c4, 0); (*je)->ReleaseByteArrayElements( je, p2, (signed char *) c10, 0);
288
4S 0
dll('VSUBN')
* Con parmetros Binary(4,0), Binary(9,0) d subb pr dll('VSUBN') d 4B 0 d 9B 0 d d d d z4 p92 b4 b9 s s s s m s *INZSR BEGSR 4S 9P 4B 9B 9 0 2 0 0 0 inz(1234) inz(1234567.89) inz(1234) inz(123456789) style(*info) button(*OK)
d mb1 d rc C C C C
callp subz(z4) callp subp(p92) callp subb(b4:b9) * Visualizar los valores cambiados por las llamadas c z4 dsply mb1 rc c p92 dsply mb1 rc c c c C b4 b9 dsply dsply seton ENDSR mb1 mb1 rc rc lr
* Esta subrutina de accin se enlaza con un evento Create de la ventana. * Hace que el componente finalice tras ejecutar INZSR. C C C CREATE1 BEGACT seton ENDACT LR
289
// Archivo fuente: //
VSUBN.C
// Aadir (d:\jdk12\include;d:\jdk12\include\win32) al valor INCLUDE para // poder encontrar jni.h al compilar. // Compilado con: IBM VisualAge(TM) para C++ para Windows(R), Versin 3.5 // Mandato de compilacin: icc /q /ss /ge- /fe vsubn.dll vsubn.c #include <stdio.h> #include <string.h> #include <jni.h> static void SwapBin2( short *b2); static void SwapBin4( int *b4); //--------------------------------------------------------------void _Export __stdcall { Java_VCOMPN_SUBZ( JNIEnv *je , void *jc, jobject p1)
jclass cls; jmethodID mid; jobject aryobj; char *zd; printf(" llamada a SUBZ satisfactoria.\n"); // p1: con zona // Llamar al mtodo para obtener el valor con zona cls = (*je)->GetObjectClass(je, p1); mid = (*je)->GetMethodID( je, cls, "zonedValue", "()[B"); if ( mid == NULL) { printf(" ERROR: GetMethod.\n"); return; } aryobj = (*je)->CallObjectMethod( je, p1, mid); zd = (char *) (*je)->GetByteArrayElements( je, aryobj, NULL); printf(" zd = %.4s.\n", zd);
290
// Ahora cambiamos los valores memcpy( zd, "9876", 4); // Devolver el parmetro con zona // 1. Actualizar el objeto matriz de bytes con el valor cambiado. (*je)->ReleaseByteArrayElements( je, aryobj, (signed char *) zd, 0); // 2. Preparar la llamada al mtodo desde la clase RpgNumeric que // toma un objeto de matriz de bytes y asigna su valor al // objeto RpgNumeric. Obtener el ID de mtodo. // cls = (*je)->GetObjectClass(je, p1); // (clS) sigue identificando el segundo parmetro. Reutilizar el valor mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); if ( mid == NULL) { printf(" ERROR 2: GetMethod.\n"); return; } (*je)->CallVoidMethod( je, p1, mid, aryobj, (int) 1, // = Component.ZONED_TYPE 0 // precisin );
Como parmetro se pasa un objeto RpgZoned. Se utiliza el mtodo RpgZoned::zonedValue para obtener una matriz de bytes que contiene el valor numrico del objeto en formato decimal con zona. Una vez se obtiene la matriz de bytes en el lado Java de la interfaz, se llama a la funcin GetByteArrayElements de la interfaz JNI para acceder a la matriz de bytes en el lado nativo de la interfaz. Para invocar el mtodo zonedValue en el objeto, se utilizan las funciones GetObjectClass, GetMethodID y CallObjectMethod de la interfaz. Debe tenerse cuidado a la hora de especificar la firma de mtodo correcta en la llamada a GetMethodID. (Sin parmetros, y sin devolver una matriz de bytes en este caso). Para alterar el valor en el lado Java, se cambia el valor de la matriz de bytes, se invoca la funcin ReleaseByteArrayElements de la interfaz para establecer el cambio efectuado en la matriz de bytes en el lado Java y se invoca en el lado Java el mtodo de clase RpgZoned apropiado para establecer el valor del objeto RpgZoned en el valor representado por la matriz de bytes. En este caso, es el mtodo assignFromNative el que acepta una matriz de bytes y dos enteros como parmetros. (La clase RpgNumeric cuya referencia se resuelve en el cdigo de ejemplo es una clase padre de la clase RpgZoned).
291
Numrico empaquetado
void _Export __stdcall { jclass cls; jmethodID mid; jobject aryobj; char *packednum; printf(" llamada a SUBP satisfactoria.\n"); // p1: empaquetado 9,2 // Llamar al mtodo para obtener el valor con zona cls = (*je)->GetObjectClass(je, p1); mid = (*je)->GetMethodID( je, cls, "packedValue", "()[B"); if ( mid == NULL) { printf(" ERROR: GetMethod.\n"); return; } aryobj = (*je)->CallObjectMethod( je, p1, mid); packednum = (char *) (*je)->GetByteArrayElements( je, aryobj, NULL); // Ahora cambiamos los valores memcpy( packednum, "\x98\x76\x54\x32\x1C", 5); Java_VCOMPN_SUBP( JNIEnv *je , void *jc, jobject p1) // P(9,2)
292
// Devolver el parmetro empaquetado // 1. Actualizar el objeto matriz de bytes con el valor cambiado. // Cuarto parm. = 0 tambin hace que se libere el alm. de la variable, // por lo que no puede accederse a ellas tras llamar a esta funcin. (*je)->ReleaseByteArrayElements( je, aryobj, (signed char *) packednum, 0); // 2. Preparar la llamada al mtodo desde la clase RpgNumeric que // toma un objeto de matriz de bytes y asigna su valor al // objeto RpgNumeric. Obtener el ID de mtodo. // cls = (*je)->GetObjectClass(je, p1); // (cls) sigue identificando el segundo parmetro. Reutilizar el valor mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); if ( mid == NULL) { printf(" ERROR 2: GetMethod.\n"); return; } (*je)->CallVoidMethod( je, p1, mid, aryobj, (int) 2, // = Component.PACKED_TYPE 2 // precisin (Nm. de pos. decimales) );
El caso de un parmetro de tipo decimal empaquetado es similar al de decimal con zona. Slo se utilizan los mtodos apropiados para convertir un objeto RpgPacked en un valor de matriz de bytes y viceversa. Se utiliza el mtodo RpgPacked::packedValue para obtener una matriz de bytes que contiene el valor numrico del objeto del parmetro RpgPacked en formato decimal empaquetado nativo y, a continuacin, se invocan las funciones de la interfaz JNI para que la matriz de bytes java sea accesible desde el lado nativo de la interfaz. Tras alterar la matriz de bytes en el lado nativo e invocar la funcin ReleaseByteArrayElements de la interfaz para devolver la matriz de bytes al lado Java, se vuelve a invocar el mtodo assignFromNative para establecer el valor del objeto RpgPacked en la matriz de bytes Java.
293
Binario
void _Export __stdcall { Java_VCOMPN_SUBB( JNIEnv *je , void *jc, jobject p1 // B(4,0) ,jobject p2) // B(9,0)
// Llamar al mtodo para obtener el valor binario cls = (*je)->GetObjectClass(je, p1); mid = (*je)->GetMethodID( je, cls, "binaryValue", "()[B"); if ( mid == NULL) { printf(" ERROR: GetMethod.\n"); return; } aryobj = (*je)->CallObjectMethod( je, p1, mid); binarynum = (char *) (*je)->GetByteArrayElements( je, aryobj, NULL); // Debe invertirse el orden de bytes del valor recibido memcpy( &binary2, binarynum, 2); SwapBin2( &binary2); printf(" binary = %hd\n", (short ) binary2); // p2: binario 9,0 // Llamar al mtodo para obtener el valor binario cls = (*je)->GetObjectClass(je, p2); mid = (*je)->GetMethodID( je, cls, "binaryValue", "()[B"); if ( mid == NULL) { printf(" ERROR: GetMethod.\n"); return; } aryobj2 = (*je)->CallObjectMethod( je, p2, mid); b9 = (char *) (*je)->GetByteArrayElements( je, aryobj2, NULL);
294
// Debe invertirse el orden de bytes del valor recibido memcpy( &binary4, b9, 4); SwapBin4( &binary4); printf(" binary = %d.\n", (int ) binary4 ); // Ahora cambiamos los valores binary2 = 5; // Intercambiarlo de nuevo para devolver el valor Java SwapBin2( &binary2); memcpy( binarynum, &binary2, 2); // Devolver el parmetro // 1. Actualizar el objeto matriz de bytes con el valor cambiado. // Cuarto parm. = 0 tambin hace que se libere el alm. de la variable, // por lo que no puede accederse a ellas tras llamar a esta funcin. (*je)->ReleaseByteArrayElements( je, aryobj, (signed char *) binarynum, 0); // 2. Preparar la llamada al mtodo desde la clase RpgNumeric que // toma un objeto de matriz de bytes y asigna su valor al // objeto RpgNumeric. Obtener el ID de mtodo. cls = (*je)->GetObjectClass(je, p1); // (cls) sigue identificando el segundo parmetro. Reutilizar el valor mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); if ( mid == NULL) { printf(" ERROR 2: GetMethod.\n"); return; } (*je)->CallVoidMethod( je, p1, mid, aryobj, (int) 3, // = Component.BINARY_TYPE 0 // precisin (Nm. de pos. decimales) );
295
// Ahora cambiamos los valores binary4 = 19981999; // Intercambiarlo de nuevo para devolver el valor Java SwapBin4( &binary4); memcpy( b9, &binary4, 4); // Devolver el parmetro // 1. Actualizar el objeto matriz de bytes con el valor cambiado. // Cuarto parm. = 0 tambin hace que se libere el alm. de la variable, // por lo que no puede accederse a ellas tras llamar a esta funcin. (*je)->ReleaseByteArrayElements( je, aryobj2, (signed char *) b9, 0); // 2. Preparar la llamada al mtodo desde la clase RpgNumeric que // toma un objeto de matriz de bytes y asigna su valor al // objeto RpgNumeric. Obtener el ID de mtodo. cls = (*je)->GetObjectClass(je, p2); // (cls) sigue identificando el segundo parmetro. Reutilizar el valor mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); if ( mid == NULL) { printf(" ERROR 2: GetMethod.\n"); return; } (*je)->CallVoidMethod( je, p2, mid, aryobj2, (int) 3, // = Component.BINARY_TYPE 0 // precisin (Nm. de pos. decimales) );
296
//------------------------------------------------------------------static void SwapBin2( short *b2) { char tmp; char *p; p = (char *) b2; tmp = p[0]; p[0] = p[1]; p[1] = tmp; } //------------------------------------------------------------------static void SwapBin4( int *b4) { char tmp; char *p; p = (char *) b4; tmp = p[0]; p[0] = p[3]; p[3] = tmp; tmp = p[1]; p[1] = p[2]; p[2] = tmp;
Este caso es similar al del decimal con zona. Slo se utilizan los mtodos apropiados para los objetos RpgBinary. La nica complicacin aadida es que la plataforma de la arquitectura Intel nativa almacena los enteros binarios en un formato bytes de menor orden a la izquierda, mientras que el lado Java trabaja con un formato bytes de menor orden a la derecha. Se emplean las funciones SwapBin2 y SwapBin4 para invertir el orden de los bytes al convertir los enteros binarios de dos y cuatro bytes de un lado al otro. Se utiliza el mtodo RpgBinary::binaryValue para obtener una matriz de bytes que contiene el valor numrico del objeto del parmetro RpgBinary en formato binario nativo. A continuacin, se invocan las funciones de la interfaz JNI para que la matriz de bytes Java sea accesible desde el lado nativo de la interfaz. Tras alterar la matriz de bytes en el lado nativo e invocar la funcin ReleaseByteArrayElements de la interfaz para devolver la matriz de bytes al lado Java, se vuelve a invocar el mtodo assignFromNative para establecer el valor del objeto RpgBinary en la matriz de bytes Java.
297
298
if ( mid == NULL) { printf(" ERROR: GetMethod.\n"); return; } i4 = (*je)->CallIntMethod( je, p2, mid); printf(" i4 = %d\n", (short) i4); // p3: 2 bytes sin signo. // Llamar al mtodo para obtener el valor doble cls = (*je)->GetObjectClass(je, p3); mid = (*je)->GetMethodID( je, cls, "unsignedValue", "()[B"); if ( mid == NULL) { printf(" ERROR: GetMethod.\n"); } return;
aryobj3 = (*je)->CallObjectMethod( je, p3, mid); u2 = (unsigned short *) (*je)->GetByteArrayElements( je, aryobj3, NULL); // Debe invertirse el orden de bytes del valor recibido SwapBin2( (char *) u2); printf(" u2 = %hu\n", *u2 );
299
// p4: 4 bytes sin signo. // Llamar al mtodo para obtener el valor doble cls = (*je)->GetObjectClass(je, p4); mid = (*je)->GetMethodID( je, cls, "unsignedValue", "()[B"); if ( mid == NULL) { printf(" ERROR: GetMethod.\n"); return; } aryobj4 = (*je)->CallObjectMethod( je, p4, mid); u4 = (unsigned int *) (*je)->GetByteArrayElements( je, aryobj4, NULL); // Debe invertirse el orden de bytes del valor recibido SwapBin4( (char *) u4); printf(" u4 = %u\n", *u4 );
// Ahora cambiamos los valores i2 = 99; i4 = 88; *u2 = 77; *u4 = 66; // Debe invertirse el orden de bytes del valor que se devuelve SwapBin2( (char *) u2); SwapBin4( (char *) u4); // Devolver la memoria de la matriz a Java. Usada posteriormente // para establecer los valores de retorno de los parmetros (*je)->ReleaseByteArrayElements( je, p3, (signed char *) u2, 0); (*je)->ReleaseByteArrayElements( je, p4, (signed char *) u4, 0);
300
// Devolver P1: entero 2 bytes // // // Invocar el mtodo RpgShortRef::setValue para establecer el valor del objeto en un valor de parmetro corto Obtener el ID de mtodo para poder invocarlo.
cls = (*je)->GetObjectClass(je, p1); mid = (*je)->GetMethodID( je, cls, "setValue", "(S)V"); if ( mid == NULL) { printf(" ERROR 5: GetMethod.\n"); return; } (*je)->CallVoidMethod( je, p1, mid, i2); // Devolver P2: entero 4 bytes // // // Invocar el mtodo RpgIntRef::setValue para establecer el valor del objeto en un valor de parmetro entero Obtener el ID de mtodo para poder invocarlo.
cls = (*je)->GetObjectClass(je, p2); mid = (*je)->GetMethodID( je, cls, "setValue", "(I)V"); if ( mid == NULL) { printf(" ERROR 6: GetMethod.\n"); return; } (*je)->CallVoidMethod( je, p2, mid, i4);
301
// Devolver P3: 2 bytes sin signo // // Invocar el mtodo RpgNumeric::assignFromNative para establecer el valor del objeto en un valor de parmetro sin signo
// Obtener el ID de mtodo para poder invocarlo. cls = (*je)->GetObjectClass(je, p3); mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); if ( mid == NULL) { printf(" ERROR 7: GetMethod.\n"); return; } // Pasar (aryobj3) como primer parmetro del mtodo, ya que ste // espera un objeto de matriz de bytes Java (*je)->CallVoidMethod( je, p3, mid, aryobj3, (int) 5, (int) 0); // Devolver P4: 4 bytes sin signo // // // Invocar el mtodo RpgNumeric::assignFromNative para establecer el valor del objeto en un valor de parmetro sin signo Obtener el ID de mtodo para poder invocarlo. // = Component.UNSIGNED_TYPE // 0 posiciones decimales
cls = (*je)->GetObjectClass(je, p4); mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); if ( mid == NULL) { printf(" ERROR 8: GetMethod.\n"); return; } (*je)->CallVoidMethod( je, p4, mid, aryobj4, (int) 5, // = Component.UNSIGNED_TYPE (int) 0); // 0 posiciones decimales }
302
static void SwapBin2( char *p) { char tmp; tmp = p[0]; p[0] = p[1]; } p[1] = tmp;
static void SwapBin4( char *p) { char tmp; tmp = p[0]; p[0] = p[3]; p[3] = tmp; tmp = p[1]; p[1] = p[2]; p[2] = tmp;
Los enteros de 2 bytes utilizan los mtodos RpgShortRef::getValue y setValue para acceder a sus valores en valores cortos en el lado nativo. De forma similar, los enteros de 4 bytes utilizan los mtodos RpgIntRef::getValue y setValue methods para pasar valores enteros de lado nativo. El paso de parmetros sin signo se complica por la falta de una primitiva Java que coincida con un valor sin signo. Al valor del objeto sin signo se accede a travs de primitivas de matriz de bytes. El acceso al parmetro invoca el mtodo para obtener la matriz de bytes que representa el valor sin signo y, a continuacin, invoca la funcin GetByteArrayElements de la interfaz para acceder a los elementos de la matriz en el lado nativo. Es ms, en una plataforma Intel/Windows nativa, el valor del byte primero debe invertirse para convertirlo al formato bytes de orden bajo ms a la izquierda. Al devolver el parmetro se sigue un proceso inverso.
Flotante (4/8)
303
void _Export __stdcall { jclass jmethodID jfloat jdouble cls, cls2; mid; f4; f8;
Java_VJNIO_SUBF(
// p1: Flotante // Llamar al mtodo para obtener el valor flotante cls = (*je)->GetObjectClass(je, p1); mid = (*je)->GetMethodID( je, cls, "getValue", "()F"); if ( mid == NULL) { printf(" ERROR: GetMethod.\n"); } return;
f4 = (*je)->CallFloatMethod( je, p1, mid); printf(" f4 = %f\n", (float) f4); // p2: Doble // Llamar al mtodo para obtener el valor doble cls2 = (*je)->GetObjectClass(je, p2); mid = (*je)->GetMethodID( je, cls2, "getValue", "()D"); if ( mid == NULL) { printf(" ERROR: GetMethod.\n"); return; } f8 = (*je)->CallDoubleMethod( je, p2, mid); printf(" f8 = %lf\n", (double) f8);
304
// Ahora cambiamos los valores f4 = 999.888; f8 = 98789.65456; // Devolver el parmetro flotante // // // Invocar el mtodo desde la clase RpgFloatRef, que asigna un valor de parmetro flotante al objeto Obtener el ID de mtodo para poder invocarlo.
mid = (*je)->GetMethodID( je, cls, "setValue", "(F)V"); if ( mid == NULL) { printf(" ERROR 2: GetMethod.\n"); } return;
(*je)->CallVoidMethod( je, p1, mid, f4); // Devolver el parmetro doble // // // Invocar el mtodo desde la clase RpgDoubleRef, que asigna un valor de parmetro doble al objeto Obtener el ID de mtodo para poder invocarlo.
mid = (*je)->GetMethodID( je, cls2, "setValue", "(D)V"); if ( mid == NULL) { printf(" ERROR 2: GetMethod.\n"); return; } } (*je)->CallVoidMethod( je, p2, mid, f8);
Los casos de parmetros flotante y doble son similares a los de los anteriores tipos de datos. Slo los mtodos para acceder a los valores del parmetro funcionan con los tipos de datos primitivos de Java, que se correlacionan con las correspondientes primitivas nativas, en lugar de las matrices de bytes habituales. Se utilizan las funciones de la interfaz JNI que trabajan con estas primitivas especficas para invocar los mtodos que sirven para acceder a los valores de los parmetros. Se utilizan los mtodos RpgFloatRef::getValue, setValue, RpgDoubleRef::getValue y setValue.
305
subdtz(fd:ft:fts)
printf(" fd = %.10s.\n", fd); printf(" ft = %.8s.\n", ft); printf(" fz = %.26s.\n", fz); // Ahora cambiamos los valores memcpy( fd, "2000-01-01",10); memcpy( ft, "17.00.00", 8); memcpy( fz, "2222-22-22-02.02.02", 19); // Actualizar los valores y devolverlos al llamador Java // Cuarto parm. = 0 tambin hace que se libere el alm. de la variable, // por lo que no puede accederse a ellas tras llamar a esta funcin. (*je)->ReleaseByteArrayElements( je, p1, (signed char *) fd, 0); (*je)->ReleaseByteArrayElements( je, p2, (signed char *) ft, 0); (*je)->ReleaseByteArrayElements( je, p3, (signed char *) fz, 0); }
Los parmetros de fecha, hora e indicacin de la hora funcionan del mismo modo que los parmetros de tipo carcter, ya que en el lado Java se implementan como matrices de bytes.
Paso de matrices
El manejo de matrices de parmetros se realiza de dos modos, en funcin del tipo de datos. Debe invocarse la funcin GetObjectArrayElement de la interfaz para obtener la direccin de un elemento de objeto individual de la matriz y, a continuacin, procesarlo del mismo modo que los mtodos de parmetros escalares. En el caso de una matriz de primitivas Java, existen funciones especficas de la interfaz para acceder a ellas como matrices de primitivas nativas y, a
306
s s s pr pr
dll('VSUBA') 4S 0 dim(4) dll('VSUBA') 9P 2 dim(4) dll('VSUBA') 4B 0 dim(4) 9B 0 dim(4) 4S 9P 4B 9B 0 2 0 0 dim(4) dim(4) dim(4) dim(4) dll('VSUBA') 4f 8f dim(4) dim(4)
s s s s pr
d subf d d
307
pr
10d 8t 26z
pr
s s s s s s s s s *INZSR BEGSR callp callp callp callp callp callp callp seton ENDSR
4f 8f 10d 8t 26z
5i 0 dim(4) inz(1) 10i 0 dim(4) inz(2) 5u 0 dim(4) inz(3) 10u 0 dim(4) inz(4)
308
// Archivo fuente: VSUBA.C // Funcin nativa con parmetros de tipo carcter // Aadir (d:\jdk12\include;d:\jdk12\include\win32) al valor INCLUDE para // poder encontrar jni.h al compilar. // Compilado con: IBM VisualAge(TM) para C++ para Windows(R), Versin 3.5 // Mandato de compilacin: icc /q /ss /ge- /fe vsuba.dll vsuba.c #include <stdio.h> #include <string.h> #include <jni.h> static void SwapBin2( char *); static void SwapBin4( char *); void _Export __stdcall { Java_VJNIA_SUBCA( JNIEnv *je , void *jc, jbyteArray p1, jobjectArray p2) char *c4; char *c10; jobject p2e; // Resolver el segundo elemento del parmetro de matriz p2e = (*je)->GetObjectArrayElement( je, p2, 1); /* nd. matriz 1er elem. = 0. c4 = (char *) (*je)->GetByteArrayElements( je, p1, NULL); c10 = (char *) (*je)->GetByteArrayElements( je, p2e, NULL); printf(" c4 = %.4s.\n", c4);
*/
printf(" c10 = %.10s.\n", c10); // Ahora cambiamos los valores memcpy( c4, "Gray", 4); memcpy(c10, "Changed ", 10); // Actualizar los valores y devolverlos al llamador Java (*je)->ReleaseByteArrayElements( je, p1, (signed char *) c4, 0); (*je)->ReleaseByteArrayElements( je, p2e, (signed char *) c10, 0); Java_VJNIA_SUBZ( JNIEnv *je , void *jc, jobject p1)
309
jclass cls; jmethodID mid; jobject aryobj; char *zd; jobject pe; // Resolver el elemento del parmetro de matriz pe = (*je)->GetObjectArrayElement( je, p1, 0); /* nd. matriz 1er elem. = 0. // p1: con zona // Llamar al mtodo para obtener el valor con zona cls = (*je)->GetObjectClass(je, pe); mid = (*je)->GetMethodID( je, cls, "zonedValue", "()[B"); aryobj = (*je)->CallObjectMethod( je, pe, mid); zd = (char *) (*je)->GetByteArrayElements( je, aryobj, NULL); printf(" zd = %.4s.\n", zd); // Ahora cambiamos los valores memcpy( zd, "9876", 4); // Devolver el parmetro con zona // 1. Actualizar el objeto matriz de bytes con el valor cambiado. (*je)->ReleaseByteArrayElements( je, aryobj, (signed char *) zd, 0);
*/
310
// 2. Preparar la llamada al mtodo desde la clase RpgNumeric que // // toma un objeto de matriz de bytes y asigna su valor al objeto RpgNumeric. Obtener el ID de mtodo.
// cls = (*je)->GetObjectClass(je, p1); // (clS) sigue identificando el segundo parmetro. Reutilizar el valor mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); (*je)->CallVoidMethod( je, pe, mid, aryobj, (int) 1, // = Component.ZONED_TYPE 0 // precisin } void _Export __stdcall { ); Java_VJNIA_SUBP( JNIEnv *je , void *jc, jobject p1 // P(9,2) )
jclass cls; jmethodID mid; jobject aryobj; char *packednum; char tmp[80]; jobject pe;
// Para rastreo
// Resolver el elemento del parmetro de matriz pe = (*je)->GetObjectArrayElement( je, p1, 1); /* nd. matriz 1er elem. = 0. */
// p1: empaquetado 9,2 // Llamar al mtodo para obtener el valor con zona cls = (*je)->GetObjectClass(je, pe); mid = (*je)->GetMethodID( je, cls, "packedValue", "()[B"); aryobj = (*je)->CallObjectMethod( je, pe, mid); packednum = (char *) (*je)->GetByteArrayElements( je, aryobj, NULL);
311
// Ahora cambiamos los valores memcpy( packednum, "\x98\x76\x54\x32\x1C", 5); // Devolver el parmetro empaquetado // 1. Actualizar el objeto matriz de bytes con el valor cambiado. // Cuarto parm. = 0 tambin hace que se libere el alm. de la variable, // por lo que no puede accederse a ellas tras llamar a esta funcin. (*je)->ReleaseByteArrayElements( je, aryobj, (signed char *) packednum, 0); // 2. Preparar la llamada al mtodo desde la clase RpgNumeric que // toma un objeto de matriz de bytes y asigna su valor al // objeto RpgNumeric. Obtener el ID de mtodo.
// cls = (*je)->GetObjectClass(je, p1); // (clS) sigue identificando el segundo parmetro. Reutilizar el valor mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); (*je)->CallVoidMethod( je, pe, mid, aryobj, (int) 2, // = Component.PACKED_TYPE 2 // precisin (Nm. de pos. decimales) ); } //---------------------------------------------------------------
312
jclass cls; jmethodID mid; jobject aryobj; jobject aryobj2; char *binarynum; char *b9; short int jobject binary2; binary4; pe,p2e;
// Resolver el elemento del parmetro de matriz pe = (*je)->GetObjectArrayElement( je, p1, 2); /* nd. matriz 1er elem. = 0. // Resolver el elemento del parmetro de matriz p2e = (*je)->GetObjectArrayElement( je, p2, 3); /* nd. matriz 1er elem. = 0. // p1: binario 4,0 */ */
// Llamar al mtodo para obtener el valor binario cls = (*je)->GetObjectClass(je, pe); mid = (*je)->GetMethodID( je, cls, "binaryValue", "()[B"); aryobj = (*je)->CallObjectMethod( je, pe, mid); binarynum = (char *) (*je)->GetByteArrayElements( je, aryobj, NULL);
313
// Debe invertirse el orden de bytes del valor recibido memcpy( &binary2, binarynum, 2); SwapBin2( (char *) &binary2); printf(" binary = %hd\n", (short ) binary2); // p2: binario 9,0 // Llamar al mtodo para obtener el valor binario cls = (*je)->GetObjectClass(je, p2e); mid = (*je)->GetMethodID( je, cls, "binaryValue", "()[B"); aryobj2 = (*je)->CallObjectMethod( je, p2e, mid); b9 = (char *) (*je)->GetByteArrayElements( je, aryobj2, NULL); // Debe invertirse el orden de bytes del valor recibido memcpy( &binary4, b9, 4); SwapBin4( (char *) &binary4); printf(" binary = %d.\n", (int ) binary4 ); // Ahora cambiamos los valores binary2 = 5; // Intercambiarlo de nuevo para devolver el valor Java SwapBin2( (char *) &binary2);
314
memcpy( binarynum, &binary2, 2); // Devolver el parmetro empaquetado // 1. Actualizar el objeto matriz de bytes con el valor cambiado. // Cuarto parm. = 0 tambin hace que se libere el alm. de la variable, // por lo que no puede accederse a ellas tras llamar a esta funcin. (*je)->ReleaseByteArrayElements( je, aryobj, (signed char *) binarynum, 0); // 2. Preparar la llamada al mtodo desde la clase RpgNumeric que // toma un objeto de matriz de bytes y asigna su valor al // objeto RpgNumeric. Obtener el ID de mtodo. cls = (*je)->GetObjectClass(je, pe); // (clS) sigue identificando el segundo parmetro. Reutilizar el valor mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); (*je)->CallVoidMethod( je, pe, mid, aryobj, (int) 3, // = Component.BINARY_TYPE 0 // precisin (Nm. de pos. decimales) ); // Ahora cambiamos los valores binary4 = 19981999; // Intercambiarlo de nuevo para devolver el valor Java SwapBin4( (char *) &binary4); memcpy( b9, &binary4, 4);
315
// Devolver el parmetro empaquetado // 1. Actualizar el objeto matriz de bytes con el valor cambiado. // Cuarto parm. = 0 tambin hace que se libere el alm. de la variable, // por lo que no puede accederse a ellas tras llamar a esta funcin. (*je)->ReleaseByteArrayElements( je, aryobj2, (signed char *) b9, 0); // 2. Preparar la llamada al mtodo desde la clase RpgNumeric que // toma un objeto de matriz de bytes y asigna su valor al // objeto RpgNumeric. Obtener el ID de mtodo.
cls = (*je)->GetObjectClass(je, p2e); // (clS) sigue identificando el segundo parmetro. Reutilizar el valor mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); (*je)->CallVoidMethod( je, p2e, mid, aryobj2, (int) 3, // = Component.BINARY_TYPE 0 // precisin (Nm. de pos. decimales) } );
//---------------------------------------------------------------
316
void _Export __stdcall { jclass jmethodID jfloat jdouble jobject cls, cls2; mid; *f4; *f8; p1e,p2e;
Java_VJNIA_SUBF(
printf(" llamada a SUBF satisfactoria.\n"); f4 f8 = = (*je)->GetFloatArrayElements( je, p1, NULL); (*je)->GetDoubleArrayElements( je, p2, NULL);
printf(" f4 = %f\n", (float) f4[0]); // p2: Doble // Llamar al mtodo para obtener el valor doble printf(" f8 = %lf\n", (double) f8[0]); // Ahora cambiamos los valores f4[0] = 999.888; f8[1] = 98789.65456; // Devolver el parmetro flotante (*je)->ReleaseFloatArrayElements( je, p1, f4, 0); (*je)->ReleaseDoubleArrayElements( je, p2, f8, 0); }
317
//--------------------------------------------------------------void _Export __stdcall Java_VJNIA_SUBDTZ( JNIEnv *je , void *jc, jbyteArray p1, jbyteArray p2, jbyteArray p3) { char *fd, *ft, *fz; jobject p1e, p2e, p3e; printf(" llamada a SUBDTZ satisfactoria.\n"); // Resolver el elemento del parmetro de matriz p1e = (*je)->GetObjectArrayElement( je, p1, 2); /* nd. matriz 1er elem. = 0. p2e = (*je)->GetObjectArrayElement( je, p2, 3); /* nd. matriz 1er elem. = 0. p3e = (*je)->GetObjectArrayElement( je, p3, 0); /* nd. matriz 1er elem. = 0. fd ft fz = (char *) (*je)->GetByteArrayElements( je, p1e, NULL); = (char *) (*je)->GetByteArrayElements( je, p2e, NULL); = (char *) (*je)->GetByteArrayElements( je, p3e, NULL); */
*/ */
printf(" fd = %.10s.\n", fd); printf(" ft = %.8s.\n", ft); printf(" fz = %.26s.\n", fz); // Ahora cambiamos los valores memcpy( fd, "2000-01-01",10); memcpy( ft, "17.00.00", 8); memcpy( fz, "2222-22-22-02.02.02", 19); // Actualizar los valores y devolverlos al llamador Java (*je)->ReleaseByteArrayElements( je, p1e, (signed char *) fd, 0); (*je)->ReleaseByteArrayElements( je, p2e, (signed char *) ft, 0); (*je)->ReleaseByteArrayElements( je, p3e, (signed char *) fz, 0); }
318
//--------------------------------------------------------------void _Export __stdcall Java_VJNIA_SUBIU( JNIEnv *je , void *jc, jshortArray p1, jintArray p2, jobject p3, jobject p4) { jclass cls, cls2; jmethodID mid; jshort *i2; jint *i4; jobject aryobj3, aryobj4; unsigned short *u2; unsigned int *u4; jobject p1e, p2e, p3e, p4e; printf(" llamada a SUBIU satisfactoria.\n"); // Resolver el elemento del parmetro de matriz i2 i4 = = (*je)->GetShortArrayElements( je, p1, NULL); (*je)->GetIntArrayElements( je, p2, NULL);
p3e = (*je)->GetObjectArrayElement( je, p3, 2); p4e = (*je)->GetObjectArrayElement( je, p4, 3); printf(" i2 = %hd\n", (short) i2[0]); printf(" i4 = %d\n", (short) i4[1]); // p3: 2 bytes sin signo. // Llamar al mtodo para obtener el valor doble cls = (*je)->GetObjectClass(je, p3e); mid = (*je)->GetMethodID( je, cls, "unsignedValue", "()[B"); aryobj3 = (*je)->CallObjectMethod( je, p3e, mid); u2 = (unsigned short *) (*je)->GetByteArrayElements( je, aryobj3, NULL);
319
// Debe invertirse el orden de bytes del valor recibido SwapBin2( (char *) u2); printf(" u2 = %hu\n", *u2 ); // p4: 4 bytes sin signo. // Llamar al mtodo para obtener el valor doble cls = (*je)->GetObjectClass(je, p4e); mid = (*je)->GetMethodID( je, cls, "unsignedValue", "()[B"); aryobj4 = (*je)->CallObjectMethod( je, p4e, mid); u4 = (unsigned int *) (*je)->GetByteArrayElements( je, aryobj4, NULL); // Debe invertirse el orden de bytes del valor recibido SwapBin4( (char *) u4); printf(" u4 = %u\n", *u4 );
320
// Ahora cambiamos los valores i2[0] = 99; i4[1] = 88; *u2 = 77; *u4 = 66; // Debe invertirse el orden de bytes del valor que se devuelve SwapBin2( (char *) u2); SwapBin4( (char *) u4); // Devolver la memoria de la matriz a Java. Usada posteriormente // para establecer los valores de retorno de los parmetros (*je)->ReleaseByteArrayElements( je, p3e, (signed char *) u2, 0); (*je)->ReleaseByteArrayElements( je, p4e, (signed char *) u4, 0); (*je)->ReleaseShortArrayElements( je, p1, i2, 0); (*je)->ReleaseIntArrayElements( je, p2, i4, 0);
// Devolver P3: 2 bytes sin signo // // Invocar el mtodo RpgNumeric::assignFromNative para establecer el valor del objeto en un valor de parmetro sin signo
// Obtener el ID de mtodo para poder invocarlo. cls = (*je)->GetObjectClass(je, p3e); mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); // Pasar (aryobj3) como primer parmetro del mtodo, ya que ste // espera un objeto de matriz de bytes Java (*je)->CallVoidMethod( je, p3e, mid, aryobj3, (int) 5, (int) 0);
321
// Devolver P4: 4 bytes sin signo // // // Invocar el mtodo RpgNumeric::assignFromNative para establecer el valor del objeto en un valor de parmetro sin signo Obtener el ID de mtodo para poder invocarlo.
cls = (*je)->GetObjectClass(je, p4e); mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); (*je)->CallVoidMethod( je, p4e, mid, aryobj4, (int) 5, // = Component.UNSIGNED_TYPE (int) 0); // 0 posiciones decimales
static void SwapBin2( char *p) { char tmp; tmp = p[0]; p[0] = p[1]; p[1] = tmp;
tmp = p[0]; p[0] = p[3]; p[3] = tmp; tmp = p[1]; p[1] = p[2]; p[2] = tmp;
fc = subrc
322
Java_VJNIR_SUBRC(
printf(" llamada a SUBRC satisfactoria.\n"); // Crear un nuevo objeto de matriz de bytes para poder devolverlo. ba = (*je)->NewByteArray( je, 10 /* = longitud matriz bytes */ ); // Pinchar la memoria del elemento de la matriz de bytes para que // el lado nativo pueda acceder a ella. p = (char *) (*je)->GetByteArrayElements( je, ba, NULL); memcpy( p, "Satisfactorio ",10);
// Actualizar los valores y devolverlos al llamador Java // Cuarto parm. = 0 tambin hace que se libere el alm. de la variable, // por lo que no puede accederse a ellas tras llamar a esta funcin. (*je)->ReleaseByteArrayElements( je, ba, (signed char *) p, 0); } return ba;
La devolucin de un valor desde la funcin implica la obtencin del objeto Java apropiado y, despus, devolverlo. En este ejemplo, se crea un objeto nuevo (que coincide con un campo Character(10)) y, a continuacin, se asigna su valor. Ya que los campos de tipo carcter de RPG se implementan como matrices de bytes Java, se crea un objeto de matriz de bytes Java con una longitud de 10, luego se utiliza la funcin GetByteArrayElements de la interfaz para acceder a los elementos de la matriz de bytes en el lado nativo, despus se liberan y se devuelven a Java y, por ltimo, se utilizan para devolverlo desde la funcin. Si el objeto de matriz de bytes Java apropiado ya estaba disponible en uno de los parmetros de entrada, podra haberse utilizado ste en lugar de crear un objeto nuevo.
323
jobject _Export __stdcall { jclass cls; jmethodID mid; jobject rzo; jbyteArray ba; char *p;
printf(" llamada a SUBRS satisfactoria.\n"); // Crear un nuevo objeto RpgZoned. cls = (*je)->FindClass( je, "com/ibm/varpg/rpgruntime/RpgZoned"); mid = (*je)->GetMethodID( je, cls, "<init>", "(II)V"); rzo = (*je)->NewObject( je, cls, mid, (int) 5, /* nm. de dgitos */ ); // // // // // (int) 0 /* nm. de posiciones decimales */
Para establecer el valor del objeto decimal con zona, necesitamos una matriz de bytes Java para utilizarla como parmetro de entrada del mtodo para establecer el objeto decimal con zona. Puede construirse un objeto de matriz de bytes nuevo u obtener uno recuperando el valor decimal con zona del objeto.
// Construir una matriz de bytes. // Crear un objeto de matriz de bytes nuevo ba = (*je)->NewByteArray( je, 5 /* = longitud matriz bytes */ ); // Pinchar la memoria del elemento de la matriz de bytes para que // el lado nativo pueda acceder a ella. p = (char *) (*je)->GetByteArrayElements( je, ba, NULL);
324
// Actualizar los valores y devolverlos al llamador Java // Cuarto parm. = 0 tambin hace que se libere el alm. de la variable, // por lo que no puede accederse a ellas tras llamar a esta funcin. (*je)->ReleaseByteArrayElements( je, ba, (signed char *) p, 0); // Preparar la llamada al mtodo desde la clase RpgNumeric que // // toma un objeto de matriz de bytes y asigna su valor al objeto RpgNumeric. Obtener el ID de mtodo.
// cls = (*je)->GetObjectClass(je, p1); // (cls) sigue identificando el segundo parmetro. Reutilizar el valor mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); (*je)->CallVoidMethod( je, rzo, mid, ba, (int) 1, // = Component.ZONED_TYPE 0 // precisin return rzo; );
Se construye un objeto RpgZoned para poder devolverlo. A continuacin, se establece su valor mediante una llamada a mtodo. Sin embargo, el mtodo para establecer el valor necesita un objeto de matriz de bytes como parmetro de entrada que suministre el valor, por lo que primero se construye el objeto de matriz de bytes. El objeto RpgZoned se construye averiguando la clase, a continuacin, el mtodo constructor de la clase y, por ltimo invocando el mtodo constructor. A continuacin se construye un objeto de matriz de bytes y se establece en un valor de bytes con formato decimal con zona. Luego se resuelve un mtodo para establecer el valor del objeto RpgZoned y se invoca, pasndole el objeto de matriz de bytes como uno de sus parmetros.
325
jobject _Export __stdcall { jclass cls; jmethodID mid; jobject ro; jbyteArray ba; char *p;
printf(" llamada a SUBRP satisfactoria.\n"); // Crear un nuevo objeto RpgPacked. cls = (*je)->FindClass( je, "com/ibm/varpg/rpgruntime/RpgPacked"); mid = (*je)->GetMethodID( je, cls, "<init>", "(II)V"); ro = (*je)->NewObject( je, cls, mid, (int) 5, /* nm. de dgitos */ ); // // // // // (int) 0 /* nm. de posiciones decimales */
Para establecer el valor del objeto decimal empaquetado, necesitamos una matriz de bytes Java para utilizarla como parmetro de entrada del mtodo para establecer el objeto decimal empaquetado. Puede construirse un objeto de matriz de bytes nuevo u obtener uno recuperando el valor decimal empaquetado del objeto.
// Crear un objeto de matriz de bytes nuevo ba = (*je)->NewByteArray( je, 3 /* = longitud matriz bytes */ );
memcpy( p, "\x55\x55\x5C", 3); // Actualizar los valores y devolverlos al llamador Java (*je)->ReleaseByteArrayElements( je, ba, (signed char *) p, 0); // Preparar la llamada al mtodo desde la clase RpgNumeric que // toma un objeto de matriz de bytes y asigna su valor al // objeto RpgNumeric. Obtener el ID de mtodo. mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); (*je)->CallVoidMethod( je, ro, mid, ba, // El objeto de matriz de bytes (int) 2, // = Component.PACKED_TYPE 0 // posiciones decimales ); return ro;
326
La devolucin de un valor decimal empaquetado es similar al caso de un valor decimal con zona ilustrado ms arriba. El objeto RpgPacked se construye averiguando la clase, a continuacin, el mtodo constructor de la clase y, por ltimo invocando el mtodo constructor. A continuacin se construye un objeto de matriz de bytes y se establece en un valor de bytes con formato decimal empaquetado. Luego se resuelve un mtodo para establecer el valor del objeto RpgPacked y se invoca, pasndole el objeto de matriz de bytes como uno de sus parmetros.
d subrb d fb C
pr s eval
5b 0 dll('VSUBR') 5b 0 fb = subrb
327
// Para establecer el valor del objeto, necesitamos // una matriz de bytes Java para utilizarla como parmetro de entrada // del mtodo para establecer el objeto. // Crear un objeto de matriz de bytes nuevo ba = (*je)->NewByteArray( je, 4 /* = longitud matriz bytes */ ); // Pinchar la memoria del elemento de la matriz de bytes para que // el lado nativo pueda acceder a ella. p = (char *) (*je)->GetByteArrayElements( je, ba, NULL); // 55555 = 0xD903
// Actualizar los valores y devolverlos al llamador Java (*je)->ReleaseByteArrayElements( je, ba, (signed char *) p, 0); // Preparar la llamada al mtodo desde la clase RpgNumeric que // toma un objeto de matriz de bytes y asigna su valor al // objeto RpgNumeric. Obtener el ID de mtodo. mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); (*je)->CallVoidMethod( je, ro, mid, ba, // El objeto de matriz de bytes (int) 3, // = Component.Binary_TYPE 0 // posiciones decimales ); return ro;
La devolucin de un valor binario es similar a la de los casos anteriores para los decimales con zona y empaquetados, slo que se devuelve un objeto RpgBinary.
328
jshort _Export __stdcall { jshort rc; rc = -5555; return rc; } jint _Export __stdcall { return -55555; }
La devolucin de un valor entero binario de 2 o 4 bytes es sencilla. Esto se debe a que los tipos se soportan como primitivas Java.
d subru d fu C
pr s eval
329
jobject _Export __stdcall { jclass cls; jmethodID mid; jobject ro; jbyteArray ba; char *p;
printf(" llamada a SUBRU satisfactoria.\n"); // Crear un nuevo objeto RpgUnsigned. cls = (*je)->FindClass( je, "com/ibm/varpg/rpgruntime/RpgUnsigned"); mid = (*je)->GetMethodID( je, cls, "<init>", "(II)V"); ro = (*je)->NewObject( je, cls, mid, (int) 5, /* nm. de dgitos */ ); (int) 0 /* nm. de posiciones decimales */
// Para establecer el valor del objeto, necesitamos // una matriz de bytes Java para utilizarla como parmetro de entrada // del mtodo para establecer el objeto. // Crear un objeto de matriz de bytes nuevo ba = (*je)->NewByteArray( je, 4 /* = longitud matriz bytes */ ); // Pinchar la memoria del elemento de la matriz de bytes para que // el lado nativo pueda acceder a ella. p = (char *) (*je)->GetByteArrayElements( je, ba, NULL); // 55555 = 0xD903
330
La devolucin de un valor binario sin signo es similar a la de los casos anteriores para los decimales con zona y empaquetados, slo que se utiliza un objeto RpgUnsigned.
// Crear un nuevo objeto de matriz de bytes para poder devolverlo. ba = (*je)->NewByteArray( je, 10 /* = longitud matriz bytes */ ); // Pinchar la memoria del elemento de la matriz de bytes para que // el lado nativo pueda acceder a ella. p = (char *) (*je)->GetByteArrayElements( je, ba, NULL);
memcpy( p, "2000-01-01",10); // Actualizar los valores y devolverlos al llamador Java (*je)->ReleaseByteArrayElements( je, ba, (signed char *) p, 0); } return ba;
Los valores de fecha, hora e indicacin de la hora se devuelven como matrices de bytes Java con la longitud esperada. Es similar a los datos de tipo carcter.
331
La devolucin de un valor de tipo flotante o doble (flotante de 8 bytes) se realiza directamente. Esto se debe a que los tipos se soportan como primitivas Java.
// Devolver una matriz de bytes de la longitud de datos actual // Crear un nuevo objeto de matriz de bytes para poder devolverlo. ba = (*je)->NewByteArray( je, 4 /* = longitud matriz bytes */ ); // Pinchar la memoria del elemento de la matriz de bytes para que // el lado nativo pueda acceder a ella. p = (char *) (*je)->GetByteArrayElements( je, ba, NULL);
memcpy( p, "abcd",4); // Actualizar los valores y devolverlos al llamador Java (*je)->ReleaseByteArrayElements( je, ba, (signed char *) p, 0); } return ba;
Un valor de tipo carcter de longitud variable se devuelve mediante una matriz de bytes Java, en la que la longitud de la matriz coincide con la longitud del valor actual.
332
10 dim(4) 5s 0 dim(4) 5p 0 dim(4) 5b 0 dim(4) 5i 0 dim(4) 10i 0 dim(4) 10u 0 dim(4) 10d dim(4) 4f dim(4) 8f dim(4) 10 varying dim(4) 9 0 style(*info) button(*OK)
d mb1 d rc
333
C C c C c C c C c C c C c C c C c C c C c C c C c c C
BEGSR eval dsply eval dsply eval dsply eval dsply eval dsply eval dsply eval dsply eval dsply eval fc = subrca mb1 fs = subrsa mb1 fp = subrpa mb1 fb = subrba mb1 rc rc rc rc
fi2= subri2a mb1 rc fi4= subri4a mb1 rc fu = subrua mb1 fd = subrda mb1 ff = subrfa mb1 rc rc rc
lr
334
// Archivo fuente: //
VSUBRA.C
// Aadir (d:\jdk12\include;d:\jdk12\include\win32) al valor INCLUDE para // poder encontrar jni.h al compilar. // Compilado con: IBM VisualAge(TM) para C++ para Windows(R), Versin 3.5 // Mandato de compilacin: icc /q /ss /ge- /fe vsubra.dll vsubra.c #include <stdio.h> #include <string.h> #include <jni.h> static void SwapBin2( char *); static void SwapBin4( char *); //--------------------------------------------------------------jobjectArray _Export __stdcall { jobjectArray oa; jclass cls; jbyteArray ba; char *p; int i; Java_VJNIRA_SUBRCA( JNIEnv *je , void *jc)
printf(" llamada a SUBRCA satisfactoria.\n"); // Crear el objeto matriz cls = (*je)->FindClass( je, "java/lang/Object"); if ( cls == NULL) { printf(" ERROR 1: FindClass.\n"); return NULL;
335
oa = (*je)->NewObjectArray( je, 4 /* longitud matriz */, cls, NULL ); if ( oa == NULL) { printf(" ERROR 2: Newobj\n"); return NULL; } // Poblar la matriz for (i=0; i<4; i++) { // Crear un nuevo objeto de matriz de bytes para poder devolverlo. ba = (*je)->NewByteArray( je, 10 /* = longitud matriz bytes */ ); // Establecer el valor del segundo elemento if ( 1 == i) { // Pinchar la memoria del elemento de la matriz de bytes para que // el lado nativo pueda acceder a ella. p = (char *) (*je)->GetByteArrayElements( je, ba, NULL); ",10);
memcpy( p, "Satisfactorio
// Actualizar los valores y devolverlos al llamador Java // Cuarto parm. = 0 tambin hace que se libere el alm. de la variable, // por lo que no puede accederse a ellas tras llamar a esta funcin. (*je)->ReleaseByteArrayElements( je, ba, (signed char *) p, 0); }
(*je)->SetObjectArrayElement( je, oa, i /* elemento matriz, empieza en 0 */ , ba); } // for i return oa; } //---------------------------------------------------------------
336
jobjectArray _Export __stdcall { jobjectArray oa; int i; jclass cls; jmethodID mid; jobject rzo; jbyteArray ba; char *p;
printf(" llamada a SUBRSA satisfactoria.\n"); // Crear el objeto matriz cls = (*je)->FindClass( je, "com/ibm/varpg/rpgruntime/RpgZoned"); if ( cls == NULL) { printf(" ERROR 1: FindClass.\n"); return NULL; } oa = (*je)->NewObjectArray( je, 4 /* longitud matriz */, cls, NULL ); if ( oa == NULL) { printf(" ERROR 2: Newobj\n"); return NULL; } // Poblar la matriz for (i=0; i<4; i++) { // Crear un nuevo objeto RpgZoned. cls = (*je)->FindClass( je, "com/ibm/varpg/rpgruntime/RpgZoned"); if ( cls == NULL) { printf(" ERROR 1: FindClass.\n"); return NULL; }
337
mid = (*je)->GetMethodID( je, cls, "<init>", "(II)V"); if ( mid == NULL) { printf(" ERROR: GetMethod.\n"); return NULL; } rzo = (*je)->NewObject( je, cls, mid, (int) 5, /* nm. de dgitos */ (int) 0 ); if ( rzo == NULL) { printf(" ERROR3: \n"); return NULL; } // Establecer el valor del segundo elemento if ( 1 == i) { // // // // Para establecer el valor del objeto decimal con zona, necesitamos una matriz de bytes Java para utilizarla como parmetro de entrada del mtodo para establecer el objeto decimal con zona. Puede construirse un objeto de matriz de bytes nuevo u obtener uno /* nm. de posiciones decimales */
// recuperando el valor decimal con zona del objeto. // Construir una matriz de bytes. // Crear un objeto de matriz de bytes nuevo ba = (*je)->NewByteArray( je, 5 /* = longitud matriz bytes */ ); if ( ba == NULL) { printf(" ERROR4: \n"); return NULL; }
338
// Pinchar la memoria del elemento de la matriz de bytes para que // el lado nativo pueda acceder a ella. p = (char *) (*je)->GetByteArrayElements( je, ba, NULL);
// Actualizar los valores y devolverlos al llamador Java // Cuarto parm. = 0 tambin hace que se libere el alm. de la variable, // por lo que no puede accederse a ellas tras llamar a esta funcin. (*je)->ReleaseByteArrayElements( je, ba, (signed char *) p, 0);
// Preparar la llamada al mtodo desde la clase RpgNumeric que // toma un objeto de matriz de bytes y asigna su valor al // objeto RpgNumeric. Obtener el ID de mtodo. // cls = (*je)->GetObjectClass(je, p1); // (clS) sigue identificando el segundo parmetro. Reutilizar el valor mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); if ( mid == NULL) { printf(" ERROR 2: GetMethod.\n"); return NULL; } (*je)->CallVoidMethod( je, rzo, mid, ba, (int) 1, // = Component.ZONED_TYPE 0 // precisin ); }
339
(*je)->SetObjectArrayElement( je, oa, i /* elemento matriz, empieza en 0 */ , rzo); } // for i return oa; } //--------------------------------------------------------------jobjectArray _Export __stdcall { jobjectArray oa; int i; jclass cls; jmethodID mid; jobject ro; jbyteArray ba; char *p; printf(" llamada a SUBRPA satisfactoria.\n"); // Crear el objeto matriz cls = (*je)->FindClass( je, "com/ibm/varpg/rpgruntime/RpgPacked"); if ( cls == NULL) { printf(" ERROR 1: FindClass.\n"); return NULL; } oa = (*je)->NewObjectArray( je, 4 /* longitud matriz */, cls, NULL ); if ( oa == NULL) { printf(" ERROR 2: Newobj\n"); return NULL; } // Poblar la matriz for (i=0; i<4; i++) { Java_VJNIRA_SUBRPA( JNIEnv *je , void *jc)
340
// Crear un nuevo objeto RpgPacked. #if 0 cls = (*je)->FindClass( je, "com/ibm/varpg/rpgruntime/RpgPacked"); if ( cls == NULL) { printf(" ERROR 1: FindClass.\n"); return NULL; } #endif mid = (*je)->GetMethodID( je, cls, "<init>", "(II)V"); if ( mid == NULL) { printf(" ERROR: GetMethod.\n"); return NULL; } ro = (*je)->NewObject( je, cls, mid, (int) 5, /* nm. de dgitos */ (int) 0 /* nm. de posiciones decimales */
);
if ( ro == NULL) { printf(" ERROR3: \n"); return NULL; } // Establecer el valor del segundo elemento if ( 1 == i) { // // // // Para establecer el valor del objeto decimal empaquetado, necesitamos una matriz de bytes Java para utilizarla como parmetro de entrada del mtodo para establecer el objeto decimal empaquetado. Puede construirse un objeto de matriz de bytes nuevo u obtener uno
// recuperando el valor decimal empaquetado del objeto. // Construir una matriz de bytes.
341
// Crear un objeto de matriz de bytes nuevo ba = (*je)->NewByteArray( je, 3 /* = longitud matriz bytes */ ); if ( ba == NULL) { printf(" ERROR4: \n"); return NULL; } // Pinchar la memoria del elemento de la matriz de bytes para que // el lado nativo pueda acceder a ella. p = (char *) (*je)->GetByteArrayElements( je, ba, NULL);
// Actualizar los valores y devolverlos al llamador Java // Cuarto parm. = 0 tambin hace que se libere el alm. de la variable, // por lo que no puede accederse a ellas tras llamar a esta funcin. (*je)->ReleaseByteArrayElements( je, ba, (signed char *) p, 0);
// Preparar la llamada al mtodo desde la clase RpgNumeric que // toma un objeto de matriz de bytes y asigna su valor al // objeto RpgNumeric. Obtener el ID de mtodo. // cls = (*je)->GetObjectClass(je, p1); // (clS) sigue identificando el segundo parmetro. Reutilizar el valor mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); if ( mid == NULL) { printf(" ERROR 2: GetMethod.\n"); return NULL; }
342
(*je)->CallVoidMethod( je, ro, mid, ba, // El objeto de matriz de bytes (int) 2, // = Component.PACKED_TYPE ); } (*je)->SetObjectArrayElement( je, oa, i /* elemento matriz, empieza en 0 */ , ro); } // for i return oa; } //--------------------------------------------------------------jobjectArray _Export __stdcall { jobjectArray oa; int i; jclass cls; jmethodID jobject mid; ro; Java_VJNIRA_SUBRBA( JNIEnv *je , void *jc) 0 // posiciones decimales
jbyteArray ba; char *p; printf(" llamada a SUBRBA satisfactoria.\n"); // Crear el objeto matriz cls = (*je)->FindClass( je, "com/ibm/varpg/rpgruntime/RpgBinary"); if ( cls == NULL) { printf(" ERROR 1: FindClass.\n"); return NULL; }
343
oa = (*je)->NewObjectArray( je, 4 /* longitud matriz */, cls, NULL ); if ( oa == NULL) { printf(" ERROR 2: Newobj\n"); } return NULL;
// Poblar la matriz for (i=0; i<4; i++) { // Crear un nuevo objeto RpgPacked. #if 0 cls = (*je)->FindClass( je, "com/ibm/varpg/rpgruntime/RpgBinary"); if ( cls == NULL) { printf(" ERROR 1: FindClass.\n"); return NULL; } #endif mid = (*je)->GetMethodID( je, cls, "<init>", "(II)V"); if ( mid == NULL) { printf(" ERROR: GetMethod.\n"); return NULL; } ro = (*je)->NewObject( je, cls, mid, (int) 5, /* nm. de dgitos */ (int) 0 /* nm. de posiciones decimales */ );
344
if ( ro == NULL) { printf(" ERROR3: \n"); return NULL; } // Establecer el valor del segundo elemento if ( 1 == i) { // Para establecer el valor del objeto decimal empaquetado, necesitamos // una matriz de bytes Java para utilizarla como parmetro de entrada // del mtodo para establecer el objeto decimal empaquetado. // Puede construirse un objeto de matriz de bytes nuevo u obtener uno // recuperando el valor decimal empaquetado del objeto. // Construir una matriz de bytes. // Crear un objeto de matriz de bytes nuevo ba = (*je)->NewByteArray( je, 4 /* = longitud matriz bytes */ ); if ( ba == NULL) { printf(" ERROR4: \n"); return NULL; } // Pinchar la memoria del elemento de la matriz de bytes para que // el lado nativo pueda acceder a ella. p = (char *) (*je)->GetByteArrayElements( je, ba, NULL); // 55555 = 0xD903
// Actualizar los valores y devolverlos al llamador Java // Cuarto parm. = 0 tambin hace que se libere el alm. de la variable, // por lo que no puede accederse a ellas tras llamar a esta funcin. (*je)->ReleaseByteArrayElements( je, ba, (signed char *) p, 0);
345
// Preparar la llamada al mtodo desde la clase RpgNumeric que // toma un objeto de matriz de bytes y asigna su valor al // objeto RpgNumeric. Obtener el ID de mtodo.
// cls = (*je)->GetObjectClass(je, p1); // (clS) sigue identificando el segundo parmetro. Reutilizar el valor mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); if ( mid == NULL) { printf(" ERROR 2: GetMethod.\n"); return NULL; } (*je)->CallVoidMethod( je, ro, mid, ba, // El objeto de matriz de bytes (int) 3, // = Component.Binary_TYPE ); } (*je)->SetObjectArrayElement( je, oa, i /* elemento matriz, empieza en 0 */ , ro); } // for i } return oa; 0 // posiciones decimales
346
//--------------------------------------------------------------jshortArray _Export __stdcall { jshortArray rc; jshort *n; Java_VJNIRA_SUBRI2A( JNIEnv *je , void *jc)
printf(" llamada a SUBRI2A satisfactoria.\n"); rc = (*je)->NewShortArray( je, 4 /* = longitud matriz */ ); // Pinchar la memoria del elemento de la matriz para que // el lado nativo pueda acceder a ella. n = (*je)->GetShortArrayElements( je, rc, NULL);
n[1] = -5555; // Actualizar los valores y devolverlos al llamador Java (*je)->ReleaseShortArrayElements( je, rc, n, 0); return rc; } //--------------------------------------------------------------jintArray _Export __stdcall Java_VJNIRA_SUBRI4A( JNIEnv *je , void *jc) { jintArray rc; jint *n; printf(" llamada a SUBRI4A satisfactoria.\n"); rc = (*je)->NewIntArray( je, 4 /* = longitud matriz */ ); // Pinchar la memoria del elemento de la matriz para que // el lado nativo pueda acceder a ella. n = (*je)->GetIntArrayElements( je, rc, NULL);
n[1] = -5555; // Actualizar los valores y devolverlos al llamador Java (*je)->ReleaseIntArrayElements( je, rc, n, 0); return rc;
347
//--------------------------------------------------------------jobjectArray _Export __stdcall { jobjectArray oa; int i; jclass cls; jmethodID mid; jobject ro; jbyteArray ba; char *p; printf(" llamada a SUBRUA satisfactoria.\n"); // Crear el objeto matriz cls = (*je)->FindClass( je, "com/ibm/varpg/rpgruntime/RpgUnsigned"); if ( cls == NULL) { printf(" ERROR 1: FindClass.\n"); return NULL; } oa = (*je)->NewObjectArray( je, 4 /* longitud matriz */, cls, NULL ); if ( oa == NULL) { printf(" ERROR 2: Newobj\n"); return NULL; } // Poblar la matriz for (i=0; i<4; i++) { // Crear un nuevo objeto RpgPacked. #if 0 cls = (*je)->FindClass( je, "com/ibm/varpg/rpgruntime/RpgUnsigned"); if ( cls == NULL) { printf(" ERROR 1: FindClass.\n"); return NULL; Java_VJNIRA_SUBRUA( JNIEnv *je , void *jc)
} #endif
348
mid = (*je)->GetMethodID( je, cls, "<init>", "(II)V"); if ( mid == NULL) { printf(" ERROR: GetMethod.\n"); return NULL; } ro = (*je)->NewObject( je, cls, mid, (int) 5, /* nm. de dgitos */ (int) 0 /* nm. de posiciones decimales */ ); if ( ro == NULL) { } printf(" ERROR3: \n"); return NULL;
// Establecer el valor del segundo elemento if ( 1 == i) { // // // // // Para establecer el valor del objeto decimal empaquetado, necesitamos una matriz de bytes Java para utilizarla como parmetro de entrada del mtodo para establecer el objeto decimal empaquetado. Puede construirse un objeto de matriz de bytes nuevo u obtener uno recuperando el valor decimal empaquetado del objeto.
349
// Crear un objeto de matriz de bytes nuevo ba = (*je)->NewByteArray( je, 4 /* = longitud matriz bytes */ ); if ( ba == NULL) { printf(" ERROR4: \n"); return NULL; } // Pinchar la memoria del elemento de la matriz de bytes para que // el lado nativo pueda acceder a ella. p = (char *) (*je)->GetByteArrayElements( je, ba, NULL); // 55555 = 0xD903
// Actualizar los valores y devolverlos al llamador Java // Cuarto parm. = 0 tambin hace que se libere el alm. de la variable, // por lo que no puede accederse a ellas tras llamar a esta funcin. (*je)->ReleaseByteArrayElements( je, ba, (signed char *) p, 0);
350
// Preparar la llamada al mtodo desde la clase RpgNumeric que // toma un objeto de matriz de bytes y asigna su valor al // objeto RpgNumeric. Obtener el ID de mtodo. // cls = (*je)->GetObjectClass(je, p1); // (clS) sigue identificando el segundo parmetro. Reutilizar el valor mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); if ( mid == NULL) { printf(" ERROR 2: GetMethod.\n"); return NULL; } (*je)->CallVoidMethod( je, ro, mid, ba, // El objeto de matriz de bytes (int) 5, // = Component.UNSIGNED_TYPE 0 // posiciones decimales ); } (*je)->SetObjectArrayElement( je, oa, i /* elemento matriz, empieza en 0 */ } // for i , ro);
351
jobjectArray _Export __stdcall { jobjectArray oa; jclass cls; jbyteArray ba; char *p; int i;
Java_VJNIRA_SUBRDA(
printf(" llamada a SUBRD satisfactoria.\n"); // Crear el objeto matriz cls = (*je)->FindClass( je, "java/lang/Object"); if ( cls == NULL) { printf(" ERROR 1: FindClass.\n"); return NULL; } oa = (*je)->NewObjectArray( je, 4 /* longitud matriz */, cls, NULL ); if ( oa == NULL) { printf(" ERROR 2: Newobj\n"); return NULL; } // Poblar la matriz for (i=0; i<4; i++) { // Crear un nuevo objeto de matriz de bytes para poder devolverlo. ba = (*je)->NewByteArray( je, 10 /* = longitud matriz bytes */ );
352
// Establecer todos los elementos en un valor de fecha vlido. // Pinchar la memoria del elemento de la matriz de bytes para que // el lado nativo pueda acceder a ella. p = (char *) (*je)->GetByteArrayElements( je, ba, NULL);
memcpy( p, "2000-01-01",10); // Actualizar los valores y devolverlos al llamador Java // Cuarto parm. = 0 tambin hace que se libere el alm. de la variable, // por lo que no puede accederse a ellas tras llamar a esta funcin. (*je)->ReleaseByteArrayElements( je, ba, (signed char *) p, 0); (*je)->SetObjectArrayElement( je, oa, i /* elemento matriz, empieza en 0 */ , ba); } // for i return oa; } //--------------------------------------------------------------jfloatArray _Export __stdcall { jfloatArray rc; jfloat *n; Java_VJNIRA_SUBRFA( JNIEnv *je , void *jc)
printf(" llamada a SUBRF satisfactoria.\n"); rc = (*je)->NewFloatArray( je, 4 /* = longitud matriz */ ); // Pinchar la memoria del elemento de la matriz para que // el lado nativo pueda acceder a ella. n = (*je)->GetFloatArrayElements( je, rc, NULL);
n[1] = -4444.4444; // Actualizar los valores y devolverlos al llamador Java (*je)->ReleaseFloatArrayElements( je, rc, n, 0); } return rc;
353
jdoubleArray rc; jdouble *n; printf(" llamada a SUBRF8 satisfactoria.\n"); rc = (*je)->NewDoubleArray( je, 4 /* = longitud matriz */ ); // Pinchar la memoria del elemento de la matriz para que // el lado nativo pueda acceder a ella. n = (*je)->GetDoubleArrayElements( je, rc, NULL);
n[1] = -7777777.55555; // Actualizar los valores y devolverlos al llamador Java (*je)->ReleaseDoubleArrayElements( je, rc, n, 0); return rc; } //--------------------------------------------------------------jobjectArray _Export __stdcall Java_VJNIRA_SUBRCVA( JNIEnv *je , void *jc) { // Similar al caso de caracteres de longitud fija, slo que los elementos // individuales de la matriz pueden crearse como matrices de bytes de // distintas longitudes para reflejar la longitud actual de los valores // de longitud variable.
354
jobjectArray oa; jclass cls; jbyteArray ba; char *p; int i; printf(" llamada a SUBRCVA satisfactoria.\n"); // Crear el objeto matriz cls = (*je)->FindClass( je, "java/lang/Object"); if ( cls == NULL) { printf(" ERROR 1: FindClass.\n"); return NULL; } oa = (*je)->NewObjectArray( je, 4 /* longitud matriz */, cls, NULL ); if ( oa == NULL) { printf(" ERROR 2: Newobj\n"); return NULL; }
355
// Poblar la matriz for (i=0; i<4; i++) { // Crear un nuevo objeto de matriz de bytes para poder devolverlo. ba = (*je)->NewByteArray( je, /* = longitud matriz bytes */ (1==i) ? 4 : 10 ); // Establecer el valor del segundo elemento if ( 1 == i) { // Pinchar la memoria del elemento de la matriz de bytes para que // el lado nativo pueda acceder a ella. p = (char *) (*je)->GetByteArrayElements( je, ba, NULL);
memcpy( p, "abcd",4); // Actualizar los valores y devolverlos al llamador Java // Cuarto parm. = 0 tambin hace que se libere el alm. de la variable, // por lo que no puede accederse a ellas tras llamar a esta funcin. } (*je)->ReleaseByteArrayElements( je, ba, (signed char *) p, 0);
(*je)->SetObjectArrayElement( je, oa, i /* elemento matriz, empieza en 0 */ , ba); } // for i } return oa;
356
El fuente del programa debe contener un procedimiento cuyo nombre coincida con el nombre del archivo fuente. Este ser el principal punto de entrada del programa. Si deben pasarse parmetros al programa, deben especificarse en la definicin de parmetros para el procedimiento principal y deben pasarse por valor. Es decir, la palabra clave VALUE debe especificarse para cada parmetro. Al ejecutar una aplicacin desde la lnea de mandatos debe separar los parmetros mediante espacios. Si se pasan ms o menos parmetros de los especificados, no aparecer ningn mensaje de error. Para crear un programa autnomo en el Diseador GUI, seleccione Proyecto > Nuevo > Proyecto no GUI De la ventana de proyectos. El editor abre un nuevo archivo fuente que contiene una especificacin de control H. Elimine el comentario para la especificacin H * EXE y escriba el cdigo de su programa. Cuando haya
Copyright IBM Corp. 1994, 2000
357
terminado, guarde su proyecto y construya la aplicacin. Asimismo, puede seleccionar las opciones que desee desde la ventana de proyectos. En el ejemplo siguiente, el programa autnomo VARPG acepta un nico parmetro. Al ejecutarse, el programa convertir el parmetro a maysculas y mostrar el resultado utilizando el cdigo de operacin DSPLY. Observe que el nombre del procedimiento principal, y el nico, es MyPgm. Si desea intentar este ejemplo, asegrese de dar al archivo el nombre MYPGM al guardarlo.
* Programa de ejemplo autnomo VARPG H EXE * * Prototipo para el procedimiento principal D MyPgm PR D 64A Value * * Definicin del procedimiento para MYPGM PMyPgm B * D MyPgm PI D InString 64A Value * D OutString S 64A * D LC C 'abcdefghijklmnopqrstuvwxyz' D UC C 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' * * Conversin del parmetro de entrada a maysculas y visualizacin C lc:uc Xlate InString OutString C OutString Dsply I 1 * PMyPgm E
Para crear un archivo DLL en el Diseador GUI, seleccione Proyecto > Nuevo > Proyecto no GUI de la ventana de proyectos. El editor abre un nuevo archivo fuente que contiene una especificacin de control H. Elimine el comentario para la especificacin H * NOMAIN y escriba el cdigo de su programa. Cuando haya terminado, guarde su proyecto y construya el archivo DLL. Asimismo, puede seleccionar las opciones que desee desde la ventana de proyectos. Al construir un archivo DLL, el compilador produce el archivo DLL y un archivo LIB. El archivo LIB se utiliza para enlazar el archivo DLL a otras aplicaciones. El archivo LIB debe encontrarse en el mismo directorio que el fuente y debe tener el mismo nombre que el archivo DLL. El archivo LIB contiene todos los procedimientos que tienen la palabra clave EXPORT en su especificacin P Begin. El siguiente ejemplo le muestra cmo codificar la parte del programa MyPGM que convierte la serie de minsculas a maysculas como un procedimiento en un archivo DLL. El fuente para el archivo DLL contiene un procedimiento llamado ToUpper. Agregue la palabra clave Export a la definicin del procedimiento para que ste pueda invocarse desde otros programas.
* Ejemplo de archivo DLL VARPG H NOMAIN *
358
* Procedimiento prototipo ToUpper D ToUpper PR 64A D 64A Value * * El procedimiento ToUpper PToUpper B Export * D ToUpper PI 64A D InString 64A Value * D OutString S 64A * D LC C 'abcdefghijklmnopqrstuvwxyz' D UC C 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' * * C lc:uc Xlate InString OutString C Return OutString * PToUpper E
Al crear y construir un archivo DLL, puede nombrarlo como guste. Para este ejemplo, hemos utilizado el nombre MyFunc. Una construccin satisfactoria crear los siguientes archivos en el directorio fuente: v MyFunc.VPG - fuente del programa v MyFunc.DLL - el archivo DLL v MyFunc.LST - el listado del compilador v MyFunc.LIB - el archivo de biblioteca v MyFunc.EVT - el archivo de sucesos (utilizado por el Diseador GUI para visualizar la ventana de errores, aunque no es necesario para ejecutar el programa) Abra y modifique el fuente MyPGM para que llame al procedimiento ToUpper en el archivo MyFunc.DLL que acaba de crearse. El fuente modificado ser:
0000 * Llamada a un procedimiento en un archivo DLL VARPG 0001 H EXE 0002 * 0003 D ToUpper 0004 D 0006 D 0007 0008 0009 0010 0011 0012 0013 0014 0015 0016 0017 * D MyMain D * PMyMain * D MyMain D InString * D Upper * PR 64A 64A PR B PI S Eval Dsply E 64A 64A Upper=ToUpper(Instring) I 1 Value DLL('MyFunc') ExtProc('TOUPPER') Value
64A
Value
ln. 0003
359
procedimiento devuelva un parmetro que sea un campo alpha de 64 bytes de longitud. La palabra clave del archivo DLL especifica que el procedimiento se encuentra en el archivo DLL llamado MyFunc.DLL. 0004 La palabra clave ExtProc especifica el nombre del procedimiento que debe invocarse. El nombre es el mismo que el que hemos empleado en la especificacin Definition (lnea 0003), por lo que puede omitir la palabra clave. Si decide, de todas formas, especificar el nombre, ste deber aparecer en maysculas, como se indica. Esta sentencia indica que el procedimiento espera un parmetro - un campo alpha de 64 caracteres de longitud. En este caso, es VALUE quien pasa el parmetro. Esta es la llamada al procedimiento.
0006
0018
Si el procedimiento que est invocando no le devuelve un valor, debe utilizar el cdigo de operacin CALLP para invocarlo:
C CALLP SomeFunc(parm1:parm2)
360
Excepciones
El tratamiento de las excepciones difiere del de las aplicaciones GUI VARPG por varias razones: v No se devuelve ninguna informacin sobre la excepcin al emisor si ste no reside en la DLL de utilidad. v El manejador de excepciones por omisin no se invoca nunca desde un archivo DLL ya que no se invoca cuando se produce una excepcin en un procedimiento. Si se produce una excepcin en el archivo DLL y no hay ningn indicador de errores ni *PSSR, el archivo DLL finaliza. La informacin sobre la excepcin se escribe en el archivo FVDCERRS.LOG. v La manera ms adecuada de tratar excepciones en un archivo DLL de utilidad es tener un indicador de errores, o un *PSSR local para cada rutina que devuelva un cdigo de devolucin apropiado al emisor.
Procedimientos de depuracin
Si desea depurar cdigo en su archivo DLL, debe seguir algunos pasos ms: 1. Inicie el depurador para su aplicacin principal; en nuestro ejemplo, MyMain. 2. En el dilogo Depurador - Control de sesin, seleccione Puntos de interrupcin-Establecer aparicin de carga.... 3. Cuando aparezca el dilogo Punto de interrupcin de aparicin de carga, escriba el nombre del archivo DLL, MyFunc, en la entrada Nombre del archivo DLL y pulse Aceptar. 4. Ejecute su programa. Cuando se invoca el proceso en el archivo DLL, se visualiza un dilogo de mensaje del depurador que indica que se est cargando el archivo DLL. Pulse Aceptar y haga lo siguiente: 1. Localice el dilogo Depurador - Control de sesin y observe que hay una nueva entrada en el panel de la derecha con el nombre del archivo DLL.
361
2. Pulse el botn con el signo + junto al nombre del archivo DLL. Se expandir para mostrar el nombre del mdulo de objeto, MyFunc.obj. 3. Efecte una doble pulsacin en el nombre del mdulo de objeto. 4. La vista del fuente del depurador mostrar ahora el fuente para el procedimiento ToUpper en el archivo DLL MYFUNC. Ahora puede aadir puntos de interrupcin y visualizar variables de programa en el archivo DLL. Asimismo, si est iniciando (START) otros componentes VARPG, o bien, si est invocando sus propias funciones C, tambin puede utilizar los procedimientos descritos ms arriba para depurarlos.
362
363
El siguiente ejemplo muestra cmo se convierten los datos cuando se transfieren datos DBCS a y desde el servidor. En este ejemplo, se crea un campo Slo DBCS de 10 bytes utilizando VisualAge RPG. Esto quiere decir que el campo puede contener cuatro caracteres DBCS ya que cada carcter DBCS requiere dos bytes. Los dos bytes extra se utilizan para insertar los caracteres SO y SI antes de transferir el campo al servidor. Suponga que el campo contiene los siguientes datos antes de transferirse al servidor:
DBDBDBDBblbl donde DB = 1 Carcter de doble byte. bl = 1 Carcter blanco de byte nico.
Antes de transferir el campo al servidor, se convierte de tal manera que los datos DBCS quedan encerrados entre los caracteres SO y SI. Los blancos de byte nico se consideran insignificantes y se sustituyen por los caracteres SO y SI adecuados. Por consiguiente, el campo aparecer de la manera siguiente antes de transferirse al servidor:
SODBDBDBDBSI
Si se recuperan los mismos datos del servidor, se eliminan los caracteres SO y SI y el campo se rellena con dos blancos de byte nico:
DBDBDBDBblbl donde DB = 1 Carcter de doble byte bl = 1 Carcter blanco de byte nico
Nota: Los campos de tipo carcter que representan los tipos de datos Slo DBCS, DBCS mixto o DBCS cualquiera deben rellenarse con el nmero adecuado de blancos de byte nico con el fin de que el campo se transfiera al servidor y los datos del campo se visualicen correctamente en la ventana. VisualAge RPG asegura que haya suficientes blancos de byte nico. Al establecer campos DBCS o recuperar informacin de campos DBCS mediante los cdigos de operacin SETATR y GETATR respectivamente, debe asegurarse de que la longitud del campo en las operaciones SETATR y GETATR sea igual que la del campo en la ventana. Si el campo no tiene la misma longitud, no podr transferirse entre el servidor y la estacin de trabajo.
364
Es la mxima longitud del campo, ya que ste se convierte a lo siguiente antes de transferirse al servidor.
SODBSIsbSODBSIsbSODBSIsbSODBSIsb. donde SO = 1 carcter de desplazamiento a teclado ideogrfico. sb = 1 carcter de desplazamiento a teclado estndar.
365
amplitud, se recomienda que cree una entrada de caracteres en la ventana. Al hacerlo, se crea un campo de tipo carcter VisualAge RPG con el mismo nombre que el componente Diseador GUI. Entonces puede utilizarse un campo Grfico distinto para interactuar con el campo de entrada de caracteres creado mediante el Diseador GUI. Utilice el cdigo de operacin SETATR o GETATR para interactuar con los campos de entrada. De esta manera, puede utilizarse toda la longitud del campo de entrada para almacenar caracteres DBCS sin preocuparse por los caracteres SO y SI.
366
En esta ventana se muestran dos vistas; la de la izquierda contiene la vista de rbol del proyecto del que desea realizar el proceso de fusin, y la de la derecha contiene todos los hijos del componente seleccionado en la vista de rbol de la izquierda. Se pueden seleccionar varios componentes en la parte derecha de la ventana, de forma similar al Explorador de Windows. Esta vista se puede utilizar como paleta de componentes adicionales porque en ella pueden seleccionarse elementos (en el panel izquierdo o derecho) y, a continuacin, sealarlos y pulsarlos en la vista de rbol del proyecto en uso o en la ventana de diseo. Esto funciona de forma similar a la paleta de componentes en el sentido de que slo se pueden colocar componentes en componentes basados en marcos y stos, a su vez, slo se pueden colocar en la raz del rbol del proyecto. Al fusionar la GUI y el
Copyright IBM Corp. 1994, 2000
367
cdigo asociado, el constructor obligar a guardar el proyecto en uso para poder contar con una copia de seguridad del trabajo en caso de que los resultados de la fusin no le satisfagan. Adems del diseo de la GUI, la fusin copiar subrutinas de accin enlazadas, paneles de ayuda, descripciones tcnicas, referencias a archivos de soporte, subrutinas de usuarios referenciadas y mensajes de usuario. Hay que tener en cuenta varias reglas al fusionar cdigo en estos casos especficos. v Se copiarn todas las subrutinas de accin enlazadas. v Los archivos de soporte referenciados no se copiarn con las referencias. Esto es responsabilidad del programador. v Las especificaciones de las descripciones de archivos y las especificaciones de definiciones no se copiarn en el proyecto en uso. Esto tambin es responsabilidad del programador. v Las subrutinas de usuario, los procedimientos RPG y los mensajes de usuario referenciados por la subrutina de accin que se copia tambin se copiarn. Esto incluye todas las referencias a subrutinas de usuario utilizadas por un cdigo de operacin EXSR o CASxx, los procedimientos RPG referenciados en un cdigo de operacin CALLP y los mensajes de usuario referenciados con el cdigo de operacin DSPLY. v En el caso de los componentes cuyo nombre ha sido modificado, tambin se cambiar el nombre de todas las subrutinas de accin que hacen referencia al componente y que tienen nombres que se ajustan al formato estndar. Por ejemplo, el nombre del siguiente cdigo fuente se cambiara, ya que sigue el formato estndar. El requisito de este formato es que el nombre del componente y de la ventana correspondan directamente con la ubicacin donde puede encontrarse el componente.
*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....8 CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq---C PSB000000C BEGACT PRESS FRA000000B . . . C ENDACT
v Los nombres de los mensajes de usuario copiados se cambian consecutivamente empezando por el primer mensaje copiado. Todos los mensajes de usuario fusionados se numeran secuencialmente empezando inmediatamente despus del ltimo mensaje del proyecto en uso. Los ID de mensaje se modifican en cdigos de operacin DSPLY que hacen referencia a ellos. v Si se detecta un conflicto de nombres para una subrutina de usuario, no se modificar el nombre y se aadir a una lista contenida en el archivo de registro de fusin. El registro tambin se visualizar en la ventana Resultado de la fusin de cdigo. El archivo de registro de fusin se ubicar en el directorio del proyecto, con el nombre de nombre_proyecto.mrg, donde nombre_proyecto es el nombre del proyecto. Este archivo ser sustituido si se realiza ms de una fusin para el mismo proyecto. El archivo no se aade automticamente. El siguiente ejemplo comprende un listado de un archivo de fusin de ejemplo.
368
Los componentes siguientes se han copiado en el proyecto de destino: Nombre de origen SEARCHW:CAN00023 SEARCHW:SEARCHW SEARCHW:SEARCHGB SEARCHW:STX00071 SEARCHW:TITLECB SEARCHW:STX00073 SEARCHW:STX00074 SEARCHW:STX00075 SEARCHW:CATCB SEARCHW:DIRCB SEARCHW:ACTORCB SEARCHW:SEARCHPB SEARCHW:CANCELSEPB SEARCHW:HELPPB SEARCHW:STX00082 Nombre de destino SEARCHW:CAN00023 SEARCHW:SEARCHW SEARCHW:SEARCHGB SEARCHW:STX00071 SEARCHW:TITLECB SEARCHW:STX00073 SEARCHW:STX00074 SEARCHW:STX00075 SEARCHW:CATCB SEARCHW:DIRCB SEARCHW:ACTORCB SEARCHW:SEARCHPB SEARCHW:CANCELSEPB SEARCHW:HELPPB SEARCHW:STX00082
Los paneles de ayuda siguientes se han copiado en el proyecto de destino: Nombre de origen 24.SEARCHW 79.SEARCHPB 80.CANCELSEPB 81.HELPPB Fusionando cdigo fuente: Subrutina de accin Redenominando a Subrutina de accin Subrutina de accin Subrutina de accin Subrutina de accin Subrutina de accin Subrutina de accin Subrutina de accin Subrutina de accin Subrutina de accin Subrutina de accin Mensaje Mensaje Mensaje Mensaje Subrutina de usuario Subrutina de usuario Subrutina de usuario Subrutina de usuario Mensaje Subrutina de usuario Subrutina de usuario Subrutina de usuario Subrutina de usuario Subrutina de usuario Subrutina de usuario Subrutina de usuario Subrutina de usuario CATW+CLOSE+CATW SEARCHW+CLOSE+SEARCHW TITLECB+CREATE+SEARCHW DIRCB+CREATE+SEARCHW ACTORCB+CREATE+SEARCHW CATCB+CREATE+SEARCHW TITLECB+ENTER+SEARCHW CATCB+SELECT+SEARCHW DIRCB+SELECT+SEARCHW ACTORCB+SELECT+SEARCHW CANCELSEPB+PRESS+SEARCHW SEARCHPB+PRESS+SEARCHW *MSG0001 -> *MSG0003 *MSG0001 -> *MSG0003 *MSG0001 -> *MSG0003 *MSG0001 -> *MSG0003 WRTBRSFSR CASECAT CKCRITERIA DSPBROWSE *MSG0001 -> *MSG0003 BRACTION BRCHILDREN BRSCIFI BRCOMEDY BRHORROR BRWESTERN BRROMANCE BRCLASSIC Nombre de destino 88.SEARCHW 99.SEARCHPB 100.CANCELSEPB 101.HELPPB
369
Los mensajes siguientes se han copiado en el proyecto de destino: Mensaje de origen 1 Mensaje de destino 3
Las descripciones tcnicas de los siguientes componentes se han copiado en el proyecto de destino: Nombre de origen SEARCHW:SEARCHPB SEARCHW:CANCELSEPB SEARCHW:HELPPB Nombre de destino SEARCHW:SEARCHPB SEARCHW:CANCELSEPB SEARCHW:HELPPB
Las reglas siguientes se aplican a la resolucin de conflictos de nombres de componentes: v Se cambiar el nombre del componente o de la ventana fusionado. v Si se cambia el nombre de una ventana, todos los componentes contenidos en ella recibirn el nombre de la nueva ventana. v Las subrutinas de accin enlazadas con una ventana o componente redenominado sern redenominadas y reenlazadas, siempre que tengan el formato estndar de nombres. v Se cambiarn las especificaciones de los clculos que contengan un cdigo de operacin GETATR o SETATR que haga referencia a un componente redenominado. v El proceso de fusin intenta corregir las referencias de componentes en el cdigo fusionado segn los cambios de nombre de los componentes. Tambin se copian los mensajes de usuario utilizados en los componentes fusionados. Se aplican las reglas siguientes: v Si existe un conflicto de nombres en un mensaje de usuario, se producir un cambio de nombre. v Se actualizarn las referencias a mensajes de usuario redenominados.
370
371
3. Pulse el botn sobre el mandato Gestionar conectores... para abrir la ventana Gestionar conectores.
372
Alternate_Paths
Es una serie que indica las vas de acceso relativas que deben utilizarse al cargar la DLL del conector descrita ms abajo. Este campo es opcional. Esta serie adopta la forma:
"&1\vaRelativa1;&1vaRelativa2;...;&1\vaRelativaN;"
donde &1\ se convertir en la va de acceso completa del archivo .plg. Esto implica que si se dispone de un conjunto de conectores que se instalan en un directorio como c:\myplugins y todos ellos estn enlazados con una DLL comn: c:\myplugins\plugutil\plugutil.dll, en caso de que todos los conectores se encuentren en c:\myplugins\plugN\plugN.plg, se podra especificar la va de acceso alternativa: &1\..\util;, que se convertira en:
Copyright IBM Corp. 1994, 2000
373
c:\myplugins\plugN\..\util; y se aadira a PATH antes de cargar la DLL. Las comillas son necesarias si se decide utilizar esta palabra clave. En lugar de una serie, tambin se puede utilizar un ID de recurso para apuntar a una va de acceso especificada en un fuente externo.
DLL_Names
El valor de este campo es una serie que define el nombre de los archivos DLL necesarios para este conector. Es un campo opcional; si se utiliza, debe haber el nombre de una DLL utilizada por el conector. Adems, puede darse el nombre mri.dll. Este nombre es opcional, pero no puede incluirse sin la DLL correspondiente. Si se incluyen los dos, se delimitan con un espacio. El nombre de los archivos DLL puede comprender la va de acceso relativa a la ubicacin de los archivos del conector. conector.dll Es el nombre de la DLL que contiene el cdigo del conector. Puede omitirse si el conector no es una llamada de funcin dentro de una DLL. mri.dll Si el MRI (series traducibles) se encuentran en una DLL diferente, indique su nombre. Primero se especifican las DLL para que las series que deban seguirse puedan incluirse en las DLL. Cuando una serie es necesaria ms adelante en el archivo .plg, si no se especifica una serie entre comillas, se presupone que el valor dado es un ID de recurso de serie en mri.dll o conector.dll
Vendor_Name
Es el nombre del proveedor especificado entre comillas dobles o del ID de recurso de una serie. Este campo es opcional, pero recomendado. Un ejemplo de esta serie sera:
Vendor_Name: "Plug-Me-In Inc."
Plugin_Name
Es el nombre del conector especificado entre comillas o del ID de recurso de una serie. Este campo es opcional, pero recomendado. Un ejemplo de este campo con una serie es:
Plugin_Name: "Who Am I?"
Help_File
Este campo es opcional e identifica el archivo .hlp de Windows utilizado para visualizar ayuda para los elementos de men. Es una serie que no lleva comillas y que incluye la va de acceso relativa del archivo de ayuda.
Unloading_Function
Este campo es opcional. El campo Unloading_Function no puede utilizarse junto con el campo Unloading_Command_Line. Este campo slo se utiliza si hay informacin o un elemento de visualizacin que tiene que modificarse o eliminarse cuando se ha finalizado o eliminado el conector. Esta serie, que lleva comillas, designa la funcin que se utilizar. La funcin debe estar incluida en la DLL que acompaa al conector. El campo Unloading_Function es el nombre de la funcin que debe llamarse cuando se vaya a descargar el conector. Tiene la siguiente signatura:
374
unsigned long unloadFunctionName( const char* const char* const char* const char* int
donde los parmetros son: ppluginPath_ La va de acceso completa del conector invocado, incluyendo la barra inclinada invertida final. ppluginStub_ El resto del nombre del archivo del conector (por ejemplo, myplug.plg). pdllPath_ La va de acceso completa de la DLL que contiene los mtodos expuestos de VARPG. builderId_ Serie utilizada por VARPG para identificar el constructor y por el conector al comunicarse con el constructor. remove_ 0 1 El constructor se est apagando. El usuario ha solicitado que se elimine todo el conector. En este caso, el conector debera eliminar en este momento toda la informacin almacenada en el registro.
Si el conector devuelve un 1 de esta funcin, el constructor puede presentar al usuario la opcin de eliminar obligatoriamente el conector descargando su DLL. En este caso, es posible que el conector interrumpa el funcionamiento del diseador y deba volverlo a iniciar.
Unloading_Command_Line
Como se ha mencionado ms arriba, este campo no puede utilizarse al mismo tiempo que el campo Unloading_Function. Cuando se utiliza esta opcin, se proporciona una serie para ejecutarla como si se tratara de la lnea de mandatos. Por ejemplo, se podra iniciar Netscape especificando la serie: netscape.exe Este mtodo permite obtener el mismo conjunto de parmetros que estaran disponibles para una funcin en una DLL. Esto se consigue mediante la definicin de variables de sustitucin. Cuando se encuentra &0, &1, &2, &3, &4 o &5 en la serie especificada, se sustituyen de la siguiente manera: &0 &1 &2 &3 ppluginPath_ ppluginStub_ pdllPath_ builderId_
Captulo 25. Creacin de conectores
375
&4 &5
IBM_PluginInterface | PluginInterface
Es una funcin avanzada que no es necesaria. Este campo permite exponer el conector como componente programable. No se pueden utilizar estas dos opciones en el mismo archivo .plg. Si no hay necesidad de especificar uno de estos parmetros, no lo haga. Cuando se utiliza una de estas opciones, se emplear el nombre de la funcin especificado cuando haya otros conectores que interacten con este conector mediante una interfaz de destino/mandato/parmetros. La signatura de la funcin debe ser: para la funcin de tipo IBM_, donde arguments_ se utiliza para entradas y salidas.
unsigned long __stdcall IBMtargetCommandFunction( const IString& pluginPath_, const IString& dllPath_, const IString& builderId_, const IString& target_, const IString& command_, IString& arguments_);
Para la funcin que no es de tipo IBM, la signatura debe ser: En este caso, si hay una serie de retorno, debera asignarse memoria a
unsigned long __stdcall targetCommandFunction( const char* ppluginPath_, const char* pdllPath_, const char* pbuilderId_, const char* ptarget_, const char* pcommand_, const char* parguments_, char** ppreturnString_);
ppreturnString_ mediante el conector con GlobalAlloc( GMEM_FIXED, [bufferSize]), para que VARPG pueda desasignar la memoria cuando haya terminado con ella. Si no hay ninguna serie de retorno que sea necesaria, puede hacerse caso omiso de este parmetro. A continuacin se muestra un ejemplo de este mandato:
{ IString returnString = ...; ... *ppreturnString = GlobalAlloc( returnString. length() + 1); strcpy( *ppreturnString, returnString);
Para ver un ejemplo de conector que d soporte a la funcin IBM_PluginInterface, consulte el ejemplo LPEXSAMP proporcionado en el directorio x:\adtswin\samples\vndplugs\lpexsamp (donde x corresponde a la letra de la unidad en la que se ha instalado VisualAge RPG).
376
Function_Name
Es el nombre de la funcin que debe llamarse en conector.dll al activar el elemento de men. Se puede utilizar este campo o el campo Command_Line. No se pueden utilizar los dos. La signatura debera ser la siguiente: donde los parmetros son:
unsigned long pluginFunctionName( const char* const char* const char* unsigned long const char* ppluginPath_, pdllPath_, builderId_, menuContextId_, partsIds_);
ppluginPath_ Mismo significado que para unloadFunctionName(). pdllPath_ Mismo significado que para unloadFunctionName(). builderId_ Mismo significado que para unloadFunctionName(). menuContextId_ Un valor entero largo sin signatura que representa el tipo de men desde el que se invoca este conector. Este valor determina el significado de partsIds_. Los valores posibles son: 1 2 El conector se invoca desde la barra de mens (es decir, se trata de un conector pensado para proyectos) y partsIds_ es una serie vaca. El conector se invoca para un nico componente seleccionado, (es decir, se trata de un conector pensado para una nica seleccin) y partsIds_ contiene el identificador del componente seleccionado. El conector se invoca para un grupo de componentes seleccionados conjuntamente, (es decir, se trata de un conector pensado para una seleccin mltiple) y partsIds_ es una serie que contiene el conjunto delimitado por espacios en blanco de los identificadores de los componentes seleccionados. El conector se invoca cuando se inicia el diseador GUI.
8 partsIds_
Es una serie que representa el componente o componentes a los que la llamada de funcin debera hacer referencia, segn lo indicado en menuContextId_. En partsIds_, cada identificador de componente es una secuencia de valores enteros largos sin signatura separados por un punto (por ejemplo, 432.5632.612) que representan la jerarqua hijo-padre del componente en cuestin. En el ejemplo indicado, 612 es el ID del componente, 5632 es el ID de su padre y 432 es el ID del padre del padre.
Command_Line
Cuando se utiliza esta opcin, se proporciona una serie para ejecutarla como si se tratara de la lnea de mandatos. Por ejemplo, se podra iniciar Netscape especificando la serie: netscape.exe. Este mtodo permite obtener el mismo conjunto de parmetros que estaran disponibles para una funcin en una DLL. Esto se consigue mediante la definicin de variables de sustitucin. Cuando se encuentra &0, &1, &2, &3, &4 o &5 en la serie especificada, se sustituyen de la siguiente manera:
Captulo 25. Creacin de conectores
377
ppluginPath_ pdllPath_ builderId_ menuContextId_ partsIds_ va de acceso del directorio raz del Diseador GUI.
Siguiendo el ejemplo anterior para Netscape, supongamos que el proveedor proporciona un archivo HTML con el conector y que este elemento de men en particular es para visualizar dicho archivo HTML. Supongamos tambin que el archivo del conector se encuentra en d:\vendor\plugins y que el archivo HTML es d:\vendor\plugins\htmlsrc\plugpage.html. Para que el conector muestre esta pgina web, la definicin de la lnea de mandatos podra ser la siguiente:
netscape &0htmlsrc\plugpage.html
Menu_Name
Es una serie o un ID de recurso de serie que indica lo que el elemento de men debera ser. Estas series tienen el formato:
submen1/submen2/.../submenN/elementomen
donde submen1 hasta submenN son submens opcionales. Por ejemplo: donde Plug-Me-In Inc. es el submen y Who am I? es el elemento de men.
Menu_Name: "Plug-Me-In Inc./Who am I?"
Menu_Info_Strings
Es una lista de series o de ID de serie que estn asociados con los submens o elementos de men correspondientes, como se especifica en Menu_Name. La asociacin funciona a la inversa. Por ejemplo, si se especifica un submen y un elemento de men en Menu_Name, pero slo se especifica una serie en Menu_Info_Strings, la serie especificada en Menu_Info_Strings se asociar con el elemento de men y se har caso omiso del submen. (Es posible que la adicin de un elemento de men anterior definiera una serie de rea de informacin para el elemento de men en cuestin.)
Supported_Menus
Como se ha mencionado en Function_Name, menuContextId_ indica el tipo de men. Supported_Menus indica los mens a los que debe aadirse esta entrada en particular.
Help_Id
Si se ha especificado un archivo de ayuda y hay ayuda asociada con este mandato, indique el ID de ayuda en el parmetro panel_largosin de Help_Id. Si se proporciona el parmetro_opcional_ventana_completa con un valor diferente a
378
cero, la ayuda se visualizar en una ventana completa de ayuda, en lugar de en el rea emergente de contexto por omisin. Este campo adopta la forma de: y un ejemplo de codificacin sera:
Help_Id: panel_largosin parmetro_opcional_ventana_completa
Help_Id:
1000 1
Accelerator
Este campo opcional especifica el acelerador que se asociar con el elemento. Consta de una de las teclas F1 a F12, seguida de uno o varios modificadores (SHIFT [DESPL], ALT, CONTROL) Nota: <F1/10>, <Alt-F5/7/8/9/10> y <Despl-F9/10> ya estn reservadas por el diseador y, si se especifican, no se tendrn en cuenta. Para utilizar esta funcin, proporcione la siguiente informacin: Cuando se utilice este campo tendr el siguiente aspecto:
Accelerator: [F1 | F2 | F3 | ... | F12] [SHIFT] [CONTROL] [ALT]
Accelerator:
F8 Shift
End_of_Definition
Este campo indica al analizador que ha finalizado una definicin de funcin y que puede empezar otra.
379
// Las lneas que empiezan por dos barras inclinadas no se tienen en cuenta // (es decir, se tratan como comentarios) Alternate_Paths: dll_Names: Vendor_Name: Plugin_Name: Help_File: Unloading_Function: (o bien) Unloading_Command_Line: IBM_PluginInterface: (o bien) PluginInterface: serie_o_IDrec conector.dll mri.dll serie_o_IDrec serie_o_IDrec archivo_ayuda.hlp "unloadingFunction" "invocacin lnea mandatos con smb. de sust. &0, &1, &2, &3, &4, &5" "IBMtargetCommandFunction" "targetCommandFunction"
Begin_Details: . . Texto opcional que especifique la funcin del conector. . . End_Details: Function_Name: (o bien) Command_Line: Menu_Name: Menu_Info_Strings: Supported_Menus: Help_Id: Accelerator: End_of_definition: "nombreFuncin1" "invocacin1 lnea mandatos con smb. de sust. &0, &1, &2, &3, &4" serie_o_IDrec serie_o_IDrec serie_o_IDrec ... IDcontextoMen1 IDcontextoMen2 ... panel_largosin parmetro_opcional_ventana_completa [F1 | F2 | F3 | ... | F12] [SHIFT] [CONTROL] [ALT]
Nota: v Todos los nombres de archivo son relativos a la ubicacin del archivo .plg. v Los descargadores son opcionales, pero si se elige alguno, slo se puede haber uno de los dos. v Puede especificarse Function_Name o Command_Line. A continuacin se muestra un ejemplo especfico de archivo .plg sencillo. Con VisualAge RPG se proporcionan algunos ejemplos de conectores. Estos archivos se pueden encontrar en el directorio X:\adtswin\samples\vndplugs\ de la estacin de trabajo donde se ha instalado VisualAge RPG (X corresponde a la letra de la unidad).
380
// Conector para proyecto de impresin Vendor_Name: Plugin_Name: Begin_Details: Who Am I? Este conector muestra informacin acerca del proyecto en uso, incluido el nombre del directorio y del archivo. End_Details: Command_Line: Menu_Name: Supported_Menus: Accelerator: End_of_Definition "d:\myproj\whoami\rt_win32\whoami.exe &1 &2 &4" "Plug-Me-In Inc./Who am I?" 1 F7 Shift "Plug-Me-In Inc." "Who Am I?"
381
Cdigo de retorno Significado 0 1 2 4 5 Todo ha ido bien y el mandato se ha ejecutado. No se ha reconocido el destino. El destino no ha reconocido el mandato. No se puede encontrar el constructor. Se ha producido un error desconocido y los resultados del mandato no son fiables.
BuildOptions
CursoredPart
ninguno
ExpandAll
[1]
ForceOpen
[Nombreproyecto]
382
ProjectTargetName
ProjectTitle ProjectFileStub
IsSaveRequired
ninguno
IsTemporary
ninguno
MostRecentlyUsed
Open
nombreProyecto
383
PromptedSave
ninguno
PromptExisting
ninguno
AllClasses
ninguno
384
IBMClasses
ninguno
IconDll
ClassName
IconId
ClassName
IsType
NombreTipo
VendorClasses
ninguno
ActionSubroutines
IDComponente
AllEvents
IDComponente
Children
[IDComponente]
ClassName
IDComponente
385
CreateFrame
ClassName
DataInfo
Devuelve una serie de tres nmeros, separados entre ellos por espacios en blanco. Los donde: componentes relacionados son, entre otros, el campo de entrada, dataType indica un valor el texto esttico y el campo de 0=Numrico o bien 1=Carcter entrada de subarchivo. dataLength expresa la longitud de los datos decimalPlaces indica el nmero de posiciones decimales
Devuelve el nmero de reas de color soportadas por el componente, en caso de que el componente soporte reas de color aparte del primer plano y el fondo. Obtiene el nombre de archivo definido para este componente. Si el componente no soporta archivos, el valor de retorno es una serie vaca. Obtiene el color del rea especificada. Devuelve una serie con 4 nmeros delimitados por espacios en blanco: useDefault - (0 1) redMix - (0 - 255) greenMix - (0 - 255) blueMix - (0 - 255)
FileName
IDComponente
GetColor
386
GetRect
IDComponente
HasFile
IDComponente
IsColorArea IDComponente [x] Ver Nota ms abajo donde x corresponde al rea de color del componente indicado. IsFontArea IDComponente [x] donde x corresponde al rea de font del componente indicado. IDComponente IDComponente
Label LinkedEvents
Name
IDComponente
OpenPart
IDComponente
OpenSettings
IDComponente
387
SetDataInfo
Establece las propiedades de los datos de un componente. No actualiza el cuaderno de donde: propiedades de un componente que ya est abierto o siendo partId es el ID de componente utilizado. El programador debe asegurarse de que los nuevos dataType indica un valor valores son compatibles con los 0=Numrico o bien 1=Carcter valores previamente existentes que ya se han definido para el dataLength expresa la longitud componente. Los componentes de los datos relacionados son, entre otros, el campo de entrada, el texto decimalPlaces indica el nmero esttico y el campo de entrada de de posiciones decimales subarchivo. partId dataType dataLength decimalPlaces IDComponente nombreArchivoNuevo Define el nombre de archivo para este componente. No tiene ningn efecto si el componente no soporta archivos. Define el font del componente. Intenta definir la etiqueta del componente. Si la etiqueta especificada no es vlida, aparece un mensaje de error. Devuelve un 1 para indicar que se ha definido la etiqueta; en caso contrario, devuelve un 0. Intenta definir el nombre del componente. Si no es posible hacerlo, aparece un mensaje de error. Si el componente tiene enlaces de accin asociados, aparece un mensaje preguntando al usuario si desea romperlos. Devuelve un 1 para indicar que el resultado ha sido satisfactorio o un 0 en caso contrario. Define las coordenadas (x y ancho alto) del componente con relacin a su padre.
SetFileName
SetFont SetLabel
SetName
IdComponente nombreNuevo
SetRect
388
SetStyles
Styles
IDComponente [0|1]
Zoom
IDComponente [0|1]
Nota: Los componentes pueden tener un rea de color de primer plano (1), de fondo (0), no tener rea de color o tener reas de color adicionales. Las ventanas, por ejemplo, no tienen reas de color. Los recuadros de seleccin tienen reas de color de primer plano y de fondo. Los grficos tienen reas de color adicionales. Por tanto, 0 y 1 slo indican necesariamente el color de primer plano y de fondo si el componente no tiene colores adicionales.
389
Los siguientes mandatos requieren que el archivo fuente est abierto en LPEX.
Tabla 16. Destino: Subrutina
Mandato DeleteActionSub DeleteUserSub UserSubroutine Parmetro(s) nombreRutina nombreRutina nombreRutina Significado/Valor de retorno Suprime la subrutina de accin con el nombre especificado. Suprime la subrutina de usuario con el nombre especificado. Si la subrutina no existe, crea una subrutina de usuario con el nombre especificado y la ubica en el archivo fuente. Si existe, se ubica en el archivo fuente. Devuelve una lista de las subrutinas de usuario.
UserSubroutines
ninguno
TurnOn
[0|1]
OpenSourceFile Query
ninguno Cualquier_consulta_LPEX
390
conectores
InvokePlugin
Get
clave [valorOmisin]
GetRect
Set
clave valor
SetRect
Nota acerca de cmo utilizar los mandatos del registro. Es muy recomendable que los conectores utilicen una subclave inicial que probablemente sea exclusiva, con el fin de que no interfieran con las entradas en el registro de otros conectores. Todas las entradas del registro creadas con estos mandatos estarn restringidas a una subseccin comn de la entrada de registro de VARPG; sin embargo, es posible solapar conectores.
391
Para evitar que se solapen, los conectores pueden utilizar una variacin del nombre de la va de acceso del archivo .PLG como subclave inicial, de la siguiente manera: Si el nombre de la va de acceso del conector es:
"c:\plugins\My_Plugins\myplug.plg",
y la entrada del registro debe utilizarse para almacenar la posicin de una ventana, una clave adecuada para este valor sera:
"c__plugins_my plugins_myplug.plg\Posicin ventana"
(Observe que se han eliminado las maysculas de la parte correspondiente a la va de acceso de la clave y que los dos puntos y las barras inclinadas invertidas se han convertido en caracteres de subrayado.) Las claves y los valores especificados deben ir entre comillas, ya que las claves pueden contener espacios. Por lo tanto, si deseara definir el valor de una serie, debera utilizar:
Set( "c__plugins_my_plugins_myplug.plg\Nombre clave relevante" "El valor nuevo.")
Hay otros mandatos que son aplicables a algunas de las propias ventanas constituyentes del Diseador GUI. (Por ejemplo, el catlogo de componentes.) Destinos aplicables: MainWindow Es la ventana principal del Diseador GUI. Catalog El catlogo de componentes. DBRefDlg La ventana Definir campos de referencia. ImportDlg La ventana Importar archivo de pantalla. LPEX La ventana del editor. Observe que estos mandatos slo son aplicables cuando la ventana especificada est abierta.
Tabla 21. Destino: Ventanas constituyentes del Diseador GUI
Mandato GetHandle Parmetro(s) ninguno Significado/Valor de retorno Devuelve el HANDLE de Windows de la ventana especificada. Devuelve el puntero de IWindow de la ventana especificada. Define el tamao y la posicin de la ventana. Desplaza la ventana a la posicin (X, Y). Devuelve la posicin de la ventana en la forma X, Y.
392
393
********************************************************************* * * * Ventana . : Main * * * * Componente : PB_Cancel * * * * Evento . . : Press * * * * Descripcin: Terminar el programa * * * ********************************************************************* * C PB_CANCEL BEGACT PRESS MAIN * C Move *on *inlr * C ENDACT * ********************************************************************* * * * Ventana . : Main * * * * Componente : Main * * * * Evento . . : Create * * * * Description: Set up the PLUGDLL and PLUGID values of the * * *COMPONENT part to establish communication with the * * GUI builder. * * * * Execute PLUGCMD attributes to collect information * * about the current project * * * ********************************************************************* * C MAIN BEGACT CREATE MAIN * C '*Component' Setatr PlugDll 'PlugDLL' C '*Component' Setatr PlugID 'PlugID' * C Eval Cmd='Project Get ProjectDir' C '*Component' Setatr Cmd 'PlugCmd' C '*Component' Getatr 'PlugResult' DirName * C Eval Cmd='Project Get ProjectFileStub' C '*Component' Setatr Cmd 'PlugCmd' C '*Component' Getatr 'PlugResult' File * C Eval Cmd='Project Get ProjectTargetName' C '*Component' Setatr Cmd 'PlugCmd' C '*Component' Getatr 'PlugResult' TAR
C C C C C C C C
Cmd='Project Get ProjectTitle' Cmd 'PlugCmd' 'PlugResult' Title Cmd='Project Get ProjectFileName' Cmd 'PlugCmd' 'PlugResult' Folder 'Main'
* *
394
Empaquetado de la aplicacin
El paso final de la creacin del conector es la compilacin del archivo .EXE. Seleccione Construir en el men desplegable Archivo y, a continuacin, la plataforma en la que desea utilizar el conector. Una vez que el archivo est compilado, ya estar listo para utilizarlo. Consulte las instrucciones de Adicin de conectores de proveedor para aadir el conector. A partir de este punto, ya puede utilizar el conector o realizar las pruebas que sean necesarias.
395
396
397
398
Antes de empezar
Asegrese de que los archivos que la aplicacin necesita se almacenan en el directorio de tiempo de ejecucin adecuado (RT_WIN32 para Windows NT/95/98 o RT_JAVA para Java;). Algunos archivos se colocan automticamente en el directorio de tiempo de ejecucin despus de construir la aplicacin (por ejemplo, los archivos MSG, HLP, DLL, BND, RST y EXE); otros deber colocarlos usted mismo (por ejemplo, BMP, GIF,ICO, JPG,MID, y WAV). Si coloca archivos adicionales en los directorios de tiempo de ejecucin antes de empaquetar la aplicacin, asegrese de que los nombres de archivo no sean los mismos que los de los archivos de aplicacin existentes. Despus de colocar todos los archivos en el directorio de tiempo de ejecucin, asegrese tambin de que no haya dos archivos que tengan el mismo nombre y de que no se d ninguna coincidencia en los dos primeros caracteres de su extensin de archivo. Por ejemplo, si tiene dos archivos FILEAABC y FILEAABB en el directorio RT_WIN32, uno se sobregrabar durante el proceso de empaquetado. Si desea empaquetar en disquetes, conviene tener disquetes preformateados disponibles antes de empezar el proceso de empaquetado.
399
desplegable Servidor. Para acceder en el tiempo de ejecucin, utilice el icono Definir informacin de AS/400. Para acceder en tiempo de empaquetado, utilice el botn Cambiar servidor. En el archivo RST, tambin debe especificar el protocolo correcto utilizado por los usuarios. Para SNA, el nombre de ubicacin remota es el nombre del direccionador definido en Client Access. Para TCP/IP, el nombre de ubicacin remota es el nombre de sistema principal AS/400 definido en la lista de servidores TCP/IP.
Especifique el sistema de destino de la aplicacin: v Windows NT/95/98 Empaqueta la versin Windows de su aplicacin para la plataforma Windows NT/95/98. v Aplicaciones Java para Windows NT/95/98 Empaqueta la versin Java de su aplicacin para la plataforma Windows NT/95/98. v Aplicacin/applet Java para todas las plataformas Empaqueta la versin Java de su aplicacin para otros sistemas operativos.
400
Especifique lo siguiente: v Lo que se desea empaquetar v La informacin de empaquetado de la aplicacin v La informacin de empaquetado del tiempo de ejecucin
401
pueden empaquetar componentes compartidos adicionales creados con otras aplicaciones. Estos componentes compartidos se aadirn automticamente a la lista la prxima vez que elija empaquetar por componentes.
En la ventana Informacin de empaquetado, especifique la informacin siguiente: Directorio destino El directorio destino para el empaquetado. Si se empaqueta en un disquete, el directorio destino slo puede ser el directorio raz del disquete: no puede haber ningn subdirectorio. Si empaqueta en un directorio, ese directorio no debe contener otros archivos. Nombre de la compaa El nombre de la compaa con el que se registrar la aplicacin. Nota: Cuando empaquete una versin actualizada de una aplicacin distribuida con anterioridad, utilice el mismo nombre de compaa para la aplicacin revisada. De lo contrario, la aplicacin revisada ser tratada como si fuera nueva. Versin La versin de la aplicacin. Ttulo El ttulo de la aplicacin.
402
Aqu puede utilizar el botn Cambiar servidor para visualizar una lista de servidores (ubicaciones remotas) utilizados por su aplicacin. Puede modificar la lista para que el paquete utilice los nuevos nombres. Seleccione Empaquetar para iniciar el empaquetado. Aparece una ventana de indicador de progreso. Se visualizan mensajes para indicar al usuario las etiquetas que debe poner en los diversos disquetes a medida que los crea. Cuando se ha completado el empaquetado, se visualiza un mensaje de realizacin.
Si se empaqueta en un disquete, el directorio destino slo puede ser el directorio raz del disquete: no puede haber ningn subdirectorio. Si empaqueta en un directorio, ese directorio no debe contener otros archivos. Seleccione Empaquetar para iniciar el empaquetado. Aparece una ventana de indicador de progreso. Un mensaje le indicar que el proceso se ha completado.
403
Especifique lo siguiente: v Especifique lo que desea empaquetar: la aplicacin, el tiempo de ejecucin o ambos. v El formato de su paquete: los archivos de aplicacin (slo vlidos si elige Aplicacin) o bien el archivo Jar.
404
v Archivos de aplicacin Incluye todos los archivos en el directorio de tiempo de ejecucin y los coloca en el directorio destino. v Archivo Jar Incluye todos los archivos para un componente en su propio archivo Jar. (Cualquier archivo de imagen GIF se copiar y no se incluir en el archivo Jar.) v Incluir JDBC Incluir el archivo de funciones de la clase JDBC en el jar.
Especifique el directorio destino. Tambin puede especificar opciones Jar. Si selecciona Incluir archivo HTML, la pgina HTML por omisin para la aplicacin se copiar en el directorio de destino. Si selecciona Exportar a AS/400, se visualizar la Smart Guide para exportar archivos al sistema AS/400. Nota: Si su aplicacin tiene componentes mltiples, cada componente dispondr de su archivo Jar. Asimismo, cualquier archivo de imagen GIF slo se copiar y no ser incluido en el archivo Jar.
405
Especifique el nombre del archivo Jar y el directorio de destino. Si selecciona Exportar a AS/400, se visualizar la Smart Guide para exportar archivos al sistema AS/400.
406
Captulo 27. Instalacin del cdigo de tiempo de ejecucin y las aplicaciones para Windows NT/95/98
En esta seccin se describe la instalacin del cdigo de tiempo de ejecucin y de aplicaciones para Windows NT/95/98, mediante InstallShield. Nota: El cdigo de tiempo de ejecucin siempre debe instalarse antes de instalar una aplicacin. Slo se instala una sola copia del cdigo de tiempo de ejecucin en una estacin de trabajo, sin importar cuntas aplicaciones se instalen en la misma.
del paquete y siga los pasos indicados en los recuadros de dilogo. Los programas de utilidad Definir conexin a servidores, Definir informacin de AS/400 y Definir lista de servidores TCP/IP se instalan con el cdigo de tiempo de ejecucin. Utilice estos programas de utilidad para mantener y actualizar los nombres y la ubicacin de los recursos de AS/400 en el cdigo de tiempo de ejecucin. Consulte el Captulo 8. Conectividad con AS/400 en la pgina 189 para obtener ms informacin.
del paquete y siga los pasos indicados en los recuadros de dilogo. El programa de utilidad Definir informacin de AS/400 se puede instalar opcionalmente con la aplicacin. Utilice este programa de utilidad para mantener y actualizar los nombres y la ubicacin de los recursos de AS/400 en el cdigo de tiempo de ejecucin. Consulte el Captulo 8. Conectividad con AS/400 en la pgina 189 para obtener ms informacin.
407
1. En el men emergente Inicio de Windows NT/95/98 en la Barra de tareas, seleccione Configuracin y Panel de control. 2. Invoque el programa de utilidad Agregar/quitar programas.
El parmetro r permite que el sistema grabe las pulsaciones de teclas efectuadas durante el proceso de instalacin. Esta informacin se almacena en el archivo setup.iss que se crea en el directorio de Windows. Estas pulsaciones de teclas se utilizarn en la instalacin silenciosa. 3. Copie el archivo setup.iss del directorio de Windows al directorio LAN en el que ha empaquetado el tiempo de ejecucin o la aplicacin. Por ejemplo, si c:\winnt es el directorio de Windows, el archivo setup.iss se encontrar bajo c:\winnt. Nota: Asegrese de copiar el archivo setup.iss del tiempo de ejecucin antes de instalar la aplicacin en el directorio LAN con la opcin r. De lo contrario, el archivo setup.iss de la instalacin de la aplicacin se grabar encima del archivo setup.iss que ha creado la instalacin del tiempo de ejecucin. 4. Modifique la copia del archivo setup.iss situado en el directorio LAN en el que ha empaquetado el tiempo de ejecucin o la aplicacin. Cambie la entrada szDir de modo que apunte a la unidad y el directorio de destino en el que debe instalarse el paquete del tiempo de ejecucin o aplicacin. 5. En la estacin de trabajo cliente, dirjase al directorio LAN en el que se ha empaquetado el tiempo de ejecucin o la aplicacin. Ejecute el siguiente mandato:
408
setup -s
Captulo 27. Instalacin del cdigo de tiempo de ejecucin y las aplicaciones para Windows NT/95/98
409
410
Parte 6. Apndices
411
412
nombrearchivo.DLL
Binario
nombrearchivo.EVT
ASCII
nombrearchivo.EXE
Binario
nombrearchivo.HLP
Binario
nombrearchivo.HTM
ASCII
nombrearchivo_applet.HTM
ASCII
nombrearchivo.IPF
ASCII
413
nombrearchivo.JAVA
ASCII
nombrearchivo.LIB
Binario
nombrearchivo.LST
ASCII
nombrearchivo.ODF
Binario o ASCII
nombrearchivo.ODX
ASCII
nombarchRecursos.propiedades ASCII
414
nombrearchivo.TXC
ASCII
nombrearchivo.TXM
ASCII
nombrearchivo.VCX
Binario
nombrearchivo.VPF
ASCII
415
416
417
La interfaz consiste en una ventana con lienzo, un subarchivo y un pulsador para cargar una pgina de registros Ms en el subarchivo. El tamao del subarchivo para este ejemplo concreto es de 10 registros. Puede cambiarse incrementando la altura del componente subarchivo. En el ejemplo se utilizan los siguientes nombres: Componente Nombre Ventana WIN1 Subarchivo SUB1 Pulsador PSBMORE
418
acceso completo a la base de datos (READ y WRITE). Esto podra implementarse proporcionando un programa por cada para cada mtodo de acceso diferente o pasando las operaciones deseadas como parmetros a un nico programa servidor. El siguiente diagrama muestra cmo funciona este ejemplo:
Interfaz de llamada entre cliente y servidor Rellenar subarchivo
Programa cliente
Subarchivo
Cliente AS/400
Programa servidor
Archivo de base de datos
El programa cliente recibe peticiones desde la interfaz de usuario. Invoca un programa servidor que lee los registros de un programa de la base de datos y pasa esos datos de nuevo al cliente mediante parmetros. El subarchivo se va llenando con los datos devueltos.
El programa cliente
El principal componente del componente cliente del programa es la interfaz de usuario. Se crea de la misma forma que cualquier aplicacin VARPG y puede utilizar las descripciones externas de base de datos del AS/400 mediante el uso de campos de referencia a base de datos. Cualquier comprobacin de la validacin especificada en la base de datos la realiza el tiempo de ejecucin de VARPG automticamente en el cliente. El programa cliente solicita datos del servidor invocando un programa de acceso a datos del servidor; los datos en s se pasan a travs de parmetros. El programa cliente no utiliza especificaciones de archivo; en su lugar, la definicin de los datos se realiza mediante estructuras de datos descritas externamente. De esta forma el programador sigue disponiendo de las ventajas de las descripciones externas de campo en los programas VARPG.
419
v getrec, una constante, que define el programa al que llama el servidor. Define el enlace con el servidor y el nombre del programa servidor. El nombre del programa debe especificarse en maysculas.
H D D D D D D D D D D cust eof nrecords fileend getrec counter custelem e ds s s s c s s extname(customer) occurs(10) inz inz
Las especificaciones C contienen una subrutina de accin que tiene un enlace con 3 eventos: v El evento Press del pulsador PSBMore v El evento Create de la ventana Win1 (Con un enlace con la subrutina de accin PSBmore/press) v El evento Pageend del subarchivo Subf1 La primera sentencia es una llamada al programa servidor para que proporcione ms registros. El resto de la lgica se limita a procesar los datos pasados mediante parmetros y los traslada al subarchivo desde la estructura de datos de aparicin mltiple. Una vez que el subarchivo se ha llenado con un conjunto de registros el nmero ms alto de registros del subarchivo se aplica al atributo SETTOP para trasladar este conjunto de registros al rea visible del subarchivo. Al final, si se alcanza el fin de archivo, el pulsador Ms se inhabilita. Observe que las teclas Av Pg todava funcionan. Es todava posible provocar un evento que desencadene esta subrutina de accin incluso con un pulsador inhabilitado.
C C C C C C C C C C C C C C C C C C C C C * PSBmore begact call parm parm parm parm eval dow occur write eval enddo eval PRESS GETREC win1 cust custelem eof nrecords
counter
counter=1 counter<=nrecords and not fileend cust sub1 counter=counter+1 %setatr('win1': 'sub1':'settop')=%getatr('win1' 'sub1':'count') eof %setatr('win1': 'psbmore':'enabled')=0 fileend=*on
Como puede ver, la parte de cdigo que corresponde al cliente es sencilla y minimiza el proceso en la estacin de trabajo.
420
El programa servidor
Debido a que el programa cliente VARPG no incluye la lgica de acceso a la base de datos, el programa servidor ser quien proporcione ahora esta funcin. El programa servidor contiene todas las definiciones y operaciones FILE con las que trata el proceso de la base de datos. Los datos se intercambian trasladando una estructura de datos como parmetro entre los programas cliente y servidor. La estructura de datos contiene las definiciones de campo del formato de registro del archivo de datos. En este ejemplo, una estructura de datos de aparicin mltiple se utiliza para acceder a una coleccin de registros. El nmero de apariciones es el mismo que el nmero de registros que deben pasarse; en este ejemplo, 10. Cualquier informacin de tipo operativo, como por ejemplo la informacin de errores, puede tambin pasarse como parmetro. La llamada del programa cliente VARPG invoca al programa servidor, que finaliza tras cada llamada. El cdigo de la operacin Return se utiliza para finalizar el programa y mantener el entorno de llamada. Esto supondr ventajas en el rendimiento para las llamadas posteriores, al no precisar de inicializacin. Asimismo, precisa que se haya creado el programa para ejecutarse en un grupo de activacin nombrado, ya que *NEW destruira inmediatamente el entorno de llamada y el espacio disponible.
Al principio de las especificaciones de clculo, el cdigo de operacin PLIST define los parmetros que se pasan a este programa. El bucle DO lee del archivo de base de datos y pone los datos en la estructura de datos CUST, que a su vez volver a pasarse al programa cliente como un parmetro. Los otros dos parmetros slo indican el estado del acceso a la base de datos: v EOF se establecer en ON si la sentencia READ establece el indicador 99. v La cuenta de registros contiene el nmero de registros que vuelven a pasarse al cliente en la estructura de datos CUST.
C C C C C C C C C C C C C C *entry plist parm parm parm parm eval occur read dow eval occur read enddo if cust custelem eof count
count
count
count=1 cust customer count<custelem and not *in99 count=count+1 cust customer *IN99
9999
9999
421
C C C C
count=count-1 eof=*on
Al compilar el programa servidor, asegrese de no especificar *NEW para el grupo de activacin. Si se especifica *NEW (el valor por omisin), todo el almacenamiento asignado por este programa se liberar al ejecutar RETURN. Una de las ventajas de este ejemplo de cliente ligero es la reutilizacin de la aplicacin de servidor por distintas aplicaciones. Incluso las aplicaciones 5250 tradicionales pueden utilizar mdulos de servidor para acceder a bases de datos. De esta forma se facilita el mantenimiento de aplicaciones ya que los cambios en un mdulo de servidor se reflejan en todas las aplicaciones que lo utilizan.
Subarchivo
Cola de datos I
En espera de peticiones
Programa servidor
El siguiente estado se especifica cuando un evento GUI solicita ms datos. (Consulte la Figura 109 en la pgina 418 para la interfaz de cliente.) Los tres eventos que desencadenan la subrutina de accin son: v Evento Create de la ventana v Evento Press del pulsador Ms... v Evento Pageend del subarchivo El programa cliente entonces espera datos de la cola de datos I. El programa servidor accede al archivo de base de datos y obtiene los datos.
422
Programa cliente
En espera de datos
Cola de datos I
Programa servidor
En el tercer estado, el programa servidor llena la cola de datos I. El programa cliente se activa y transfiere los datos al subarchivo. Despus, el programa regresa a su estado inicial y el proceso vuelve a empezar.
El programa servidor enva datos
rellenando subarchivo con datos Recibiendo datos
Programa cliente
Subarchivo
Recibiendo datos
Programa servidor
Enviando datos
La aplicacin de cliente
La interfaz de usuario es la misma que la de la anterior aplicacin, esencialmente un subarchivo que se llena con datos de una base de datos del servidor AS/400. El subarchivo empieza a llenarse con el evento Create de la ventana, y contina cuando se presiona el pulsador Ms... o se produce un evento Pageend utilizando las teclas de avance de pgina. Esencialmente, se trata de lo mismo que en el anterior ejemplo. La configuracin de las colas de datos se realiza en la subrutina de inicializacin *INZSR, que invoca un programa en el servidor para crear dos colas de datos en una biblioteca del sistema AS/400. Para crear colas de datos exclusivas para cada cliente, los cinco ltimos caracteres de la direccin IP se codifican en el nombre de la cola de datos. Los caracteres I u O al final del nombre de una cola de datos proporcionan los nombres exclusivos para las colas de datos de entrada o de salida. El trabajo del servidor recibe mandatos de la cola de datos O; los mandatos se envan a la cola de datos O desde el programa cliente.
Apndice B. Cmo escribir aplicaciones de cliente ligero
423
Una vez creadas las colas de datos, el programa cliente invoca el programa servidor y le pasa los dos nombres de colas de datos. El programa servidor espera que la cola de datos O le enve mandatos del programa cliente. El programa cliente se activa mediante eventos GUI y entonces enva peticiones a la cola de datos O. Entonces espera a que la cola de datos I se llene de datos procedentes del trabajo del servidor. Cuando el programa cliente recibe una peticin de finalizacin, se invoca la subrutina *TERMSR para indicar al programa servidor que debe terminar y se eliminarn las dos colas de datos.
424
D nrecords 2 0 D filler 20 D* lmite del bucle D custelem s 2 0 inz(%elem(CustDS)) D* indicador de que se ha alcanzado el fin de archivo D fileend s n D* parmetros para las API de cola de datos D msg_sz s 5 0 D Name_of_Q s 10 D Name_of_Lb s 10 D count s 2 0 D maxlen s 10 0 inz(%size(custds:*all)) D wait_time s 5 0
La subrutina de inicializacin Una vez se han creado las colas de datos RPG y la DATAQ del programa RPG servidor se ha iniciado, se invoca el programa mediante la palabra clave NOWAIT, con lo que el programa cliente no esperar a que acabe. Ambos programas estn funcionando de forma enteramente asncrona.
C* C* C* C* C C* C* C* C C* C* C C C C C C C C C C C C* C C C C C C C C C C C C* C C C C* C Subrutina de inicializacin empleada parar la configuracin del entorno servidor *inzsr begsr Obtener de la direccin IP con la que construir nombre exclusivos para las colas de datos entipadd contendr una direccin IP completa callp getHostName(enthname:entipadd) Nombre de construccin de las colas de datos 'I' y 'O' Agregar los 5 ltimos caracteres de la direccin IP a 'I' u 'O' eval qnameI= qname1 + %subst(entipadd:%len (%trim(entipadd))-5:5) + 'I' eval qnameO= qname1 + %subst(entipadd:%len (%trim(entipadd))-5: 5) + 'O' eval cmd=%trim(%trimr(cmd1) + qnamei + cmd2 + %editc(%size( CustDS:*all):'Z') + ')') Crear colas de datos call QCMDEXC 98 parm cmd parm cmdlen eval cmd=*blank eval cmd=%trim(%trimr(cmd1) + qnameo + cmd2 + %editc(%size( CustDS:*all):'Z') + ')') call QCMDEXC 98 parm cmd parm cmdlen Invocar el programa servidor para que acceda a la base de datos del servidor call DATAQ 98 parm qnamei parm qnameo Completada la inicializacin, ahora a procesar eventos endsr
La subrutina de accin
425
Se enva una peticin a la cola de datos O. Entonces el programa cliente espera una respuesta de la DATAQ del programa servidor, en la cola de datos I. Una vez recibidos los datos, el subarchivo se llena en un bucle.
C* C* C* C* C* C* C C* C C* C* C* C C C C C C C* C* C C C C C C C C C* C C C C C C C C* C C C C C C C* C C C C C C * C Se invoca la subrutina de accin desde: - Evento Press del pulsador PSBMORE - Evento Create de la ventana - Evento Pageend del subarchivo PSBmore begact PRESS win1 Mientras haya datos, debe obtenerse ms datos if not fileend Enviar peticin a la cola de datos 'O' para que obtenga ms datos eval nrecords=10 call QSNDDTAQ parm qnameo parm 'CWDATAQ' NAME_OF_LB 10 parm 23 MSG_SZ 5 0 parm rinfo Esperar datos de la cola de datos 'I' Esperar datos de proceso en DS rinfo eval wait_time=-1 eval MSG_sz=23 call QRCVDTAQ parm qnamei parm 'CWDATAQ ' NAME_OF_LB parm MSG_SZ parm rinfo parm WAIT_TIME Esperar los datos de la base de datos eval Msg_sz=%size(custds:*all) call QRCVDTAQ parm QNAMEI parm 'CWDATAQ ' NAME_OF_LB parm MSG_SZ parm CustDS parm WAIT_TIME Llenar el subarchivo con todos los registros que haya ledo el servidor eval count=1 dow count<=nrecords and not fileend count occur CustDS write sub1 eval count=count+1 enddo Si se ha indicado el fin de archivo, desactivar el pulsador if eof eval %setatr('win1': 'psbmore':'enabled')=0 eval fileend=*on endif endif fin de la subrutina de accin endact
Interrumpir la subrutina Se enva una peticin de interrupcin a la DATAQ del programa servidor y las dos colas de datos se eliminan.
C* Cuando la app del cliente finaliza, limpiar el entorno de servidor C* C *termsr begsr C* Indicar fin de programa al programa servidor y enviar datos a la DATAQ 'O'
426
C eval nrecords=0 C call QSNDDTAQ C parm qnameo C parm 'CWDATAQ' NAME_OF_LB C parm 23 MSG_SZ C parm rinfo C* Eliminar ambas colas de datos C eval cmd=*blank C eval cmd=%trim(%trimr(cmde) + C qnamei + ')') C call QCMDEXC C parm cmd C parm cmdlen C eval cmd=*blank C eval cmd=%trim(%trimr(cmde) + C qnameo + ')') C call QCMDEXC C parm cmd C parm cmdlen C* La aplicacin concluye C endsr
98 10 5 0
98
98
El programa servidor
Una vez se ha iniciado, entra en un bucle y espera a la cola de datos O hasta que recibe una peticin del programa cliente. En este ejemplo, son posibles dos peticiones diferentes. El programa determina qu peticin se ha enviado: la de enviar ms datos o la de finalizar. Para una peticin de ms datos leer 10 registros ms de la base de datos y enviar dos tems a la cola de datos I. El primer tem contiene informacin de proceso; cuntos registros se leyeron y si se ha producido una situacin de fin de archivo. El segundo tem contiene la estructura de datos de aparicin mltiple con los datos del archivo de la base de datos. El programa cliente recibir estos registros de la cola de datos I y llenar el subarchivo de acuerdo con ellos. Cuando el programa servidor recibe la seal de que se solicita una interrupcin, se activar el indicador LR y finalizar el bucle DO. Esto finalizar el programa. Cualquier otra operacin de limpieza ser gestionada por el programa cliente.
427
D msg_sz S 5 0 D wait_time s 5 0 D* nombre de las DATAQ pasadas desde el cliente D qnamei s 10 D qnameo s 10
Lnea principal del programa Procesar el bucle DO, esperar a la cola de datos O hasta que lleguen ms datos de la base de datos, enviar los datos a la cola de datos I y seguir esperando ms peticiones.
C* C C C C* C* C C* C C C C C C C C C* C* C* C C C C C C C C C C* C C C C C* C* C* C* C C C C C C* C C C C C C C* C* C C C* Principio de la lnea principal *entry plist parm qnamei parm qnameo El bucle DO se ejecuta constantemente hasta que el programa cliente le indica que se interrumpa dow not *inlr Esperar a que el programa cliente indique que necesita datos eval wait_time=-1 eval MSG_sz=23 call 'QRCVDTAQ' parm qnameo parm NAME_OF_LB parm MSG_SZ parm rinfo parm WAIT_TIME Leer 10 registros del archivo de la base de datos cuenta de registros = 0 significa que el programa cliente se est interrumpiendo if count >0 eval count=1 count occur CustDS read customer 9999 dow count<custelem and not *in99 eval count=count+1 count occur CustDS read customer 9999 enddo Determinar si hay ms datos en el archivo if *IN99 eval count=count-1 eval eof=*on endif Enviar informacin a la cola de datos Enviar un registro con informacin sobre cuntos registros se han ledo y si se ha alcanzado el fin de archivo call 'QSNDDTAQ' 98 parm QnameI parm NAME_OF_LB parm 23 MSG_SZ parm rinfo Enviar los datos en DS desde el archivo de la base de datos a DATAQ eval msg_sz=%SIZE(custds:*all) call 'QSNDDTAQ' 98 parm qnamei parm NAME_OF_LB parm MSG_SZ parm CUSTds Cuando finaliza el programa cliente, enva nrecords 0, entonces este programa acaba tambin else eval *inlr=*on
428
429
Este subarchivo slo tiene capacidad para 8 registros en pantalla debido a que cada registro ocupa dos filas del subarchivo. A continuacin puede ver el fuente del programa para esta aplicacin:
H* Programa para listar los registros del cliente F* Archivo Workstn que contiene DSPF Fgetrecs cf e workstn sfile(sub1:recnum) D* estructura de datos para pasar datos del programa servidor al subarchivo Dcust e ds extname(customer) occurs(8) D inz Deof s 1 inz(*off) Dnrecords s 2 0 Dfileend s 1 inz(*off) Dcount s 2 0 Dcustelem s 2 0 inz(%elem(cust)) Drecnum s 5 0 inz(1) * Programa principal para invocar la subrutina del subarchivo y * finalizar el programa * In91 indica que el archivo de la base de datos no ha alcanzado el final C EVAL *IN91=*ON C exsr more C eval *inlr=*on c C more BEGsr * Bucle para obtener ms datos y visualizarlos en un subarchivo C dow not *in03 * Invocar el programa servidor para que obtenga datos la primera vez * y cundo se utiliza el avance de pgina C if *in91 C call 'GETREC' C parm cust C parm custelem C parm eof C parm nrecords C eval count=1 * recnum1 es sbfrcdnbr en el registro de control del subarchivo, * para posicionar el primer registro que se visualizar en la pantalla C EVAL RECNUM1=RECNUM * Bucle para llenar un subarchivo con nuevos registros C dow count<=nrecords
430
C C C C C C C C C C C C C C C C C
* *
* *
occur cust write sub1 eval count=count+1 eval recnum=recnum+1 enddo Una vez se ha aadido el conjunto de registros al subarchivo, visualizarlo, adems del formato del encabezamiento y del pie de pgina write record1 write footer exfmt sub1ctl Ignorar las teclas de Av Pg else read sub1ctl 99 endif if eof=*on IN90 habilita la tecla Av Pg para que puedan leerse ms registros. Al final del archivo se inhabilita. eval *in90=*on eval recnum=recnum1 endif enddo Abandonar el bucle cuando se solicite Salir ENDSR
count
431
432
Asegrese de incluir la extensin .VPG en el nombre del archivo para que pueda beneficiarse de las funciones de interpretacin y comprobacin de sintaxis que incorpora el editor. Para ejecutar el compilador FVDFNFE, emita el mandato de compilador desde una lnea de mandatos de MS-DOS. La sintaxis del mandato es:
fvdfnfe nombrearchivo.VPG [/compilador_opcin1 ... /compilador_opcinn]
Nota: Debe incluir la extensin .VPG en el nombre del archivo fuente; no se da por supuesta. Las opciones del compilador, que puede escribir en maysculas o minsculas, son opcionales. stas son: Opcin Descripcin /BL nombre Nombre de la biblioteca de enlace. Si hubiera ms de una, delimite los nombres mediante comillas. /D Genera informacin de depuracin
/GL 1-99 Nivel de gravedad de generacin /L /LI /LX /LV /LD /LC /LE /LM2 /LS Genera un listado de salida Sangrado Genera un listado de referencias cruzadas (XREF) Genera un listado de referencias cruzadas visual (XREF) Expande DDS en listado Expande /COPY en listado Muestra referencias externas Muestra mensajes de segundo nivel en el listado Muestra las lneas excluidas en el listado
/LP 10-99 Lneas por pgina (listado) /HCU Habilita la antememoria en el sistema principal
Copyright IBM Corp. 1994, 2000
433
Renueva la antememoria en el sistema principal Corrije valores numricos Permite valor nulo
/RNU Permite valor nulo bajo control del usuario /RT /TI Trunca valores numricos Genera informacin de depuracin (igual que /D)
/SB Nombre Nombre de archivo de enlace SQL /SF XX Formato SQL para columnas de fecha y hora /SI XX (RR RS CS UR) nivel de aislamiento de SQL /SN Nombre Nombre de base de datos SQL /SP Nombre Nombre de archivo de paquete SQL /SR /SU /SUP /SVC /SVG Bloqueo de registro de SQL ID de usuario de base de datos Contrasea de base de datos Carcter de variable de conversin Grfico de variable de conversin
DEFINE_FILE
La sentencia DEFINE_FILE indica la ubicacin de los archivos definidos en las especificaciones F en el sistema AS/400. En este ejemplo, el archivo CUSTOMER en la especificacin F se refiere al archivo CUSTMAST en la biblioteca PRODUCT.
434
Si el archivo se encuentra en la lista de su biblioteca, puede omitir la sentencia DEFINE_FILE. En tal caso, la bsqueda se llevar acabo en la lista de biblioteca *LIBL. La palabra clave TEXT se utiliza para comentarios, por lo que puede estar en blanco.
435
436
Glosario
Este glosario incluye trminos y definiciones de: v El American National Dictionary for Information Systems ANSI X3.172-1990, copyright 1990 del American National Standards Institute (ANSI). Si desea adquirir una copia de esta publicacin debe dirigirse al American National Standards Institute, 1430 Broadway, New York, New York, 10018. Las definiciones se especifican mediante el smbolo (A) despus de las mismas. v El Information Technology Vocabulary desarrollado por el Subcomit 1, Comit Tcnico Conjunto 1, de International Organization for Standardization y el International Electrotechnical Committee (ISO/IEC JTC1/SC1). Las definiciones de las partes publicadas de este vocabulario se identifican mediante el smbolo (|) despus de las mismas; las definiciones tomadas de borradores de estndares internacionales, borradores del comit y trabajos no concluyentes desarrollados por ISO/IEC JTC1/SC1 se identifican mediante el smbolo (T) despus de las mismas, lo cual indica que an no se ha alcanzado un acuerdo definitivo entre los Organismos Nacionales integrantes del SC1. v IBM Dictionary of Computing, New York: McGraw-Hill, 1994. v Object-Oriented Interface Design IBM Common User Interface Guidelines, SC34-4399-00, Carmel, IN: Que Corporation, 1992.
A
accin. (1) Sinnimo de subrutina de accin. (2) Programa ejecutable o archivo de mandatos utilizado para manipular los componentes de un proyecto o participar en una construccin. accin por omisin. Accin que se efecta cuando se realiza otra como, por ejemplo, pulsar la tecla Intro. alias de servidor. Nombre al que da una definicin y que puede utilizarse en lugar del nombre del servidor. ancla. Cualquier componente que se utiliza como punto de referencia para alinear, dimensionar y espaciar otros componentes. anotaciones de error. Realiza un seguimiento de los errores en las anotaciones de error. El editor le lleva al lugar del cdigo fuente en el que se ha producido el error. API. Interfaz de programacin de aplicaciones. aplicacin. Un grupo de componentes de software utilizados para efectuar tareas de usuario especficas en un sistema. applet. Programa escrito en Java que se ejecuta dentro de un navegador compatible con Java o AppletViewer. archivo. Grupo de datos relacionados que se almacena y se recupera mediante un nombre asignado. Un archivo puede incluir informacin que inicia un programa (objeto de archivo de programa), contiene texto o grficos (objeto de archivo de datos) o procesa una serie de mandatos (archivo por lotes). archivo de mensajes. Archivo que contiene mensajes de aplicacin. Este archivo se crea a partir del archivo fuente de mensajes durante el proceso de construccin. Vase tambin construir. archivo de ondas. Archivo utilizado para sonidos audio en un dispositivo de forma de onda. archivo de Recurso de Presentacin de Informacin (IPF). Archivo en el que se almacena el fuente de la ayuda de la aplicacin. archivo MIDI. Archivo de la Interfaz Digital de Instrumentos Musicales.
437
archivos JAR (.jar). En Java, abreviatura de Java ARchive. Es un formato de archivo que se utiliza para agregar varios archivos en uno. rea comn. rea de almacenamiento proporcionada por el sistema para retener datos temporalmente. Los datos del rea comn estn disponibles para otras aplicaciones. rea de cliente. La parte de la ventana que es el espacio de trabajo del usuario donde ste teclea informacin y selecciona opciones de campos de seleccin. En ventanas primarias, el rea en la que un programador de aplicaciones presenta los objetos con los que trabaja el usuario. rea de informacin. Componente de una ventana en el que se visualiza informacin sobre el objeto o la opcin en los que se encuentra el cursor. El rea de informacin tambin puede incluir un mensaje sobre la conclusin normal de un proceso. Vase tambin barra de estado. rea de trabajo. rea utilizada para organizar objetos de acuerdo a las tareas del usuario. Cuando un usuario cierra un rea de trabajo, todas las ventanas abiertas a partir de objetos contenidos en el rea de trabajo se eliminan del lugar de trabajo. Arquitectura Common User Access (arquitectura CUA). Directrices para el dilogo entre una persona y una estacin de trabajo o un terminal. arquitectura CUA. Arquitectura de Acceso Comn de Usuario. arrastrar. Mover o copiar un objeto utilizando el ratn. Por ejemplo, un usuario puede arrastrar el borde de una ventana para hacerla ms grande pulsando un botn del ratn y mantenindolo pulsado mientras mueve el ratn. Vase tambin arrastrar y soltar. arrastrar y soltar. Manipular directamente un objeto movindolo y colocndolo en cualquier lugar utilizando el ratn. ASCII (American National Standard Code for Information Interchange). Cdigo estndar, que se compone de un juego de caracteres codificados de 7 bits (8 bits incluyendo comprobacin de paridad), que se utiliza para el intercambio de informacin entre sistemas de proceso de datos, sistemas de comunicacin de datos y equipo asociado. El juego de caracteres ASCII se compone de caracteres de control y caracteres grficos. (A) atenuado. Atenuacin del contraste visual de un componente que indica que el usuario no puede seleccionar ni manipular directamente ese componente.
B
barra de desplazamiento. Componente que muestra a un usuario que hay ms informacin disponible en una direccin determinada y que puede moverse para visualizar dicha informacin utilizando el ratn o las teclas de pgina. barra de estado. Componente de una ventana que visualiza informacin que indica el estado de la vista o del objeto actuales. Vase tambin rea de informacin. barra de herramientas. Men que contiene una o ms opciones grficas que representa las acciones que un usuario puede efectuar utilizando el ratn. barra de ttulos. rea en la parte superior de cada ventana que contiene el smbolo del men del sistema. base de datos. (1) Grupo de datos con una estructura determinada para aceptar, almacenar y proporcionar, previa peticin, datos para varios usuarios. (T) (2) Todos los archivos de datos almacenados en el sistema. Biblioteca de enlace dinmico (DLL). Archivo que contiene cdigo ejecutable y datos enlazados de manera lgica a un programa durante el tiempo de carga o el de ejecucin, en lugar de durante el enlace. Varias aplicaciones pueden compartir a la vez el cdigo y los datos de una biblioteca de enlace dinmico. BMP. Extensin de archivo de un archivo bitmap. borde de dimensionamiento. Borde de un marco alrededor de un componente (o conjunto de componentes) que selecciona para cambiar el tamao del componente (o del conjunto de componentes) utilizando el ratn o el teclado.
438
borde de seleccin. Borde visual que aparece alrededor de un componente de VARPG o de un componente creado por el usuario, que permite moverlo con el ratn o el teclado. botn. (1) Mecanismo en un dispositivo de puntero, como un ratn, utilizado para solicitar o iniciar una accin. (2) Mecanismo grfico en una ventana que, cuando se selecciona, produce una accin. Por ejemplo, el pulsador Aceptar que, al seleccionarse, inicia una accin. botn 1 del ratn. Por omisin, el botn izquierdo del ratn se utiliza para seleccionar. botn 2 del ratn. Por omisin, el botn derecho del ratn se utiliza para manipular. botn de manipulacin. Vase botn 2 del ratn. botn de maximizar. Botn en la parte ms a la derecha de una barra de ttulo sobre el que un usuario pulsa el botn del ratn para aumentar el tamao de la ventana lo mximo posible. Comprese con botn de minimizar y botn de ocultar. botn de minimizar. Botn ubicado junto al botn ms a la derecha en una barra de ttulo que reduce el tamao de la ventana lo mximo posible. Comprese con botn de maximizar y botn de ocultar. botn de ocultar. Botn en una barra de ttulo sobre el que un usuario pulsa el botn del ratn para suprimir una ventana del lugar de trabajo sin cerrarla. Cuando la ventana est oculta, el estado de la misma, indicado en la lista de ventanas, cambia. Comprese con botn de maximizar y botn de minimizar. botn de ratn. Mecanismo en un ratn para seleccionar opciones, iniciar acciones o manipular objetos con el puntero. Vase tambin botn 1 del ratn y botn 2 del ratn. botn de restaurar. Botn que aparece en la esquina ms a la derecha de la barra de ttulo despus de haber maximizado una ventana. Cuando se selecciona el botn de restaurar, la ventana vuelve a tener el tamao y la posicin que tena antes de que se maximizara. Vase tambin botn de maximizar. botn de seleccin. Vase botn 1 del ratn.
C
campo. (1) rea identificable en una ventana, como un campo de entrada, en la que un usuario escribe texto. (2) Grupo de bytes relacionados, como un nombre o una cantidad, que se trata como una unidad en un registro. campo de referencia. Campo de la base de datos de AS/400 cuyas caractersticas un componente campo de entrada puede heredar. campo de subarchivo. Campo utilizado para definir campos en un componente subarchivo. Vase tambin campo subarchivo. Capa de Sockets Segura (SSL). Esquema de seguridad de gran aceptacin desarrollado por Netscape Communications Corp. y RSA Data Security, Inc. SSL permite al cliente autenticarse en el servidor y cifrar todos los datos y peticiones. El URL de un servidor seguro protegido mediante SSL empieza por https en lugar de http. carpeta destino. Objeto en el que se coloca el icono que representa una aplicacin VARPG. catlogo de componentes. Espacio de almacenamiento para todos los componentes utilizados para crear interfaces grficas de usuario para aplicaciones VARPG. cliente. (1) Sistema que depende de un servidor para obtener datos. (2) La PWS donde se ejecutan las aplicaciones VARPG. Vase tambin cliente DDE. cliente DDE. Aplicacin que inicia una conversacin DDE. Comprese con servidor DDE. Vase tambin componente cliente DDE y conversacin DDE. cliente/servidor. Modelo de interaccin en el proceso de datos distribuidos en el que un programa en una ubicacin enva una peticin a un programa en otra ubicacin y espera una respuesta. El programa que efecta la peticin recibe el nombre de cliente; y el programa que responde, servidor. Vase tambin cliente, servidor, cliente DDE, servidor DDE.
Glosario
439
compilar. Convertir un programa fuente en un programa ejecutable (programa objeto). componente barra de desplazamiento horizontal. Componente que aade una barra de desplazamiento horizontal a una ventana. Este componente permite desplazarse por un panel de informacin de izquierda a derecha o viceversa. componente barra de desplazamiento vertical. Componente que aade una barra de desplazamiento vertical a una ventana. Este componente permite desplazarse por un panel de informacin verticalmente. componente barra de estado. Componente de una ventana que puede visualizar informacin adicional sobre un proceso o accin de la ventana. componente barra de mens. rea que est junto a la parte superior de la ventana, debajo de la barra de ttulo y encima del resto de la ventana, que contiene opciones que proporcionan acceso a otros mens. En VisualAge RPG, se seala y pulsa un componente barra de mens de la paleta de componentes o del catlogo de componentes y se suelta en una ventana de diseo. componente barra de progreso. Componente que se puede utilizar para indicar el progreso de un proceso como, por ejemplo, copiar archivos, cargar una base de datos, etc. de forma grfica. componente bena Java. Componente que permite a las aplicaciones VARPG acceder a los JavaBean de Sun Microsystem. componente botn de seleccin. Crculo con texto al lado. Los botones de seleccin se combinan para mostrar a un usuario un conjunto fijo de opciones de entre las que slo puede seleccionarse una. Cuando se selecciona una opcin, el crculo se rellena parcialmente. Puede sealar y pulsar un componente botn de seleccin de la paleta de componentes o del catlogo de componentes y soltarlo en una ventana de diseo. componente calendario. Componente que aade un calendario que puede ser modificado por el usuario para incluir texto, color u otros atributos. componente campo de entrada. rea de una pantalla donde un usuario pueden entrar informacin, a menos que el campo sea de slo lectura. Normalmente, los lmites de un campo de entrada estn indicados. En VisualAge RPG, se seala y pulsa un componente campo de entrada de la paleta de componentes o del catlogo de componentes y se suelta en una ventana de diseo. componente cliente DDE. Componente utilizado para intercambiar datos con otras aplicaciones como, por ejemplo, aplicaciones de hoja de clculo, que soportan el protocolo de intercambio de datos dinmico (DDE). componente *component. Componente que es la representacin de componente del componente lgico. Para cada componente lgico se crea un componente *component, que no se visualiza. componente contenedor. Componente que almacena registros relacionados y los visualiza en una vista de detalles, de icono o de rbol. componente control de animacin. Componente que permite reproducir archivos de vdeo, con la extensin AVI, en Windows, o reproducir secuencias GIF de animacin en aplicaciones Java. componente cuaderno. Representacin grfica de un cuaderno. Puede aadir pginas de cuaderno al componente cuaderno y agrupar las pginas en secciones separadas por separadores. En Windows, a veces se hace referencia al cuaderno como el control de separadores de Windows. Vase tambin componente pgina de cuaderno y componente pgina de cuaderno con lienzo. componente de activeX. Componente que aade objetos de control ActiveX al proyecto. Las aplicaciones VARPG pueden acceder as a los atributos y supervisar si hay eventos. componente definido por el usuario. Componente, que se compone de uno o ms componentes que ha personalizado, que guarda en la paleta de componentes o del catlogo de componentes para volver a utilizarlo. Cuando est en la paleta o en el catlogo, este componente se puede sealar y pulsar en la ventana de diseo tal como se hara con otro componente de VARPG. componente destino. Componente que, siempre que cambia el estado del componente fuente, recibe un evento link (de enlace) del componente fuente.
440
componente de subarchivo. Componente utilizado para visualizar una lista de registros que constan de varios campos. Este componente es similar a un subarchivo de AS/400. Vase tambin campo de subarchivo. componente edicin de mltiples lneas (MLE). Componente que representa un campo de entrada que permite al usuario entrar varias lneas de texto. componente elemento de men. Componente que es un elemento grfico o de texto en un men. Cuando el usuario desea trabajar con un objeto, selecciona un elemento de men. componente fuente. Componente que, siempre que cambia su estado, puede notificarlo a los componentes de destino. Un componente fuente puede tener varios destinos. componente graduador. Componente visual de una interfaz de usuario que representa una cantidad y su relacin con el rango de posibles valores para esa cantidad. El usuario tambin puede modificar el valor de la cantidad. Puede sealar y pulsar un componente graduador de la paleta de componentes o del catlogo de componentes y soltarlo en una ventana de diseo. componente grfica. Componente que permite al usuario aadir un grfico a la GUI. Los estilos de grfico disponibles son el diagrama de lneas, de barras, de lneas y barras y circular. componente imagen. Componente utilizado para visualizar una imagen, de un archivo BMP o ICO, en una ventana. componente lienzo. Componente en el que puede sealar y pulsar otros componentes, colocarlos y organizarlos para producir una interfaz grfica de usuario. El componente lienzo ocupa el rea de cliente de un componente ventana o de un componente pgina de cuaderno. Vase tambin componente pgina de cuaderno con lienzo y componente ventana con lienzo. componente lgico. Agrupacin funcional de archivos relacionados dentro de un proyecto. Se crea un componente lgica cuando las palabras clave NOMAIN y EXE no se encuentran en las especificaciones de control. componente lgico compartido. Componente lgico al que puede accederse a travs de ms de un proyecto. componente medios. Componente que proporciona a un programa la posibilidad de procesar archivos de sonido (.WAV) y archivos de vdeo (.MID). componente men emergente. Componente que, cuando se aade a un objeto en la interfaz, aparece junto al objeto con el que est asociado cuando se solicita. Puede sealar y pulsar un componente men emergente de la paleta de componentes o del catlogo de componentes y soltarlo en una ventana de diseo. componente odbc/jdbc. Componente que permite a las aplicaciones VAPRG acceder y procesar archivos de base de datos que den soporte a la API ODBC de Windows o la API JDBC de Sun Microsystem. componente pgina de cuaderno. A part used to add pages to a notebook part. Vase tambin cuaderno. componente pgina de cuaderno con lienzo. Combinacin del componente cuaderno y del componente pgina con lienzo. Vase tambin cuaderno y componente lienzo. componente panel de medios. Componente utilizado para proporcionar al usuario control sobre otros componentes. Por ejemplo, un componente panel de medios puede utilizarse para controlar el volumen de un componente medios. componente pulsador. Botn etiquetado con texto que representa una accin que se inicia cuando un usuario selecciona el pulsador. Puede sealar y pulsar un componente pulsador de la paleta de componentes o del catlogo de componentes y soltarlo en una ventana de diseo. Vase tambin componente pulsador grfico. componente pulsador grfico. Pulsador, etiquetado con un grfico, que representa una accin que se inicia cuando un usuario la selecciona. Comprese con componente pulsador. componente recuadro de contorno. Componente que es un recuadro rectangular colocado alrededor de un grupo de componentes para indicar que todos los componentes estn relacionados. componente recuadro de grupo. Marco rectangular alrededor de un grupo de controles que indica que estn relacionados y que proporciona una etiqueta optativa para el grupo. En VisualAge RPG, se seala y pulsa un componente recuadro de grupo de la paleta de componentes o del catlogo de componentes y se suelta en una ventana de diseo.
Glosario
441
componente recuadro de lista. Control que contiene opciones desplazables que un usuario puede seleccionar. En VisualAge RPG, se seala y pulsa un componente recuadro de lista de la paleta de componentes o del catlogo de componentes y se suelta en una ventana de diseo. componente recuadro de seleccin. Recuadro de seleccin con texto asociado que representa una opcin. Cuando un usuario selecciona una opcin, aparece un indicador en el recuadro de seleccin que indica que la opcin est seleccionada. El usuario puede eliminar la marca del recuadro de seleccin volviendo a seleccionar la opcin. En VisualAge RPG, se seala y pulsa un componente recuadro de seleccin de la paleta de componentes o del catlogo de componentes y se suelta en una ventana de diseo. componente referencia a componente lgico. Componente que permite que un componente lgico se comunique con otro en una aplicacin VARPG. componentes. Objetos que componen la GUI de una aplicacin VARPG. componente selector cclico. Tipo de campo de entrada que muestra un anillo de opciones relacionadas, pero que se excluyen mutuamente, por el que un usuario puede desplazarse y seleccionar una opcin. El usuario tambin puede teclear una opcin vlida en el campo de entrada. Puede sealar y pulsar un componente selector cclico de la paleta de componentes o del catlogo de componentes y soltarlo en una ventana de diseo. componente subarchivo de mensajes. Componente que puede visualizar mensajes predefinidos o texto suministrado en la lgica del programa. componente submen. Componente utilizado para iniciar un submen a partir de un elemento de men o de un men existente, o para iniciar un men desplegable a partir de un elemento de men en una barra de men. Vase tambin submen y componente elemento de men. componente temporizador. Componente utilizado para hacer un seguimiento del intervalo de tiempo entre dos eventos y activar el segundo evento cuando ha transcurrido el intervalo. componente texto esttico. Componente utilizado como etiqueta para otros componentes, como solicitud para un componente campo de entrada. componente ventana. rea con lmites visibles que representa una vista de un objeto o con la que un usuario mantiene un dilogo con un sistema. Puede sealar y pulsar un componente ventana de la paleta de componentes o del catlogo de componentes y soltarlo en la ventana de proyectos. componente ventana con lienzo. Combinacin del componente ventana y del componente lienzo. Vase tambin componente ventana y componente lienzo. comprobacin de sintaxis. Verifica que la sintaxis de cada lnea sea correcta mientras se edita el cdigo fuente. Con ello pueden evitarse errores de compilacin. Esta opcin puede activarse o desactivarse. Puede visualizarse slo determinados tipos de especificacin, como especificaciones C, o una lnea con una serie especfica. Conectividad de Baes de Datos Java (JDBC). Estndar del sector para la conectividad independiente de la base de datos entre Java y una amplia gama de bases de datos. JDBC proporciona una interfaz de programacin de aplicaciones (API) a nivel de llamada para el acceso a bases de datos basado en SQL. conector. Funcin creada por el usuario o un proveedor externo que se puede utilizar en los programas VARPG. CONFIG.SYS. Archivo de configuracin, ubicado en el directorio raz de la unidad de arranque, para los sistemas operativos DOS, OS/2 o Windows. Contiene informacin necesaria para instalar y ejecutar hardware y software. configuracin. Manera en que el hardware y el software de un sistema de proceso de informacin estn organizados y se conectan entre s (T). construir. Proceso por el que las diversas partes de un cdigo fuente que forman los componentes lgicos de una aplicacin VARPG se compilan y enlazan para producir una versin ejecutable de la aplicacin. conversacin DDE. El intercambio de datos entre un cliente DDE y un servidor DDE. Vase tambin conversacin de enlace esttico y conversacin de enlace dinmico. conversacin de enlace dinmico. En DDE, actualizacin automtica de un programa cliente por un programa servidor cuando los datos cambian en el servidor. Comprese con conversacin de enlace esttico
442
conversacin de enlace esttico. En DDE, peticin explcita efectuada por un programa cliente a un programa servidor. El programa servidor responde a la peticin. Comprese con conversacin de enlace dinmico. cuaderno de propiedades. Representacin grfica que se asemeja a un cuaderno enlazado que contiene pginas separadas en secciones por pginas separadoras. Seleccione los separadores de un cuaderno para ir de una seccin a otra. cursor. Indicacin visible de la posicin en la que aparecer la interaccin de usuario con el teclado.
D
DBCS. Juego de caracteres de doble byte. DDE. Intercambio de datos dinmico. definicin de interfaz de procedimiento. Repeticin de la informacin prototipo dentro de la definicin de un procedimiento. Se utiliza para declarar los parmetros de entrada para el procedimiento y para garantizar que la definicin interna del procedimiento es coherente con la definicin externa (el prototipo) directorio destino. Directorio en el que se almacena la aplicacin VARPG compilada despus de una creacin. Comprese con carpeta destino. directorio fuente. Directorio en el que se almacenan todos los archivos fuente para una aplicacin VARPG. Diseador GUI. Conjunto de herramientas utilizadas para crear interfaces arrastrando y soltando componentes de la paleta de componentes a la ventana de diseo. DLL. Biblioteca de enlace dinmico. doble pulsacin. Pulsar un botn dos veces rpidamente.
E
EBCDIC. Cdigo de intercambio decimal binario ampliado. Juego de caracteres de 256 caracteres de 8 bits. edicin directa. Utilizacin de procedimientos que permiten a un usuario trabajar con un objeto arrastrndolo con un ratn o interactuando con su men emergente. elemento. En intercambio de datos dinmico, una unidad de datos. Por ejemplo, la posicin de la casilla superior izquierda en una hoja de clculo es fila 1, columna 1. Se puede hacer referencia a la posicin de la casilla como el elemento R1C1. eliminar referencia. Accin de suprimir la asociacin entre un componente y un campo de base de datos de AS/400. nfasis. Resaltado del cambio de color u otra indicacin visible de condiciones relativas a un objeto o una opcin que afecta a la capacidad del usuario de interactuar con ese objeto u opcin. El nfasis tambin puede proporcionar a un usuario informacin adicional sobre el estado de una opcin o un objeto. entrada/salida (E/S). Datos proporcionados al sistema o datos que resultan del proceso del sistema. estacin de trabajo. Dispositivo que permite a un usuario efectuar trabajos. Vase tambin estacin de trabajo programable. estacin de trabajo programable (PWS). Estacin de trabajo que tiene posibilidades de proceso y que permite a un usuario modificar sus funciones. evento. Seal generada como resultado de una modificacin en el estado de un componente. Por ejemplo, al accionar un pulsador se genera el evento Press. evento de enlace. Evento que un componente destino recibe siempre que cambia el estado de un componente fuente.
Glosario
443
excepcin. (1) En lenguajes de programacin, una situacin anormal que se da durante la ejecucin, que puede ocasionar una desviacin de la secuencia normal de ejecucin, para la que existen recursos en los lenguajes de programacin a fin de definirla, activarla, reconocerla, ignorarla y manejarla. (I) (2) En VisualAge RPG, un evento o situacin que impide, o puede impedir, que una accin solicitada por un usuario concluya tal como ste espera. Las excepciones tienen lugar cuando un producto no puede interpretar la entrada de un usuario. EXE. Extensin de un archivo ejecutable. exportar. Funcin que convierte un archivo interno en un formato de archivo estndar para utilizarlo fuera de la aplicacin. Comprese con importar.
F
foco. Sinnimo de foco de entrada. foco de entrada. rea de una ventana en la que la interaccin del usuario puede tener lugar desde el teclado o desde el ratn.
I
ICO. Extensin de archivo de un archivo de icono. icono. Representacin grfica de un objeto, que se compone de una imagen, un fondo de imagen y una etiqueta. importar. Funcin que convierte objetos de archivo de pantalla de AS/400 al componente VARPG adecuado. Comprese con exportar. indicador de progreso. Uno o ms controles utilizados para informar a un usuario sobre el curso de un proceso. ndice. Identificador de una entrada en componentes de VARPG como, por ejemplo, recuadros de lista o recuadros de combinacin. INI. Extensin de archivo para un archivo del sistema operativo OS/2 o Windows que contiene informacin especfica de la aplicacin que necesita conservarse de una llamada de una aplicacin a otra. intercambio de datos dinmicos (DDE). Intercambio de datos entre programas o entre un programa y un objeto de archivo de datos. Cualquier cambio efectuado en la informacin de un programa o una sesin se aplica a los datos idnticos creados por el otro programa. Vase tambin conversacin DDE, cliente DDE y servidor DDE. Interfaz de programacin de aplicaciones (API). Interfaz funcional suministrada por el sistema operativo o un programa bajo licencia que se solicita por separado, que permite que un programa de aplicacin escrito en un lenguaje de alto nivel pueda utilizar datos o funciones especficas del sistema operativo o del programa bajo licencia. interfaz de usuario grfica (GUI). Tipo de interfaz de usuario que proporciona las ventajas de los grficos de alta resolucin. Una interfaz grfica de usuario incluye una combinacin de grficos, el paradigma de accin de objeto, el uso de dispositivos de puntero, barras de men y otros mens, solapamiento de ventanas e iconos. Interfaz Nativa de Java (JNI). Interfaz de programacin que permite al cdigo Java que se ejecuta dentro de una Mquina Virtual Java (JVM) interoperar con las funciones escritas en otros lenguajes de programacin. IPF. Recurso de Presentacin de Informacin.
J
Java. Lenguaje de programacin orientado a objeto para cdigo interpretado porttil que soporta la interaccin entre objetos remotos. Java y sus especificaciones han sido desarrolladas por Sun Microsystems, Incorporated. JavaBean. En Java, un modelo de componente reutilizable, porttil e independiente de la plataforma. Java Runtime Environment (JRE). Subconjunto del Kit de desarrollo Java para los usuarios finales y desarrolladores que deseen redistribuir el JRE. El JRE consiste en la Mquina Virtual Java, las Clases de Ncleo de Java y los archivos de soporte.
444
Java 2 Software Development Kit (J2SDK). Software que distribuye Sun Microsystems a los desarrolladores de Java. Este software incluye el interpretador Java, clases Java y herramientas de desarrollo Java. Las herramientas de desarrollo incluyen un compilador, un depurador, un desensamblador, un AppletViewer, un generador de archivos de apndice y un generador de documentacin. juego de caracteres de doble byte (DBCS). Juego de caracteres en el que cada carcter se representa mediante 2 bytes. Algunos idiomas como el japons, el chino o el coreano, que contienen ms smbolos de los que pueden representarse mediante los 256 puntos de cdigo, necesitan el juego de caracteres de doble byte. Puesto que cada carcter necesita 2 bytes, la escritura, la visualizacin y la impresin de caracteres DBCS necesita hardware y programas que soporten DBCS. El sistema soporta cuatro juegos de caracteres de doble byte: japons, coreano, chino simplificado y chino tradicional. Comprese con juego de caracteres de un solo byte (SBCS). juego de caracteres de un solo byte (SBCS). Juego de caracteres en el que cada carcter se representa mediante un byte. Comprese con juego de caracteres de doble byte (DBCS).
L
lnea de ejecucin. La unidad ms pequea de operacin que puede efectuarse dentro de un proceso. lista desplegable. Campo de una sola seleccin en el que slo puede verse la opcin actual. Las dems opciones permanecen ocultas hasta que el usuario realiza una accin especfica para visualiza el recuadro de lista que las contiene. lugar de trabajo. rea que ocupa toda la pantalla y contiene todos los objetos que componen la interfaz del usuario.
M
Mquina Virtual Java (JVM). La parte del Java Runtime Environment (JRE) responsable de interpretar bytecodes de Java. marcador de grupo. Marcador que identifica un componente como el primero de un grupo. Cuando el usuario desplaza el cursor por un grupo de componentes y llega al ltimo, el cursor vuelve a la primera parte del grupo. mensaje. (1) Informacin no solicitada por un usuario pero visualizada por un producto como respuesta a un evento no esperado o cuando se produce algo no deseado. (2) Comunicacin enviada por una persona o un programa a otra persona u otro programa. men. Lista de opciones que pueden aplicarse a un objeto. Un men puede contener opciones que no estn disponibles para ser seleccionadas en determinados contextos. Estas opciones estn atenuadas. men desplegable. Men que aparece al seleccionar una opcin en una barra de men o a partir del smbolo del men del sistema. Las opciones de un men desplegable estn relacionadas entre s. men emergente. Men que, cuando se solicita, aparece junto al objeto con el que est asociado. Contiene opciones adecuadas para el objeto en su contexto actual. MID. Extensin de archivo de un archivo MIDI. migrar. (1) Mover a un sistema operativo modificado, generalmente a un nuevo release o versin de un sistema. (2) Mover datos desde una jerarqua de almacenamiento a otra. mdulo EXE. Un mdulo EXE consta de un procedimiento principal y subprocedimientos. Se crea cuando la palabra clave EXE est presente en la especificacin de control. Todas las subrutinas (BEGSR) deben ser locales a un procedimiento. El EXE debe contener un procedimiento cuyo nombre coincida con el nombre del archivo fuente. Este ser el punto de entrada principal para el EXE; es decir, el procedimiento principal. mdulo NOMAIN. Mdulo que contiene solamente subprocedimientos. No contiene ninguna accin o subrutina de usuario autnoma. Un mdulo NOMAIN se crea cuando la palabra clave NOMAIN se encuentra en la especificacin de control.
Glosario
445
N
nemotcnico. Un solo carcter, dentro del texto de una opcin, identificado por un subrayado debajo de l. Vase tambin seleccin nemotcnica. nivel del graduador. Indicador visual en el graduador que un usuario puede mover para modificar el valor numrico.
O
objeto. (1) Espacio de almacenamiento con nombre que consiste en un conjunto de caractersticas que describen el espacio de almacenamiento en s y, en algunos casos, datos. Un objeto es algo que existe en el almacenamiento y ocupa parte de su espacio, y en el que se pueden efectuar operaciones. Algunos ejemplos de objetos son: programas, archivos, bibliotecas y carpetas. (2) Componente visual de una interfaz de usuario con el que un usuario puede efectuar una tarea. Un objeto puede aparecer como texto o como un icono. objeto de datos. Objeto que transporta informacin, como texto, grficos, audio o vdeo.
P
paleta de colores. Conjunto de colores que puede utilizarse para cambiar el color de cualquier componente en la GUI de la aplicacin. paleta de componentes. El grupo de componentes ms adecuado para construir la interfaz grfica de usuario actual para una aplicacin. Cuando finaliza la GUI, puede vaciar la paleta y aadir los componentes del catlogo de componentes que necesite para la siguiente aplicacin. paleta de fonts. Conjunto de fonts que puede utilizarse para cambiar el font de un componente en la GUI de la aplicacin. panel de navegacin. Grupo de botones que se pueden utilizar para controlar la seleccin visible de registros en un subarchivo. paquete. Funcin utilizada para reunir todos los componentes de una aplicacin VARPG para su distribucin. paradigma accin-objeto. Patrn de interaccin en el que un usuario selecciona un objeto y a continuacin selecciona una accin para aplicarla a ese objeto. procedimiento. Un procedimiento es cualquier parte del cdigo a la que pueda llamarse mediante la operacin CALLP. procedimiento principal. Un procedimiento principal es un subprocedimiento que puede especificarse como procedimiento de entrada del programa y que recibe el control cuando se le llama por primera vez. El procedimiento principal slo se genera cuando se crea un EXE. Consulte mdulo EXE programacin orientada a objetos. Mtodo para estructurar programas como clases organizadas jerrquicamente que describen los datos y las operaciones de objetos que pueden interactuar con otros objetos. (T) programa destino. Objeto que el proyecto ha de crear, como una biblioteca de enlace dinmico (DLL). programa de utilidad DLL. Vase mdulo NOMAIN programa objeto. Programa destino adecuado para ser ejecutado. Un programa objeto puede o no necesitar enlace. (T) prototipo. Un prototipo es una definicin de la interfaz de llamadas. Incluye informacin como, por ejemplo, si la llamada est enlazada (procedimiento) o es dinmica (programa), el nombre externo, el nmero y la naturaleza de los parmetros, qu parmetros deben ser pasados y el tipo de datos de cualquier valor de retorno (para un procedimiento) proyecto. Conjunto de datos y acciones completo necesarios para construir un destino nico, como una biblioteca de enlace dinmico (DLL) o un archivo ejecutable (EXE).
446
pulsar. Pulsar y liberar un botn del ratn sin mover el puntero fuera de la opcin o del objeto. Vase tambin doble pulsacin. puntero del ratn. Sinnimo de cursor. PWS. Estacin de trabajo programable.
R
ratn. Dispositivo con uno o ms pulsadores que se utilizan para colocar un puntero en la pantalla sin usar el teclado. Se utiliza para seleccionar una opcin o una funcin que se ha de efectuar o para llevar a cabo operaciones en la pantalla, como dibujar lneas y arrastrarlas de una posicin a otra. recuadro de combinacin. Control que combina las funciones de un campo de entrada y de un recuadro de lista. Un recuadro de combinacin contiene una lista de objetos por los que el usuario puede desplazarse y seleccionar para completar el campo de entrada. Si lo desea, el usuario tambin puede escribir texto directamente en el campo de entrada. En VisualAge RPG, se seala y pulsa un componente recuadro de combinacin de la paleta de componentes o del catlogo de componentes y se suelta en una ventana de diseo. recuadro de combinacin desplegable. Tipo de recuadro de combinacin en la que un recuadro de lista est oculto hasta que un usuario realiza una accin especfica para visualizarlo. Recurso de Presentacin de Informacin (IPF). Herramienta utilizada para crear ayuda en lnea en una estacin de trabajo programable. resaltado de smbolos. Mejora la legibilidad del cdigo. Puede configurar el resaltado de diferentes elementos del lenguaje con diferentes colores o fonts para identificar las estructuras del programa. Puede activar o desactivar el resaltado de smbolos.
S
SBCS. Juego de caracteres de un solo byte. seccin fuente principal. En un programa VARPG, la seccin que contiene todas las definiciones globales para un mdulo. Para un componente lgico, esta seccin tambin incluye la accin y las subrutinas de usuario. seleccin nemotcnica. Mtodo de seleccin en el que un usuario selecciona una opcin tecleando el nemotcnico de esa opcin. sealar y pulsar. (1) Mtodo de seleccin que se utiliza para copiar un componente de la paleta o el catlogo de componentes en la ventana de diseo, la vista de iconos o la vista de rbol de la GUI. (2) Para colocar un componente en cualquiera de las vistas, seale y pulse el componente; despus, mueva el cursor a la ventana elegida y seale y suelte el componente donde desea que aparezca. En las vistas de iconos y de rbol, el componente se colocar en el componente padre, y tendr que moverlo al lugar donde le interese que aparezca en la ventana de diseo. servidor. Sistema de una red que maneja las peticiones de otro sistema, llamado cliente. servidor DDE. Aplicacin que proporciona datos a otra aplicacin habilitada por DDE. Comprese con cliente DDE. Vase tambin conversacin DDE. sistema operativo. Grupo de programas del sistema que controlan la operacin general de un sistema. solicitud. (1) Mensaje visual o audible enviado por un programa para solicitar la respuesta de un usuario. (T) (2) Smbolo o mensaje que se visualiza para solicitar una entrada del usuario o proporcionar informacin operativa. El usuario debe responder a la solicitud para poder proseguir. SSL. Capa de Sockets Segura. submen. Men que aparece al seleccionar una opcin en cascada en otro men y que contiene opciones relacionadas con dicho men. Los submens se utilizan para reducir la longitud de un men desplegable o de un men emergente. Vase tambin componente submen.
Glosario
447
subprocedimiento. Procedimiento especificado despus de la seccin fuente principal. Debe tener un prototipo correspondiente en las especificaciones de definicin de la seccin fuente principal. subrutina de accin. Lgica que se escribe para responder a un evento especfico.
T
tema. En intercambio de datos dinmico (DDE), el juego de datos que es el sujeto de una conversacin DDE. tope de tabulador. Atributo utilizado para establecer un tope de tabulador para un componente de manera que los usuarios pueden proporcionarle foco cuando utilizan el tabulador para moverse por la interfaz.
V
valor por omisin. Valor que el sistema o un programa proporciona o presupone automticamente cuando el usuario no especifica ninguno. El valor por omisin puede asignarse a un pulsador o a un pulsador grfico. ventana activa. Ventana con la que un usuario interacta actualmente. Esta es la ventana que recibe la entrada del teclado. ventana de diseo. Ventana en el diseador GUI en la que se colocan componentes para crear una interfaz de usuario. ventana emergente. Ventana movible, de tamao fijo, en la que un usuario proporciona informacin necesaria para una aplicacin de manera que puede continuar procesando una peticin de usuario. Sinnimo de ventana secundaria. ventana inactiva. Ventana que no puede recibir entrada de teclado en un momento dado. ventana primaria. Ventana en la que tiene lugar la interaccin principal entre el usuario y la aplicacin. Sinnimo de ventana principal. ventana principal. Vase ventana primaria. ventana secundaria. Ventana que contiene informacin que depende de la informacin de una ventana primaria y se utiliza para complementar la interaccin en dicha ventana. Vase tambin ventana primaria. Sinnimo de ventana emergente. vista de rbol. Visualizacin del contenido de un objeto de manera jerrquica. vista de detalles. Vista de contenido estndar en la que un icono pequeo se combina con texto para proporcionar informacin descriptiva sobre un objeto. vista de iconos. Vista de contenido estndar en la que cada objeto contenido en un contenedor se visualiza como un icono.
W
WAV. Extensin de archivo de un archivo de ondas.
448
Bibliografa
Para obtener informacin adicional sobre temas relacionados con VisualAge RPG y CODE (Cooperative Development Environment) para AS/400, consulte las siguientes publicaciones de IBM: Manuales de WebSphere Development Tools para AS/400: *Nota: Se han actualizado todas las versiones en lnea de las publicaciones de WebSphere Development Tools para AS/400. Las publicaciones cuyo nmero de pedido est marcado con un asterisco (*) no se han vuelto a imprimir en este release. v Iniciacin a VisualAge RPG y CODE/400, SC10-3287-01 (SC09-2625-01), proporciona informacin sobre WebSphere Development Tools para AS/400, dando una visin general de las caractersticas de CODE/400 y VARPG, de cmo funcionan juntas y de las ventajas empresariales que se obtienen al utilizarlas. Manuales de VisualAge RPG: v Iniciacin a VisualAge RPG y CODE/400, SC10-3287-01 (SC09-2625-01)*, describe los conceptos y las tareas de VARPG que se realizan mientras se utiliza VisualAge RPG. v VisualAge RPG Manual de consulta del lenguaje, SC10-3066-01 (SC09-2451-01)*, proporciona informacin de consulta sobre el lenguaje y el compilador de VARPG. v VisualAge RPG Manual de consulta de componentes, SC10-3065-02 (SC09-2450-02)*, proporciona una descripcin de cada componente, atributo de componente, evento de componente, atributo de componente y atributo de evento de VARPG. Es un manual de consulta para todos aquellos que desarrollan aplicaciones con VisualAge RPG. v Programacin con VisualAge para RPG, SC10-3067-02 (SC09-2449-02)*, contiene informacin especfica sobre cmo crear aplicaciones con VisualAge RPG. Describe los pasos que debe seguir en cada fase del ciclo de desarrollo de la aplicacin, desde el diseo hasta el empaquetado y la distribucin. Se incluyen ejemplos de programacin para clarificar los conceptos y el proceso de desarrollo de aplicaciones VARPG. v Java for RPG Programmers es una introduccin al lenguaje Java (y RPG IV) mediante la comparacin con el lenguaje RPG. Se trata de un comienzo muy apropiado en el mundo de Java. Tambin incluye una gua de aprendizaje interactiva en formato CD sobre Java y VisualAge para Java, mediante MINDQ. v Experience RPG IV Tutorial es una gua de aprendizaje interactiva en formato CD que ensea RPG IV e ILE, paso a paso y de un modo divertido. Se trata de un manual con preguntas y ejercicios que ayudan a adquirir experiencia prctica con esta nueva y apasionante versin de RPG. v Otra publicacin que no es de IBM interesante para los usuarios de VisualAge RPG es VisualAge for RPG by Example. Informacin y publicaciones del AS/400: v Si tiene acceso a Internet, puede obtener otra informacin y publicaciones del AS/400 en uno de los siguientes sitios Web:
http://www.as400.ibm.com/infocenter http://publib.boulder.ibm.com/pubs/html/as400/infocenter.htm
449
Para obtener una versin en copia software de las publicaciones de AS/400, consulte la publicacin CD-ROM AS/400e Biblioteca en soporte software, SK3T-1325-04 (SK3T-0118-04). Manuales de Gestor para el Desarrollo de Aplicaciones ADM: v ADTS/400: Gestor para el Desarrollo de Aplicaciones ADM Introduccin y gua de planificacion, GC10-9401-00 (GC09-1807-00), describe los conceptos bsicos y la planificacin necesaria para hacer un uso efectivo de la funcin Gestor para el Desarrollo de Aplicaciones ADM. v ADTS/400: Gestor para el Desarrollo de Aplicaciones ADM Gua del Usuario, SC10-9609-01 (SC09-2133-01), describe cmo crear y gestionar proyectos definidos para la funcin Gestor para el Desarrollo de Aplicaciones ADM. v ADTS/400: Gestor para el Desarrollo de Aplicaciones ADM Gua de autoaprendizaje, SC10-9610-00 (SC09-2138-00), proporciona experiencia prctica en la utilizacin de la funcin Gestor para el Desarrollo de Aplicaciones ADM del producto ADTS para OS/400. Esta gua muestra cmo utilizar la funcin Gestor para el Desarrollo de Aplicaciones ADM guindole a travs de una serie de ejercicios paso a paso. v ADTS/400: Application Development Manager API Reference, SC09-2180-00, describe cmo los programadores de aplicaciones pueden escribir su propia interfaz para la funcin Gestor para el Desarrollo de Aplicaciones ADM. Manual Recurso de presentacin de informacin (IPF): v Information Presentation Facility Programming Guide G25H-7110, describe los elementos que componen el IPF (Recurso de presentacin de informacin). IPF es una herramienta que soporta el diseo y el desarrollo de documentos en lnea y de recursos de ayuda en lnea. Manuales de SQL: v IBM SQL Reference Version 2 SC26-8416, Volumen 2, compara los recursos de DB2 SQL/DS DB2/400 DB2/6000 IBM SQL ISO-ANSI (SQL92E) X/Open (XPG4-SQL). v DB2 Universal Database Administration Guide S10J-8157, proporciona la informacin necesaria para utilizar y administrar el producto DB2. v DB2 Universal Database Embedded SQL Programming Guide S10J-8158, describe cmo disear y codificar programas de aplicacin para acceder a los servidores de la familia DB2 Client/Server (como DB2 o DB2/400). Contiene informacin detallada sobre la utilizacin del SQL (Lenguaje de Consulta Estructurada) y llamadas de API en las aplicaciones.
450
Avisos
Esta informacin se ha elaborado para productos y servicios que se ofrecen en Estados Unidos. Es posible que IBM no ofrezca todos los productos, servicios o caractersticas que se tratan en este documento en otros pases. Consulte con el representante local de IBM para obtener informacin sobre los productos y servicios que estn disponibles en su rea en la actualidad. Ninguna referencia hecha en esta publicacin a un producto, programa o servicio de IBM pretende afirmar ni implicar que slo pueda utilizarse dicho producto, programa o servicio de IBM. Puede utilizarse cualquier producto, programa o servicio funcionalmente equivalente y que no infrinja ninguno de los derechos de propiedad intelectual de IBM. Sin embargo, es responsabilidad del usuario evaluar y verificar el funcionamiento de los productos, programas o servicios que no sean de IBM. IBM puede tener patentes o solicitudes de patente pendientes acerca del tema de este documento. La entrega de este documento no le otorga ninguna licencia sobre dichas patentes. Puede enviar consultas sobre licencias, por escrito, a: Director of Licensing Intellectual Property & Licensing International Business Machines Corporation North Castle Drive, MD - NC119 Armonk, New York 10504-1785 EE.UU. El siguiente prrafo no es aplicable en el Reino Unido ni en ningn otro pas donde tales estipulaciones sean contradictorias con la legislacin local: INTERNATIONAL BUSINESS MACHINES CORPORATION PROPORCIONA ESTA PUBLICACIN TAL CUAL, SIN NINGN TIPO DE GARANTA, EXPLCITA O IMPLCITA, INCLUYENDO, PERO SIN LIMITARSE A, LAS GARANTAS IMPLCITAS DE NO VULNERACIN, COMERCIALIZACIN E IDONEIDAD PARA UNA FINALIDAD DETERMINADA. En determinados pases no se permite la declaracin de limitacin de responsabilidad de las garantas expresas ni implcitas en determinadas transacciones, por lo tanto, esta declaracin puede no ser procedente en su caso. Esta informacin puede contener inexactitudes tcnicas o errores tipogrficos. Se efectan cambios peridicos en la informacin contenida en este documento; tales cambios se incorporarn en nuevas ediciones de la publicacin. IBM puede hacer mejoras y/o modificaciones en los productos y/o programas descritos en esta publicacin en cualquier momento sin previo aviso. Las referencias hechas en esta informacin a pginas Web de terceros se proporcionan slo como gentileza para los usuarios y de ninguna manera puede interpretarse que IBM avala esas pginas Web. El material de estas pginas Web no forma parte del material para este producto de IBM y el usuario ser el nico responsable del uso de estas ubicaciones Web. Los poseedores de una licencia de este programa que deseen obtener informacin al respecto con el fin de permitir: (i) el intercambio de informacin entre programas creados de manera independiente y otros programas (incluido ste) y (ii) la utilizacin mutua de la informacin que se ha intercambiado, deben ponerse en contacto con IBM en la siguiente direccin:
451
IBM Canada Ltd. Department 071 1150 Eglinton Avenue East Toronto, Ontario M3C 1H7 Canad Dicha informacin estar disponible de acuerdo con los trminos y condiciones oportunos, que en algunos casos puede incluir el pago de una cantidad. IBM proporciona el programa bajo licencia descrito en esta informacin y todo el material bajo licencia disponible para l segn los trminos del Contrato de Cliente IBM, Contrato de Licencia de Programa Internacional IBM o cualquier contrato equivalente entre IBM y el cliente.
Java y todas las marcas registradas derivadas de Java son marcas registradas de Sun Microsystems, Inc. en Estados Unidos y/u otros pases. Lotus es marca registrada de Lotus Development en Estados Unidos y/u otros pases. ActiveX, Microsoft, Windows y Windows NT son marcas registradas de Microsoft Corporation en Estados Unidos y/o en otros pases. Otros nombres de empresas, productos y servicios pueden ser marcas registradas o marcas de servicio de terceros.
452
99
99
A
acceso a archivos de imgenes en tiempo de construccin 234 actualizar registro de subarchivo para componentes subarchivo 153 AddItemEnd, atributo 145 AddMsgId, atributo 106 AddMstTxt, atributo 106 AddRcd, atributo 65 agrupacin de botones de seleccin, ejemplo 136 alteraciones temporales acceso a archivos de base de datos de AS/400 192 acceso a reas de datos de AS/400 191 llamada a programas AS/400 262 alteraciones temporales de rea de datos 191 aplicacin actualizacin 407 eliminar 407 empaquetado 399 instalacin 407 volver a empaquetar 407 volver a instalar 407 aplicacin Video Catalog adicin de ayuda en lnea 15 adicin de mensajes 15 creacin de la ventana Comedy 7 creacin de la ventana Preview 11 descripcin de 3 diseo 5 ejecutar 4 instalacin 3 aplicaciones, cliente ligero 417 archivo .EVT, descripcin 413 archivo .HLP, descripcin 413 archivo .IPF, descripcin 413 archivo .IPM, descripcin 413 archivo .LIB, descripcin 413 archivo .LST, descripcin 413 archivo .ODF, descripcin 413 archivo .ODX, descripcin 413 archivo .RST, descripcin 413 archivo .TXC, descripcin 413 archivo .TXM, descripcin 413 Copyright IBM Corp. 1994, 2000
453
atributo Multiplier 167 atributo MultSelect para componentes recuadro de lista 75, 90 para componentes subarchivo 152 atributo Panel 82 atributo PanelItem 102 atributo ParentName, usos comunes de 35 atributo PartName, usos comunes de 35 atributo PartType, usos comunes de 35 atributo Position establecer 100 para componentes panel de medios 102 atributo ReadOnly para componentes campo de entrada 74 para componentes edicin de mltiples lneas 111 para componentes recuadro de combinacin 59 para componentes selector cclico 146 atributo Selected para componentes recuadro de combinacin 59 para componentes recuadro de lista 91, 92 atributo Sequence para componentes recuadro de combinacin 58 para componentes recuadro de lista 90 atributo SetItem para componentes recuadro de combinacin 59 para componentes recuadro de lista 91 atributo SetTop para componentes recuadro de combinacin 59 para componentes recuadro de lista 91 atributo TabLabel 39 atributo Text 110 atributo TextEnd 111 atributo TextSelect 111 atributo TextStart 111 atributo TickLabel para componentes graduador 139 atributo TimerMode 168 atributo UserData, usos comunes de 39 atributo Value para componentes graduador 139 para componentes selector cclico 146 para componentes temporizador 168 atributo Visible para componentes de ventana 176 para componentes temporizador 167 usos comunes de 38 atributo Volume para componentes medios 100 para componentes panel de medios 102
atributo Width para componentes recuadro de contorno 131 usos comunes de 37 atributos AddItemEnd 145 AddLink 100, 101 AddMsgId 106 AddMsgTxt 106 AddOffset 111 AddRcd 65 AllowLink 100, 101 Arrange 67 AudioMode 100 BackColor 37 BackMix 37, 140 Bottom 37 ColNumber 66, 155 comprobacin de atributos de evento y de sistema 27 Count 66, 92, 154 CharOffSet 111 Checked 55, 104 DDEMode 255 DeSelect 59, 91, 92 DragEnable 41 DropEnable 41 Enabled 37, 74, 105, 111 FileName 78, 82, 99, 233 FirstSel 59 Focus 38 FontName 149 FontSize 149 ForeColor 37 ForeMix 37 GetItem 92 GetNewID 65 GetRcdText 65 Height 37, 131 Index 59, 92, 155 InfoLabel 39 InsertItem 58, 91 InsertLine 110 InsertMode 73 Interval 167 Label 39, 79, 104, 134, 149 Left 37 LineNumber 110 Masked 74 Maximum 145 Minimum 145 MsgSubText 107 Multiplier 167 obtener y establecer 25 OpenEdit 155 OpenImmediately 176, 177 Panel 82 PanelItem 102 para componentes barra de desplazamiento horizontal 80 para componentes barra de desplazamiento vertical 174 para componentes barra de estado 151 para componentes barra de progreso 133 para componentes bean Java 87
atributos (continuacin) para componentes botn de seleccin 136 para componentes campo de entrada 72 para componentes cliente DDE 71 para componentes contenedor 64 para componentes control de animacin 50 para componentes cuaderno 115 para componentes de ActiveX 47 para componentes de posicionamiento 37 para componentes edicin de mltiples lneas 110 para componentes graduador 139 para componentes imagen 82 para componentes interfaz ODBC/JDBC 119 para componentes lienzo 54 para componentes lienzo de cuaderno 117 para componentes men emergente 132 para componentes opcin de men 104 para componentes pgina de cuaderno 116 para componentes panel de medios 101 para componentes pulsador 134 para componentes pulsador grfico 78 para componentes recuadro de combinacin 57, 58 para componentes recuadro de contorno 131 para componentes recuadro de grupo 79 para componentes recuadro de lista 75, 90 para componentes recuadro de seleccin 55 para componentes referencia a componente lgico 62 para componentes subarchivo 152 para componentes subarchivo de mensajes 106 para componentes submen 166 para componentes temporizador 167 para componentes texto esttico 149 para componentes ventana con lienzo 175, 176 ParentName 35 PartName 35 PartType 35 Position 100, 102 ReadOnly 59, 74, 111, 146 RecordID 66 RemoveItem 59, 91 RemoveMsg 107 RemoveRcd 67 Selected 59, 91, 92 SelectItem 61 Sequence 58, 90 SetItem 59, 91 SetRcdIcon 67
454
atributos (continuacin) SetRcdText 64 SetTop 59, 91 TabLabel 39 Terminar al cerrar 182 Text 59, 73, 110, 146 TextEnd 111 TextSelect 111 TextStart 111 TimerMode 168 UserData 39 Validate 73 Value 139, 146, 168 View 70 Visible 38, 167, 176 Volume 102 Volumen 100 Width 37, 131 atributos comunes, descripcin de 35 atributos de evento, utilizacin 26 atributos del sistema %DspHeight 27, 38 %DspWidth 27, 38 AudioMode, atributo 100 ayuda adicin de grficos a 236 creacin de enlaces de hipertexto 237 creacin de un pulsador de ayuda 236 creacin para Windows 239 editar 212 nombrearchivo.IPM 413 nombrearchivo.VPF 413 para aplicaciones Java 243 planificacin de la aplicacin 19 reutilizar UIM 212 tipos de 236 traducir 235 ayuda segn el contexto 236
bitmaps, utilizacin 233 bloqueo de archivos de base de datos de AS/400 196 BMP, archivo utilizacin 81, 233 botn de maximizar 178 botn de minimizar 178 buscar un mensaje un mensaje 249
C
calendario 51 finalidad 51 cambio el contenido de un campo durante la depuracin 224 la representacin durante la depuracin 224 un valor de puntero durante la modificacin 226 variables, matrices y estructuras durante la depuracin 224 vistas del depurador 226 cambio de la posicin de los componentes 178 cambio del tamao de las ventanas 178 cambios de fuente java 278 campo, componentes nombres exclusivos 30 campos de subarchivo ocultos 155 CLEAR, cdigo de operacin finalidad 30 para componentes subarchivo 153 cliente DDE atributos 71 determinar si est soportado por programas 71 eventos 71 finalidad 71 clientes ligeros 417 Close, evento 182 cdigo de operacin BEGACT, respuesta a eventos con 26 cdigo de operacin CALL, ejemplo de 262 cdigo de operacin CALLB llamada a funciones locales 255, 256 cdigo de operacin ENDACT, respuesta a eventos con 26 cdigo de operacin READ (leer un registro) archivos de base de datos 195 finalidad 30 cdigo de operacin SETATR (establecer atributo) para componentes imagen 82 reflejar valores almacenados en la pantalla 29 cdigo de operacin STOP (detener un componente lgico) descripcin 261 cdigo de operacin WRITE (crear nuevos registros) archivos de base de datos 195 finalidad 30 para componentes subarchivo 153
B
barra de desplazamiento horizontal atributos 80 eventos 80 finalidad 80 barra de desplazamiento vertical atributos 174 eventos 174 finalidad 174 barra de estado, componente atributos 151 eventos 151 finalidad 151 barra de mens atributos 103 eventos 103 finalidad 103 barra de progreso, componente finalidad 133 bean Java, componente atributos 87 classpath, configuracin 88 crear 87 finalidad 87 JAR asociados 88 propiedades y mtodos 89 bibliografa 449
cdigo de operacin WRITE (crear nuevos registros) (continuacin) reflejar valores almacenados en la pantalla 29 cdigo de tiempo de ejecucin empaquetado 399 instalacin 407 cdigo fuente editar 214 nombrearchivo.VPG 413 cdigos de edicin definido por el usuario 230 finalidad 229 formato de datos en formatos predefinidos 229 cdigos de operacin CALLB 256 CLEAR 153, 183 CHAIN 153 DELETE 153 READ 73 READC 153 READS 153 SETATR 82 SHOWWIN 177 START 62, 260 STOP 260 UPDATE 153 WRITE 73, 153 ColNumber, atributo 66, 155 color de componentes convertidos despus de la importacin 211 colores de componente ejemplo de componente graduador 140 usos comunes de 37 compartir campos de programa, ejemplo de componentes 31 compilacin de programas nombrearchivo.EVT 413 nombrearchivo.LST 413 Complete, evento 100 componente *component atributos 184 eventos 184 finalidad 184 Componente ActiveX atributos 47 crear 47 eventos 47, 49, 87 finalidad 46 mtodos 48 propiedades 47 componente botn de seleccin atributos 136 ejemplo que muestra cmo agrupar 136 eventos 136 finalidad 136 componente campo de entrada almacenar valores de lectura 29 alteracin temporal de valores definidos 29 atributos 72 borrar 183 eventos 73 finalidad 72 ndice
455
componente campo de entrada (continuacin) inicio de componentes lgicos 260 y transferencia de datos 41 componente de interfaz ODBC/JDBC acceder a los datos de una tabla 120 atributos 119, 133 conexin a una base de datos 119 crear de un conjunto de registros 119 eventos 119, 133 finalidad 118 recuperar filas de tabla 121 tipos de datos 121 componente edicin de mltiples lneas atributos 110 ejemplo de 112 eventos 110 finalidad 110 y transferencia de datos 41 componente elemento de men atributos 104 eventos 103, 104 finalidad 104 componente pulsador atributos 134 eventos 134 finalidad 134 componente pulsador grfico atributos 78 eventos 78 finalidad 77 componente recuadro de combinacin aadir y cambiar elementos 58 atributos 57 eliminacin de elementos 59 eventos 58 finalidad 57 orden de elementos 58 recuperacin de un elemento seleccionado por usuario 59 seleccin y deseleccin de elementos 59 y transferencia de datos 41 componente Recuadro de contorno atributos 131 eventos 131 finalidad 131 componente subarchivo de mensajes atributos 106 ejemplo de 108 eventos 106 finalidad 106 y transferencia de datos 41 componente texto esttico almacenar valores de lectura 29 alteracin temporal de valores definidos 29 atributos 149 eventos 149 finalidad 149 nombres exclusivos 30 y transferencia de datos 41 componente ventana atributos 175 eventos 175 finalidad 175
componentes *component 184 ActiveX 46 barra de desplazamiento horizontal 80 barra de desplazamiento vertical 174 barra de estado 151 barra de mens 103 barra de progreso 133 Bean Java 87 botn de seleccin 136 cambio de los colores de 37 campo de entrada 72 Cliente DDE 71 colocacin en diversas resoluciones de monitor 38 comunicacin entre 253 contenedor 64 Contenedor 64 control de animacin 50 cuaderno 115 detener 261 edicin de mltiples lneas 110 elemento de men 104 enlace 253 graduador 139 grfica 75 habilitacin de componentes 37 imagen 81 iniciar 260 interfaz ODBC/JDBC 118 lienzo 53 listado de eventos para un componente 26 marco de la ventana 175 medios 99 men emergente 132 pgina de cuaderno 116 pgina de cuaderno con lienzo 117 panel de medios 101 posicionamiento 37 pulsador 134 pulsador grfico 77 recuadro de combinacin 57 Recuadro de combinacin 57 recuadro de contorno 131 recuadro de grupo 79 recuadro de lista 83, 90 recuadro de seleccin 55 referencia 25 referencia a componente lgico 62 Referencia a componente lgico 62 selector cclico 145 soportar transferencia de datos 41 subarchivo 152 subarchivo de mensajes 106 submen 166 temporizador 167 texto esttico 149 ventana 175, 176 comprobacin de nivel conectores de proveedor aadir 371 crear 373 gestionar 371 invocar 371 196
contenedor, componente atributos 64 cambio de vistas de 67 ejemplo de actualizacin de datos en 66 ejemplo de adicin de registros a 66 ejemplo de eliminar registros de 67 eventos 64 finalidad 64 control de animacin, componente atributos 50 eventos 50 finalidad 50 conversin cdigo fuente RPG utilizando CVTRPGSRC 214 Crear archivo de mensajes, programa de utilidad 250 cuaderno, componente atributos 115 eventos 115 finalidad 115 CVTRPGSRC, herramienta de conversin ILE RPG/400 214
CH
CHAIN (recuperacin aleatoria de archivo), cdigo de operacin 153 Change, evento para componentes graduador 140 para componentes panel de medios 102 y componentes edicin de mltiples lneas 112 CharOffset, atributo 111
D
DELETE (suprimir registro), cdigo de operacin 153 depurador cambio de vista 223 Cargar aparicin 218 ejecucin de pasos 222 ejecucin de pasos externos 222 ejecucin de pasos internos 222 ejecucin de un programa durante la depuracin 222 ejecucin del programa 223 establecimiento de puntos de interrupcin 219, 221 iniciar 217 modificacin de la representacin 224 modificacin de las vistas del depurador 226 modificacin del contenido de un campo 224 puntos de interrupcin 218 retorno de recorrido 222 selecciones de la barra de herramientas 222 visin general 217 visualizacin de la pila 223 visualizacin de la supervisin del programa 223
456
depurador (continuacin) visualizacin de la ventana de control de sesin de la depuracin 223 visualizacin de registros 223 visualizacin del almacenamiento 223 visualizar variables 223 diferencias de tiempo de ejecucin java 280 diseo aplicacin Video Store Catalog 5 ayuda en lnea 19 contenido de la ventana 20 lgica del programa 21 mensajes 21 nmero de ventanas 20 DLL, archivo carga de la aparicin de DLL durante la depuracin 218 descripcin 413 llamada a funciones 256 DSPLY 250
E
edicin archivos de ayuda 212 datos en campos de entrada y componentes texto esttico 229, 230 fuente RPG 214 mensajes 249 editar mensajes de forma directa 251 ejecucin con puntos de interrupcin programas durante la depuracin 222 puntos de interrupcin de la depuracin 221 ejecucin de pasos externos durante la depuracin 222 ejecutar subrutina invocacin de subrutinas de accin con 26 ejemplos actualizacin de componentes contenedor 66 adicin de registros a un componente contenedor 66 agrupacin de botones de seleccin 136 aplicacin Video Store Catalog 3 cambio del tamao de una ventana 178 componente ventana 183 de componentes que comparten un campo de programa 31 de transferencia de datos 42 eliminacin de registros de componentes contenedor 67 lectura y modificacin de registros de subarchivo 154 obtencin y establecimiento de valores para componentes selector cclico 146 utilizacin de componente referencia a componente lgico 62 utilizacin de subarchivos para visualizar datos de AS/400 155
ejemplos (continuacin) utilizacin del componente edicin de mltiples lneas 112 utilizacin del componente graduador 140 utilizacin del componente imagen 83 utilizacin del componente recuadro de lista 93 utilizacin del componente subarchivo de mensajes 108 utilizacin del componente subarchivo para visualizar registros de base de datos 156 utilizacin del componente temporizador 168 utilizacin del evento Create para una ventana 38 eliminar cdigo de tiempo de ejecucin 407 una aplicacin 407 empaquetado aplicacin 399 cdigo de tiempo de ejecucin 399 prerrequisitos 399 enlace de componentes 253 enlaces de hipertexto, creacin 237 entradas de posicin y conversin durante la importacin 208 establecer fonts de la depuracin 227 puntos de interrupcin de la depuracin 219 etiquetas descripcin 39 sustitucin 247 etiquetas de sustitucin definicin de texto para 247 descripcin 39 evento Create, ejemplo de 38 evento Enter para componentes recuadro de combinacin 61 para componentes recuadro de lista 92, 165 evento GotFocus usos comunes de 39 y componentes edicin de mltiples lneas 112 evento LostFocus, usos comunes de 39 evento MenuSelect para componentes opcin de men 105 evento Press para componentes pulsador 135 para componentes pulsador grfico 78 evento Select para componentes botn de seleccin 138 para componentes recuadro de combinacin 61 para componentes recuadro de lista 92 para componentes subarchivo 165 sealizacin 56
eventos Close 182 codificacin de BEGACT y ENDACT 26 Complete 100 comprobacin de errores de atributos de evento 27 Change 102, 112, 140 descripcin de atributos 26 Enter 92, 165 GotFocus 39, 112 invocacin de subrutinas de accin 26 listado de eventos para un componente 26 LostFocus 39 MenuSelect 105 Notify 63 para componentes barra de desplazamiento horizontal 80 para componentes barra de desplazamiento vertical 174 para componentes barra de estado 151 para componentes barra de mens 103 para componentes barra de progreso 133 para componentes bean Java 87 para componentes botn de seleccin 136 para componentes campo de entrada 73 para componentes cliente DDE 71 para componentes control de animacin 50 para componentes cuaderno 115 para componentes de ActiveX 47 para componentes edicin de mltiples lneas 110 para componentes graduador 139 para componentes imagen 82 para componentes Interfaz ODBC/JDBC 119 para componentes medios 99 para componentes opcin de men 104 para componentes pgina de cuaderno 116 para componentes panel de medios 101 para componentes pulsador 134 para componentes pulsador grfico 78 para componentes recuadro de combinacin 61 para componentes recuadro de contorno 131 para componentes recuadro de grupo 79 para componentes recuadro de lista 90 para componentes recuadro de seleccin 56 para componentes selector cclico 145 para componentes subarchivo 152 ndice
457
eventos (continuacin) para componentes subarchivo de mensajes 106 para componentes submen 166 para componentes temporizador 167 para componentes texto esttico 149 para componentes ventana con lienzo 175, 176 Press 78, 135 respuesta a eventos en el programa 26 Select 56, 92, 138, 165 Tick 167 eventos, atributos definicin de atributos de evento y de sistema 28 finalidad 26 EXE, archivo descripcin 413 llamada a archivos .EXE 258
F
FirstSel, atributo 59 FontName, atributo 149 FontSize, atributo 149 fuente RPG reutilizar 214
importar 206 (continuacin) formatos de registro de pantalla 207 palabras clave de archivos de pantalla 209 situacin 201 iniciar el depurador 217 ventana de depuracin 217 inicio de componentes lgicos inicio de componentes lgicos 260 inicio de un componente lgico 260 InsertItem para componentes recuadro de lista 91 InsertMode, atributo 73 instalacin aplicaciones (para Windows NT) 407 cdigo de tiempo de ejecucin (para Windows NT) 407 cdigo para ejemplos en este manual 33 consideraciones sobre DBCS 363 ejemplo Catlogo de vdeos 3 intercambio de informacin con otras aplicaciones de PWS 253 IPF (Recurso de Presentacin de Informacin) 235
llamada a programas locales (continuacin) funciones utilizando constantes con nombre 256 funciones utilizando un puntero de procedimiento 257 llamada a programas locales 255 programas locales 255 programas remotos 260 llamada de prototipo llamada de prototipo 264
M
Masked, atributo 74 matriz modificacin durante la sesin de depuracin 224 visualizacin durante la sesin de depuracin 223 Maximum, atributo 145 medios, componente atributos 99 control con el componente panel de medios 100 eventos 99 finalidad 99 sealizacin de eventos 100 mensajes buscar 249 compilar para traducir 250 crear 247, 248 disear 21 edicin 249 editar para traducir 251 eleccin del tipo de 248 nombrearchivo.TXM 413 supresin 249 tipos de 247 utilizacin con la lgica 250 utilizacin de etiquetas 251 mensajes de error error al referenciar componentes 177 salida formateada incorrectamente 231 men emergente, componente atributos 132 eventos 132 finalidad 132 mtodos java, invocar 269 mtodos java, prototipo 270 Minimum, atributo 145 modificacin eventos de enlace a subrutinas de accin 26 ID de recurso 413 MsgSubText, atributo 107
J G
Gestor de Interfaz de Usuario, reutilizar archivos 212 GETATR utilizacin 25 GetNewID, atributo 65 GetRcdText, atributo 65 glosario 437 graduador, componente atributos 139 eventos 139 finalidad 139 grfica 75 finalidad 75 java, compilacin 277 JavaHelp, creacin 243 Juego de Caracteres de Doble Byte consideraciones del desarrollo de aplicaciones 363 DBCS puro 365 GETATR, cdigo de operacin 364, 365 SETATR, cdigo de operacin 364, 365 tipo de datos DBCS cualquiera 363, 365 tipo de datos DBCS mixto 363, 365 tipo de datos grficos 365 tipo de datos Slo DBCS 363, 364
I
ICO, archivo utilizacin 81, 233 iconos, utilizacin 233 imagen, componente acceso a archivos de imgenes y sonido en tiempo de construccin 234 atributos 82 especificacin del atributo FileName 233 eventos 82 finalidad 81 imgenes, adicin 233 importar 206 archivos de pantalla 206, 207 color de componentes convertidos 211 entradas de posicin y conversin 208
L
lienzo, componente atributos 54 eventos 54 finalidad 53 listas de bibliotecas configuracin de un servidor 190 Consideraciones sobre el cuaderno Definir informacin de AS/400 193 descripcin de trabajo 190 QCMDDDM 190, 191 QCMDEXC 190
N
nemotcnico para botones de seleccin 136 para componentes recuadro de seleccin 56 para elementos de men 104 para pginas del cuaderno 116 para pulsadores 134
LL
llamada a programas locales funciones locales 256 funciones sin parmetros obligatorios 257
458
O
obtencin de la cuenta de registros atributo de texto para componentes de mltiples lneas 110 atributos de componente 25 cuenta de registros en un subarchivo 154 estado de componentes botn de seleccin 138 estado de componentes recuadro de seleccin 55 valor para componentes graduador 139 valores para componentes selector cclico 146 Open Immediately, atributo 176 OpenEdit, atributo 155
P
pgina de cuaderno, componente atributos 116 eventos 116 finalidad 116 pgina de cuaderno con lienzo, componente atributos 117 eventos 117 finalidad 117 palabras de edicin correccin de salida formateada incorrectamente 231 cuerpo de 231 estado de 232 finalidad 229, 230 partes de 231 posiciones de expansin de 232 panel de medios, componente atributos 101 control del componente medios 100 eventos 101 finalidad 101 planificacin de la aplicacin 19 posicin de los componentes, cambiar 178 proceso recurrente llamadas recursivas 266 programa de lenguaje de control (CL) ALCOBJ 196 CVTRPGSRC, herramienta de conversin ILE RPG/400 214 QCMDDDM 190 QCMDEXC 190 STRPCCMD 263 programa de utilidad de Empaquetado 399 programa de utilidad Definir informacin de AS/400 establecimiento de un servidor en tiempo de ejecucin 190 y empaquetado de la aplicacin 400 programas, no GUI 357
programas autnomos 357 programas de ejemplo construir 34 ejecutar 34 instalar 33 instrucciones especiales para ejemplos que necesiten datos de AS/400 34 programas de utilidad Crear archivo de mensajes 250 Definir informacin de AS/400 190, 400 Empaquetado 399 programas no GUI 357 Programas no GUI desde DOS 433 prototipo, mtodos Java 270 pseudnimos de archivo (alteraciones temporales) 192 publicaciones, lista de 449 pulsador de ayuda, creacin 236 puntero modificacin del valor durante la depuracin 226 visualizacin durante la depuracin 225 punto de interrupcin establecer 219, 221
referencia a componente lgico, componente atributos 62 comunicacin entre componentes lgicos 253 ejemplo 62 eventos 62 finalidad 62 RemoveItem, atributo 59, 91 RemoveMsg, atributo 107 RemoveRcd, atributo 67 RESET finalidad 30 restricciones de java 277 reutilizacin aplicaciones de AS/400 201 archivos de ayuda UIM 212 archivos de pantalla 206, 207 fuente RPG 214
S
seleccin de elementos en recuadros de combinacin 59 SelectItem, atributo 61 selector cclico, componente ejemplo de 146 eventos 145 finalidad 145 servidores acceso a archivos de base de datos de AS/400 192 acceso a reas de datos de AS/400 191 alteracin de archivos de base de datos 196 bloqueo de archivos de base de datos 196 comprobacin de nivel 196 configurar para desarrollar/ejecutar aplicaciones 190 consideraciones de base de datos 197 consideraciones sobre el cuaderno 189 consideraciones sobre la lista de bibliotecas 190 definicin de la informacin de AS/400 189 emisin de mandatos CL 190 llamada a programas AS/400 262 llamada a programas AS/400 con archivos de estacin de trabajo 263 utilizacin de la aplicacin como servidor DDE 254 SETATR utilizacin 25 SetRcdIcon, atributo 67 SetRcdText, atributo 64, 67 SHOWWIN, cdigo de operacin carga de ventana en memoria 177 sistema, atributos comprobacin de errores de atributos de sistema 27 sonido, adicin 233 START (iniciar un componente lgico), cdigo de operacin descripcin 260 ndice
Q
QCMDDDM cambio de la lista de bibliotecas QCMDDDM, cambio de la lista de bibliotecas 190 QCMDEXC cambio de la lista de bibliotecas QCMDEXC, cambio de la lista de bibliotecas 190 190
190
R
READC (leer siguiente registro modificado), cdigo de operacin 153 READS (leer registro seleccionado del subarchivo), cdigo de operacin 153 RecordID, atributo 66 recuadro de grupo atributos 79 eventos 79 finalidad 79 recuadro de lista, componente atributos 75, 90 eventos 90 finalidad 90 y transferencia de datos 41 recuadro de seleccin, componente atributos 55 eventos 55, 56 finalidad 55 obtencin y establecimiento de estados 55 Recurso de Presentacin de Informacin (IPF) 235 referencia componentes en diferentes ventanas 25 componentes en las mismas ventanas 25
459
START (iniciar un componente lgico), cdigo de operacin (continuacin) llamada a programas locales utilizando 259 restricciones al llamar a programas locales con 260 y componentes referencia a componente lgico 62 subarchivo, componente atributos 152 campos ocultos 155 ejemplo de lectura y actualizacin de registros 154 ejemplo de visualizar datos de AS/400 155 eventos 152 finalidad 152 submen, componente atributos 166 eventos 166 finalidad 166 subrutina de accin modificacin de eventos de enlace 26 subrutina de accin, invocacin 26
V
Validate, atributo 73 valor de color RGB 37 valores por omisin abrir inmediatamente 176 contenido de la lista de ventanas 181 debido a cdigo de operacin CLEAR 183 foco 181 orden de los elementos en un recuadro de combinacin 58 valores del men del sistema 182 visible 176 varios procedimientos llamada de prototipo 264 ventana con lienzo, componente atributos 176 eventos 176 finalidad 176 ventanas atributos 175, 176 atributos para cdigos de operacin 30 cambiar el tamao 178 carga en memoria 177 cdigos de operacin para 30 consideraciones sobre el estilo 22 creacin al iniciar 177 cundo puede establecer atributos 177 dar foco de entrada 38 diseo del contenido de 20 especificar cundo visualizar 38 establecimiento del contenido de la lista de ventanas 181 establecimiento del foco 181 eventos 175, 176 finalidad 175, 176 mtodo para mover 178 nombres exclusivos para componentes campo de entrada y texto esttico 30 OpenImmediately, atributo 176 referencia 177 situar sin utilizar la barra de ttulo 178 terminacin al Cerrar 182 utilizacin de sonido 233 valores del men del sistema 182 valores por omisin 176 Visible, atributo 176 visualizacin 176 visualizacin de imgenes en 233 View, atributo 70 vistas, cambiar 67 vistas de contenedor, cambiar 67 Visual RPG barra de herramientas de la depuracin 222 ejecucin de puntos de interrupcin 221 establecimiento de fonts de la depuracin 227 establecimiento de puntos de interrupcin 219 informacin de arranque de la depuracin 219
T
temas finales para componentes graduador 140 usos comunes de 37 temporizador, componente eventos 167 finalidad 167 terminacin de un programa 182 Terminar al cerrar 182 texto finalidad 30 para componentes campo de entrada 73 para componentes recuadro de combinacin 59 para componentes selector cclico 146 Tick event 167 tiempo de ejecucin actualizacin 407 eliminar 407 nombrearchivo.DLL 413 nombrearchivo.EXE 413 nombrearchivo.HLP 413 nombrearchivo.ODX 413 nombrearchivo.RST 413 suprimir 407 volver a empaquetar 407 volver a instalar 407 tipo de componente descripcin 264 tipo de datos grficos 365 traduccin compilar mensajes para 250 consejos para 22, 40 editar mensajes para 251 mensajes 22 nemotcnico 22 transferencia de datos componentes que soportan 41 ejemplo 42 utilizacin 41
Visual RPG (continuacin) lista de puntos de interrupcin 220 modificacin de un valor de puntero 226 modificacin de variables, matrices y estructuras 224 ventana de depuracin 217 visualizacin de un valor de puntero 225 visualizacin de variables, matrices y estructuras 223 visualizacin del cdigo fuente ensamblador 218 visualizacin del punto de interrupcin de la carga de la aparicin 218 visualizar variables cdigo fuente ensamblador de la depuracin 218 punto de interrupcin de la carga de la aparicin de la depuracin 218 valor de puntero durante la depuracin 225 variables, matrices y estructuras durante la depuracin 223 variables durante la depuracin 223 volver a empaquetar 407
W
Windows, ayuda, creacin 239
460
SC10-3067-04