Página de inicio - Tecla de acceso: 1
Notas técnicas

MultiBase. Notas a la versión 2.0, release 05 para Windows

4. Notas al programador de aplicaciones

Además de los comentarios referentes al interface de usuario expuestos en la sección anterior, dentro de este apartado vamos a explicar en detalle algunos aspectos que debe conocer el programador de aplicaciones de MultiBase/WIN para el correcto funcionamiento de las mismas y su correcta instalación.

4.1. Los ficheros de botones

Los botones que utiliza MultiBase/WIN se encuentran «embebidos» en el comando ctl, habiéndose definido dos tamaños diferentes —que llamaremos «grandes» y «pequeños»—, con el fin de que el usuario pueda seleccionar aquellos que más le convengan. Una copia de estos botones se encuentra en los ficheros «TBUTTONS.BMP» y «TBUTSMAL.BMP», respectivamente, dentro del directorio «TRANSDIR\etc» (normalme te «\ctl\etc»).

Estos ficheros son editables por el usuario utilizando el Paintbrush del Windows, que podrá añadir más botones o modificar los ya existentes. Para que los cambios realizados en estos ficheros surtan efecto habrá que definir la variable de entorno MBBUTBMP con el nombre del fichero «.BMP» que contenga los botones que se desean emplear, o bien definiéndolo en la sección «.CONFIGURATION» del fichero «MB.INI» (ver sección 4.2. más adelante).

Los botones que aparecen en el menú por defecto de un FORM están igualmente incluidos en los ficheros de botones antes citados, y por tanto también son modificables.

Cada línea de los ficheros de botones debe contener 21 botones de dos anchos diferentes, 14 de un tipo y 7 de otro.

Cada línea de botones aparece «duplicada» en el fichero: en la primera línea se muestran los botones en estado «normal», mientras que la segunda corresponde el aspecto que presentarán dichos botones cuando se encuentren «pulsados». Si en la primera línea hay, por tanto, 21 botones «no pulsados», en la segunda línea deberán estar esos mismos botones «pulsados». La tercera línea del fichero conte drá la segunda línea de botones no pulsados; la cuarta la segunda línea de botones pulsados, y así sucesivamente (edite cualquiera de los dos ficheros de botones antes citados para comprobar estos extremos).

Estos botones se numeran desde el cero (0), siendo éste, por regla general, un botón que no contiene ningún dibujo en su interior con el fin de que el usuario pueda aplicarlo como genérico para aque las opciones que no tengan definido ningún otro botón —en cuyo caso aparecerán en dicho botón las primeras letras de la(s) opción(es) elegida(s)—.

4.2. El fichero MB.INI

El lanzamiento del CTL en Windows puede realizarse con la opción «-ini» para indicar un fichero de inicialización:

ctl.exe -ini filename.ini

Siendo «FILENAME.INI» el nombre del fichero que contiene las características de inicialización del CTL.

El fichero «MB.INI» contiene algunas características de la configuración con que deberá arrancar el CTL al ejecutar un programa. Este fichero de inicialización siempre deberá estar en el directorio TRANSDIR\etc» (normalmente «\ctl\etc»). Una aplicación que no sea lanzada con la opción «-ini» lo será por defecto con el fichero «MB.INI» del directorio «TRANSDIR\etc» (normalmente «\ctl\etc»).

El fichero «MB.INI» es un fichero dependiente del terminal, es decir, podrá tener distintas entradas para distintos tipos de terminales (distintos valores de la variable de entorno TERM). A continuación se muestra un ejemplo para una entrada en el «MB.INI» que servirá para cualquier variable TERM de nombre PCUSER, PC, PCTRANS o VGAC:

:PCUSER|PC|PCTRANS|VGAC
.COLORS
SOLID-COLORS
COLOR-BACKGROUND RGB 64 128 128 TO WHITE
COLOR-BKTITLE RGB 64 128 128

.MENU-BUTTONS
almacen.Entrada de Datos.Articulos=117 GAP
almacen.Entrada de Datos.Clientes=68 NOGAP
almacen.Entrada de Datos.Proveedores=69 NOGAP
almacen.Entrada de Datos.Albaranes=126 NOGAP
almacen.Entrada de Datos.Formas de Pago=128 NOGAP
almacen.Entrada de Datos.Provincias=127 NOGAP
almacen.Entrada de Datos.Unidades=129 NOGAP
almacen.Listados.Precios=132 GAP
almacen.Listados.Clientes=130 NOGAP
almacen.Listados.Proveedores=131 NOGAP
almacen.Listados.Albaranes=133 NOGAP
almacen.Listados.Albaranes (PRINTMAN)=134 NOGAP
almacen.Varios.Estadisticas=108 GAP
almacen.Varios.Fotos=106 NOGAP

*.*.Clientes=68
*.*.Albaranes=126
*.*.Articulos=117
*.*.Entrada Datos=94
*.*.Listados=42
*.*.Menus=116
*.*.Librerias=117
*.*.Varios=118
*.*.Cabeceras=6
*.*.Lineas=7
*.*.Modificar=2
*.*.Borrar=3
*.*.Agregar=1
*.*.Encontrar=4
*.*.Insertar=9
*.*.Usando EasySQL=34
*.*.De una tabla=46
*.*.De una View=47
*.*.Solo esquema=95
*.*.Esquema y atributos=94
*.*.Terminal=33
*.*.Impresora=42
*.*.Fichero=76
*.*.Documentar=52
*.*.Lista de usuarios=51
*.*.Aprobar=92
*.*.Salvar y salir=92
*.*.Descartar y salir=67
*.*.Seleccion de Tabla=50
*.*.Otros Parametros=48
*.*.Ejecutar Estadistica=22
*.*.Fin del programa=67
*.*.Excel=63
*.*.Pantalla=66
*.*.Editar=86
*.*.Compilar=93
*.*.*=0

.KEYS-BUTTONS
*.faccept=13 Aceptar
*.fhelp=10 Ayuda
*.fcancel=12 Cancelar
*.fuser1.F2=0 GAP Ventana de Ayuda
*.ftop=17 GAP Ir al Primero
*.fbottom=16 NOGAP Ir al Ultimo
*.fdown=14 NOGAP Uno Abajo
*.fup=15 NOGAP Uno Arriba
*.fredraw=110 GAP Repintar Ventana

.CONFIGURATION
# Comment next line for using big buttons
BUTSIZE SMALL
LINESCARET 1 MBBUTBMP c:\mbdemo\almacen.bmp

.DLL
LIB demodll.dll
ShowBmp (WORD, LPSTR, WORD, WORD, WORD, WORD) return WORD
DoKey (WORD, WORD, LPSTR)

Como puede verse en el ejemplo anterior, una entrada para uno o varios tipos de terminales comienza con el signo de dos puntos seguido de los nombres de los terminales separados por la barra vertical. Es decir, el aspecto es el mismo que el del fichero «TACTIONS» o el del «TERMCAP» del sistema.

Cualquier línea de comentarios del fichero deberá comenzar con el signo «#».

Para una sección de un terminal determinado existen tres subsecciones distintas. Éstas comienzan con un punto y deben ir en mayúsculas. A continuación se comenta cada una de ellas.

Sección «.COLORS»:
Indica los colores con que deberá funcionar el programa. Estos colores pueden editarse directamente con el fichero o bien por medio de la opción «Definición de Colores» de la persiana de Accesorios e MultiBase («MB»). En el caso de utilizar el accesorio se deberá pulsar la opción de «Salvar Cambios» para que éstos queden permanentes en el fichero «.INI» correspondiente.

Asimismo, se podrán utilizar y crear «Paletas de Colores» que serán guardadas en el fichero «MBPAL.INI» o bien en el fichero de entorno indicado por la variable MBPAL.

En la sección «.COLORS» podrán indicarse los colores bien por medio de uno de los siguientes: BLACK, WHITE, GRAY, LTGRAY, DKGRAY, RED, YELLOW, GREEN o BLUE, o bien especificando los tres valores RGB del color que se desea. Por ejemplo:

.COLORS
COLOR-BACKGROUND RGB 255 255 128
COLOR-BKBOXES RGB 0 255 112
COLOR-BKSELECT DKGRAY
COLOR-TEXT GRAY
COLOR-EDITFIELD RGB 128 128 0
COLOR-TITLE RGB 128 64 64
COLOR-TEXTSELECT WHITE

El color de fondo que se desea utilizar podrá especificarse como se ha dicho o bien indicando el nombre de un fichero, de extensión «.BMP», que contenga el gráfico que se desea tener como fondo. En ste caso se deberá indicar en el COLOR-BACKGROUND el nombre de dicho fichero de la forma siguiente:

.COLORS
COLOR-BACKGROUND BMP C:\Windows\AGUA.BMP
COLOR-BKBOXES RGB 0 255 112
COLOR-BKSELECT DKGRAY
COLOR-TEXT GRAY
COLOR-EDITFIELD RGB 128 128 0
COLOR-TITLE RGB 128 64 64
COLOR-TEXTSELECT WHITE

El color del fondo (COLOR-BACKGROUND) también podrá indicarse por medio de una variable de entorno si se trata de un BMP. En este caso, la variable de entorno a utilizar es MBBKBMP, y deberá contene el «path» completo del fichero «.BMP» que se desea como fondo. Si no se indica el «path» completo, éste se entenderá relativo al «TRANSDIR\etc».

Los colores indicados en los campos COLOR-BKSELECT y COLOR-TEXTSELECT indican el aspecto que deberá tener el vídeo inverso, por tanto, deberán definirse ambos o ninguno.

Sección «.MENU-BUTTONS» (o «LOTUS-BUTTONS»):
Por medio de esta sección se podrán cambiar los botones de los menús de tipo «Lotus» de los programas. Asimismo, en esta sección se podrán asignar botones a las distintas opciones de un menu «pulldown». Si no existe esta sección, sólo aparecerán botones «Lotus» en los menús por defecto del FORM. En este caso, los menús «Lotus» se mostrarán como un «pulldown» que contendrá las distintas opciones del menú «Lotus».

Las entradas de esta sección tienen la siguiente sintaxis:

module_name.menu_name.option_name=button_number [GAP | NOGAP]

En los menús de tipo «Lotus» cada una de estas partes puede ser sustituida por un asterisco, que indicará «cualquiera». Por su parte, en los menús de tipo «pulldown» esto no ocurre, ya que nose admiten comodines.

Por defecto, el sistema por defecto introduce un «GAP» (salto) cada 3 botones. Las palabras «GAP» y «NOGAP» se utilizarán para obviar esta característica.

En el ejemplo que se muestra a continuación se está indicando que en cualquier módulo y en cualquier menú que aparezca la opción «Cabeceras» deberá usarse el botón número 6; que en cualquier módulo en cualquier menú que aparezca la opción «Lineas» se usará el botón número 7, etc.

.MENU-BUTTONS
*.*.Cabeceras=6
*.*.Lineas=7
*.*.Modificar=2
*.*.Borrar=3
*.*.Agregar=1
*.*.Encontrar=4
*.*.Insertar=9
*.*.*=0

En la última línea del ejemplo anterior se indica que cualquier opción de cualquier menú de cualquier módulo deberá utilizar el botón numero cero. Al ser la última línea de la sección, se está indicando que todas las opciones que aparezcan en los programas y no estén indicadas en las líneas anteriores deberán ir con el botón número cero.

En el ejemplo siguiente se indica que en el módulo llamado «almacen» y en el menú «Entrada de Datos», la opción «Articulos» deberá tener el botón número 117, la opción «Clientes» el 68, etc.:

.MENU-BUTTONS
almacen.Entrada de Datos.Articulos=117 GAP
almacen.Entrada de Datos.Clientes=68 NOGAP
almacen.Entrada de Datos.Proveedores=69 NOGAP
almacen.Entrada de Datos.Albaranes=126 NOGAP
almacen.Entrada de Datos.Formas de Pago=128 NOGAP
almacen.Entrada de Datos.Provincias=127 NOGAP
almacen.Entrada de Datos.Unidades=129 NOGAP

Evidentemente, el «button_number» indica el número del botón en el fichero «TBUTSMAL.BMP» o en el fichero de botones que se decida utilizar.

Decir que una opción debe ir con el botón cero indica al sistema que deberá pintar sobre el botón número cero las tres primeras letras del nombre de la opción. Es por ello por lo que dicho botón no deberá contener ningún dibujo.

La definición de botones en la sección MENU-BUTTONS se examina de arriba abajo, por lo que la línea «*.*.*=0» deberá ir forzosamente la última.

Sección «.KEYS-BUTTONS»:
En esta sección se indica qué aspecto deberá tener la barra de botones del sistema (parte derecha de la barra de botones). En el caso de no introducirse esta sección el sistema introducirá su barra e botones por defecto. En caso contrario se utilizará la indicada en esta sección.

La sintaxis de cada línea de esta sección es la siguiente:

module_name.action_name[.title]=button_number
[GAP | NOGAP] comments

Siendo:

  module_name Nombre del módulo.
  action_name Nombre de la acción correspondiente. Estos nombres serán los mismos que los del fichero «TACTIONS» (primera columna).
  title Nombre que se deberá escribir encima del botón. Este título podrá llevar un carácter «&» delante del carácter que se desee subrayar.
  button_number Número del botón en el fichero de botones.
  comments Texto que se utilizará como comentario del botón y que será mostrado en su cartel de ayuda.

Al igual que en el caso anterior, las palabras «GAP» y «NOGAP» indican si se deberá dejar o no un espacio detrás del botón correspondiente. De la misma forma que antes, el sistema, por defecto, intr duce un espacio cada tres botones.

A continuación se muestra un ejemplo de la sección KEYS-BUTTONS:

.KEYS-BUTTONS
*.faccept=13 Aceptar
*.fhelp=10 Ayuda
*.fcancel=12 Cancelar
*.fuser1.F2=0 GAP Ventana de Ayuda
*.ftop=17 GAP Ir al Primero
*.fbottom=16 NOGAP Ir al Ultimo
*.fdown=14 NOGAP Uno Abajo
*.fup=15 NOGAP Uno Arriba
*.fredraw=110 GAP Repintar Ventana

Sección «.CONFIGURATION»:
Establece los parámetros generales de configuración. Las entradas de esta sección permiten especificar los aspectos que a continuación se detallan:

a) Elección del tamaño de los botones.
Mediante la cláusula «BUTSIZE» es posible elegir el tamaño de los botones («grandes» o «pequeños») que se desean utilizar. Asimismo, el usuario podrá definir nuevos tamaños si así lo desea. La sintaxis para definir el tamaño de los botones es la siguiente:

BUTSIZE [SMALL] [Alto].[Anchograndes].[Anchopequeños].[Gap]

Por defecto se asume el tamaño de los botones «grandes». Por contra, si se especifica «SMALL» se utilizarán los botones «pequeños». Los valores por defecto se asumen cuando no se especifica alguno de los parámetros indicados en la sintaxis.

Los tamaños por defecto son los siguientes:

  alto anchograndes anchopequeños gap
Botones Grandes 26 34 23 10
Botones Pequeños 22 25 18 9

Si los valores indicados (excepto «Gap») no coinciden con ninguno de los anteriores, se deberá especificar, además, el fichero «.BMP» que contenga los botones que se desean utilizar.

Ejemplos de configuración:

  nada Botones grandes.
  BUTSIZE Botones grandes.
  BUTSIZE SMALL Botones pequeños.
  BUTSIZE SMALL ...30 Botones pequeños con un gap (salto) de 30 píxeles.
  BUTSIZE 20... Botones grandes con un salto de 20 píxeles.(*)
  BUTSIZE 12.12.12.12 Botones con 12 píxeles de alto, 12 de ancho grande, 12 de ancho pequeño y 12 de salto.(*)

(*) En estos casos será necesario definir un fichero «.BMP» con esos tamaños de botones.

b) Elección del fichero de botones.
Si se desea utilizar un fichero de botones distinto de los embebidos en el comando ctl (los dos citados anteriormente), se deberá utilizar la cláusula «MBBUTBMP» con la siguiente sintaxis:

MBBUTBMP nombre.bmp

Siendo «NOMBRE.BMP» el fichero del que se tomarán los botones. Nótese que este nombre de fichero no debe ir entrecomillado.

Este procedimiento es equivalente a definir la variable de entorno «MBBUTBMP= nombre.bmp». En ambos casos, se deberá especificar el «path» completo del fichero, de lo contrario se asumirá relativo al directorio «TRANSDIR\etc».

c) Elección del tipo de cursor en programas de líneas.
La entrada de la sección «.CONFIGURATION» que permite modificar el tipo de cursor que aparecerá en los programas de líneas para indicar la línea en curso es la siguiente:

LINESCARET [0 | 1 | 2]

Donde:

  0 Valor por defecto (cursor _CARET_ de edición).
  1 y 2 Son dos cursores en forma de flecha, cada uno con distinto color. El color con el que aparecerá en pantalla depende del color del fondo de la ventana.

d) Elección del tipo de cursor de edición.
La entrada de la sección «.CONFIGURATION» que permite modificar el cursor de edición de campos es la siguiente:

CARET [BLOCK | VLINE | HLINE] [grosor]

Donde:

  BLOCK El cursor aparecerá en pantalla como un bloque rectangular. Éste es el valor por defecto.
  VLINE y HLINE El cursor aparecerá en pantalla como una línea vertical u horizontal, respectivamente. En estos casos se podrá especificar el grosor de dicha línea, expresado en píxeles.

e) Modificaciones en el aspecto de la ventana principal.
El título de la ventana Windows en la que se ejecuta el CTL puede cambiarse por medio de la entrada WINTITLE en la sección «.CONFIGURATION»:

WINTITLE texto

Donde:

  texto Será el texto que aparecerá en la cabecera de la ventana lanzada.

Este texto puede cambiarse en tiempo de ejecución por medio de la función «setwintitle», como veremos más adelante.

El interlineado en la pantalla puede modificarse por medio de la entrada EXTLEADING dentro de la sección «.CONFIGURATION». La sintaxis es:

EXTLEADING n

Donde:

  n Número comprendido entre 0 y 10 que indicará el número de píxeles que se deberá tener entre dos líneas de la pantalla.

f) Configuración del manejador de impresión.
Para facilitar el uso del gestor de impresión se pueden especificar valores como: PRTSET, DBPRINT, RPRINTER, PRINTMANFONT, FIXPRTCOLUMN (ver Funciones CTL Asociadas al Manejo de Impresión en el epígrafe 11.3).

Sección «.DLL»:
Esta sección permite definir las librerías dinámicas (DLLs) que posteriormente serán utilizadas por los programas CTL, así como las funciones exportadas de éstas que se usarán en los programas CTL. Su sintaxis es la siguiente:

LIB namelib
namefun ([type1, ... typen]) [RETURN type]
namefun ([type1, ... typen]) [RETURN type]
...
LIB namelib2
...

Donde:

  namelib Nombre de la librería DLL (p. ej. «DEMODLL.DLL»), que deberá estar en alguno de los directorios indicados en el «path».
  namefun Nombre de una función exportada de la librería. Por ejemplo: «ShowBmp».
  type Tipo de un parámetro o del valor retornado. Puede ser cualquiera de los siguientes:

   WORD: Dos bytes numérico, equivalente a SMALLINT.
   DWORD: 4 bytes numérico, equivalente a INTEGER, DATE o TIME.
   LPSTR: 4 bytes alfanumérico, equivalente a CHAR.

Conversiones de variables CTL a parámetros de la función:

Conversiones de valor retornado a variables CTL:

En la aplicación de demostración incluida en su copia de MultiBase/WIN se proporciona una librería («DEMODLL.DLL»), cuyos fuentes en C se encuentran en el directorio «C:\mbdemo». Asimismo, al menú de almacén se ha añadido un programa, denominado «DEMODLL.SCT», que utiliza dicha librería a modo de ejemplo.

Particularidades sobre las DLLs:
El CTL para Windows admite el mensaje de usuario WM_USER (ver «WINDOWS.H» en el SDK para Windows) con objeto de poder simular la función «dokey()».

Ejemplo:

SendMessage(hw, WM_USER, key, lab)

Donde:

  hw Obtenido con «gethwnd()». (Ver «Funciones Específicas...» en el epígrafe 11).
  WM_USER 0x0400.
  key Carácter ASCII. Si «key» es 0, «lab» equivale a un «string» con el nombre de una acción.

Por ejemplo:

SendMessage(hw, WM_USER, ‘h’, NULL)
SendMessage(hw, WM_USER, 0, "fuser1")

« »