Sei sulla pagina 1di 206

Tabla de contenido

Captulo 1.

1.1
1.2
1.3
1.4

WINDOWS..............................................

Qu son los eventos?...............................


Dilogo entre FiveWin y Windows................
Objetos, variables, mtodos y herencia .......
Sintxis FiveWin. Comandos preprocesados
y clases ......................................................

2
2
3

1.4.1
1.4.2

6
6

Funciones internas
WinApi

1.5 Estructuras de programas FiveWin


1.5.1
1.5.2
1.5.3

Ventana inicial
Men
Cajas de dilogo

6
7
7
7

Programas propuestos
1.
2.
3.
4.

5.

Generacin de clases
Utilizacin de clase generada
Derivacin de clases I
Derivacin de clases II

9
13
15
17

4.1
4.2
4.3
4.4

17
18
18
19

Tecnologa de orientacin a eventos

Captulo 2.

2.1
2.2
2.3
2.4
2.5
2.6
2.7

Generacin clase TTringulo From TFigura


Generacin clase TCuadrado From TFigura
Generacin clase TRectngulo From TFig.
Generacin clase TCirculo From TFigura

VENTANAS

19

21

Qu es una ventana ?
Partes de una ventana
Contenedora de objetos
Sintxis FiveWin de creacin de ventanas
Activar ventanas
Clusulas 'ON'
Ventanas MDI

21
22
23
23
26
27
28

2.7.1

28

Ventana MDI principal

Programacin Windows

2.7.2

Introduccin a FIVEWIN

Ventanas MDI hijas

2.8 Clase TWindow


2.9 Variables y mtodos ms usados

29
29
29

Programas propuestos
1.
2.
3.
4.
5.
6.
7.

Creacin de una ventana


Ventana con brocha
Ventana con estilo
Ventana con brocha .BMP
Asociacin de Icono a ventana
Ventana con estilo (nOR) y brocha .BMP
Clusulas 'ON'

Captulo 3.

MENUS

3.1 Mens Pop-Up


3.2 Definicin desde cdigo
3.2.1
3.2.2
3.3
3.4
3.5
3.6
3.7

Encapsulamiento de opciones
Variables y mtodos ms utilizados

Ventanas y mens
Barra de iconos
Men del sistema
Mens flotantes
Mens de herramientas

36
36
36
37
37
38
38

41

41
42
44
45
46
46
48
48
48

Programas propuestos
1.
2.
3.
4.
5.
6.
7.
8.

Creacin de mens Pop-Up


Creacin de mens con dibujos incorporados
Creacin de barra de iconos
Cambio del dibujo de un botn
Habilitar y deshabilitar botones
Creacin menu Pop-Up
Redefinir men del sistema
Barra de herramientas MsgToolBar

Captulo 4.

CAJAS DE DIALOGO

4.1 Cajas de dilogo Modales y No-Modales


4.1.1
4.1.2

Como crear cajas de dilogo


Activando la caja de dilogo

50
51
52
52
53
54
55
56

57

57
58
59

II

Programacin Windows

Introduccin a FIVEWIN

4.2 Caja de dilogo como contenedora de controles


4.3 Tipos de controles
4.4 Static Text
4.5 Edit Text
4.6 Radio Button
4.7 Check Box
4.8 Push Button
4.9 ListBox
4.10 ComboBox
4.11 Iconos
4.12 Bitmaps
4.13 Cursores
4.14 Scroll Bar
4.15 Controles VBX
4.16 Clase TDialog
4.16.1
4.16.2

Principales variables
Principales mtodos

60
60
61
63
64
65
66
68
69
70
71
72
72
74
75
75
76

Programas propuestos
1.

Ejemplo de utilizacin de comandos 'arroba' (@)

Captulo 5.

RESOURCE WORKSHOP

5.1 Qu son los Recursos?


5.2 Qu es el Resource WorkShop?
5.3 Qu haremos y que no haremos con el
Resource WorkShop
5.4 Almacenes de Recursos
5.5 Cajas de Dilogo
5.5.1
5.5.2
5.5.3
5.5.4
5.5.5
5.5.6
5.5.7
5.5.8
5.5.9
5.5.10
5.5.11

PushButton
RadioButton
Barras de Scroll
ListBox
ComboBox
Check Box
Static Text
Edit Text
TWBrowses
Bitmaps
Bitmaps, iconos y cursores

77

87

87
88
88
90
90
92
96
98
99
101
102
104
105
108
110
112

Programas propuestos

III

Programacin Windows

1.
2.
3.
4.
5.

'Busqueda blanda' en TWBrowses


116
Caja de dilogos No-Modales
117
Mostrar, ocultar, habilitar y deshabilitar controles
118
Manejo de controles: Checkbox, Listbox, Combobox
ScrollBar, Say, Get y PushButton
119
Manejo de ListBox. Clusula FILES
121

Captulo 6.

6.1
6.2
6.3
6.4
6.5

GENERADOR DE INFORMES

123

El generador de informes de FiveWin


Creacin de un informe
Informes a pantalla, disco o impresora
Cabeceras, pies de pgina y ttulos
Las columnas del informe

123
125
126
127
128

6.5.1
6.5.2
6.5.3

128
129

6.5.4
6.5.5
6.5.6
6.6
6.7
6.8
6.9

Introduccin a FIVEWIN

Contenido de las columnas


El ttulo de las columnas
Tamao, aspecto, alineacin y
posicin de las columnas
Tipos de letras en las columnas
Sombras y lineas en las columnas
Totales en las columnas

129
130
132
133

Informes agrupados y sumarios


Seleccin de los registros a imprimir
Gestin de sucesos en un informe
Los objetos del generador de informes

134
135
136
137

6.9.1

El objeto TReport

137

6.9.1.1
6.9.1.2

137
139

6.9.2

6.9.3

6.9.4

Principales datos
Principales mtodos

El objeto TRLine

140

6.9.2.1

141

Principales datos

El objeto TRColumn

141

6.9.3.1

142

Principales datos

El objeto TRGroup

143

6.9.4.1
6.9.4.2

143
143

Principales datos
Principales mtodos

Programas propuestos
1.

Listado n 1

144

IV

Programacin Windows

2.
3.

Introduccin a FIVEWIN

Listado n 2
Listado n 3

Captulo 7.

FICHEROS DE AYUDA

7.1 Creacin de ficheros de ayuda para Windows


7.2 Requisitos necesarios para desarrollar un fichero
de ayuda
7.3 Disear el fichero de ayuda
7.4 Escribiendo en fichero de ayuda
7.5 Las cadenas de contexto
7.6 Creacin de hiperenlaces
7.7 Hiperenlaces entre ficheros
7.8 El fichero de proyecto
7.9 Compilacin y visualizacin de la ayuda
7.10 Inclusin de grficos en un fichero de ayuda
7.11 El botn de buscar que no funciona
7.12 Uso de bitmaps en hiperenlaces
7.13 Creacin de secuencias
7.14 Las etiquetas de construccin (build tags)
7.15 Los ficheros de proyecto
7.16 Utilizacin de macros en ficheros de proyecto

145
146

149

149
150
151
152
153
154
155
156
157
157
159
160
161
162
164
171

Programas propuestos
1.

Creacin de un fichero de ayuda

182

Programacin Windows

Introduccin a FIVEWIN

1
WINDOWS

Nos vamos a adentrar en un mundo complicado como es la programacin


para Windows. Lo haremos de la mano del compilador CA-Clipper y de la
librera FiveWin, herramientas que nos garantizarn un camino poco
traumtico si tenemos en cuenta que la mayora de los programadores que se
adentren en este curso, sern expertos programadores en CA-Clipper.
Anticipamos que no es necesario un conocimiento profundo del CA-Clipper
para poder manejar FiveWin con soltura.
El pasar de un ambiente en modo texto a un ambiente grfico es un salto
considerable. Igualmente la transicin entre un sistema de programacin
procedural a un sistema orientado a eventos va a ser 'chocante' pero en
ningn caso ser un obstculo insalvable. Abordaremos la Programacin
Orientada a Objetos (OOPS) aunque no sea este el fin ltimo del curso,
estableciendo conceptos, enseando manejo y en definitiva marcando unos
conceptos bsicos que permitan a los usuarios de FiveWin y CA-Clipper
desarrollar sus programas conforme a unas tcnicas bastante avanzadas.
Todo ello explicado con un lenguaje claro y sencillo. Intentaremos no hacer
complicado lo sencillo.

____________________________________________________________________
1

Programacin Windows

1.1

Introduccin a FIVEWIN

Qu son los eventos?

Hemos hablado de un cambio en la


forma de programar. Pasaremos de
programar de una forma procedural
a un sistema de programacin
orientada al evento. Pero..., qu
es un evento? realmente un evento
para la gente de la calle es algo
que sucede en un momento
determinado. El diccionario habla
de sucesos y nosotros no vamos a llevarle la contraria al diccionario. Vamos a
programar de acuerdo a los sucesos que ocurran. Podemos imaginar uno de
nuestros programas. Estamos en una pantalla de captura de datos. Qu
eventos pueden suceder? Podemos pulsar una tecla, podemos mover el
cursor del ratn, podemos pulsar un botn del ratn, etc. S nosotros estamos
en casa sentados en el silln esperando que suceda algo, podemos identificar
las cosas que pasen como eventos. Pongmonos en el caso. Estamos en
casa y omos un timbre que identificamos con el telfono, omos unas
campanillas que identificamos con el timbre de la puerta de la calle. Estas son
algunas de las cosas que podemos identificar. Tambin podramos haber odo
un ruido de la calle, o se nos rompe un jarrn, etc. Ante estos sucesos o
eventos nosotros adoptamos una conducta en consecuencia. Si omos el
telfono que suena, vamos a cogerlo y respondemos al mismo. Si omos que
llaman a la puerta nos levantamos y abrimos la puerta. Si se nos rompe un
jarrn recogeremos los trocitos. En la programacin vamos a seguir el mismo
sistema. Tendremos un bucle del estilo DO WHILE y un enorme DO CASE
para prever todas las cosas que nos puedan suceder y las acciones que
emprenderemos.

1.2

Dilogo entre FiveWin y Windows

Si estuvisemos programando con el famoso SDK de MicroSoft tendramos


que teclear ese bucle Do While y ese enorme DO CASE pero no estamos
trabajando con SDK sino con FW. FiveWin resuelve este tema y nos deja a
nosotros que disfrutemos con los resultados. NO tenemos que preocuparnos
del bucle pues todo lo que suceda lo controlan a medias entre Windows y
FiveWin. Veamos como es ese dilogo que tienen estos dos sujetos.
W. Se ha detectado una pulsacin de tecla
FW. Tomo nota Windows. Como estoy en un Get anotar esa pulsacin
y la mostrar por pantalla.
W

Se est pulsando el botn derecho del ratn en las coordenadas


x,y.
FW Desplegar un men flotante en la posicin que me indicas.
W Han pulsado el botn de control de la ventana principal.
FW Despliega el men de control, por favor.

____________________________________________________________________
2

Programacin Windows

Introduccin a FIVEWIN

Este puede ser un dilogo que mantiene Windows y FiveWin. Windows esta
permanentemente alerta de lo que sucede con el equipo y FiveWin le
responde con acciones a tomar en cada caso. Adems FiveWin nos deja una
serie de oportunidades para que nosotros seamos los que digamos que cosas
hacer cuando se produzcan determinados sucesos o eventos. Ms adelante
veremos como hacerlo.

1.3 Objetos, variables, mtodos y herencia


Es un poco temerario el dedicar un solo punto a todas estas cosas pero
estamos en un curso que no es especfico de programacin orientada a
objetos y lo que vamos a intentar es despejar dudas sobre el tema sin
pretender formar expertos en la materia.
Estamos acostumbrndonos a or ltimamente hablar de objetos por todos los
sitios. No debemos preocuparnos demasiado porque objetos han existido
toda la vida y seguirn existiendo. Una pelota, un coche, un bolgrafo, un
televisor, todos ellos son objetos con caractersticas propias que los
diferencian unos de otros. Adems cada cosa nos sirve para hacer algo
determinado. Un objeto por tanto estar formado por materiales y estos
materiales servirn para 'dar vida' al mismo. S juntamos los componentes
necesarios podemos construir una radio que excitar nuestros sentidos al
reproducir la msica. S juntamos las piezas correspondientes podremos
construir un coche que nos traslade de un sitio a otro. Tambin podemos
fabricar un lapicero con el que dibujar. Siempre estamos hablando de
materiales y comportamientos. Los objetos son simplemente eso: Materiales y
comportamientos. En informtica tendremos que simular los objetos a base de
lineas de cdigo. No podemos pretender que mediante lineas de cdigo
podamos crear un objeto coche y subirnos en l para desplazarnos de un sitio
al otro, as es que solo los simularemos.
Vamos a simular mediante nuestros
programas, los objetos que nos permitan
realizar nuestro trabajo de forma ms
cmoda. La comodidad consiste en que
cada objeto que creemos llevar consigo
los materiales y las acciones que sepa
hacer. De esta forma se manejar una
cantidad de informacin muy grande
haciendo referencia simplemente a una
palabra.
En programacin llamaremos variables
de instancia a las caractersticas o materiales de los objetos y llamaremos
mtodos a los comportamientos de los mismos. De todos es sabido que CAClipper no soporta una programacin orientada al objeto total. Simplemente
tiene cuatro clases predefinidas. FiveWin incorpora en su interior un ncleo
llamado Objects que va a permitir definir cuantas clases de objetos
queramos. Solo tendremos que hacerlo con la sintaxis especial que propone.

CLASS nombre de clase

____________________________________________________________________
3

Programacin Windows

Introduccin a FIVEWIN

DATA componente
DATA componente
DATA componente
.
.
METHOD nombre de mtodo CONSTRUCTOR
METHOD nombre de mtodo
METHOD nombre de mtodo
.
.
.
ENDCLASS

Por medio de esta sintaxis crearemos Clases de objetos, entendiendo por


clase aquello que engloba a todos los objetos del mismo tipo. La clase Medios
de transporte engloba a todos los objetos que sirven para transportar a gente,
animales o casas de un lugar a otro. Tienen caractersticas comunes que
hacen que pertenezcan a la misma clase. La clase juguetes agrupa a todas
las cosas que cumplen con el mismo fin: divertir a las personas cuando
juegan con ellos. La clase es algo general, son como las caractersticas
bsicas que todo objeto tiene que cumplir para poder ser considerado del
mismo tipo que otro.
Siempre tendremos un Mtodo CONSTRUCTOR que nos fabricar los
objetos. Realmente lo que har ser recoger todos los materiales y juntarlos.
En programacin nos devolver una serie de variables y mtodos a las que
nosotros identificaremos por un nombre. En CA-Clipper hacamos oGet :=
GetNew( ), oBrowse := TBrowse:New( ). En FiveWin haremos:
oMiObjeto := MiClase( ):New( )
Estamos asignando a una variable llamada oMiObjeto, lo que devuelva el
mtodo New de la clase MiClase. En la siguiente lnea de mi cdigo, la
variable oMiObjeto contendr el objeto en cuestin.
Cuando queramos referirnos a los mtodos de ese objeto nombraremos
primero el objeto seguido de dos puntos ':' y el nombre del mtodo como si se
tratase de una funcin normal y corriente:
oMiObjeto:Muevete( )
Muvete sera un mtodo que se habra codificado cuando creamos la clase.
S lo que queremos hacer es referirnos a una variable del objeto tendremos
que referirnos a ella anteponiendo el nombre del objeto:
oMiObjeto:nAlto := 7

nValor := oMiObjeto: nAlto

Posteriormente iremos viendo objetos a medida que vayamos avanzando en


el curso as como los manejos que haremos de sus mtodos y variables.
Por ltimo haremos mencin de la facultad que tienen las clases de heredar
las caractersticas de otra clase de objetos. Utilizando la clusula FROM
disponemos de todas las variables y mtodos de la clase especificada

____________________________________________________________________
4

Programacin Windows

Introduccin a FIVEWIN

pudiendo adems rechazar las variables que no nos sirvan y aadir las
nuevas. Esto mismo sirve tambin para los mtodos.
CLASS nombre de clase FROM clase antiga
DATA componente nuevo
METHOD nombre de mtodo CONSTRUCTOR
METHOD nombre de mtodo
ENDCLASS
La clase as definida hereda todas las caractersticas de la clase de la cual
proviene y adems agrega nuevos componentes que harn los objetos
distintos de los que haca la clase anterior.

1.4

Sintaxis FiveWin. Comandos preprocesados y clases

Los autores de FiveWin han apostado por una sintaxis intuitiva a base de
comandos preprocesados que hacen del manejo de las clases una tarea muy
sencilla. El potente preprocesador de CA-Clipper va a convertir una serie de
comandos preprocesados en llamadas a las clases de FiveWin. Algunas
personas piensan que esta forma de obrar es enmascarar realmente lo que
se hace. No creo que sea esta la cuestin pues lo nico que no est
enmascarado en programacin sera el lenguaje mquina de un ejecutable.
Lo que hacen los autores de FiveWin es facilitar el trabajo.
Una gran parte de los comandos preprocesados van a servir para conseguir
un objeto de un tipo concreto. As cuando digamos DEFINE BRUSH oBrush lo
que estamos realmente pidiendo es un objeto del tipo TBrush. Cuando
digamos DEFINE WINDOW oWnd estaremos solicitando un objeto de la clase
TWindow. Cuando digamos @ 10,10 BUTTON oBoton ... estaremos pidiendo
a la clase TButton que nos suministre un objeto botn. A medida que
avancemos en los temas iremos profundizando en los comandos
preprocesados. Igualmente el
alumno puede comprobar la
sintaxis de los comandos en el
CodeCar
que
sirve
de
complemento a este manual.
Podemos utilizar en caso de
duda, los ficheros cabecera
almacenados en el directorio
INCLUDE donde podemos ver
por una parte los comandos
preprocesados y por otra la
conversin a las diferentes
llamadas de las clases. En caso
de duda podemos compilar
nuestro programa con la opcin '/P' que sirve para conservar el fichero con
extensin .PPO que crea CA-Clipper en el proceso de compilacin. En el
veremos la 'cruda realidad' de los programas. Todos los comandos de CAClipper y de FiveWin traducidos a sus ltimas consecuencias.

____________________________________________________________________
5

Programacin Windows

Introduccin a FIVEWIN

1.4.1 Funciones internas


FiveWin se ha decantado por los comandos preprocesados, pero esto no
quiere decir que todo en FiveWin este hecho de la misma forma. Incorpora
una serie de funciones escritas en CA-Clipper y en lenguaje propio para
facilitar el camino a los programadores. Disponemos de los fuentes de las
mismas en el directorio SOURCE\FUNCTION. Pueden encontrar la
explicacin de todas ellas en el CodeCar adjunto.

1.4.2 WinApi
CA-Clipper esta escrito en lenguaje 'C'. FiveWin tambin pero adems
estamos trabajando en Windows lo cual supone que utilizaremos el API de
Windows. En las diferentes versiones de CA-Clipper hemos visto que este
compilador se entenda a las mil maravillas con 'C'. Lo haca a travs del
sistema Extendido. Todo porque CA-Clipper y 'C' no trabajan con la misma
'pila' (no pueden hacerse llamadas directas a 'C'). En este nuevo entorno
sucede que tenemos a nuestra disposicin todas las funciones del API de
Windows pero sigue existiendo el mismo problema de paso de parmetros a
travs de la dichosa pila. Haciendo la correspondiente funcin puente para
pasarle los parmetros a Windows las funciones del API estn a nuestro
servicio. Lo nico que hay que hacer es fabricar esa funcin puente, compilar
el fichero .C y lincarlo con nuestro programa.
El fabricante de FiveWin ha realizado un montn de funciones puente para
que gran parte de las funciones del API puedan ser llamadas desde FiveWin.
El cdigo fuente de las mismas lo encontraremos en el directorio
SOURCE\WINAPI y el listado de ellas en el CodeCar.

1.5

Estructura de programas FiveWin

No debemos de olvidarnos nunca que FiveWin es una librera para CAClipper, lo que significa que seguimos programando en CA-Clipper al igual
que lo hemos venido haciendo siempre. Antes utilizbamos libreras de
terceros tales como las Nantucket Tools, Funcky, Nanford, etc. Ahora
FiveWin, por lo tanto vamos a seguir conservando la estructura de nuestros
programas, lo nico es que como dijimos al principio, se introduce un nuevo
estilo de programacin que es la orientacin al evento, Se potencia el trabajo
con clases y se remoza el viejo interface de nuestros programas con el
usuario. Se sustituye el modo texto por el modo grfico que proporciona
Windows. Tendremos que empezar a pensar en 'modo Windows'. En este
nuevo entorno todo funciona por mdulos, todo son unidades independientes
con caractersticas propias. Bueno... porque no decirlo, todo son objetos.
Unos objetos preciosos, llenos de variables y de mtodos que nos van a
resultar maravillosos. Estos objetos tienen una particularidad y es que si
pensamos en un botn este va a llevar asociada la accin a realizar cuando
se pulse. S pensamos en un men cada opcin del mismo llevar asociada
una determinada accin. Vamos a comprobar que tenemos un
'empaquetamiento' que nos har ver nuestra programacin de una forma

____________________________________________________________________
6

Programacin Windows

Introduccin a FIVEWIN

distinta a la que venamos observando


anteriormente en nuestro entorno de trabajo
DOS.

1.5.1 Ventana inicial


Cuando empecemos a hacer nuestro primer
programa, nos vamos a dar cuenta de que
todo lo que hagamos descansar sobre una
ventana a la que llamaremos ventana inicial.
De ella partirn las llamadas a las diferentes opciones de la aplicacin.
Como ser nuestra ventana principal? Realmente no es muy diferente a las
ventanas que estamos acostumbrados a ver en Windows. Incluso dira que es
igual que ellas. Como no va a ser igual s estamos programando en
Windows?
Cuando programbamos en DOS utilizbamos una pantalla principal para
introducir al usuario en nuestra aplicacin. Desde ella podamos elegir una
opcin de un men y en funcin de la eleccin se llamara a una u otra
funcin. En FiveWin sucede lo mismo, lo nico que esa pantalla inicial es una
ventana.

1.5.2 Men
Esta ventana inicial, al igual que nuestras viejas pantallas iniciales, tienen un
men para que el usuario elija el camino a seguir. Antes sudbamos tinta
china para dotar a nuestros programas de un men tipo 'Pull-down'. Esos
tiempos quedaron atrs! Afortunadamente FiveWin incorpora una serie de
comandos preprocesados que nos permitirn fabricar mens del tipo
reseado, del tipo 'barra de iconos' y algn otro ms. En ellos
las opciones llevan asociadas las acciones que se ejecutarn
al elegirse, el mensaje que se mostrar en la barra de
mensajes, el color ... toda una serie de datos que facilitarn la
vida al programador y que se irn especificando a medida que
se va definiendo el propio men.

1.5.3 Cajas de dilogo


S antes hablbamos de la ventana como esa pantalla inicial de nuestros
programas en modo texto, ahora tenemos que hablar de las sucesivas
pantallas a las que accedamos por medio de nuestro men. En Windows
vamos a acceder a un tipo de ventana un poco especial que se llama Caja de
Dilogo. En estas cajas de dilogo vamos a mantener precisamente, un
dilogo con el usuario. Le pediremos datos y el usuario nos los proporcionar.
Le mostraremos dibujos, listas de eleccin donde pueda seleccionar alguno
de los datos suministrados, botones para desencadenar acciones, etc.
Necesitbamos que el ordenador recogiera los deseos del usuario y las cajas
de dilogo van a abrir una va de comunicacin entre ambos.

____________________________________________________________________
7

Programacin Windows

Introduccin a FIVEWIN

____________________________________________________________________
8

Programacin Windows

Introduccin a FIVEWIN

PROGRAMAS PROPUESTOS
1. Programa de generacin de clases
Sencillo programa de generacin de clases en modo texto donde podemos
apreciar la forma en que se crea una clase con sus variables de instancia y
mtodos.

#include 'Objects.ch'
// Ejemplo de definicin de una clase Botn con apariencia 3D

CLASS TBoton3D

// Comenzamos la definicin de la clase


// Indicamos que datos va a contener la clase

DATA cTexto
// Texto del Botn
DATA nArriba, nIzquierda
// Coordenadas del botn
DATA cColorLetra, cColorSombra // Color de las letras y de la sombra
DATA cAntiguaPantalla
// Pantalla bajo el botn
DATA lEsVisible
// Es visible ?
DATA lEstaPulsado
// Est pulsado ?
// Indicamos los mtodos que contendr la clase
// Constructor para los objetos de la clase
METHOD New ( cTexto , nArriba , nIzquierda , cColorLetra ,;
cColorSombra ) CONSTRUCTOR
// Mtodo para mostrar los botones
METHOD Mostrar ( lEstaPulsado )
// Mtodo para ocultar los botones
METHOD Ocultar ()
// Mtodo para mover los botones
METHOD Mover (nlinea, nColumna)
// Mtodo para pulsar un botn
METHOD Pulsar ()
// Mtodo para soltar un botn
METHOD Soltar ()
ENDCLASS
//----------------------------------------------------------------------//
// Comenzamos a codificar cada uno de los mtodos de la clase
//
// Creacin de un botn
METHOD New ( cTexto , nArriba , nIzquierda ,;
cColorLetra , cColorSombra) CLASS TBoton3D
// OJO Hay que indicar a que
// clase pertenece el mtodo
// Definimos los valores por defecto para los parmetros

____________________________________________________________________
9

Programacin Windows

DEFAULT

Introduccin a FIVEWIN

cTexto
nArriba
nIzquierda
cColorLetra
cColorSombra

:= "Botn" , ;
:= ROW() , ;
:= COL() , ;
:= "W/G" , ;
:= "N/B"

// Inicializamos los datos de la clase


// Observar que aunque las dos variables tienen el mismo nombre
// son distintas, ya que el operador :: le dice al compilador
// que se trata de variables de la clase
// Variable de la clase

Parmetro de la funcin

::cTexto
::nArriba
::nIzquierda
::lEsVisible
::cColorLEtra
::cColorSombra
::lEstaPulsado := .F.

:= cTexto
:= nArriba
:= nIzquierda
:= .F.
:= cColorLetra
:= cColorSombra

RETURN nil

// Mostrar un botn
METHOD Mostrar ( lEstaPulsado ) CLASS TBoton3D
LOCAL nRow, nCol
DEFAULT

lEstaPulsado := ::lEstaPulsado

// Solo lo pintamos si est oculto o si su estado ha cambiado


IF (.NOT. ::lEsVisible) .OR. ( ::lEstaPulsado != lEstaPulsado )
DispBegin()
::lEstaPulsado := lEstaPulsado
// Salvamos la pantalla
IF ::lEstaPulsado
::cAntiguaPantalla := SAVESCREEN ( ::nArriba, ;
::nIzquierda+1, ;
::nArriba, ;
::nIzquierda+LEN(::cTexto) )
ELSE
::cAntiguaPantalla := SAVESCREEN( ::nArriba, ;
::nIzquierda, ;
::nArriba+1, ;
::nIzquierda+LEN(::cTexto)+1 )
ENDIF
nRow
nCol

:= ROW()
:= COL()

// Pintamos el botn
IF ::lEstaPulsado
@ ::nArriba, ::nIzquierda+1 SAY ::cTexto COLOR ::cColorLetra
ELSE
@ ::nArriba , ::nIzquierda SAY ::cTexto COLOR ::cColorLetra
@ ROW() , COL() SAY "_" COLOR ::cColorSombra
@ ::nArriba+1 , ::nIzquierda+1 SAY REPLICATE ("_", LEN (::cTexto)) ;
COLOR ::cColorSombra
ENDIF

____________________________________________________________________
10

Programacin Windows

Introduccin a FIVEWIN

// Restauramos el cursor a su sitio


DEVPOS (nRow,nCol)
// Indicamos que el botn est visible
::lEsVisible := .T.
DispEnd()
ENDIF
RETURN NIL

// Ocultar el botn
METHOD Ocultar() CLASS TBoton3D
// Solo lo ocultamos si el botn es visible
IF ::lEsVisible
DispBegin()
// Restablecemos la pantalla
IF ::lEstaPulsado
RESTSCREEN ( ::nArriba, ::nIzquierda + 1, ;
::nArriba, ::nIzquierda + LEN (::cTexto) ,;
::cAntiguaPantalla )
ELSE
RESTSCREEN ( ::nArriba, ::nIzquierda, ;
::nArriba+1, ::nIzquierda + LEN (::cTexto)+1 ,;
::cAntiguaPantalla )
ENDIF
// Indicamos que ya no es visible
::lEsVisible := .F.
DispEnd()
ENDIF
RETURN NIL

// Cambiar la posicin del botn


METHOD Mover ( nLinea , nColumna ) CLASS TBoton3D
LOCAL lEraVisible
// Guardamos su estado de visibilidad
lEraVisible := ::lEsVisible
// Comprobamos si est en pantalla
IF lEraVisible
::Ocultar()
ENDIF
// Cambiamos su posicin
::nArriba
:= nLinea
::nIzquierda := nColumna
// Si era visible, lo volvemos a mostrar
IF lEraVisible
::Mostrar()
ENDIF
RETURN NIL

____________________________________________________________________
11

Programacin Windows

Introduccin a FIVEWIN

// Pulsar el botn
METHOD Pulsar() CLASS TBoton3D
// Solo lo pulsamos si es visible
IF ::lEsVisible
DispBegin()
::Ocultar()
// Lo ocultamos
::Mostrar(.T.)
// y lo redibujamos pulsado
DispEnd()
ENDIF
::lEstaPulsado := .T.
RETURN NIL

METHOD Soltar() CLASS TBoton3D


// Solo lo soltamos si es visible
IF ::lEsVisible
DispBegin()
::Ocultar()
// Lo ocultamos
::Mostrar(.F.)
// y lo redibujamos soltado
DispEnd()
ENDIF
::lEstaPulsado := .F.
RETURN NIL

____________________________________________________________________
12

Programacin Windows

Introduccin a FIVEWIN

2. Programa de demostracin de la utilizacin de la clase creada


anterior-mente

Programa que muestra tres botones en la pantalla con aspecto 3D. Los
mueve de derecha a izquierda, los pulsa y posteriormente los oculta.

#include "Objects.ch"

// Vamos a probar la clase TBoton3D

FUNCTION Main()
LOCAL oBoton1, oBoton2, oBoton3 // Definimos tres variables que contendrn
// los objetos botn que vamos a crear
// Creamos los botones mediante llamadas al mtodo de la clase
// que hemos definido como CONSTRUCTOR (en nuestro caso New() )
oBoton1 := TBoton3D():New("Primero",5,60,"W+/G","N/B")
oBoton2 := TBoton3D():New("Segundo",12,60,"W/R","N/B")
oBoton3 := TBoton3D():New("Tercero",17,60,"GR+/R","N/B")
// Limpiamos la pantalla
SETCOLOR("W/B")
CLS
@ 1, 0 TO MAXROW(), MAXCOL() DOUBLE
// Mostramos los botones
@ 0,0 CLEAR TO 0,MAXCOL()

____________________________________________________________________
13

Programacin Windows

Introduccin a FIVEWIN

@ 0,0 SAY "Mostrando los botones"


oBoton1:Mostrar()
Inkey(1)
oBoton2:Mostrar()
Inkey(1)
oBoton3:Mostrar()
Inkey(3)

// Movemos los botones


// Pasamos los objetos como parametros a una funcin
@ 0,0 CLEAR TO 0,MAXCOL()
@ 0,0 SAY "Moviendo los botones"
Origen(oBoton1)
Inkey(1)
Origen(oBoton2)
Inkey(1)
Origen(oBoton3)
Inkey(1)
// Pulsamos los botones
@ 0,0 CLEAR TO 0,MAXCOL()
@ 0,0 SAY "Pulsando los botones"
oBoton1:Pulsar()
inkey(.5)
oBoton1:Soltar()
inkey(.5)
oBoton2:Pulsar()
inkey(.5)
oBoton2:Soltar()
inkey(.5)
oBoton3:Pulsar()
inkey(.5)
oBoton3:Soltar()
inkey(.5)
// Ocultamos los botones
@ 0,0 CLEAR TO 0,MAXCOL()
@ 0,0 SAY " Ocultando los botones"
oBoton2:Ocultar()
Inkey(1)
oBoton3:Ocultar()
Inkey(1)
oBoton1:Ocultar()
Inkey(1)
SET COLOR TO "W/N"
CLS
? "Fin del ejemplo"
? ""
RETURN NIL
//----------------------------------------------------------------------//
// Esta funcin mueve un botn hasta la 1 columna de la pantalla
FUNCTION Origen(oBoton)

____________________________________________________________________
14

Programacin Windows

Introduccin a FIVEWIN

LOCAL nI
FOR nI := oBoton:nIzquierda TO 1 STEP -1
oBoton:Mover(oBoton:nArriba,nI)
NEXT nI
// Podramos haber hecho oBoton:Mover(oBoton:nArriba,0),
// pero esto queda ms bonito
RETURN NIL
//----------------------------------------------------------------------//

3. Programa de ejemplo de derivacin de clases


El programa deriva una nueva clase que llamamos boton2d de la clase
creada anteriormente llamada boton3D.
#include "Objects.ch"
// Creamos un nuevo tipo de Boton3D
// Derivamos TBoton3D2 de TBoton3D
CLASS TBoton3D2 FROM TBoton3D
// Todos los datos de la clase padre (TBoton3D) se heredan
// automticamente, as como sus metodos. Solo es necesario
// escribir aquellos que sean nuevos o que realizen una accin
// diferente.
//
// En nuestro caso reescribimos Mostrar() y Ocultar() ya que el
// dibujo del Botn es distinto.
// Podramos haber reescrito el metodo NEW, ya que para este tipo
// de botn solo vamos a utilizar un color, pero cuando no es necesario
// hacer algo, es necesario no hacerlo (siempre que funcione)
METHOD Mostrar( lEstaPulsado )
METHOD Ocultar()
ENDCLASS
//-----------------------------------------------------------------------//
// Mostrar el botn
METHOD Mostrar( lEstaPulsado ) CLASS TBoton3D2
LOCAL nRow, nCol, cForeGround, cBackGround
DEFAULT lEstaPulsado := ::lEstaPulsado
// Solo lo pintamos si est oculto o si su estado ha cambiado
IF (.NOT. ::lEsVisible) .OR. ( ::lEstaPulsado != lEstaPulsado )
DispBegin()
cForeGround := IF(AT("/",::cColorLetra)!=0,;
LEFT(::cColorLetra,AT("/",::cColorLetra)-1),;
::cColorLetra)
cBackGround := IF(AT ("/",::cColorLetra) !=0, RIGHT (::cColorLetra, ;
LEN (::cColorLetra) - AT ("/",::cColorLetra)), "B")
::lEstaPulsado := lEstaPulsado

____________________________________________________________________
15

Programacin Windows

Introduccin a FIVEWIN

// Salvamos la pantalla
::cAntiguaPantalla := SAVESCREEN (::nArriba, ;
::nIzquierda, ;
::nArriba, ;
::nIzquierda+LEN(::cTexto)+2 )
nRow := ROW()
nCol := COL()

// Pintamos el botn
IF ::lEstaPulsado
@ ::nArriba, ::nIzquierda SAY " "+::cTexto COLOR ::cColorLetra
ELSE
@ ::nArriba , ::nIzquierda SAY "" COLOR cBackGround+"+/"+cBackGround
@ ::nArriba , ::nIzquierda+1 SAY ::cTexto COLOR ::cColorLetra
@ ::nArriba , COL() SAY "" COLOR "N/"+cBackGround
ENDIF
// Restauramos el cursor a su sitio
DEVPOS(nRow,nCol)
// Indicamos que el botn est visible
::lEsVisible := .T.
DispEnd()
ENDIF
RETURN NIL

//-----------------------------------------------------------------------//
// Ocultar el botn
METHOD Ocultar() CLASS TBoton3D2
// Solo lo ocultamos si el botn es visible
IF ::lEsVisible
DispBegin()
// Restablecemos la pantalla
RESTSCREEN (::nArriba, ::nIzquierda, ::nArriba, ::nIzquierda + ;
LEN (::cTexto)+2 , ::cAntiguaPantalla )
// Indicamos que ya no es visible
::lEsVisible := .F.
DispEnd()
ENDIF
RETURN NIL

____________________________________________________________________
16

Programacin Windows

Introduccin a FIVEWIN

4. Problema de derivacin de clases


Este problema empieza generando una clase llamada figura para luego ir
derivando sucesivamente las clases tringulo, cuadrado, rectngulo y
crculo.
Creacin de una clase base que represente (no que dibuje) una figura
geomtrica genrica.
A partir de esta clase base, derivar una serie de clases para figuras
geomtricas reales (Cuadrados, Crculos, Tringulos, ...), implementando un
mtodo que calcule el rea de la figura.

#include "Objects.ch"
CLASS TFigura
DATA nX, nY

// Variable en la que vamos a guardar las


// dimensiones de la figura. Definimos 2 ya que
// la mayora de las figuras que vamos a derivar
// necesitan dos dimensiones para calcular el
// rea. Si necesitan ms, las implementaremos en
// la derivacin

// Constructor de la clase
METHOD New( nX, nY) CONSTRUCTOR
// Calculo del rea de la figura
METHOD Area() VIRTUAL
ENDCLASS
//----------------------------------------------------------------------//
METHOD New( nX, nY) CLASS TFigura
DEFAULT nY := nX // Si no pasamos el segundo parmetro, se asume
// igual al primero
::nX := nX
::nY := nY
RETURN NIL
//----------------------------------------------------------------------//

4.1 Programa que genera la clase TTriangulo derivada de la clase


TFigura
#include "Objects.ch"

CLASS TTriangulo FROM TFigura


// Solo reescribimos el clculo de rea.
// Es lo nico que necesitamos
METHOD Area()
ENDCLASS

____________________________________________________________________
17

Programacin Windows

Introduccin a FIVEWIN

METHOD Area() CLASS TTriangulo


LOCAL nArea
// Area = Base * Altura / 2
nArea := ::nX * ::nY / 2 // Heredadas de la clase base
RETURN nArea

4.2 Programa que genera la clase TCuadrado derivada de la clase


TFigura
#include "Objects.ch"
CLASS TCuadrado FROM TRectangulo
// Esta clase no tiene ni DATA ni METHOD
//
// Un cuadrado no es sino un rectngulo en el que la
// base y la altura son iguales. Gracias al DEFAULT en
// el constructor de la clase base, no es necesario
// definir nada.
ENDCLASS

4.3 Programa que genera la clase TRectangulo derivada de la clase


TFigura
#include "Objects.ch"

CLASS TRectangulo FROM TFigura


// Solo reescribimos el clculo de rea.
// Es lo nico que necesitamos
METHOD Area()
ENDCLASS

METHOD Area() CLASS TRectangulo


LOCAL nArea
// Area = Base * Altura
nArea := ::nX * ::nY // Heredadas de la clase base
RETURN nArea

____________________________________________________________________
18

Programacin Windows

Introduccin a FIVEWIN

4.4 Programa que genera la clase TCirculo derivada de la clase TFigura


#include "Objects.ch"

CLASS TCirculo FROM TFigura


// Solo reescribimos el clculo de area.
// Es lo nico que necesitamos
METHOD Area()
ENDCLASS

METHOD Area() CLASS TCirculo


LOCAL nArea
// Area = PI * Radio^2
nArea := 3.1416 * ::nX * ::nX // Heredadas de la clase base
RETURN nArea

5. Problema demostrativo de como funciona un programa con tecnologa


de orientacin a eventos.
#include "Inkey.ch"
// Ejemplo de como funciona un programa orientado a eventos
STATIC aListaDeEventos := {}
// Lista con los eventos que vamos a manejar
STATIC aBotones := {}
// Los botones de nuestro programa
STATIC bSinEventos
// Codeblock que se ejecutar mientras no se
// producen eventos.
FUNCTION Main()
LOCAL nI
SET COLOR TO "W/B"
CLS
@0,0 TO MAXROW()-1,MAXCOL()
@ 1,1 SAY "Pulse F10 para terminar"
// Creamos unos cuantos botones y los mostramos
FOR nI := 1 TO 10
AADD(aBotones,;
TBoton3D():New(" F"+ALLTRIM(STR(nI))+" ",(nI-1)*2+2,12,"W+/G"))
ATAIL(aBotones):Mostrar()
NEXT nI
// Aadimos eventos a la lista. Cada posicin de la tabla es un array
// que contiene una tecla que activa el evento y el codeblock que ha
// de ejecutar
AADD(aListaDeEventos, {K_F1,{|| Procesa(1) } })
AADD(aListaDeEventos, {K_F2,{|| Procesa(2) } })
AADD(aListaDeEventos, {K_F3,{|| Procesa(3) } })
AADD(aListaDeEventos, {K_F4,{|| Procesa(4) } })
AADD(aListaDeEventos, {K_F5,{|| Procesa(5) } })
AADD(aListaDeEventos, {K_F6,{|| Procesa(6) } })

____________________________________________________________________
19

Programacin Windows

Introduccin a FIVEWIN

AADD(aListaDeEventos, {K_F7,{|| Procesa(7) } })


AADD(aListaDeEventos, {K_F8,{|| Procesa(8) } })
AADD(aListaDeEventos, {K_F9,{|| Procesa(9) } })
AADD(aListaDeEventos, {K_F10,{|| Procesa(10) , FinPrograma() } })
bSinEventos := {|| Reloj() }

// Se ejecuta cuando no hay eventos

GestorDeEventos()

// Cedemos el control al procesador de eventos

RETURN NIL

FUNCTION GestorDeEventos()
LOCAL nI, nTecla
// Entramos en el bucle de espera.
DO WHILE .T.
nTecla := INKEY()
IF nTecla != 0 // Si se ha pulsado una tecla se comprueba si
// se ha colocado un evento asociado
FOR nI := 1 TO LEN(aListaDeEventos)
IF nTecla == aListaDeEventos[nI,1]
// Si lo encontramos, ejecutamos el
// Codeblock asociado
EVAL(aListaDeEventos[nI,2])
EXIT
ENDIF
NEXT nI
ENDIF
// Aqu ejecutamos la accin por defecto del programa
EVAL(bSinEventos)
ENDDO
RETURN NIL

// Funcin a la que llaman los eventos. Para este ejemplo hemos usado una
// sola funcin en lugar de varias.
FUNCTION Procesa(nCual)
aBotones[nCual]:Pulsar()
@ MAXROW(),0 CLEAR TO MAXROW(),MAXCOL()
@ MAXROW(),0 SAY "Ha pulsado la tecla F"+alltrim(str(nCual))
CLEAR TYPEAHEAD
Inkey(1)
aBotones[nCual]:Soltar()
@ MAXROW(),0 CLEAR TO MAXROW(),MAXCOL()
RETURN NIL

FUNCTION FinPrograma()
SET COLOR TO "W/N"
CLS
? "Fin del Programa"
CANCEL
RETURN NIL

FUNCTION Reloj()
@0,MAXCOL()-10 SAY TIME()
RETURN nil

____________________________________________________________________
20

Programacin Windows

Introduccin a FIVEWIN

TEST DE EVALUACIN
Por favor, marque con una seal la respuesta o respuestas vlidas para cada
pregunta.

1.
Cmo se llaman los materiales con que construimos los
objetos?
Variables estticas
Variables importadas
Variables de instancia
2.

Cmo se llama el sistema de programacin de Windows?


Orientado al evento
Orientado a la funcin
Orientado al programador

3-

Cmo se llama el mtodo con el que se crean los objetos?


Creador
Fabricante
Constructor

4.

Dnde se encuentran los comandos preprocesados?


En las libreras
En los mdulos reemplazables
En los ficheros cabecera

5.
Qu partcula sirve para
proceso de creacin?

heredar una clase de otra en el

CLASS
CONSTRUCTOR
FROM
6.

Cuando llamamos a los comandos preprocesados, estos


traducen la llamada a ... ?
Una funcin de Windows
Una clase de FiveWin
Una funcin de Clipper

Respuestas vlidas ..........................................

______

____________________________________________________________________
21

Programacin Windows

Introduccin a FIVEWIN

____________________________________________________________________
22

Programacin Windows

Introduccin a FIVEWIN

2
VENTANAS

2.1

Qu es una ventana?

Efectivamente, una ventana tambin es lo que nos seala nuestro personaje,


pero si nos centramos en el terreno en que estamos estudiando, una ventana
es un rectngulo con unas
caractersticas muy particulares. Es
la estrella de este nuevo entorno. De
repente parece que todo son
ventanas: Las ventanas, las cajas de
dilogo, incluso los botones!
FiveWin aporta una nueva solucin a
la programacin Windows y para ello
incorpora las clases. Crea una clase
base que se llama TWindow de
donde va a ir derivando las cajas de
dilogo, las barras de botones, las
ventanas MDI, las barras de
mensaje y los controles.

Programacin Windows

Introduccin a FIVEWIN

Las ventanas son unos rectngulos donde va a aparecer nuestras cajas de


dilogo, controles, mens, etc. Estas ventanas llevan incorporadas en sus
esquinas superiores, unos botones que servirn para manejarlas. A la
izquierda un botn de control y a la derecha botones de maximizar, minimizar
y en su caso restaurar.
Comentamos en el primer captulo que la herencia entre clases permita que
una clase que estemos creando herede todas las caractersticas de la clase
padre. Tambin dijimos que poda sustituir elementos de la clase padre por
elementos propios que serviran para hacer diferente a esta nueva clase. Esto
es lo que sucede con la caja de dilogo, botones, etc. Heredan caractersticas
de la clase TWindow pero luego se particularizan para ser lo que son.

2.2

Partes de una ventana

Por fin vemos lo que es realmente una ventana. Ya habamos visto alguna
otras veces cuando entramos en Windows, ahora vamos a observar los
elementos que la forman.

Como podemos observar no se trataba simplemente de un rectngulo. Los


controles que vemos en la imagen a excepcin del men sern puestos por
FiveWin de manera automtica cuando creemos una ventana.
El primero de ellos es el botn de control, que desplegar al pulsarlo un men
que llamamos del sistema. Despus vemos la barra de ttulo que sirve
precisamente para poner el ttulo de la ventana. En la esquina derecha nos
encontramos con dos botones. Minimizar y maximizar. Sirven para convertir la
ventana en un icono y para hacer que la ventana ocupe la totalidad de la
pantalla. Debajo de la barra de ttulo encontramos la barra de men y por
ltimo los bordes de la ventana que convierten a la ventana en
redimensionable. Cuando pinchamos en uno de sus bordes o esquinas y
arrastramos el ratn sin soltar el botn, la ventana cambia de tamao.

Programacin Windows

2.3

Introduccin a FIVEWIN

Contenedora de objetos

Realmente no es para tanto. Hemos dicho que


vamos a utilizar controles y que esos controles
van a ser objetos, es lgico pensar que las
ventanas o cajas de dilogo donde van a
aparecer sean los dueos de los mismos. El
concepto de contenedor debemos interpretarlo
como dueo o responsables de los objetos. As
suceder que tanto las ventanas como las cajas
de dilogo se van a responsabilizar de los
controles que contengan. Esto quiere decir que cuando le toque mostrarse a
la ventana esta lo har y se encargar de que lo hagan los controles que
contenga. Tambin suceder que cuando la ventana o la caja de dilogo
termine su existencia la terminarn todos los controles que contuviese.
Para terminar hemos de saber que la clase TWindow guarda un array donde
va a guardar todos los controles que se le vayan aadiendo. De esta forma no
habr ningn problema para manejarlos sabiendo en todo momento cuantos
tiene y como se llaman.

2.4

Sintaxis FiveWin de creacin de ventanas

Como dijimos anteriormente, los creadores de FiveWin han apostado por una
forma de trabajar a base de comandos preprocesados. Estos sern
convertidos por el preprocesador de CA-Clipper en llamadas a las clases
correspondientes. En este caso la llamada ser a la clase TWindow y se le
pasarn una serie de parmetros que configurarn a nuestro gusto la ventana
resultante.
La sintaxis completa de definicin de ventana se puede encontrar en el
CodeCar. Tenemos que ver el proceso de creacin de ventanas en dos
partes:
la primera ser la definicin de la ventana.
la segunda ser la activacin de la misma.
Estos dos procesos son como cuando estamos preparando un plato en
nuestra cocina. Primero lo fabricamos y cuando llega el momento nos lo
comemos.
En una primera fase vamos a definir la ventana con todos sus componentes.
Utilizaremos el comando preprocesado DEFINE WINDOW que quiere decir
Define ventana. Estas dos palabras tendrn que acompaarse por el nombre
de un objeto ventana que habremos declarado como Static fuera del
programa principal:

Programacin Windows

Introduccin a FIVEWIN

#include "fivewin.ch"
static oWnd
function main( )
DEFINE WINDOW oWnd ...

El hecho de declarar el nombre del objeto ventana como static es para poder
manejar con ms soltura la ventana desde otras funciones del mismo mdulo.
Una vez definido el nombre de la ventana tendramos que definir el ttulo de la
misma. Lo haremos con la clusula TITLE acompaada de una cadena de
texto que aparecer en la barra de ttulo cuando ejecutemos el programa.
Seguirn las coordenadas de la ventana especificadas por la clusula FROM
x,y TO x1, y1 siendo x e y las coordenadas de la esquina superior izquierda y
x1 e y1 las coordenadas de la esquina inferior izquierda. Estas coordenadas
simulan modo texto por lo cual podemos seguir ventanas del mismo modo
que lo hacamos con CA-Clipper en modo texto.
DEFINE WINDOW oWnd TITLE "Mi primera ventana" FROM 1,1 TO 20,70
Podemos seguir especificando caractersticas como son los colores para el
fondo de la ventana y la tinta con que se escribir en ella. Se especifica si se
quiere, no es obligatorio. Lo haramos por medio de la clusula COLORS.
Esta clusula ir acompaada por dos valores separados por comas. El
primer valor para el color del texto y el segundo valor para el color del papel.
Los colores los podemos conseguir con una funcin al efecto que nos
mezclar pintura de tres colores: rojo, verde y azul. La funcin devuelve el
color resultante a cambio de que nosotros le digamos la proporcin de color
que queremos de cada.
COLORS RGB(128,128,128), RGB(255,255,255)
Esta proporcin nos proporcionara un color gris para el texto y un color
blanco para el papel. S no deseamos quebrarnos la cabeza, disponemos de
los colores ms utilizados en formado de constantes predefinidas en el fichero
de cabecera COLORS.CH ubicado en el directorio INCLUDE: CLR_WHITE,
CLR_BLUE, CLR_GRAY, CLR_BLACK...
Algo que seguro que nos interesar ser el dotar a nuestra ventana de un
men. Es normal ya que s hacemos la ventana ser para acceder desde ella
a otras partes de nuestro programa. El men lo estudiaremos en un captulo
especifico pero anticiparemos que mediante la clusula MENU indicaremos el
nombre de un objeto men del tipo pull-down que ser devuelto por una
funcin
... MENU MiMenu( )
.
.

Programacin Windows

Introduccin a FIVEWIN

Function MiMenu( )
LOCAL oMenu

.
.
.
Return oMenu
El men es el tpico de Windows de una barra de men donde aparecern al
seleccionar, diversos mens desplegables.
S quisiramos terminar de dar un aire super profesional a nuestra ventana
nos gustara ponerle un fondo bonito como hace Windows con el tapete del
escritorio. No-problem' . FiveWin nos proporciona herramientas para tapizar
nuestra ventana con dibujos. Utilizaremos lo mismo que utilizamos para pintar
nuestras paredes: una brocha. Mediante la clusula BRUSH especificaremos
un objeto brocha con el colorear el fondo de nuestra ventana. S en lugar de
pintura lisa queremos un 'papel pintado' lo podemos conseguir tambin
simplemente especificando al definir la brocha, un pequeo dibujo con
formato .BMP para que forme el dibujo de nuestro papel pintado. La brocha la
definiremos con anterioridad mediante el comando DEFINE BRUSH
acompandolo del nombre de un obrero brocha que bien pudiera ser oBrush
DEFINE BRUSH oBrush STYLE BORLAND
Seguro que tambin nos gustara que nuestra ventana tuviese una buena
representacin cuando se minimizase y se convirtiera en icono.
Mediante la clusula
ICON
podemos asociar a nuestra
ventana un icono que le
represente
cuando
este
minimizada o cuando se est
cambiando de tarea mediante la
pulsacin de CTRL+ TAB.
Anteriormente tendremos que
definir el icono de la misma forma
que
venimos
haciendo
ltimamente. En efecto se trata
del comando DEFINE ICON y el
nombre del objeto icono.

DEFINE ICON oIcon FILENAME nombre del fichero en el disco.

Podemos conseguir dotar a nuestras ventanas de estilo propio si no nos


conformamos con el estilo que nos proporciona FiveWin por defecto. Lo
conseguiremos por medio de una serie de clusulas que especificaremos en
la definicin:

Programacin Windows

Introduccin a FIVEWIN

BORDER para que nuestras ventanas sean redimensionables o no


especificaremos BORDER NONE o BORDER SINGLE.
NOSYSMENU para que nuestra ventana no disponga de men del
sistema.
NOCAPTION o NO TITLE para que nuestra ventana no tenga ttulo.
NOICONIZE o NOMINIMIZE para que nuestra ventana no se pueda
minimizar.
NO MAXIMIZE para que nuestra ventana no se pueda maximizar.
Por ltimo, podemos dotar a nuestras ventanas de barras de scroll mediante
las clusulas VSCROLL o HSCROLL.

2.5

Activar ventanas

Llego el momento esperado. Por fin vamos a ver nuestra ventana actuando.
Una vez definida la ventana con todas sus caractersticas tenemos que
activar la ventana para que esta se muestre.
La activacin de la ventana se va a producir de una manera muy simple. El
comando utilizado va a ser precisamente ACTIVATE WINDOW y el nombre
del objeto ventana a activar.
ACTIVATE WINDOW oWnd

En el momento de activacin tambin tenemos algunas clusulas interesantes


que podemos comentar. La primera es la posibilidad de hacer que nuestra
ventana se pinte maximizada, normal o iconizada por medio de las clusulas
MAXIMIZED, NORMAL o ICONIZED.
Podemos validar la finalizacin de nuestra ventana de tal manera que no se
pueda cerrar la ventana hasta que la funcin que anotemos con la clusula
VALID nos devuelva un valor .T. (verdadero)
ACTIVATE WINDOW oWnd VALID Validar ( )

Programacin Windows

2.6

Introduccin a FIVEWIN

Clusulas 'ON'

Anteriormente estuvimos hablando de que Windows y FiveWin mantenan un


interesante dilogo constantemente. Windows le transmita a FiveWin las
cosas que pasaban (eventos) y a cambio FiveWin le deca que accin tomar.
Tambin dijimos que en ciertas circunstancias FiveWin nos permitira
interceptar el dilogo para que nosotros diramos nuestra opinin de que se
debera hacer. Ha llegado el momento. Disponemos de la capacidad de
interceptacin de 15 eventualidades, dependiendo de la versin del producto
que estemos utilizando. En lenguaje llano solemos decir a nuestros hijos:
Cuando te levantes me traes un vaso de agua.
a FiveWin le podemos decir :
Cuando se mueva la ventana haz tal cosa.
Cuando se pinte la ventana haz tal otra.
Cuando se pulse el botn izquierdo del ratn encima de la ventana
haz lo de ms all.
Cuando ... haz ...
Cuando suceda tal evento haz tal accin en lugar de lo que tu haces por
defecto.
Los eventos que podemos interceptar son:
ON LEFT CLICK
ON RIGHT CLICK
ON MOVE
ON RESIZE
ON PAINT
ON KEYDOWN
ON INIT
ON UP
ON DOWN
ON PAGEUP
ON PAGEDOWN
ON LEFT
ON RIGHT
ON PAGELEFT
deslizante.
ON PAGERIGHT
ON DROPFILES

Pulsado botn izquierdo del mouse.


Pulsado botn derecho del mouse.
Se ha movido la ventana.
La ventana ha cambiado de tamao.
La ventana se ha pintado.
Se ha pulsado una tecla
Se va a inicializar la ventana
Se ha pulsado el botn superior del SCROLL
BAR.
Se ha pulsado el botn inferior del SCROLL
BAR.
Se puls por encima del botn deslizante.
Se puls por debajo del botn deslizante.
Se puls el botn izquierdo del SCROLL BAR.
Se puls el botn derecho del SCROLL BAR.
Se puls a la izquierda del botn
Se puls por la derecha del botn deslizante.
Se ha soltado ficheros arrastrados desde el
Administrador de Ficheros.

Programacin Windows

Introduccin a FIVEWIN

Despus de todas estas clusulas ON deberemos de especificar una


funcin o un grupo de funciones separadas por comas y encerradas entre
parntesis.

2.7

Ventanas MDI

La programacin de las ventanas MDI mediante el SDK de MicroSoft es una


de las tareas ms tediosas y complicadas que tiene Windows. FiveWin se
desmarca una vez ms del resto. Ha conseguido que el manejo de las
ventanas MDI sea la cosa ms sencilla del mundo. Antes de nada tendremos
que decir que son las ventanas MDI. Estamos acostumbrados a entrar en
Windows y encontrarnos con nuestro Administrador de programas de toda la
vida. Vemos una ventana con el ttulo antes mencionado y dentro de ella
diversos iconos que representan los diversos grupos de trabajo que tenemos
a nuestra disposicin. Tenemos un grupo para Aplicaciones, otro para
Juegos, otro que se llama Principal, otro Accesorios, otro Inicio, etc. Cuando
abrimos una de esas carpetas nos encontramos con que es otra ventana. S
abrimos todas las carpetas llenamos
la ventana del administrador de
programas y tenemos que buscar la
opcin
correspondiente
para
organizarlas y ponerlas bien en
mosaico o en cascada. Desde aqu
podemos acceder a cualquiera de los
grupos y por extensin a cualquiera de
los programas representados por los iconos.
Todo esto que he estado explicando es un entorno MDI (Interface de Mltiples
Documentos).

2.7.1 Ventana MDI principal


Existe una Ventana principal y varias ventanas hijas que dependen de la
ventana madre. La forma de crear una ventana MDI madre es aadir en la
definicin de la ventana la clusula MDI y especificar en que opcin de la
barra de men se ha de poner la informacin relativa a las ventanas hijas
activas. Lo especificaremos mediante la clusula MENUINFO y el nmero de
opcin en donde deseamos que se deposite la informacin.
DEFINE WINDOW oWndMdi TITLE " Prueba de MDI " FROM 1,1 TO 20,70 ;
MDI MENUINFO 3
ACTIVATE WINDOW oWndMdi

Programacin Windows

Introduccin a FIVEWIN

2.7.2 Ventanas MDI hijas


Al igual que la ventana principal MDI tiene una clusula que la diferencian en
el momento de la definicin de una ventana normal, tambin las ventanas
hijas tienen la suya. Se trata de la clusula MDICHILD. Podemos crear un
men en la barra de mens de la ventana principal y por medio de alguna de
las opciones crear las ventanas MDI hijas. Tendremos que especificar el
nombre de la ventana madre con la clusula OF.
Tenemos que tener en cuenta una circunstancia fundamental: cuando
programamos con ventanas MDI podemos hacer que un proceso inicie una
misma operacin varias veces. Se puede dar la circunstancia de abrir o
intentar abrir varias veces la misma base de datos. No hay problema si lo
tenemos en cuenta pero si se nos pasa desapercibido podemos abrir la base
de datos dos veces de modo exclusivo. Tambin podemos tener problemas
con la actualizacin de registros s no los bloqueamos debidamente. Nuestra
programacin ha de ser mucho ms cuidadosa. Posteriormente hablaremos
de como sacar ms provecho a la programacin de las ventanas MDI.

2.8

Clase TWindow

Hemos dicho al principio del captulo que los comandos preprocesados de


creacin de las ventanas realmente lo que estamos haciendo es llamar a la
clase TWindow. Todas las clases son importantes pero si tenemos en cuenta
que la clase TWindow sirve para derivar una gran parte de las dems clases,
creo que debemos hacer una parada para intentar, por lo menos, explicar los
principales datos y los principales mtodos de la ventana. Pensemos que
todas las clases que se deriven de TControl tendrn los mtodos y variables
de la clase TWindow aunque en el listado de la clase en concreto no las
veamos.

2.9

Variables y mtodos ms usados

bLClicked
bRClicked
bLDblClick

Codeblock que se ejecuta al pulsar el botn izquierdo del


mouse.
Codeblock que se ejecuta al pulsar el botn derecho del
mouse.
Codeblock que se ejecuta al hacer doble click con el mouse.

Los tres codeblocks pasan automticamente las coordenadas del lugar


de la ventana donde se puls el ratn.
bGotFocus

Codeblock que se ejecuta cuando va a tomar el foco una


ventana o cualquier objeto derivado de la clase TWindow.
Podemos utilizarlo para hacer nuestra propia clusula When.
Ejecutar una accin cuando entremos el objeto a que
hagamos referencia. Las clusulas When que estn

Programacin Windows

Introduccin a FIVEWIN

implementadas se ejecutan en bloque para todos los


controles.
bLostFocus

Codeblock que se ejecuta cuando se va a perder el foco una


ventana o cualquier objeto derivado de la clase TWindow.
Sirve para hacer nuestra propia clusula Valid.

bKeyDown

Codeblock que se ejecutar si lo hemos definido, cuando se


pulsa una tecla. Podemos emular de esta forma a nuestro
aorado INKEY(0)- Vamos a explicar la forma de trabajar con
l por la importancia que tiene.
Antes de activar la ventana con ACTIVATE WINDOW , incluiremos una linea
de cdigo donde diremos:
oWnd:bKeyDown := { | nKey,nFlags | MiFuncion (nKey) }
Con ello conseguimos que cuando se pulse una tecla teniendo el foco la
ventana, se evale el codeblock y por consiguiente se ejecute la funcin
especificada entre las llaves.

Este codeblock est disponible tambin en la clase TControl,


lo que quiere decir que lo podemos utilizar para los controles
evalundose cuando se pulse una tecla si coincide que el
control tiene el foco.
cCaption
cMsg
lFocused
nStyle

Ttulo de la ventana
Cadena de mensaje asociado a la ventana
Tiene el foco esta ventana?
Estilo de la ventana. Podemos variar el estilo de la siguiente
forma:
Declaramos nuestra ventana, dialogo, control o la clase de
objeto derivada de la clase TWindow, aprovechndonos de la
manera estandard que proporciona FiveWin con los
comandos preprocesados. Una vez realizado y antes de que
se active la ventana o la caja de dilogo con el
correspondiente ACTIVATE, llamamos a la variable nStyle del
objeto correspondiente y le decimos: oWnd:nStyle := nOr ( ...
). Puede ser oWnd , oDlg o lo que sea. El truco est en poner
entre los parntesis del 'nOr', las constantes preprocesadas
correspondientes al estilo que deseamos. Podemos encontrar
todas estas constantes en el fichero de cabecera
WINDOWS.H de los lenguajes C++. Una vez realizado esto
se activa la ventana o la caja de dilogo.

nChrHeight
nChrWidth
nLastKey
nClrPane

Altura de los caracteres en curso.


Anchura de los caracteres en curso.
ltima tecla pulsada.
Color de fondo. (Cuidado con el control TSay que hereda
directamente esta variable. No dispone de nClrBack como los
dems controles)
Color del texto.
Array de controles que tendr la ventana o la caja de dilogo.
Objeto Barra de iconos.

nClrText
aControls
oBar

10

Programacin Windows

oBrush
oCursor
oFont
oIcon
oMenu
oSysMenu
oPopup
oMsgBar
oWnd
oVScroll
oHScroll

Introduccin a FIVEWIN

Objeto Brocha.
Objeto Cursor.
Objeto Font.
Objeto Icono que representar a la ventana minimizada o en
cambio de tarea.
Objeto men de la ventana.
Objeto men del sistema.
Objeto PoPup.
Objeto barra de mensajes.
Objeto Ventana.
Objeto scroll bar vertical.
Objeto scroll bar horizontal.

Mtodos ms utilizados
Box ( nTop, nLeft, nBottom, nRight )
Dibuja una caja en las coordenadas especificadas y el color actual.
Circle ( nRow, nCol, nWidth )
Dibuja un circulo en las coordenadas y con el radio especificado.
Line ( nTop, nLeft, nBottom, nRight )
Dibuja una lnea en las coordenadas determinadas.
Say ( nRow, nCol, cText, nClrFore, nClrBack, oFont, lPixel )
Pinta una cadena de texto con los colores y el font especificado. S el
parmetro lPixel es verdadero las coordenadas sern en pixels.
SayBitmap ( nRow, nCol, coBitmap, nWidth, nHeight )
Dibuja un bitmap correspondiente a un objeto Bitmap.
SayRect ( nRow, nCol, cText, nClrFore, nClrBack, nWidth )
Dibuja una cadena de texto rodeada de un rectngulo con los colores
especficos y el ancho concreto.
SetPixel ( nX, nY, nColor )
Pintar un pixel en las coordenadas y el color especificados.
SetText ( cText )
Cambiar el texto de la barra de ttulo u obtenerlo.
EraseBkGnd (hDC)
Borra el fondo de una ventana. El dispositivo de contexto lo obtenemos
con el mtodo GetDC. Ejemplo: EraseBkGnd (oWnd:GetDC() ) .
FloodFill ( nFila, nColumna, nRGBcolor)
Rellena un contorno cerrado del color especificado.
Capture ()
Captura toda la actividad del ratn en la ventana.
CoorsUpdate ()

11

Programacin Windows

Introduccin a FIVEWIN

Refresca las coordenadas de la ventana. Las variables nTop, nLeft,


nBottom y nRight no se refrescan automticamente al redimensionar la
ventana ni al moverla. Llamando al este mtodo dispondremos de los
valores actuales de las coordenadas.
Copy ( lAll )
Copia una ventana con todo su contenido al portapapeles.
cTitle ( cNewTitle )
Cambiar el ttulo de la ventana. En los controles al ser heredado este
mtodo a travs de la clase TControl, nos va a servir para cambiar el
ttulo, o el texto de los mismos.
Disable ()
Desactivar la ventana. En el caso de botones (heredado de TWindow)
el botn quedar desactivado y no se podr elegir. Se utiliza a menudo
en conjunto con el mtodo Hide () para ocultar un control en una caja
de dilogo. Si juntamos los dos mtodos, podemos hacer que
aparezcan y desaparezcan los controles. Posteriormente los haremos
aparecer y activarse con los mtodos Show y Enable.
Enable ()
Activa la ventana desactivada previamente.
End ()
Finaliza la ventana.
FocusNext ( hCtrl, lPrevious )
Pasa el foco al siguiente control de la ventana.
LostFocus ()
Hace que la ventana pierda el foco.
GotFocus ()
Hace que la ventana obtenga el foco y tome el foco el primer control de
la misma.
SetFocus ()
Hace que la ventana obtenga el foco.
GoNextCtrl ( hCtrl )
Pasa el foco al siguiente control.
GoPrevCtrl ( hCtrl )
Pasa el foco al control previo.
cGenPrg ()
Devuelve una cadena de texto que contiene el cdigo fuente que
genera la ventana y todos los controles que contenga. Se puede
utilizar en todas las clases heredadas de TWindow.

12

Programacin Windows

Introduccin a FIVEWIN

nGetChrHeight ()
Obtener el ancho de los caracteres en uso.
GetWidth ( cText, oFont )
Obtener el ancho de una cadena de texto con un font determinado.
GetRect ()
Devuelve un objeto TRect de coordenadas iguales a las coordenadas
de la ventana.
nVertRes ()
Obtener la resolucin vertical en curso.
nHorzRes ()
Obtener la resolucin horizontal en curso.
GetDC ()
Obtener el dispositivo de contexto de la ventana.
ReleaseDC ()
Deshacerse del dispositivo de contexto obtenido con GetDC.
HandleEvent ( nMsg, nWParam, nLParam )
Manejador de eventos.
HardCopy ( nScale, lFromUser )
Impresin de ventana con escala determinada. S hacemos que
lFromUser sea verdadero, aparecer la caja de dilogo de impresin.

Print ( oTarget, nRow, nCol, nScale )


Impresin de ventana en unas coordenadas dadas con una escala
determinada.
Hide ()
Ocultar la ventana.
Show ()
Mostrar la ventana.
Paint ()
Pintar la ventana.
Iconize ()
Iconizar la ventana.
Minimize ()
Minimizar la ventana.

Move ( nTop, nLeft, nWidth, nHeight, lRepaint )


Mueve la ventana a las coordenadas y el tamao especificados
repintndose en el caso que lRepaint sea verdadero.

13

Programacin Windows

Introduccin a FIVEWIN

Refresh ( lErase )
Obliga a repintarse a la ventana.
Update ()
Obliga a repintar, simplemente, los controles que incluyan en su
definicin la variable lUpdate con un valor verdadero.
SendMsg ( nMsg, nWParam, nLParam )
Enviar mensajes a una ventana para que los ejecute inmediatamente.
PostMsg ( nMsg, nWParam, nLParam )
Enviar mensajes a una ventana para que los ejecute cuando le
corresponda. Se ponen los mensajes en una pila de mensajes y se van
ejecutando por orden.
SetBrush ( oBrush )
Poner una brocha determinada a la ventana.
SetColor ( nClrFore, nClrBack, oBrush )
Poner unos colores determinados y una brocha determinada a la
ventana.
SelColor ( lFore )
Obtener colores desde una caja de dilogo de colores.
SetCoors ( oRect )
Cambiar las coordenadas de la ventana que correspondern con las
del objeto rectngulo obtenido con anterioridad.
SelFont ()
Obtener un font determinado eligindolo de la caja de dilogo de
fuentes.
SetFont ( oFont )
Poner una font determinada.
GetFont ()
Obtener la font que se est utilizando.
SetMenu ( oMenu )
Poner un men determinado a la ventana.
SetMsg ( cText )
Poner un texto determinado en la barra de mensajes.

14

Programacin Windows

Introduccin a FIVEWIN

PROGRAMAS PROPUESTOS
1. Programa de creacin de una ventana

#include "FiveWin.ch"
FUNCTION Main()
LOCAL oWnd
// Nuestra ventana
DEFINE WINDOW oWnd ;
FROM 2,2 TO 20,20 ;
TITLE "Mi Ventana"
ACTIVATE WINDOW oWnd

// Definimos la ventana
// Coordenadas
// Titulo
// Activamos la ventana

RETURN NIL

2. Programa de generacin de una ventana con una brocha determinada.


La brocha la definimos con anterioridad.

#include "FiveWin.ch"
#include "Winapi.ch"

FUNCTION Main()
LOCAL oWnd
// Nuestra ventana
LOCAL oBrush // Brocha

DEFINE BRUSH oBrush STYLE "BORLAND" // Definimos la brocha


DEFINE WINDOW oWnd ;
FROM 2,2 TO 20,40 ;
TITLE "BORLAND";
BRUSH oBrush

// Definimos la ventana
// Coordenadas
// Titulo
// Brocha para la pantalla

ACTIVATE WINDOW oWnd

// Activamos la ventana

RETURN NIL

3. Programa de generacin de ventana


Utilizacin de la variable de instancia nStyle para cambiar el estilo de la
ventana apoyndose en la funcin nOr.
#include "FiveWin.ch"
#include "Winapi.ch"

FUNCTION Main()
LOCAL oWnd
// Nuestra ventana

15

Programacin Windows

LOCAL oBrush

Introduccin a FIVEWIN

// Brocha

DEFINE BRUSH oBrush STYLE "TILED" // Definimos la brocha


DEFINE WINDOW oWnd
// Definimos la ventana
FROM 2,2 TO 20,40 ;
// Coordenadas
TITLE "TILED";
// Ttulo
BRUSH oBrush;
// Brocha para la pantalla
STYLE nOr(WS_CAPTION + WS_SYSMENU + WS_MINIMIZEBOX )
// Ahora la ventana solo tiene ttulo, botn de sistema
// y botn de minimizar. El resto, al no haberse especificado
// en la clasula STYLE, no aparece.
ACTIVATE WINDOW oWnd

// Activamos la ventana

RETURN NIL

4. Problema de generacin de ventanas


Activacin de la ventana con una brocha creada mediante un fichero .BMP

#include "FiveWin.ch"
#include "Winapi.ch"

FUNCTION Main()
LOCAL oWnd
// Nuestra ventana
LOCAL oBrush // Brocha

DEFINE BRUSH oBrush FILE "BROCHA.BMP"

DEFINE WINDOW oWnd ;


FROM 2,2 TO 20,40 ;
TITLE "Brocha en disco";
BRUSH oBrush
ACTIVATE WINDOW oWnd

// Definimos la brocha
// de un fichero en disco

// Definimos la ventana
// Coordenadas
// Titulo
// Brocha para la pantalla
// Activamos la ventana

RETURN NIL

5. Programa de generacin de ventana. Iconos


Se genera una ventana y se le asocia un icono.

#include "FiveWin.ch"

FUNCTION Main()
LOCAL oWnd
// Nuestra ventana
LOCAL oIcon // Nuestro icono
DEFINE ICON oIcon FILE "MIICONO.ICO"

16

Programacin Windows

Introduccin a FIVEWIN

DEFINE WINDOW oWnd ;


FROM 2,2 TO 20,60 ;
TITLE "Prueba de icono";
ICON oIcon

// Definimos la ventana
// Coordenadas
// Titulo

@ 3,3 SAY "Minimizame" OF oWnd

// Mensajito

ACTIVATE WINDOW oWnd

// Activamos la ventana

RETURN NIL

6- Crear una ventana igual que la que se genera al ejecutar el programa


PROBLEMA.EXE del disco de ejemplos Unidad2. Como orientacin
diremos que se utiliza la funcin nOR y la variable de instancia nStyle
adems de la clusula BRUSH.

7. Efectuar un programa que ilustre las clusulas ON en la activacin de


una ventana.
#include "fivewin.ch"

FUNCTION Main()
LOCAL oWnd
DEFINE WINDOW oWnd FROM 0,0 TO 20,70 ;
TITLE "Clusulas ON"
ACTIVATE WINDOW oWnd ;
ON CLICK MsgInfo("Botn Izquierdo");
ON RIGHT CLICK MsgInfo("Botn Derecho");
ON MOVE MsgInfo("Moviendo") ;
ON RESIZE MsgInfo("Redimensionando") ;
ON PAINT MsgInfo("Pintando") ;
ON KEYDOWN MsgInfo("Pulsado un tecla") ;
ON INIT MsgInfo("Inicializando")
RETURN NIL

17

Programacin Windows

Introduccin a FIVEWIN

TEST DE EVALUACIN
Por favor, marque con una seal la respuesta o respuestas vlidas para cada
pregunta.

1.

Qu es una brocha?
Un instrumento de pintor
El objeto con el que coloreamos el fondo
de una ventana.
Un objeto para destruir ventanas

2.

Con qu mtodo se destruye una ventana?


Mtodo destructor
End ( )
Enabled ( )

3.

Cmo se pinta una pantalla por impresora?


Pulsando la tecla 'Imprimir'
Con el mtodo Copy ( )
Con el mtodo HardCopy( )

4.

De qu mtodo esta heredada la clase TWindow?


Del mtodo TControl
Del API de WIndows
De ninguna

5.

Con que funcin definimos estilos?


nOr
SysMenu
STYLE

6.

Es opcional la clusula TITLE ?


Si
No
Es recomendable

Respuestas vlidas ..........................................

______

18

Programacin Windows

Introduccin a FIVEWIN

3
MENUS

3.1

Mens Pop-Up

Llegamos a una seccin que nos va a resultar familiar. Es la toma de


decisiones que venimos haciendo en todos nuestros programas. Una vez
pasado el momento del inicial del arranque de la aplicacin, nuestro programa
se parar y se quedar en espera de que el usuario tome una decisin.
Necesitamos tener varias opciones para elegir y esto siempre lo hemos
conseguido mediante mens. Al principio se
trataba de una serie de nmeros de los cuales
elegamos uno. Despus se puso de moda la
eleccin de las opciones por medio de las
teclas de funcin. Ms tarde se puso de moda
los mens al estilo @ PROMPT que
desplazaban con los cursores, una barra
horizontal a travs de una serie de palabras.
Por
ltimo
logramos
mediante
unas
combinaciones ms o menos afortunadas unos
mens verticales desplegables que partan de
una barra horizontal. Necesitbamos mucho trabajo para realizarlos y no

Programacin Windows

Introduccin a FIVEWIN

siempre se comportaban como nosotros queramos. Esto se ha acabado!.


Los mens en Windows se hacen muy fcilmente y funcionan sin fallos.
El primer tipo de men que vamos a ver es el men Pop-up. Una barra de
men horizontal en la que se desplegarn mens verticalmente.

La gran diferencia con respecto a los mens tradicionales es que cada opcin
es un objeto que lleva incluido la accin que va a ejecutar cuando se le pulse,
y adems, otra serie de datos que veremos ms adelante.

3.2

Definicin desde cdigo

La forma de confeccionar el listado es muy simple. Muy simple una vez que
hayamos hecho el primero pero, el primero...
Vamos con el primero que es el difcil.
Como era de esperar, un men es tambin un objeto y lo vamos a crear de
una forma estructurada. Lo haremos a base de 'bucles' MENU - ENDMENU:
MENU oMenu
....
ENDMENU
Con esta estructura tenemos garantizada la barra horizontal. Ahora le
agregaremos las diferentes opciones dentro de ella. Vamos a llamar ITEMS a
las diferentes opciones tanto de los mens horizontales como de los mens
verticales. Sern ITEMS del MENU o ms concretamente MENUITEMS.

Programacin Windows

Introduccin a FIVEWIN

La unidad ms pequea en el men es el MENUITEM. Cada opcin de la


barra de men horizontal y cada opcin de la barra vertical son objetos
MENUITEMS.
Un MENUITEM va a tener el aspecto exterior de una cadena de texto, pero es
algo ms. Es esa cadena y la accin que se producir cuando se elija, es por
eso por lo que debemos definirlas juntas. Tambin lleva consigo el texto que
aparecer en la barra de Mensajes. Hagamos una barra horizontal de men
con sus opciones:
MENU oMenu
MENUITEM "Primera opcin"
MENUITEM "Segunda opcin"
MENUITEM "Tercera opcin"
ENDMENU

Queda bien verdad? Ahora tendremos que acoplarle a cada opcin un men
vertical. Veamos:
MENU oMenu
MENUITEM "Primera opcin"
MENU
MENUITEM "Primero 1"
MENUITEM "Primero 2"
MENUITEM "Primero 3"
ENDMENU
MENUITEM "Segunda opcin"
MENUITEM "Tercera opcin"
ENDMENU

Para definir un men que salga de alguna de las opciones no tenemos ms


que incluir otro men entre dos MENUITEMS.
MENU oMenu
MENUITEM "Primera opcin"
MENU
MENUITEM "Primero 1"
MENUITEM "Primero 2"
MENU
MENUITEM
"121"
MENUITEM "122"
ENDMENU
MENUITEM "Primero 3"

Programacin Windows

Introduccin a FIVEWIN

ENDMENU
MENUITEM "Segunda opcin"
MENUITEM "Tercera opcin"
ENDMENU

De la misma forma obraremos en las dems opciones de la barra horizontal.

3.2.1 Encapsulamiento de opciones.


En el punto anterior dijimos que un MENUITEM es una cadena de texto y algo
ms. Efectivamente, es un objeto compuesto de muchas ms cosas. Puede
tener:

Una marca ' ' de activacin. > > > > > > >
Un dibujo.
Una accin asociada.
Teclas aceleradoras.> > > > > > > > > > >
Opciones habilitadas o deshabilitadas.

La sintaxis completa de la generacin de mens la podemos encontrar en el


CodeCard adjunto.
Tenemos que darnos cuenta de que estamos tratando con un objeto TMen y
varios objetos TMenuItem. Esto conlleva que 'podremos', y algunas veces
'tendremos', que acceder a los datos de los objetos y a sus mtodos
directamente. Veamos las clusulas de los MENUITEMS y luego hablaremos
de los datos y mtodos.
Mediante el comando MENUITEM y un nombre, le especificamos a FiveWin el
nombre del objeto. No es obligatorio especificar el nombre y solo lo haremos
cuando preveamos que tendremos que utilizar sus mtodos o sus datos.
Con la clusula PROMPT especificamos la cadena de texto que aparecer en
el men.
S queremos que la opcin sea una opcin que se marque y desmarque
sucesivamente con la tpica ' ' utilizaremos la clusula CHECK, CHECKED
o MARK.
Podemos deshabilitar la opcin o habilitarla con la opcin ENABLED o
DISABLED lo que producir el efecto de no poder seleccionarse y mostrarse
en un tono plateado.
S deseamos que nuestro men contenga un dibujo, deberemos especificar el
nombre de un fichero con extensin .BMP mediante la

Programacin Windows

Introduccin a FIVEWIN

clusula FILE, FILENAME o DISK. S en lugar de encontrarse el fichero en


disco se encuentra en un 'Almacn de Recursos' especificaremos el nombre
que el dibujo tiene en el mismo. Lo haremos ayudndonos de la clusula
RESOURCE, RESNAME o simplemente NAME y el mencionado nombre.
Llega el momento de decir lo que queremos que se haga cuando pulsemos la
opcin. Utilizamos la clusula ACTION y seguidamente el nombre de la
funcin a la que llamaremos con parntesis incluidos. En el caso de que
queramos llamar a ms de una funcin, separaremos las mismas por medio
de comas y encerraremos el conjunto de funciones entre parntesis:
ACTION ( altas( ), pregunta ( ), cerrar ( ) )
ACTION altas ( )
S en lugar de una llamada a una funcin, deseamos especificar un
CodeBlock, lo que haremos ser utilizar la clusula BLOCK
Con la clusula ACCELERATOR podemos indicar una combinacin de teclas
para abreviar la pulsacin. Es como cuando pulsamos ALT + F4 para salir de
Windows.
S indicamos la clusula HELP, la opcin se separar de las dems y se
situar en la parte derecha de la barra de mens, rellenndose
automticamente con las opciones correspondientes a un men de ayudas.
Por ltimo podemos indicar que el menuitem pertenece a un men del
sistema mediante la clusula OF, MENU o SYSMENU. El men del sistema
es el que aparece cuando se pulsa el botn de control (esquina superior
izquierda).

3.2.2 Variables y mtodos ms utilizados.


Vamos a hacer simplemente referencia de dos variables y de dos mtodos de
los MENUITEMS (TMenuItem) dado que es en ellos donde reside la pequea
complicacin que puede tener el men a nivel de clases.
lCHecked
lActive

y falsa s no lo est.
Verdad s est marcada con
Verdad s esta activa y falsa s no lo est.

SetCheck ( lOnOff )
Enable()
Disable()

Marcar y desmarcar, alternativamente, la opcin.


Habilita la opcin.
Deshabilita la opcin.

oMenuItem1:SetCheck (.t.)
oMenuitem2:Enable ( ) , oMenuitem2:Disable ( )

3.3

Ventanas y mens

Programacin Windows

Introduccin a FIVEWIN

Todo esto esta muy bien, pero... cmo lo ensamblamos con nuestra
ventana?
Muy sencillo. Al definir nuestra ventana y mediante nuestra clusula MENU,
llamamos a una funcin donde construiremos el men. Despus esta funcin
devolver el objeto men que ella misma fabrique:
...
...
DEFINE WINDOW oWnd TITLE "Prueba de menu" FROM 1,1 TO ;
20,70 MENU mimenu( )

ACTIVATE WINDOW oWnd


return nil
Function mimenu ( )
Local oMenu
MENU oMenu
MENUITEM ...
MENUITEM ...
...
...
ENDMENU
RETURN oMenu

3.4.

Barra de iconos

Quin no se ha quedado impresionado alguna vez con las barras de iconos


de Lotus o con las barras de iconos de Excel o Word ? Son impresionantes!
FiveWin las pone a nuestro alcance con muy poco esfuerzo. Otra vez los
comandos preprocesados van a hacer maravillas. Definiremos un objeto barra
y lo iremos rellenando con botones que en su interior llevarn un pequeo
dibujo, incluso tenemos la oportunidad de hacer que al pulsar los botones,
estos cambien de dibujo y as obtener una animacin.
Como siempre disponemos de la sintaxis completa de creacin de la barra de
iconos en el CodeCard adjunto.
Tenemos que crear un objeto 'barra de iconos' que posteriormente iremos
rellenando de botones con dibujos, y por ltimo, dotaremos a los botones de
acciones que se ejecutarn al ser pulsados. Recuerde: Barra y botones.
Para definir el objeto ButtonBar utilizamos el comando DEFINE BUTTONBAR
acompaado de un nombre para el objeto. Despus especificaremos las
caractersticas de la barra y quin es el dueo de la misma.

Programacin Windows

Introduccin a FIVEWIN

Las caractersticas son:


El Ancho y el alto de los botones ayudndonos de las clusulas SIZE,
BUTTONSIZE o SIZEBUTTON y despus, el ancho y alto separados
por una coma.
Podemos hacer que la barra tenga un aspecto 3D de relieve, con las
clusulas 3D o 3DLOOK.
Se puede colocar la barra al lado izquierdo, arriba, abajo, derecho y
flotante. Lo haremos con las clusulas LEFT, TOP, DOWN, RIGHT o
ADJUST.
Un efecto muy interesante se produce cuando hacemos que el cursor cambie
de forma cuando pasa por la barra de botones. Lo conseguimos aadiendo a
la definicin un objeto cursor definido con anterioridad con la forma tpica de
definicin de objetos: DEFINE CURSOR oCursor NAME nombre de recurso.
Este objeto cursor lo aadiremos a la definicin de la barra mediante la
clusula CURSOR.
Por ltimo tendremos que aclarar quin es el dueo de la barra y lo haremos
con la clusula OF, WINDOW o DIALOG y el nombre del objeto propietario.
DEFINE BUTTON oBtnBar BUTTONSIZE 20,30 3DLOOK TOP ;
CURSOR oCursor OF oWnd
Una vez definida la barra tendremos que rellenarla de botones. Lo hacemos
con los DEFINE de siempre: DEFINE BUTTON oBtn especificando el dueo
de ese botn. Este botn es un objeto con personalidad propia al que
tenemos que suministrar valor para sus datos. Dispone de una accin a
realizar cuando se le pulse, unos dibujos y un mensaje que aparecer en la
barra de mensajes de la ventana.
La accin se la diremos con la clusula ACTION y el nombre de una funcin.
Los dibujos se los diremos mediante las clusulas FILE, FILENAME o DISK,
s vamos a recoger los dibujos desde ficheros de disco con extensin .BMP o
con las clusulas NAME, RESNAME o RESOURCE s sacamos los dibujos
de ficheros almacenes de recursos (ya explicaremos los mismos en el
captulo 5).
Antes de nada tenemos que aclarar a FiveWin que este botn pertenece a
una barra de botones. Lo haremos con las clusulas OF o BUTTONBAR y el
nombre del objeto 'barra de botones. El mensaje lo especificamos con la
clusula MESSAGE y una cadena de texto.
Por ltimo tenemos tres clusulas ms que terminarn de configurar nuestra
barra de botones:
La primera es la clusula GROUP que har que el botn se separe un
poco hacia la derecha consiguiendo que los botones queden
agrupados.
La segunda es ADJUST que ajustar dibujos de diferentes tamaos al
tamao que nosotros le hayamos dicho en la definicin de la barra de
botones.
La ltima es la clusula WHEN que permite que digamos una funcin
para prevalidar las acciones que ejecutan los botones.
DEFINE BUTTON oBtnBar BUTTONSIZE 20,30 3DLOOK TOP ;
CURSOR oCursor OF oWnd
DEFINE BUTTON oBoton1 OF oBtnBar NAME "Open"

Programacin Windows

Introduccin a FIVEWIN

.....................
.....................

3.5

Men del sistema

El men del sistema es un tipo de men pop-up que obtenemos al pulsar el


botn superior izquierdo. Nosotros podemos incluir nuevas opciones
redefiniendo el objeto mediante la clusula REDEFINE MENUSYS y el
nombre del objeto que le demos especificando, por supuesto, el propietario
del citado men. Despus incluiramos los MENUITEMS que quisiramos de
la forma que ya conocemos. Terminaramos la redefinicin con la clusula
ENDSYSMENU.

3.6

Mens flotantes

Es una prctica cada vez ms utilizada el utilizar el botn derecho del ratn
para editar las caractersticas de los objetos que tenemos en pantalla. Para
ello, cuando detectamos la pulsacin, desplegamos un men tipo pop-up en
el sitio en que se encontraba la flecha del ratn. Este tipo de men flotante lo
construiremos con una sintaxis de comandos preprocesados. Utilizamos el
comando ACTIVATE MENU y el nombre del objeto men y las coordenadas
con la clusula AT fila, columna. Tambin en este caso tenemos que declarar
el dueo del men con las clusulas OF, WINDOW o DIALOG y el nombre
del propietario. Al final del captulo veremos un programa de ejemplo.

3.7

Mens de herramientas

FiveWin nos ofrece dos formas de hacer los mens de herramientas. Los dos
dibujos de la parte inferior son dos barras de botones un tanto especiales. En
la primera barra, los botones son
autnticos. En la segunda no. La segunda
barra de herramientas es un bitmap
completo. Vamos a invertir los colores de
los botones para producir el efecto de
hundimiento.
La primera barra la conseguimos mediante
la definicin de una barra de botones y la
clusula ADJUST o mediante la funcin
MsgToolBar pasndola como parmetros el
objeto ventana o dialogo donde se va a
mostrar, el ttulo de la barra, un array de
codeblocks que contengan las acciones a
realizar con cada pulsacin y por ltimo
uno o dos arrays de dibujos para los
botones. El segundo array sera para la animacin de los botones.

Programacin Windows

Introduccin a FIVEWIN

La segunda barra tiene que simular la pulsacin del botn calculando las
coordenadas de los botones en funcin del sitio donde se pulso. Una vez
calculado las coordenadas se utilizara la funcin InvertRect. Esta funcin
tiene como parmetros el dispositivo del contexto donde estamos pintando
(por ejemplo oWnd:hDC ) y un array de coordenadas del rectngulo a invertir.
Una nueva llamada a la funcin con las mismas coordenadas supondra que
el botn volvera a su posicin original.

Programacin Windows

Introduccin a FIVEWIN

PROGRAMAS PROPUESTOS
1.

Creacin de mens Pop-Up

El programa crea una ventana que incorpora una clusula MENU. Esta
clusula tiene que estar acompaada de un objeto men que se obtendr
como retorno de la funcin CreaMenu( ). En esta funcin se utilizan los
mtodos Enable y Disable para habilitar y deshabilitar opciones, y el mtodo
SetCheck para marcar y desmarcar opciones del men. Este ltimo mtodo
se apoya en el dato lChecked
para saber s la opcin est marcada o no.

#include "Fivewin.ch"
// Creacin de mens desde cdigo
STATIC oWindow

// Ventana del programa

FUNCTION Main()
DEFINE WINDOW oWindow FROM 5,5 TO 24,70 ; // Coordenadas
TITLE OemToAnsi("Probando los mens") ;
// Ttulo
MENU CreaMenu()
// Men
ACTIVATE WINDOW oWindow
RETURN NIL
//-------------------------------------------------------------------------//
// Funcin que crea el men para la aplicacin
FUNCTION CreaMenu()
LOCAL oMenu
// Menu de la aplicacin
LOCAL oPrimero, oSegundo, oMarcado // Items para el men
MENU oMenu
// Creamos el men
MENUITEM "&Primero"
MENU
MENUITEM "&Calculadora" ACTION WinExec("Calc.exe")
MENUITEM "&Block de notas" ACTION WinExec("Notepad.exe")
SEPARATOR
MENUITEM "&Salir" ACTION oWindow:End()
ENDMENU
MENUITEM "&Segundo"
MENU
MENUITEM oPrimero PROMPT "&1.- Activar 2";
ACTION (oPrimero:Disable(), oSegundo:Enable())
MENUITEM oSegundo PROMPT "&2.- Activar 1" ;
ACTION (oPrimero:Enable(), oSegundo:Disable())
SEPARATOR
MENUITEM oMarcado PROMPT "Item marcable" ;
ACTION oMarcado:SetCheck( ! oMarcado:lChecked)
ENDMENU
ENDMENU

10

Programacin Windows

Introduccin a FIVEWIN

oSegundo:Disable()
RETURN oMenu
//-------------------------------------------------------------------------//

2.

Creacin de men con dibujos incorporados.

En este programa creamos un men con la particularidad de que parte de las


opciones, en lugar de ser cadenas de texto son bitmaps.

#include "Fivewin.ch"
// Creacin de mens con dibujo
STATIC oWindow // Ventana del programa
FUNCTION Main()
DEFINE WINDOW oWindow FROM 5,5 TO 24,70 ; // Coordenadas
TITLE OemToAnsi("Probando los mens") ;
// Ttulo
MENU CreaMenu()
// Men
ACTIVATE WINDOW oWindow
RETURN NIL
//-------------------------------------------------------------------------//
// Funcin que crea el men para la aplicacin
FUNCTION CreaMenu()
LOCAL oMenu

// Menu de la aplicacin

MENU oMenu
// Creamos el men
MENUITEM "&Primero"
MENU
MENUITEM FILE "calc.bmp" ;
ACTION WinExec("Calc.exe")
MENUITEM "&Block de notas" ACTION WinExec("Notepad.exe")
SEPARATOR
MENUITEM FILE "Exit.bmp" ;
ACTION oWindow:End()
ENDMENU

ENDMENU

RETURN oMenu
//-------------------------------------------------------------------------//

3.

Creacin de barra de iconos.

11

Programacin Windows

Introduccin a FIVEWIN

Este programa crea una ventana y define una barra de iconos que sacamos
de ficheros .BMP almacenados en el disco.

#include "FiveWin.ch"
// Utilizacin de barras de iconos
STATIC oWindow
STATIC oBarra

// Ventana de la aplicacin
// Barra de botones

FUNCTION Main()

// Definimos la ventana
DEFINE WINDOW oWindow FROM 5,5 TO 24,70 ;
TITLE "Probando barras de iconos "

// Coordenadas
// Ttulo

// Definimos la barra de botones


DEFINE BUTTONBAR oBarra OF oWindow
// Definimos los botones
// Al primero botn le indicamos dos ficheros de bitmap, uno para
// el botn relajado y otro para el botn pulsado
DEFINE BUTTON OF oBarra FILE "Info.bmp","Help.bmp" ;
ACTION MsgInfo(OemToAnsi("Botn 1"))
DEFINE BUTTON OF oBarra FILE "New.bmp";
ACTION MsgInfo(OemToAnsi("Botn 2"))
DEFINE BUTTON OF oBarra FILE "Link.bmp";
ACTION MsgInfo(OemToAnsi("Botn 3"))
ACTIVATE WINDOW oWindow
RETURN nil

4.

Cambio del dibujo de un botn

#include "Fivewin.ch"
// Cambio del bitmap de un botn

STATIC oWindow
STATIC oBoton1, oBoton2
STATIC nDibujo := 1

// Ventana de la aplicacin
// Los botones
// Controlamos el dibujo del botn

FUNCTION Main()

// Definimos la ventana
DEFINE WINDOW oWindow FROM 5,5 TO 24,70 ;
TITLE "Probando los botones "

// Coordenadas
// Ttulo

// Definimos los botones


@1 , 1 BUTTON oBoton1 PROMPT OemToAnsi("Cambiar el dibujo del botn") ;

12

Programacin Windows

Introduccin a FIVEWIN

OF oWindow ;
SIZE 300,20 ;
ACTION Cambiar()
@40 , 40 BUTTON oBoton2 FILE "Boton1.bmp" ;
SIZE 50,50 ;
OF oWindow
ACTIVATE WINDOW oWindow
RETURN nil
//------------------------------------------------------------------------//
// Cambiar el dibujo del botn
FUNCTION Cambiar()
nDibujo := IF (nDibujo == 3, 1, ++nDibujo)
oBoton2:SetFile("Botn"+alltrim(str(nDibujo))+".BMP")
oBoton2:Paint()
RETURN NIL

5. Programa que ilustra como se habilitan y se deshabilitan los botones.


No se hace sobre la barra de botones sino sobre botones sueltos para
que se pueda apreciar mejor. Sobre la barra de botones sera igual.
#include "FiveWin.ch"
// Habilitacin y deshabilitacin de botones
STATIC oWindow
// Ventana de la aplicacin
STATIC oBoton1, oBoton2, oBoton3
// Los botones
FUNCTION Main()

// Definimos la ventana
DEFINE WINDOW oWindow FROM 5,5 TO 24,70 ;
TITLE "Probando los botones "
// Ttulo

// Coordenadas

// Definimos los botones


@1 , 1 BUTTON oBoton1 PROMPT OemToAnsi("Este botn habilita el siguiente") ;
OF oWindow ;
SIZE 300,20 ;
ACTION (oBoton2:Enable(), oBoton1:Disable())
@10 , 1 BUTTON oBoton2 PROMPT OemToAnsi("Este botn habilita el siguiente") ;
OF oWindow ;
SIZE 300,20 ;
ACTION (oBoton3:Enable(), oBoton2:Disable())
@20 , 1 BUTTON oBoton3 PROMPT OemToAnsi("Este botn cierra la ventana") ;
OF oWindow ;
SIZE 300,20 ;
ACTION (oWindow:End())

// Deshabilitamos el segundo y el tercero


oBoton2:Disable()
oBoton3:Disable()

13

Programacin Windows

Introduccin a FIVEWIN

ACTIVATE WINDOW oWindow


RETURN nil

6. Creacin de un men del tipo pop-up


#include "FiveWin.ch"
STATIC oWindow, oMenu
//----------------------------------------------------------------------------//
function Main()
DEFINE WINDOW oWindow ;
FROM 1, 1 TO 23, 50 ;
TITLE OemToAnsi("Probando mens PopUp")
// Se muestra un mensaje en la ventana oWnidow
// esta vez no se ha definido previamente el objeto barra de mensajes
SET MESSAGE OF oWindow TO OemToAnsi("Pulse el botn derecho")
ACTIVATE WINDOW oWindow ;
ON RIGHT CLICK MuestraMenu( nRow, nCol )
// al pulsar el botn Derecho del Mouse se llama a nuestra funcin
// muestra men, pasndole automticamente la fila y la columna.
// nRow y nCol los proporciona FiveWin sin hacer nada ms
return nil
//----------------------------------------------------------------------------//
function CrearMenu()
LOCAL oMenu
MENU oMenu POPUP
// Creando un menu PopUp
MENUITEM "Submenus"
MENU
MENUITEM "Block de Notas" ACTION WinExec("Notepad.exe")
MENUITEM "Calculadora" ACTION WinExec("Calc.exe")
SEPARATOR
MENUITEM "Fin"
ENDMENU
SEPARATOR
MENUITEM "Fin"
ENDMENU
return oMenu
//----------------------------------------------------------------------------//
function MuestraMenu( nRow, nCol )
LOCAL aCoord
DEFAULT oMenu := CrearMenu()

// usamos esta funcin del API para obtener las coordenadas de la ventana
// actualizadas.
aCoord := GetWndRect(oWindow:hWnd)
ACTIVATE POPUP oMenu WINDOW oWindow AT nRow+aCoord[1] , nCol+aCoord[2]

14

Programacin Windows

Introduccin a FIVEWIN

return nil
//----------------------------------------------------------------------------//

7. Redefinir el men del sistema.

#include "Fivewin.ch"
// Redefinicin del men de sistema
STATIC oWindow // Ventana del programa
FUNCTION Main()
DEFINE WINDOW oWindow FROM 5,5 TO 24,70 ;
// Coordenadas
TITLE OemToAnsi("Probando los mens de sistema") // Ttulo
// al empezar a crearse la ventana se llama a la funcin
// cambiaMenu donde modificaremos el men del sistema
ACTIVATE WINDOW oWindow ON INIT CambiaMenu()
RETURN NIL
//-------------------------------------------------------------------------//
// Funcin que cambia el men de sistema
FUNCTION CambiaMenu()
LOCAL oMenu // Menu de systema
REDEFINE SYSMENU oMenu OF oWindow // Cambiamos el men
SEPARATOR
MENUITEM "&Opciones"
MENU
MENUITEM "&Calculadora" ACTION WinExec("Calc.exe")
MENUITEM "&Block de notas" ACTION WinExec("Notepad.exe")
SEPARATOR
MENUITEM "&Salir del programa" ACTION oWindow:End()
ENDMENU
SEPARATOR
MENUITEM OemToAnsi("&Informacin") ACTION MsgInfo("Prueba de SysMenu")
ENDSYSMENU
// resetearamos lo hecho ahora volviendo al men original del sistema
// utilizando el mtodo Reset ----> oMenu:Reset( )
RETURN NIL
//-------------------------------------------------------------------------//

8. Creacin de una barra de herramientas con la funcin MsgToolBar


#include "fivewin.ch"

// Probando las barras mviles de herramientas

15

Programacin Windows

Introduccin a FIVEWIN

STATIC oWindow
FUNCTION Main()
LOCAL aBit1 := { "BOTTON.BMP",;
"TOP.BMP",;
"FORWARD.BMP",;
"REWIND.BMP",;
"NEXT.BMP",;
"PREV.BMP",;
"REC.BMP",;
"BOX.BMP" }
LOCAL aBit2 := aBit1
LOCAL aAcciones := {{|| .T. },{||.T.},{||.T.},{||.T.},{||.T.},{||.T.},{||.T.},{||.T.}}
DEFINE WINDOW oWindow FROM 0,0 TO 20,70 ;
TITLE "Probando las barras de herramientas"
// Creamos la barra de herramientas
ACTIVATE WINDOW oWindow ON INIT ;
MsgToolBar(oWindow,; // Ventana
"Tools",; // Ttulo
aAcciones,; // Acciones
aBit1,;
// 1er Bitmap del boton
aBit2,;
// Segundo bitmap
)
RETURN NIL

16

Programacin Windows

Introduccin a FIVEWIN

TEST DE EVALUACIN
Por favor, marque con una seal la respuesta o respuestas vlidas para cada
pregunta.

1.

Cmo se construye un men pop-up?


Con comandos predefinidos
Con el comando MENU
Con MENU y el nombre del objeto

2.

Se puede modificar el men del sistema?


No
Si con REDEFINE MENUSYS
Algunas veces

3.

Cundo se definen las acciones a realizar en los mens?


Cuando se definen los MENUITEMS
Despus de definir el men
Cuando sea necesario

4.

En qu lugares puede estar una barra de iconos?


ARRIBA solamente
En los cuatro costados
En los cuatro costados y flotante

5.

Se pueden incluir bitmaps en los mens?


Si, a veces
Si diciendo el nombre de un fichero .BMP
No, nunca

6.

Se puede hacer una ventana sin men de sistema?


S pero tendrs problemas para cerrarla
Si pero no por medios normales
Si. Con la clusula NOSYSMENU

Respuestas vlidas ..........................................

______

17

Programacin Windows

Introduccin a FIVEWIN

18

Programacin Windows

Introduccin a FIVEWIN

4
CAJAS DE DIALOGO

4.1

Cajas de dilogo Modales y No-Modales

En Windows llamamos caja de dilogo a un tipo particular de ventana que no


tiene botones de maximizar y minimizar. Normalmente tampoco tiene men.
Es como las pantallas de CA-Clipper que utilizbamos para establecer un
dilogo entre el programa y el usuario. Estas cajas de dilogo van a ser el
soporte de numeroso tipo de controles que facilitarn la comunicacin
hombre-mquina. Hasta ahora solo estbamos acostumbrados a hacer una
tarea al mismo tiempo, de hecho no emprendamos otra hasta no acabar la
que estbamos haciendo. En Windows a ese comportamiento se le llama
Modal. Resulta que ahora con eso de la multitarea vamos a poder hacer
varias cosas a la vez y tenemos que estar preparados. Las cajas de dilogo
no son ajenas a las nuevas tecnologas y de alguna forma aportan su granito
de arena a la tendencia. A dems de el comportamiento Modal ofrecen la
posibilidad de que su comportamiento pueda ser tambin No-Modal, lo que
quiere decir que se podr empezar otra tarea sin haber terminado la que se
estaba realizando en la caja de dilogo actual. Tendremos que tener ms
cuidado a la hora de programar ya que nuestra programacin no siempre va a
ser una programacin lineal. El usuario puede hacer cosas diferentes a las
que nosotros tenamos pensado hacer. Recomendamos empezar con las

Programacin Windows

Introduccin a FIVEWIN

cajas de dilogo No-Modales cuando ya tengamos un poco ms de


experiencia en la programacin Windows.

4.1.1 Cmo crear cajas de dilogo


Como siempre utilizaremos comandos preprocesados para que sea ms fcil.
Tambin como hacamos con las ventanas vamos a utilizar el comando
DEFINE:
DEFINE DIALOG objeto Dialogo
NAME, RESNAME, RESOURCE cNombre en los Recursos
TITLE cTtulo
FROM nArriba , nIzquierda TO nAbajo , nDerecha
LIBRARY, DLL Manipulador
VBX
STYLE nEstilo
COLOR, COLORS nColorTexto [, nColorFondo]
BRUSH objeto Brocha
WINDOW, DIALOG, OF objeto Contenedor
PIXEL
ICON objeto Icono
FONT objeto Font
Vamos primero a establecer los datos y en la segunda parte activaremos la
ventana y aadiremos algunas caractersticas y comportamientos.
Primero y mediante DEFINE DIALOG vamos a asociar nuestra caja de
dilogo a un nombre de objeto para ms tarde poder referirnos a la caja de
alguna forma. A nadie le gusta que le digan Oye tu! A la caja de dilogo
tampoco. Necesita or su nombre para hacer caso a las ordenes.
Tenemos que especificar quin es el dueo de la caja de dilogo siempre que
vayamos a utilizar controles que utilicen la barra de mensajes de la ventana
principal. Lo haremos mediante las clusulas OF o WINDOW y el nombre de
la ventana contenedora. S pertenece a otra caja de dilogo lo indicaremos
con la clusula DIALOG.
Mediante las clusulas NAME, RESNAME o RESOURCES especificaremos
el nombre de una caja de dilogo ya construida que podamos haber
guardado en un fichero almacn. La caja guardada de esta forma se dice que
es un recurso y a los ficheros que la contienen se les llama almacenes de
recursos. Puede ser el almacn, una DLL. Anteriormente tendramos que
haber especificado el lugar de donde vamos a sacar nuestros recursos. Se
hace con SET RESOURCES TO ... y el nombre de un fichero con extensin
.DLL, y al terminar el programa se descargar con SET RESOURCES TO.
Tambin se puede especificar el almacn de recursos mediante la clusula
LIBRARY o DLL y el manipulador obtenido anteriormente con la funcin
LoadLibrary( nombre de dll).
S no especificamos el nombre del recurso, definiremos un ttulo para la
ventana con la clusula TITLE y una cadena de caracteres. Despus las
coordenadas superior izquierda e inferior derecha. Son coordenadas que

Programacin Windows

Introduccin a FIVEWIN

simulan modo texto. Si utilizamos la clusula PIXEL las coordenadas tendran


que venir expresadas en puntos.
Tenemos que especificar a FiveWin cuando estamos creando la caja de
dilogo si vamos a incluir algn control del tipo VBX de Visual Basic. Si lo
vamos a hacer incluiremos la clusula VBX.
Ms adelante especificaremos el estilo con STYLE y un nmero predefinido.
Los colores de texto y fondo con COLOR o COLORS y el nmero que nos
devuelve la funcin nRGB( nRojo, nVerde, nAzul) o las constantes
predefinidas que encontramos en el fichero cabecera COLORS.CH.
Podemos asignar un icono a la caja de dilogo con la clusula ICON que
habremos definido con anterioridad. Tambin podemos definir una brocha
para pintar el fondo de nuestra caja, ya sea con un color liso o con un color
entramado. En cualquiera de los casos, la brocha habr que definirla
anteriormente. Por ltimo podemos dotar a nuestra caja de dilogo y sus
controles de un tipo de letra determinado utilizando la clusula FONT y el
nombre de un objeto FONT creado con anterioridad.

4.1.2 Activando la caja de dilogo


Llega el momento de que la caja de dilogo inicie su actividad. La tenemos
que activar y ella aprovechar para activar a su vez, todos los controles que
contenga.

ACTIVATE DIALOG objeto Dialogo


CENTER, CENTERED
NOWAIT, NOMODAL
WHEN Funcin para When
VALID Funcin para Valid
ON [ LEFT ] CLICK Funcin para CLick
ON INIT Funcin al iniciarse
ON MOVE Funcin al moverse
ON PAINT Funcin al Pintarse
ON RIGHT CLICK Funcin al pulsar con el botn derecho

Se activa la caja de dilogo especificando el nombre dado al definirla. La


podemos mostrar centrada para mayor comodidad CENTER o CENTERED.
Podemos obtener una caja de dilogo con comportamiento Modal (el standard
por defecto) o NOMODAL del cual hablaremos ms tarde.
Podemos utilizar dos posibilidades de validacin. Una de prevalidacin de
toma de foco por parte de la caja de dilogo, con la clusula WHEN y una
funcin que devuelva un valor lgico. La postvalidacin es para perder o no
perder el foco de la caja de dilogo. Es con la clusula VALID. Por ltimo
podemos interceptar el dilogo entre FiveWin y WIndows. Son los famosos
eventos y nuestras clusula ON.
ON INIT Podemos especificar una funcin que se ejecute al iniciarse la caja
de dilogo. Con ON MOVE podemos especificar otra que se ejecute al
moverse la caja. Otra para que se ejecute cuando se pinte por medio de la
clusula ON PAINT. Por ltimo podemos detectar cuando se pulse el botn

Programacin Windows

Introduccin a FIVEWIN

derecho sobre la caja de dilogo y ejecutar una funcin. Se prepara todo con
ON RIGHT CLICK y el nombre de una funcin.

4.2

Caja de dilogo como contenedora de controles

Cuando hablbamos de las ventanas decamos que estas eran responsables


de los controles que contuviesen. Las cajas de dilogo son un tipo de ventana
especial pero se comportan igual que las ventanas respecto a los controles
que contienen. Son responsables de mostrar todos los controles que
contengan. Cuando definimos una caja de dilogo especificamos quien es el
dueo de la misma, normalmente una ventana, cuando definimos los
controles decimos quien es el dueo de ellos. Lo decimos para que se pueda
realizar un control de los mismos. Desde ese momento la caja de dilogo se
encargar de activar los controles y de desactivarlos cuando se active y se
desactive la misma.

4.3

Tipos de controles

'Antigamente' cuando programbamos en modo texto, disponamos de


herramientas para realizar la captura de datos y para ensear los mismos por
pantalla. Desde el @ GET hasta el TBrowse tenamos una serie de
instrumentos que nos permitan realizar estas tareas. En FiveWin vamos a
disponer de instrumentos que llamaremos controles para intentar hacer todos
estos trabajos mucho ms sencillos. Adems disponemos de los 'mimbres'
que
nos
permitirn
confeccionar
nuestros
propios
controles.
En
principio los controles a
nuestra disposicin son los
siguientes:

Texto esttico
Cajas de edicin
Radio botones
Checkbox
Push button
Listbox
Combo box
Iconos
Cursores
Bitmaps
ScrollBars
TwBrowses
Controles VBX

Programacin Windows

Introduccin a FIVEWIN

FiveWin propone dos formas de abordar el trabajo para confeccionar las cajas
de dilogo:

A OJO! con los comandos @ fila, columna


Con un Editor de Recursos.

Suena un poco grotesco el primer punto pero es as. La programacin de las


cajas de dialogo de forma manual en Windows no es una tarea fcil s
deseamos colocar los controles donde queremos. Las unidades de medida de
la caja de dilogo estn determinadas por los fuentes de caracteres utilizados
en ellas. De esta forma, aunque se puede hacer, resulta difcil ajustar la
situacin exacta de un control. Nosotros pensamos que la solucin ms
profesional es la de trabajar con el editor de recursos que explicaremos en el
siguiente captulo.
Los editores de recursos nos van a
permitir crear nuestras cajas de dilogo
de forma visual con lo que no
tendremos que calcular previamente el
sitio donde ponemos los controles
porque
lo
estaremos
viendo
continuamente.
La sintaxis de creacin de controles por
ambos mtodos se pueden encontrar
en el CodeCard adjunto
Los puntos sucesivos van a intentar
aclarar como son los controles que
hemos estado nombrando. En este manual se va a tratar ms extensamente
la programacin de los controles de forma visual mediante el editor de
recursos pues es esta la forma de programar que utilizamos los
programadores el 90 % de las veces. Lo fcil sera decir que el @ fila,
columna SAY de CA-Clipper sigue sirviendo en Windows de la misma forma
que serva en CA-Clipper 5.x pero no es as. Utilizaremos este sistema
cuando queramos incluir controles de forma manual (lo veremos en los
programas de ejemplo). Es por eso por lo que haremos que nuestra
programacin sea lo ms visual posible.

4.4

Static Text

@ nFila , nColumna SAY objetoSay PROMPT,VAR cText


PICTURE cPicture
OF,WINDOW,DIALOG objetoWnd
FONT objetoFont
CENTERED, CENTER
RIGHT
BORDER
PIXEL, PIXELS
COLOR,COLORS nColorTexto , nColorFondo

Programacin Windows

Introduccin a FIVEWIN

SIZE nAncho , nAlto


DESIGN
UPDATE
SHADED, SHADOW
BOX
RAISED

Los Static Text en Windows son lo que los Say's en CA-Clipper. Mostramos
texto por pantalla. En nuestra caja de dilogo pueden aparecer como una
cadena de texto normal y corriente o con un tipo de letra y un color
determinado. Tambin podemos rodearlo de un borde o hacer que el texto se
centre o se alinee a izquierda o derecha. Podemos mostrar en pantalla, como
en CA-Clipper, cadenas de texto o variables.

Utilizamos el mtodo CA-Clipper de declarar controles. En este caso se trata


del @ ..., ... SAY. La llamada a este comando preprocesado generar un
objeto de la clase TSay. Bsicamente declaramos la fila y la columna
simulando modo texto. Si vamos a utilizar algn mtodo de esta clase,
tendremos que poner despus de SAY un nombre de un objeto y la clusula
PROMPT o VAR para que FiveWin sepa cual es el objeto y cual es la cadena
de texto a mostrar. Acto seguido se indica el propietario del control: objeto
dialogo o ventana
Podemos especificar que el control aparezca centrado, ajustado a la derecha,
con borde. Indicaremos las coordenadas en puntos o pixels s aadimos la
clusula PIXEL o PIXELS.
El tamao del rectngulo que rodear al SAY se puede especificar o cambiar
mediante la clusula SIZE nAncho, nAlto.
Las clusulas SHADED o SHADOW, RAISED, BOX y generan unas lineas en
relieve o en depresin o una caja.
La clusula DESIGN agrega un borde redimensionable al control y permite
que el control se pueda mover de sitio mediante el ratn.
La clusula UPDATE nos proporciona la facilidad de que nuestro control se
refresque selectivamente cuando se ejecute el mtodo UPDATE de la clase
TDialog o TWindow. Esto quiere decir que solo se refrescaran los controles
de una caja de dilogo que tengan esta clusula al llamar al mtodo UPDATE.

Programacin Windows

4.5

Introduccin a FIVEWIN

Edit text

@ nFila, nColumna GET objetoGet VAR uVariable


OF, WINDOW, DIALOG objetoWnd
PICTURE cPictute
VALID ValidFuncin
COLOR,COLORS nColorTexto [, nColorFondo]
SIZE nAncho , nAlto
FONT objetoFont
DESIGN
CURSOR objetoCursor
PIXEL
MESSAGE cMensage
UPDATE
WHEN WhenFuncin
CENTER, CENTERED
RIGHT
Los 'Edit text' representan en Windows lo mismo que el @ GET en CAClipper, con la diferencia de que en FiveWin se incorpora el GET
MULTILINEA que es lo mismo que el MemoEdit en CA-Clipper.
El control Edit Text en su versin de una sola linea, es un objeto obtenido de
la clase TGet y el control Edit Text Multilinea es un objeto obtenido de la clase
TMGet. Para la gente que estuviese acostumbrada a manejar los Gets de CAClipper tenemos que decir que los datos fundamentales del objeto TGet en lo
relativo a la edicin de la variable, provienen de un objeto GET de CA-Clipper.
Por lo tanto podemos utilizar todos los datos que venamos utilizando
anteriormente.
Para el GET de una sola linea especificamos la fila y la columna emulando
coordenadas del modo texto. Como siempre s vamos a utilizar
posteriormente algn mtodo de la clase TGet o alguna variable de instancia,
tendremos que declarar el nombre de un objeto. S declaramos un objeto
tenemos que poner la clusula VAR para que FiveWin sepa cual es el nombre
del objeto y cual el de la variable a editar. Por supuesto tendremos que decir
quien es el propietario del control. Lo haremos mediante las clusulas OF,
DIALOG o WINDOW y el nombre del objeto contenedor.
Podemos asociar al GET un objeto Font y un objeto Cursor de esta manera
las letras que utilicemos para editar la variable puede aparecer con un tipo de
letra determinado y al pasar por encima del GET el cursor del ratn, este
adoptar la forma que corresponda al objeto cursor determinado.
Utilizaremos las clusulas COLOR y SIZE para colorear el get y darle el
tamao deseado.
En el caso de utilizar la clusula PIXEL las coordenadas y las medidas
vendrn expresadas en puntos o pixels.
Tambin disponemos de clusulas para ajustar el texto a derecha o al centro.
Estas son RIGHT y CENTER.
Si queremos que aparezca un mensaje en la barra de mensajes al efecto, se
lo comunicaremos a FiveWin utilizando la clusula MESSAGE seguido de una
cadena de texto.

Programacin Windows

Introduccin a FIVEWIN

Disponemos de clusula UPDATE de refresco selectivo. PICTURE que


funciona igual que en CA-Clipper. Clusula DESIGN para borde
redimensionable y posibilidad de movimiento en la pantalla, y por ltimo dos
clusulas para prevalidar la edicin de los datos y postvalidar el trmino de los
mismos: WHEN y VALID.
@ nFila , nColumna GET objetoGet VAR uVariable
OF, WINDOW, DIALOG oWnd
MULTILINE, MEMO, TEXT
COLOR,COLORS nColorTexto [, nColorFondo ]
SIZE nAncho, nAlto
FONT objetoFont
HSCROLL
CURSOR objetoCursor
PIXEL
MESSAGE cMensage
UPDATE
WHEN WhenFuncion
CENTER, CENTERED
RIGHT
READONLY, NO MODIFY

El objeto obtenido es producto de una llamada al mtodo constructor de la


clase TMGet.
Cuando el GET es multilinea tendremos que aadir la clusula MULTILINE,
MEMO o TEXT. En este caso no disponemos de clusula VALID y si de
WHEN. Podemos incluir una barra de scroll HORIZONTAL a parte de la barra
de scroll vertical que tenemos por defecto siempre y por ltimo la clusula
READONLY o NO MODIFY para editar el campo memo o texto sin posibilidad
de modificacin.

4.6

Radio Button

@ nFila , nColumna RADIO oRadioMenu VAR nVariable


PROMPT cItems,...
OF, WINDOW, DIALOG objetoWnd
HELPID, HELP ID nHelpId
ON CLICK, ON CHANGE uCambio
COLOR nColorTinta [, nColorFondo ]
MESSAGE cMensage
UPDATE
WHEN WhenFuncin
SIZE nAncho , nAlto

Un 'Radio Button' es ese pequeo circulo que al 'pincharlo' se marca con un


circulo concntrico. El radio botn forma parte, siempre, de un conjunto. Un
grupo de radio botones forman una especie de men con una nica eleccin

Programacin Windows

Introduccin a FIVEWIN

posible. S recordamos el men @ fila, columna PROMPT nos haremos una


idea muy aproximada de lo que es este sistema del Radio Button

El resultado de la eleccin en el men de radio botones es el mismo que en el


@ PROMPT: un nmero que representar el nmero de opcin elegida.

4.7

Check Box

@ nFila , nColumna CHECKBOX objetoChbx VAR lVariable


PROMPT cTexto acompaante
OF, WINDOW, DIALOG objetoWnd
SIZE nAncho , nAlto
HELPID, HELP ID nHelpId
FONT objetoFont
ON CLICK uClick
VALID ValidFuncin
COLOR, COLORS nColorTexto [, nColorFondo ]
DESIGN
PIXEL
MESSAGE cMensage
UPDATE
WHEN WhenFuncion

El control Check Box es un pequeo cuadrado identificado por una cadena de


texto que le acompaa y que al 'pincharlo' con el ratn, se marca con un aspa.
Al contrario de lo que suceda con los Radio
Buttons, en este control se puede elegir ms de un
elemento. No estamos ante un men como en el
caso anterior sino en una eleccin de opciones que
pueden ayudar a confeccionar un perfil de un
conjunto de datos determinados. La clase que
utilizamos en esta ocasin es la clase TCheckBox la
cual nos devolver un objeto cuando lo solicitemos
con los comandos preprocesados oportunos. Estos comandos siguen como
siempre la notacin xBase de @ fila, columna seguido de la clusula
identificadora del control CHECKBOX. Si vamos a necesitar un objeto ahora
es el momento de darle nombre. Lo haremos y adems pondremos la
clusula VAR para que FiveWin sepa cual es el objeto y cual la variable lgica
asociada. S no furamos a utilizar el nombre del objeto, pondramos

Programacin Windows

Introduccin a FIVEWIN

directamente la variable lgica. Despus, como siempre, le indicaremos a


FiveWin, quien es el dueo del control para que lo pueda activar. Lo haremos
por medio de la clusula OF, DIALOG o WINDOW y el nombre del objeto
contenedor.
Tenemos un grupo de clusulas que sirven para definir externamente el
control, as podemos asignarle un color mediante la clusula COLOR o
COLORS seguido por el color de texto y el color del papel, podemos dar un
tamao al control mediante la clusula SIZE anotando el ancho y el alto,
podemos declarar el tipo de letra que utilizaremos en el control, especificando
un objeto font mediante la clusula FONT y podemos asignar una cadena de
texto para mostrarla como mensaje en la barra de mensajes mediante la
clusula MESSAGE.
S aadimos la clusula PIXEL las coordenadas tanto de ubicacin como de
tamao, vendrn especificadas en puntos o pixels y s aadimos la clusula
DESIGN nuestro checkbox se ver rodeado de un borde redimensionable y
se podr mover de un lugar a otro con el ratn.
Disponemos de dos clusulas de validacin. La primera es prevalidacin
WHEN y la segunda postvalidacin VALID. A continuacin de las clusulas
tendremos que poner una funcin que al evaluarse devuelva un valor lgico.
Por ltimo tambin tenemos una clusula UPDATE para el refresco selectivo
del control.

4.8

Pushbutton

El control PushButton, como su propio nombre indica, es un botn que se


puede presionar. Lo utilizamos en este entorno como un interruptor que
desencadena algn tipo de accin o acciones.
@ nFila , nColumna BUTTON objeto Botn
NAME, RESNAME, RESOURCE cResName1 [, cResName2 ]
FILE, FILENAME, DISK cBmpFichero1 [,<cBmpFichero2>]
SIZE nAncho , nAlto
ACTION uAccin
OF, WINDOW, DIALOG oWnd
MESSAGE cMensaje
WHEN WhenFuncin
ADJUST
En FiveWin tenemos dos tipos de botones para pulsar: los botones con
dibujos en su interior y los que simplemente muestran una cadena de texto.
Los primeros se gestionan en FiveWin mediante la clase TBtnBmp y los
segundos mediante la clase TButton. En ambos casos utilizamos la tcnica @
fila, columna para ubicar el botn en la ventana. La clusula BUTTON le
indica a FiveWin que vamos a solicitar un objeto del tipo botn. A continuacin
ponemos el nombre de un objeto botn en el caso de vayamos a necesitar
posteriormente referirnos a alguno de sus mtodos o a alguna de sus
variables de instancia. Despus, como siempre indicaremos a FiveWin el
nombre del contenedor con las clusulas OF, DIALOG o WINDOW. La
clusula ACTION nos permite indicar la accin que se ejecutar al pulsar el

10

Programacin Windows

Introduccin a FIVEWIN

botn. S deseamos que sea ms de una encerraremos el conjunto entre


parntesis y las separaremos por medio de comas.
Como siempre tendremos que indicar las caractersticas del botn y lo
haremos diciendo el tamao en pixels mediante la clusula SIZE ancho y alto.
Un detalle interesante es la clusula ADJUST con la que podremos ajustar el
dibujo del botn al tamao especificado con la clusula SIZE. De esta forma
podremos tener un botn con un dibujo independiente del tamao del bitmap.
El citado bitmap lo podemos obtener de un fichero .BMP almacenado en disco
o de un dibujo almacenado en un almacn de recursos. En el primer caso
utilizaremos las clusulas FILE, FILENAME o DISK seguidas de uno o dos
nombres de ficheros .BMP de los cuales el segundo ser para conseguir un
efecto de animacin. S lo obtenemos de recursos utilizaremos las clusulas
NAME, RESNAME, RESOURCE y el nombre que tenga el bitmap en nuestro
almacn de recursos.
S en lugar de ser un botn con dibujos definimos un botn con cadena de
texto, el objeto se solicita de la clase TButton y las clusulas difieren un poco
de la anterior definicin.
@ nFila , nColumna BUTTON objeto Boton PROMPT cTexto
SIZE nAncho , nAlto
ACTION uAccin
OF, WINDOW, DIALOG oWnd
MESSAGE cMensaje
WHEN WhenFuncin
DEFAULT
HELP, HELPID, HELP ID nHelpId
FONT objeto Font
PIXEL
DESIGN
UPDATE

Como podemos observar la forma de utilizar los dos tipos de botones es


semejante. Difieren en cosas como el texto que aparece en el botn y que
declararemos con ayuda de la clusula PROMPT. Las clusulas FONT,
DESIGN y PIXEL que utilizaremos respectivamente para el tipo letra del texto,
el borde redimensionable y las unidades de medida.
Disponemos de la clusula UPDATE de refresco selectivo y una clusula que
nos servir para declarar al botn como botn principal que recibir la
pulsacin del "intro" que se produzca en nuestra caja de dilogo. Ya no se
pasar de control a control con el intro sino que se pulsar directamente este
botn. Esta clusula es DEFAULT. Por ltimo la clusula HELP, HELPID o
HELP ID nos sirve para poder identificar el lugar desde donde se invoque a la
ayuda de Windows

11

Programacin Windows

4.9

Introduccin a FIVEWIN

Listbox

El control Listbox es lo que en CA-Clipper era el Achoice. Una caja en la que


se muestra un array de cadenas de caracteres. En el caso del Listbox se
aade una barra vertical con un par de botones en los extremos de ella y otro
botn que se desplaza a lo largo de ella. Esta barra
sirve para manejar los datos de la lista hacindolos
desplazarse hacia arriba y hacia abajo.
FiveWin lo implementa y adems permite que sus
elementos puedan ser dibujos, tanto ficheros .BMP
como bitmaps almacenados en recursos.
Al pulsar una tecla alfabtica se produce una bsqueda
entre los elementos del array mostrado cuya primera
letra coincida con la tecla pulsada.

@ nFila , nColumna LISTBOX objeto Listbox VAR cVariable


ITEMS, PROMPTS array Lista
SIZE nAncho , nAlto
ON CHANGE uCambio
ON [ LEFT ] DBLCLICK u Doble Click Izquierdo
OF, WINDOW, DIALOG oWnd
VALID ValidFuncin
COLOR,COLORS nColorTexto [, nColorPapel ]
PIXEL
DESIGN
FONT objeto Font
MESSAGE cMensaje
UPDATE
WHEN WhenFuncion

Utilizamos la misma forma de declarar el control como hemos hecho con los
dems controles: @ fila, columna y la clusula correspondiente en este caso
LISTBOX. S vamos a necesitar posteriormente referirnos a algn mtodo o
variable de la clase TListbox tendremos que especificar el nombre de un
objeto y despus la clusula VAR seguida de la variable que nos servir para
recoger la eleccin hecha en el LISTBOX. Acto seguido tendremos que
especificar el dueo del control con OF, DIALOG o WINDOW y el nombre del
propietario.
Como siempre, s no ponemos el nombre del objeto tampoco hace falta poner
la clusula VAR ya que se entender perfectamente cual es la variable. Dado

12

Programacin Windows

Introduccin a FIVEWIN

que el LISTBOX nos sirve para mostrar un array, tiene que existir una
clusula para ello. Se trata de la clusula ITEMS a la que acompaaremos
del nombre de un array. Despus tendremos que dar forma a nuestro control
como siempre (es opcional):
Tamao con clusula SIZE ancho y alto, color con la clusula COLOR o
COLORS y el color del texto y el color del papel, el tipo de letra que queremos
para el listbox especificando un objeto FONT, una cadena de texto para que
se muestre en la barra de mensaje con la clusula MESSAGE, si queremos
que disponga de un borde redimensionable y se pueda arrastrar con el ratn.
Si queremos ajustar al mximo la ubicacin del control, utilizaremos la
clusula PIXEL para que las medidas sean en puntos o pixels.
Disponemos de varias oportunidades de interceptar el dialogo de Windows y
FiveWin desviando el mismo hacia las funciones que nosotros
especifiquemos.
Podemos hacer que se ejecute una funcin cuando:
Cambie la opcin elegida (ON CHANGE)
Se efecte una doble pulsacin del botn izquierdo (ON DBLCLICK)
Por ltimo podemos validar la perdida de foco del control mediante una
funcin especificada con la clusula VALID y como siempre disponemos de
una clusula UPDATE de refresco selectivo.

4.10

ComboBox

El control ComboBox es una mezcla de controles


que ya hemos comentado. En concreto se trata de
una caja de edicin (GET) y un Listbox asociado,
de manera que cuando seleccionamos un elemento
del Listbox este aparecer en la caja de edicin.

@ nFila, nColumna COMBOBOX objeto Combobox VAR Variable


ITEMS, PROMPTS array Items
OF,WINDOW,DIALOG Wnd
SIZE nAncho, nAlto
COLOR,COLORS nColorTexto [, nColorPapel ]
FONT objeto Font
MESSAGE cMensaje
PIXEL
HELPID, HELP ID HelpId
ON CHANGE funcin para el cambio
UPDATE
WHEN WhenFuncin
VALID ValidFuncin

13

Programacin Windows

Introduccin a FIVEWIN

Declaramos el control Combobox con @ fila, columna COMBOBOX y un


nombre para el objeto en caso de que vayamos a utilizar con posterioridad
algn mtodo o alguna variable del mismo. En ese caso se tendr que
diferenciar el objeto de la variable agregando la clusula VAR y el nombre de
la variable. Luego el array a mostrar y la clusula OF, DIALOG o WINDOWS
y el nombre del dueo del combobox.
Despus, y opcionalmente, podemos declarar el tamao con SIZE ancho y
alto, el color con COLOR o COLORS y el color del texto y del papel, el tipo de
letra especificando un objeto font con la clusula FONT y el mensaje con
MESSAGE.
Con PIXEL podemos indicar que las medidas se hagan en puntos o pixels.
Disponemos de la clusula UPDATE para el refresco selectivo y dos
clusulas para la prevalidacin y postvalidacin WHEN y VALID. Por ltimo
se puede especificar un nmero para suministrar al programa de ayudas y as
identificar desde donde se llama a esta.

4.11

Iconos

Los iconos se utilizan normalmente para representar acciones de una manera


grfica. Los encontramos por todos los sitios, desde logotipos de las
empresas a figuras en los medios de transporte, deportes, etc. Los vamos a
utilizar mucho en este nuevo entorno. Con ellos vamos a indicar acciones,
programas, intenciones, etc. Cuando los integremos como parte de los
botones, los iconos representarn la accin que se ejecutar al pulsar el
botn. S forman parte de una
pantalla de entrada de datos,
podrn
representar
a
los
mismos.
En FiveWin los iconos se
almacenarn en ficheros con
extensin .ICO aunque a veces
los confundiremos con ficheros
de bitmaps pequeos utilizando
unos y otros para los mismos
fines. FiveWin maneja los iconos
a travs de la clase TIcon

@ nFila, nColumna ICON objeto Icono


OF, WINDOW, DIALOG oWnd
NAME, RESOURCE, RESNAME cNombre del recurso
FILE, FILENAME, DISK cFichero icono
BORDER
ON CLICK uClick
UPDATE
WHEN WhenFunc

Declaramos el objeto icono con @ fila, columna ICON y un nombre de icono.


Nombre del dueo del icono con OF, DIALOG o Window, despus el nombre

14

Programacin Windows

Introduccin a FIVEWIN

del icono ya est en un almacn de recursos o en un fichero de extensin


.ICO. En el primer caso se especifica con las clusulas, NAME, RESOURCE
o RESNAME y en el segundo con FILE, FILENAME o DISK. Se le puede
dotar de borde con la clusula BORDER. Podemos expresar una funcin para
cuando se haga 'click' sobre l. Una clusula UPDATE de refresco selectivo y
una funcin de prevalidacin con la clusula WHEN.

4.12

Bitmaps

Los Bitmaps representan uno de


los aspectos ms importantes en
este nuevo entorno. Siempre
hemos deseado poner un poco de
color en nuestros programas,
rodendolos de grficos que
alegren nuestras pantallas. Desde
FiveWin vamos a poder incluir
dibujos en tantos colores como
acepte nuestra tarjeta grfica.
Estos dibujos se almacenarn en
ficheros con extensin .BMP.
FiveWin incorpora una clase
llamada TBitmap para manejarlos
con toda comodidad. Existen dos
formas de manejar los bitmaps en
FiveWin: con comandos @ fila,
columna BITMAP o manejndolos
desde los ficheros de recursos. El
manejo
desde
recursos
se
explicar en el captulo siguiente dedicado al editor de recursos.

@ nFila, nColumna BITMAP objeto Bitmap


OF, WINDOW, DIALOG oWnd
NAME, RESNAME, RESOURCE cResName
FILE, FILENAME, DISK cBmpFichero
NOBORDER, NO BORDER
SIZE nAncho , nAlto
SCROLL
ADJUST
CURSOR objeto Cursor
PIXEL
MESSAGE cMensaje
ON CLICK, ON LEFT CLICK Funcin para click izquierdo
ON RIGHT CLICK Funcin para click derecho
UPDATE
WHEN WhenFuncin

15

Programacin Windows

Introduccin a FIVEWIN

Declaramos el objeto bitmap con @ fila, columna BITMAP y el nombre de un


objeto bitmap despus se indica el propietario del control con OF, DIALOG o
WINDOW. Indicamos donde se encuentra el bitmap ya sea en un fichero de
disco o en un almacn de recursos. Podemos hacer que no tenga borde al
dibujo con la clusula NO BORDER o NOBORDER. El tamao con SIZE
ancho y alto. La clusula SCROLL aade una barra de scroll al bitmap para
aquellos bitmaps que no quepan en el tamao indicado. ADJUST para ajustar
el bitmap al tamao expresado. CURSOR para que cuando el ratn pase
sobre el bitmap se ponga el cursor que hayamos dicho. PIXEL para que las
coordenadas y tamao se expresen en puntos. MESSAGE para poder
mostrar un mensaje en la barra de mensajes cuando el cursor 'sobrevuele' el
bitmap. Interceptamos la pulsacin del botn izquierdo o el derecho con ON
CLICK o ON LEFT CLICK y con ON RIGHT CLICK. Por ltimo disponemos
de la clusula UPDATE de refresco selectivo y una prevalidacin con la
clusula WHEN.

4.13 Cursores
FiveWin nos proporciona la posibilidad de cambiar el apuntador del ratn de
una forma sencilla.
DEFINE CURSOR objeto Cursor
cResName

RESOURCE, RESNAME, NAME

Nuestra misin es obtener un objeto del tipo cursor. Lo conseguimos


mediante este comando predefinido que solicitar un objeto a la clase
TCursor. Tenemos que especificar mediante la clusula RESOURCE,
RESNAME o NAME el nombre con que creamos nuestro cursor en el
almacn de recursos.
Una vez que hayamos conseguido nuestro
objeto cursor, estaremos en disposicin de
utilizarlo como apoyo de la programacin.
Unas veces lo utilizaremos para indicar la realizacin de un proceso, otras
veces nos servir para indicar que debemos elegir uno de los botones sobre
el que pasemos, otras veces indicar que una opcin esta deshabilitada...

4.14

Scroll Bar

Las Barras de Scroll son unos controles que vamos a utilizar para representar
un valor determinado que estar comprendido entre un rango de valores
dados. Se trata de un rectngulo horizontal o vertical con un botn en cada
uno de sus extremos y otro que se ir deslizando a lo largo de ella y que
representar, visualmente el valor del que hemos estado hablando.
Tenemos un comando para situar una barra de scroll en una caja de dilogo.
Se trata del comando preprocesado @ fila, columna SCROLLBAR .
Los comandos que vamos a utilizar desde el cdigo de nuestro programa
para definir las barras de scroll son los siguientes:

16

Programacin Windows

Introduccin a FIVEWIN

@ nFila , nColumna SCROLLBAR objeto Scrollbar


HORIZONTAL
VERTICAL
OF objeto contenedor
RANGE nMnimo , nMximo
PAGESTEP nSalto de Pgina
SIZE nAncho , nAlto
COLOR,COLORS nColorTexto [, nColorFondo]
MESSAGE cMensaje
UPDATE
PIXEL
UP, ON UP uAccin para arriba
DOWN, ON DOWN uAccin para abajo
PAGEUP, ON PAGEUP uAccin para pgina arriba
PAGEDOWN, ON PAGEDOWN uAccin para pgina abajo
ON THUMBPOS uAccin para arrastre de botn

Actuamos de la misma forma que siempre. Asociamos un nombre de objeto a


nuestro control para poder referirnos posteriormente a sus variables y
mtodos. Indicamos tambin la fila y la columna. Acto seguido tenemos que
decir si la barra de scroll va a ser HORIZONTAL o VERTICAL.
Tendremos que especificar el dueo de la barra de scroll para que se pueda
hacer cargo de su control. Lo haremos con la clusula OF seguido del nombre
del contenedor.
Habamos dicho que bamos a representar un nmero comprendido entre un
rango. Establecemos el rango con la clusula RANGE y separados por una
coma ponemos el valor mnimo y el valor mximo.
Siguiendo con los valores, tenemos que indicar como va a variar el nmero
representado cuando se produzcan las posibles pulsaciones de botones o
arrastre del botn deslizante. Con la clusula PAGESTEP estableceremos la
cantidad que aumentar o disminuir el nmero representado cada vez que
pulsemos con el ratn entre el botn deslizante y los botones de los extremos
o cuando pulsemos una tecla de pgina arriba o pgina abajo. Cuando
pulsemos en los botones extremos o las teclas de cursores, el valor
representado disminuir de una en una unidad.
La clusula SIZE nos sirve para especificar el tamao de la barra de scroll.
Las clusulas COLORS o COLOR sirve para colorear la barra. Tambin
tenemos la posibilidad de indicar una cadena de texto para mostrar en la
barra de mensajes con la clusula MESSAGE.
La clusula UPDATE es la ya conocida clusula de refresco selectivo.
PIXEL nos sirve para ubicar el control en la caja de dilogo o ventana
haciendo referencia a las coordenadas en puntos.
Despus de todas estas clusulas entramos en el apartado en el que
podemos indicar nombres de funciones que se ejecuten cuando sucedan
determinadas cosas.
Podemos desviar nuestro programa a una funcin indicada por nosotros
cuando suceda:

Se pulse el botn arriba o izquierdo UP, ON UP


Se pulse el botn abajo o derecho DOWN, ON DOWN

17

Programacin Windows

Introduccin a FIVEWIN

Se pulse entre el botn deslizante y el botn arriba o izquierdo


PAGEUP, ON PAGEUP
Se pulse entre el botn deslizante y el botn abajo o derecho
PAGEDOWN, ON PAGEDOWN
Cuando se arrastre el botn deslizante. PAGEDOWN, ON
PAGEDOWN

4.15

Controles VBX

A partir de la versin 1.7 de FiveWin disponemos de la posibilidad de


incorporar controles externos a nuestras cajas de dilogo. Se trata de los
controles del lenguaje Visual Bsic de la empresa Microsoft.
Estos controles son similares a los dems que tenemos en Windows con la
particularidad de que estn muy extendidos en el mercado y de que hay
muchos fabricantes que se dedican a construirlos. Nosotros no vamos a
construirlos pero vamos a utilizarlos.
Los ficheros VBX son en realidad DLL's renombradas que contienen en su
interior objetos ya construidos. Estos objetos estn formados de manera
similar a los que nosotros utilizamos en FiveWin. Tienen Variables, Mtodos y
EVENTOS.
Para utilizar un control VBX tenemos que disponer de documentacin sobre
ellos ya que tendremos que hacer referencia a las variables, mtodos y
eventos de la misma forma que lo hacemos con nuestros controles.
La forma de incluir un VBX en nuestra caja de dilogo o en nuestra ventana
es a travs de los siguientes comandos preprocesados.
@ nFila, nColumna VBX objeto Vbx
OF objeto contenedor
SIZE nAncho , nAlto
FILE, FILENAME, DISK cNombre del fichero VBX
CLASS cNombre de la Clase VBX
ON cEVENTO 1 uAccin 1
ON cEVENTO n uAccin n
Damos un nombre al control VBX para poder referirnos a l posteriormente.
Indicamos con el procedimiento habitual, las coordenadas en que se mostrar
el control. Con la clusula OF decimos quien va a ser el dueo del control ya
sea una ventana o una caja de dilogo. Con SIZE damos un tamao al control
especificando el ancho y el alto del mismo.
Ahora tenemos que indicar cual es el nombre del fichero VBX y lo haremos de
la forma en que venimos haciendo tradicionalmente, con las clusulas FILE,
FILENAME o DISK. Seguidamente y de forma opcional indicaremos el
nombre de la clase que proporciona el fabricante del control para el mismo.
Nos apoyamos en la clusula CLASS.
Por ltimo tenemos que indicar lo que se va a realizar cuando se produzcan
los eventos que el fabricante ha programado. En la documentacin que tiene
que acompaar al VBX se indican las variables, los mtodos y los eventos.
Recordemos que evento es algo que puede suceder. Con nuestras clusulas
de manejo de eventos (ON) indicaremos una o unas acciones a realizar
cuando se produzca el citado evento. Se tiene que poner el mismo nombre de

18

Programacin Windows

Introduccin a FIVEWIN

evento que el que indica el fabricante del VBX en la documentacin. Podemos


poner tantas clusulas ON como eventos contenga el control y hacer que se
ejecute la accin que nosotros indiquemos con nuestra funcin.

4.16

Clase TDialog

Terminamos de hablar de los controles haciendo una referencia rpida de la


clase TDialog. Esta clase es la que va a devolver un objeto Dialogo sobre el
que reposarn todos nuestros controles. TDialog est heredada de la clase
TWindow, lo que quiere decir que posee, de entrada, todos los datos de la
misma. Vamos a mostrar los datos, heredados o no, que son interesantes por
su utilizacin.

4.16.1

Principales variables
bStart
bMoved
bPainted
bValid
bInit
bRClicked
bLClicked
bLDblClick
bWhen
bMMoved

Codeblock que se ejecutar al inicio una vez.


Codeblock que se ejecutar cuando se mueva la
caja.
Codeblock que se ejecutar cuando se pinte la caja.
Codeblock que se ejecutar para validar la
terminacin de la caja de dilogo.
Codeblock que se ejecutar al iniciar la caja de
dilogo. Se ejecuta varias veces.
Codeblock que se ejecutar al pulsar el botn
derecho del ratn.
Codeblock que se ejecutar al pulsar el botn
izquierdo del ratn.
Codeblock que se ejecutar al hacer "doble click" el
botn izquierdo.
Codeblock que se ejecutar al iniciarse la caja de
dilogo, permitiendo el inicio de la misma o no.
Codeblock que se ejecutar cada vez que se mueva
el ratn. Pasa automticamente las coordenadas de
la ventana.

19

Programacin Windows

bKeydown
nChrHeight
nChrWidth
Cargo
aControls
lFocused
lActive
lVisible
oFont

4.16.2

Introduccin a FIVEWIN

Para capturar pulsaciones del teclado


Altura de los caracteres de la caja de dilogo.
Anchura de los caracteres de la caja de dilogo.
Variable definible por el usuario.
Array de controles que contendr la caja de dilogo.
Tiene el foco la caja de dilogo?
Est activa la caja de dilogo?
Est visible la caja de dilogo?
Objeto Font activo en la caja de dilogo

Principales mtodos
Disable()
Enable()
Hide()
Display()
End()
Destroy()
Copy()
cTitle (cTitle)
EraseBkGnd()

Desactiva una caja de dilogo.


Activa una caja de dilogo.
Oculta la caja de dilogo.
Muestra la caja de dilogo.
Termina la actividad de una ventana.
Destruye la ventana y todos sus objetos.
Copia la caja de dilogo al portapapeles.
Cambia u obtiene el ttulo de la caja de dilogo.
Borra la caja de dilogo y el fondo que ocupa.

GetItem (nId)
FocusNext()

Obtener el manipulador de un control segn su nID.


Pasa el foco al siguiente control de la caja de
dilogo.

GoPrevCtrl (hCtrl)
GoNextCtrl (hCtrl)

Ir al control previo al manipulador del control


dado.
Ir al control prximo al manipulador del control
dado.

GotFocus()
LostFocus()

Obtener el foco para la caja de dilogo.


Perder el foco de la caja de dilogo.

cGenPrg()

Generar el cdigo fuente que crear la caja de


dilogo.
Vuelve a pintar la caja de dilogo con todos sus
controles.

Refresh()

HardCopy (nScale,lUser)
impresora

Copia la caja de dilogo en la


con la escala que se indique.

Como hemos indicado anteriormente, TDialog est derivada directamente de


TWindow es por eso que se entremezclan mtodos y variables de una clase y
de otra.

20

Programacin Windows

Introduccin a FIVEWIN

PROGRAMAS PROPUESTOS
1. Ejemplo de utilizacin de comandos 'arroba'
Se simula un editor de recursos creando una ventana MDICHILD y
cambiando a una caja de dilogo con los controles copiados de la
ventana. Se borra los controles de la ventana MDICHILD usando el botn
derecho del mouse.
#include "fivewin.ch"
static oWnd, oMenu, MdiCh
static oMenuIt1 , oMenuIt2 , oMenuIt3, oMenuIt4, oMenuIt5
static oMenuIt6 , oMenuIt7 , oMenuIt8, oMenuIt9, oMenuIt10
static oMenuIt11, oMenuIt12
static CtrlActivo := 0
static oDlg
function main()
DEFINE WINDOW oWnd TITLE "Utilidad de comandos 'arroba' " ;
FROM 0,0 TO 20,79 MENU MiMenu() MDI
// Creamos una ventana MDI con su correspondiente men

ACTIVATE WINDOW oWnd ON INIT CreaMdiCh() MAXIMIZED


// Creamos una ventana MDICHILD en el proceso de inicializacin
// de la ventana principal

RETURN nil
****************************
Function MiMenu()
*****************
*
* Creamos el men principal de la aplicacin y asignamos acciones
*
MENU oMenu
MENUITEM oMenuIt1 PROMPT "Say"
MENUITEM oMenuIt2 PROMPT "Get"
MENUITEM oMenuIt3 PROMPT "CheckBox"
MENUITEM oMenuIt4 PROMPT "ListBox"
MENUITEM oMenuIt5 PROMPT "ComboBox"
MENUITEM oMenuIt6 PROMPT "Button"
MENUITEM oMenuIt7 PROMPT "Scr V"
MENUITEM oMenuIt8 PROMPT "Scr H"
MENUITEM oMenuIt9 PROMPT "Icono"
MENUITEM oMenuIt10 PROMPT "Bitmap"
MENUITEM oMenuIt11 PROMPT "Test"

ACTION Desac(1 )
ACTION Desac(2 )
ACTION Desac(3 )
ACTION Desac(4 )
ACTION Desac(5 )
ACTION Desac(6 )
ACTION Desac(7 )
ACTION Desac(8 )
ACTION Desac(9 )
ACTION Desac(10)
ACTION Test()

21

Programacin Windows

Introduccin a FIVEWIN

MENUITEM oMenuIt12 PROMPT "Terminar"


oWnd:End()
ENDMENU

ACTION

RETURN oMenu
**************************
Function Desac (nMenos)
*************
* Desactivamos las opciones de men de 1 a 10 menos
* la actual.
* Si existe alguna opcin deshabilitada las habilitamos todas
* Lo hacemos para que cuando elijamos una opcin esta indique
* que control estamos en disposicin de colocar en la ventana de diseo

Local nIndice, oPcion


CtrlActivo := nMenos

// Esta variable nos indica el control que vamos a poner


// en la ventana de diseo

* Solo entramos en la funcin DESAC cuando la opcin est activada.


* Si al repasar las dems opciones encontramos alguna desactivada (lActive := .f.)
* quiere decir que queremos activar todas las opciones para poder elegir un nuevo control
* Hacemos que el control activo sea igual a 0 y en el siguiente proceso se activan todas
* las opciones con el mtodo ENABLE

FOR nIndice := 1 TO 10
IF !oMenu:aItems [nIndice]:lActive
CtrlActivo := 0
EXIT
ENDIF
NEXT
FOR nIndice := 1 TO 10
oPcion := oMenu:aItems [nIndice]
IF CtrlActivo == 0
oPcion:Enable()
ELSE
IF nIndice == nMenos
LOOP
ENDIF

// si es el control elegido, no se desactiva.

oPcion:Disable()
ENDIF
NEXT

22

Programacin Windows

Introduccin a FIVEWIN

oMenu:Refresh()
RETURN nil

*************************************
FUNCTION CreaMdiCh()
**************
*
* Crea la ventana MdiChild
*
*
DEFINE WINDOW MdiCh MDICHILD OF oWnd;
TITLE OemToAnsi("Caja de di logo de diseo") ;
FROM 4,10 TO 23,70
MdiCh:bLClicked := { |fila,columna| PonCtrl (fila,columna) }
// cuando se presione el botn izquierdo del ratn vamos a poner un control
// en la ventana MDICHILD en las coordenadas especificadas.
// El control vendr determinado por la variable CtrlActivo

ACTIVATE WINDOW MdiCh

RETURN nil

*******************************
Function PonCtrl (fila,columna)
****************
*
* Pone controles en la ventana de diseo
*
*
Local nFila := fila
Local nColumna := columna
Local oIcon, oBitmap
Local oSay

// En la fase de diseo todos los controles situados son de la clase TSay. Diferenciamos unos
// de otros por el texto mostrado en cada uno de ellos.
// Este texto se acumula en la variable de instancia del objeto llamada cCaption

DO CASE

23

Programacin Windows

Introduccin a FIVEWIN

CASE CtrlActivo == 1
@ nFila,nColumna SAY oSay PROMPT "TSay" OF MdiCh ;
PIXEL ;
// para especificar las coordenadas en puntos
DESIGN ;
// para poder redimensionar y mover el control
SIZE 90,30
oSay:bRClicked := {|| oSay:End()}
// cuando pulsemos el botn derecho del ratn sobre el control, este desaparecer
// de la ventana gracias a que se ejecutar el mtodo End() para ese control

CASE CtrlActivo == 2
@ nFila,nColumna SAY oSay PROMPT "TGet" OF MdiCh ;
PIXEL ;
DESIGN ;
SIZE 90,30
oSay:bRClicked := {|| oSay:End()}
CASE CtrlActivo == 3
@ nFila,nColumna SAY oSay PROMPT "TCheck" OF MdiCh ;
PIXEL ;
DESIGN ;
SIZE 90,30
oSay:bRClicked := {|| oSay:End()}
CASE CtrlActivo == 4
@ nFila,nColumna SAY oSay PROMPT "TListbox" OF MdiCh ;
PIXEL ;
DESIGN ;
SIZE 100,100
oSay:bRClicked := {|| oSay:End()}
CASE CtrlActivo == 5
@ nFila,nColumna SAY oSay PROMPT "TComboBox" OF MdiCh ;
PIXEL ;
DESIGN ;
SIZE 100,100
oSay:bRClicked := {|| oSay:End()}
CASE CtrlActivo == 6
@ nFila,nColumna SAY oSay PROMPT "TButton" OF MdiCh ;
PIXEL ;
DESIGN ;

24

Programacin Windows

Introduccin a FIVEWIN

SIZE 100,40
oSay:bRClicked := {|| oSay:End()}
CASE CtrlActivo == 7
@ nFila,nColumna SAY oSay PROMPT "TScrv" OF MdiCh ;
PIXEL ;
DESIGN ;
SIZE 20,100
oSay:bRClicked := {|| oSay:End()}
CASE CtrlActivo == 8
@ nFila,nColumna SAY oSay PROMPT "TScrh" OF MdiCh ;
PIXEL ;
DESIGN ;
SIZE 100, 20
oSay:bRClicked := {|| oSay:End()}
CASE CtrlActivo == 9
@ nFila,nColumna SAY oIcon PROMPT "TIcon" OF MdiCh ;
PIXEL ;
DESIGN ;
SIZE 32,32
// Cuando pulsemos el botn derecho sobre un Icono accedemos a la caja de
// dilogo Abrir para elegir un fichero .ICO cuando elijamos el fichero, el nombre
// de este se acumula en la variable de instancia cargo

oIcon:bRClicked := { || oIcon:cargo := cGetFile ("*.ICO",;


"Elija un fichero .ICO") }
CASE CtrlActivo == 10
@ nFila,nColumna SAY oBitmap PROMPT "TBitmap" OF MdiCh ;
PIXEL ;
DESIGN ;
SIZE 50,50

oBitmap:bRClicked := { || oBitmap:cargo := cGetFile ("*.BMP",;


"Elija un fichero .BMP") }
// acumulamos en la variable cargo el nombre del fichero .BMP elegido

OTHERWISE
RETURN nil

25

Programacin Windows

Introduccin a FIVEWIN

ENDCASE
RETURN nil

***********************
FUNCTION Test ()
********************
LOCAL nTop
LOCAL nLeft
LOCAL nBottom
LOCAL nRight

:= MdiCh:nTop + 20
:= MdiCh:nLeft
:= MdiCh:nBottom - 10
:= MdiCh:nRight - 10

DEFINE DIALOG oDlg TITLE "Recursos de Five WorkShop" ;


FROM nTop, nLeft TO nBottom, nRight ;
PIXEL OF oWnd
// Creamos una caja de dilogo de coordenadas idnticas a la ventana MDICHILD
// que utilizamos para el diseo.
// En el inicio de la creacin de la caja de dilogo se va a la funcin ADDCTRL
// para aadir los controles en funcin de los aadidos en la ventana de diseo.

ACTIVATE DIALOG oDlg

ON INIT AddCtrl()

return nil

****************************
FUNCTION AddCtrl()
****************************
*
*
* Aade los controles a la caja de dilogo en funcin de lo definido
* en la caja de dilogo de diseo
* En el array aControls de las cajas de dilogo y ventanas, se depositan los
* controles que pertenezcan a ellas.
LOCAL nInd := 0
LOCAL nLenaCtr := LEN (MdiCh:aControls)
LOCAL oBjeto, oIcon, oBitmap
LOCAL cCaption, nTop, nLeft, nBottom, nRight, nWidth, nHeight
LOCAL cVar := SPACE (30)
LOCAL lVar := .f.
LOCAL aItems := {"Uno","Dos","Tres","Cuatro","Cinco","Seis","Siete"}
// mientras que no se acaben los controles de la ventana de diseo
// se sigue en el proceso de creacin de controles

DO WHILE nInd < nLenaCtr

26

Programacin Windows

Introduccin a FIVEWIN

nInd ++
oBjeto := MdiCh:aControls[nInd]
// Los objetos TSay de la ventana de diseo nos proporcionan las
// coordenadas de los nuevos controles de la caja de dilogo y la variable
// cargo para los iconos y bitmaps

oBjeto:CoorsUpdate()
// con este mtodo refrescamos las coordenadas de cada objeto

nTop
nLeft
nWidth
nHeight
cCaption

:= oBjeto:nTop
:= oBjeto:nLeft
:= oBjeto:nRight - oBjeto:nLeft
:= oBjeto:nBottom - oBjeto:nTop
:= oBjeto:cCaption

DO CASE
CASE cCaption == "TSay"
@ nTop,nLeft SAY cCaption PIXEL OF oDlg ;
SIZE nWidth , nHeight
CASE cCaption == "TGet"
@ nTop,nLeft GET cVar PIXEL OF oDlg ;
SIZE nWidth , nHeight
CASE cCaption == "TCheck"
@ nTop,nLeft CHECKBOX lVar PROMPT cCaption PIXEL OF oDlg ;
SIZE nWidth , nHeight
CASE cCaption == "TListbox"
@ nTop,nLeft LISTBOX cVar ITEMS aItems PIXEL OF oDlg ;
SIZE nWidth , nHeight
CASE cCaption == "TComboBox"
@ nTop,nLeft COMBOBOX cVar ITEMS aItems PIXEL OF oDlg ;
SIZE nWidth , nHeight
CASE cCaption == "TButton"
@ nTop,nLeft BUTTON cCaption PIXEL OF oDlg ;
SIZE nWidth , nHeight
CASE cCaption == "TScrv"
@ nTop,nLeft SCROLLBAR VERTICAL PIXEL OF oDlg ;

27

Programacin Windows

Introduccin a FIVEWIN

SIZE nWidth , nHeight;


RANGE 1,100
CASE cCaption == "TScrh"
@ nTop,nLeft SCROLLBAR HORIZONTAL PIXEL OF oDlg ;
SIZE nWidth , nHeight;
RANGE 1,100

CASE cCaption == "TIcon"

@ nTop /14 ,nLeft / 8 ICON oIcon OF oDlg FILE oBjeto:Cargo


// La clase TIcon calcula las coordenadas simulando modo texto.
// Para reducir nTop y nLeft que tenemos en puntos, a modo texto
// tenemos que dividir por 14 y por 8

CASE cCaption == "TBitmap"

@ nTop,nLeft BITMAP oBitmap PIXEL OF oDlg FILE oBjeto:Cargo

ENDCASE
ENDDO
return nil

28

Programacin Windows

Introduccin a FIVEWIN

29

Programacin Windows

Introduccin a FIVEWIN

TEST DE EVALUACIN
Por favor, marque con una seal la respuesta o respuestas vlidas para cada
pregunta.

1. Qu clusula utilizamos para comunicar las coordenadas en puntos?


PIXEL
FONT
DESIGN
2. Con qu mtodo se deshabilitan los controles?
End()
Hide()
Disable()
3. Cmo se ocultan los controles?
Hide()
Disable()
New()
4. Cmo se almacenan los controles en las ventanas o cajas de
dilogo?
En la variable cargo
En variables de instancia
En un array
5. De quin heredan las diferentes clases de controles?
TDialog
TControl y TWindow
TControl y TDialog
6. Cmo 'matamos' un control?
Con el mtodo End()
Con el mtodo Destroy()
Con el mtodo Terminar()

Respuestas vlidas ..........................................

______

30

Programacin Windows

Introduccin a FIVEWIN

5
RESOURCE WORKSHOP

5.1

Qu son los recursos?

Por un momento vamos a dejar la definicin a un lado y vamos a hablar de los


elementos que vamos a manejar. Una vez que identifiquemos los mismos, no
vamos a tener ninguna dificultad en saber lo que es un recurso.
Al realizar los programas nos ayudamos de materiales que se repiten
sistemticamente en todos nuestros trabajos: mens, pantallas de captura de
datos, dibujos... En Windows no va a ser de otra forma. Tenemos muchos
elementos que nos van a acompaar en nuestra programacin como si fueran
materiales para construir una casa. Nos ayudarn a confeccionar nuestros
programas.
Son ms importantes los materiales o los procesos? No tengo ni la mas
remota idea. Digamos que se necesitan mutuamente. De lo que si estoy
seguro es de que los materiales son muy parecidos de un programa a otro, es
mas, yo dira que son iguales. En Windows vamos a disponer de cajas de
dilogo, mens, bitmaps, iconos, botones, listbox, radiobotones, etc... y
siempre se van a repetir, en lo fundamental, de un programa a otro. Podemos
hacer cajas de dilogo diferentes en dos programas, pero siempre las
haremos utilizando los botones, cajas de edicin, listbox ... Estos elementos
no cambian.

____________________________________________________________________
1

Programacin Windows

Introduccin a FIVEWIN

Windows ha sabido tomar buena nota de la experiencia acumulada en otros


entornos de trabajo y ha decidido que estos elementos pueden agruparse en
ficheros de tal manera que podamos construir una caja de dilogo que
funcione a la perfeccin dejndola a falta de que se la asocie con los datos y
procesos de nuestro programa. Echndole un poco de imaginacin es como
s nos dedicramos a crear robots que anduviesen y se movieran a la
perfeccin y los guardramos en un almacn para posteriormente, en el
momento de utilizarlos, introducirles los programas que les dotaran de
operatividad

5.2

Qu es el Resource WorkShop

Hemos hablado de almacenar los recursos en almacenes y eso esta muy


bien. Lo mejor que podemos hace es dejar que ese trabajo lo realice un
especialista. Nosotros hemos elegido el especialista en manejo de recursos
de la casa Borland, Resource WorkShop.
Es un especialista que nos ayudar a confeccionar los mens, cajas de
dilogo, iconos, bitmaps, etc, para despus almacenarlos en ficheros
apropiados a las circunstancias. Estos ficheros se llamarn Almacenes de
Recursos.
Este producto viene incorporado en el Borland C++ y en Turbo Pascal para
Windows. Como comprobaremos en los puntos siguientes, nos permite
disear visualmente las cajas de dilogo, mens, etc. Lo utilizaremos como
complemento a nuestra programacin hasta el punto de que sin l nuestro
trabajo se hara muy dificultoso.

5.3

Que haremos y qu no haremos con el Resource


WorkShop?

Esta claro que nos hemos cambiado a Windows para que el trabajo sea ms
fcil y ms bonito. Lo que no haremos, por supuesto, es utilizar herramientas
por muy visuales que sean, para realizar un trabajo que lo haramos mucho
mejor desde el cdigo de nuestro programa. Esto es lo que sucede con los
mens. Los mens son mucho ms fciles de codificar desde el programa
que de hacer desde el Resource WorkShop. En cambio las cajas de dilogo

____________________________________________________________________
2

Programacin Windows

Introduccin a FIVEWIN

son mucho ms fciles de disear con el editor de recursos que si las


codificsemos desde programa. Esto sucede por que las coordenadas de las
cajas de dilogo van en funcin del tipo de letra que estemos utilizando en la
misma. Es un jaleo el situar los controles desde cdigo, por eso el diseo
visual es el ideal en este caso (no lo desechamos pues algunas veces son
necesarios).
Los bitmaps los almacenaremos unas ocasiones en ficheros .BMP y otras
dentro de nuestros almacenes de recursos. Los iconos y cursores los
manejaremos desde el editor. En todo caso, cada uno realizar los trabajos
de una forma u otra, pero siempre tendremos que intentar hacerlo de la forma
que resulte ms fcil.

5.3

Qu se puede hacer con el Resource WorkShop?

El editor de recursos viene a ser como un taller mecnico en el que


fabricamos los elementos necesarios para montar un programa. Vamos a
poder fabricar, fundamentalmente, los siguientes mdulos:

Cajas de dilogo
Mens
Bitmaps y
Cursores

Es verdad que se pueden realizar ms cosas con el editor pero realmente lo


que ms vamos a utilizar son los indicados.

5.4

Almacenes de Recursos

____________________________________________________________________
3

Programacin Windows

Introduccin a FIVEWIN

ltimamente aprendemos muchas palabras nuevas y esta es otra. Un


almacn en el entorno que nos movemos va a estar representado por un
fichero. En el vamos a introducir nuestras cajas de dilogo, iconos, bitmaps,
etc. Tenemos varios tipos de almacenes de recursos que identificaremos por
la extensin del fichero que utilicemos. Principalmente utilizaremos dos de
ellos, el tipo DLL y el tipo RC. El primero se llama Librera de Enlace Dinmico
y el segundo de Recursos Compilado.
Que es una cosa y otra? En la vida real una librera es un mueble que
contiene los libros. En programacin es algo parecido, un fichero que contiene
mdulos en formato binario. La particularidad es que nuestro programa
cargar estos mdulos en memoria solo cuando los necesite, pudindolos
compartir con otros programas. Cuando no le hagan falta los dejar de nuevo
en el disco. En las libreras almacenamos libros que consultamos cuando no
sabemos algo. Las libreras en programacin son un conjunto 'libros'
(funciones) a las que acceder nuestro programa para consultar lo que no
sepa hacer con lo que tiene en el mdulo principal del ejecutable.
Los ficheros RC son un poco ms normales. Si miramos uno por dentro
veremos que esta escrito en lenguaje natural. se entiende! Resource
WorkShop va a especificar en el todos los recursos por su nombre indicando
las coordenadas y caractersticas. Posteriormente utilizaremos el programa
RC.EXE para transformarlo en lenguaje mquina. Con este programa
introduciremos los recursos en nuestro fichero '.EXE'. Lo conseguiremos con
la siguiente sintaxis:
RC -k nombre del fichero
El modificador -k se utiliza para que el programa RC no reorganice los
segmentos del ejecutable. Se aaden todos los recursos al final del ejecutable
y en la cabecera se anota los recursos incluidos. El nombre del fichero .RC ha
de ser el mismo que el de nuestro ejecutable pero distinta extensin..
Los ficheros DLL se especificarn al principio del cdigo del programa
mediante la frmula ya conocida SET RESOURCES TO "Midll.DLL" . Antes
de finalizar el mismo tendremos que poner SET RESOURCES TO para liberar
la DLL. Si no lo hacemos, se quedar 'pillada' y no podremos grabar las
modificaciones que hagamos hasta que no se cierre (cerrar Windows o utilizar
algn programa al efecto).

5.5

Cajas de dilogo

Las cajas de dilogo van a ser una herramienta indispensable para nuestro
trabajo. Son como las pantallas tpicas que venamos utilizando en CA-Clipper
para realizar la captura y muestra de nuestros datos. Sirven para
comunicarnos con el usuario. Normalmente estn 'repletas de controles' Says,
Gets, Browses, radiobotones, Checkbox, etc. Os aseguramos que lo vamos a
pasar fenomenal diseando cajas de dilogo con el Resource WorkShop.
Tenemos dos clases de cajas: Modales y No-Modales. Las cajas modales son
similares a las pantallas de CA-Clipper que tendremos que terminarlas para
poder pasar a realizar otra tarea. Las no-modales, por el contrario, pueden
emprender otra misin sin tener terminada la suya. !Van a darnos un juego
tremendo aunque tambin habr que tener ms cuidado con ellas. Ambas

____________________________________________________________________
4

Programacin Windows

Introduccin a FIVEWIN

sern generadas por la clase TDialog heredada de TWindow, lo que quiere


decir que posee la mayora de las cualidades de la clase TWindow.
Para fabricar una caja de dilogo con el Resource WorkShop obraremos de la
siguiente forma

Elegimos las opciones New si queremos crear un fichero de recursos nuevo y


Open project si lo que deseamos es abrir un fichero ya existente. Luego
elegimos el tipo de almacn de recurso deseado y accedemos a la ventana
superior con una ventana titulada untitled.rc donde irn apareciendo los
recursos que vayamos creando. Elegimos la opcin Resource y cuando se
muestre el men elegiremos la opcin New para despus elegir DIALOG.

____________________________________________________________________
5

Programacin Windows

Introduccin a FIVEWIN

Al elegir la opcin DIALOG se nos muestra una ventana con una caja de
dilogo vaca para ir rellenndola con controles. En la esquina superior
derecha de la ventana se muestran tres mens flotantes. Uno que
utilizaremos para alinear los controles otro para dar ttulo a los controles y el
ltimo, el ms importante, para elegir los controles que colocaremos en la caja
de dilogo.
En el men de herramientas podemos
elegir entre los siguientes tipos de
controles:

Push Button
Radio Buttons
Barras de scroll horizontales
verticales.
ListBox
Check Box
ComboBox
Edit Text
Static Text
Controles estilo Borland

5.5.1 PUSHBUTTON
Los pushbutton son esos rectngulos grises que aparecen en todas las cajas
de dialogo que al apretarlos con la flecha del ratn, se hunden y
desencadenan una accin. En FiveWin contamos con una serie de comandos
preprocesados para su manejo y definicin. Contamos con dos tipos de
botones: los botones normales con texto en su interior y los botones con
dibujos

____________________________________________________________________
6

Programacin Windows

Introduccin a FIVEWIN

Los comandos preprocesados que utilizaremos para su redefinicin son los


siguientes:
REDEFINE BUTTON objeto Botn
ID nIdentificador OF, WINDOW, DIALOG objeto Dilogo o ventana
ACTION uAccin
HELP, HELPID, HELP ID nHelpId
MESSAGE cMensaje
UPDATE
WHEN When Funcin
Cuando utilizamos el editor de recursos para aadir controles lo que estamos
haciendo es construyendo un control plenamente operativo al que desde
programa tendremos que darle los ltimos 'toques' tales como asignarles
acciones o definir las validaciones.
Mediante la clusula REDEFINE BUTTON vamos a conseguir en, primer
lugar, asociar el nombre de un objeto a nuestro control PushButton. Acto
seguido tendremos que identificar nuestro control mediante la clusula ID y el
nmero que asigna Resource WorkShop al mencionado control de manera
automtica. Esta asignacin se realiza porque le resulta ms sencillo
controlarlo por medio de un nmero que por medio de un nombre. Este
nmero se llama identificador. Una vez identificado tendremos que asociar el
control a un contenedor ya sea una caja de dilogo o una ventana mediante
las clusulas OF, WINDOW o DIALOG seguido del nombre del objeto
contenedor.
Como mencionamos al principio, tenemos que asignar una accin al botn y
lo haremos mediante la clusula ACTION seguido del nombre de una funcin
o un grupo de funciones encerradas entre parntesis y separadas por comas.
Mediante las clusulas HELP, HELPID o HELP ID especificamos un nmero
que nos servir para identificar el lugar en que nos encontramos de cara al
programa gestor de ayudas WinHelp.Exe.
Podemos especificar una cadena de caracteres para mostrarla en la barra de
mensajes mediante la clusula MESSAGE y la mencionada cadena.
La clusula UPDATE es un indicador de refresco selectivo. Anteriormente
utilizbamos el mtodo Refresh() de las ventanas y cajas de dilogo para
volver a pintar los controles que contenan con sus valores actuales. Esto era
algo lento ya que pintaba todos los controles incluso los que nunca
cambiaban. Al especificar esta clusula se puede llamar al mtodo UPDATE()
que tienen las ventanas y las cajas para que solo refresque los controles que
contengan la mencionada clusula.
Por ltimo disponemos de una clusula WHEN que nos permitir especificar
una funcin para validar cuando el botn puede tomar el foco o no.
Esta es la teora de como redefinir desde el cdigo nuestro botn pero todava
no sabemos como disear visualmente el mismo. Vamos a verlo.
Lo primero que haremos es utilizar una caja de dilogo ya sea existente o
creada. Nos aparece una pantalla semejante a la siguiente:

____________________________________________________________________
7

Programacin Windows

Introduccin a FIVEWIN

Nos aparecen varias ventanas flotantes con los ttulos Caption,


Alignment y Tools. Elegiremos del men Tools uno de los iconos

lo
En este momento nuestro cursor cambia de forma
situaremos sobre la caja de dilogo que estamos diseando y pulsaremos.
Aparecer en la caja de dilogo un botn.
Si en lugar de este dibujo
elegimos el otro icono, lo
que obtendremos ser un
botn con estilo Borland
que veremos despus.
Para
acceder
a
las
caractersticas del botn
haremos 'doble click' sobre
el mismo y de esta forma
podremos
cambiar
aspectos concretos de su
funcionamiento.
La pantalla que obtenemos
es la siguiente:

____________________________________________________________________
8

Programacin Windows

Introduccin a FIVEWIN

El primer apartado es Caption y en el introduciremos el texto que aparecer


en el botn. El segundo Control ID y aparecer de forma automtica el
nmero identificador del control que podremos modificar a nuestro gusto
siempre con cuidad de no duplicar los mismos en la misma caja de dilogo.

En el apartado de atributos
podemos
especificar
si
queremos que el control
tome el foco cuando se
pulse la tecla Tabulador si
marcamos el apartado Tab
stop. Si deseamos que nuestro botn forme parte de un grupo de controles lo
sealamos con Group. S deseamos que nuestro botn se muestre
desactivado lo indicaremos con el apartado Disabled. Posteriormente
podemos habilitarlo desde cdigo con oBoton:Enable() en el caso de que
llamemos as el objeto botn asociado. Por ltimo podemos ocultar el botn s
desactivamos la marca Visible luego se puede activar con oBoton:Show(). El
mtodo opuesto a Show es Hide y el mtodo opuesto a Enable es Disable().
Como dijimos antes tambin podemos utilizar botones con dibujo. El sistema
para que el dibujo aparezca es el siguiente:
1 utilizar los botones definidos por Borland con identificadores que van desde
el nmero 1 correspondiente al OK y la 'V' hasta el 999 . Estos botones
predefinidos estn almacenados en la librera BWCC.DLL y se pueden utilizar
libremente ya que la misma es de libre distribucin.

____________________________________________________________________
9

Programacin Windows

Introduccin a FIVEWIN

2 Dibujar los botones nosotros mismos en cuyo caso tendremos que dibujar
ntegramente los tres estados posibles del botn: reposo, con el foco y
pulsado. Luego almacenaremos los tres dibujos con los nombres 1000 +
nmero de identificador, 3000 + nmero identificador y 5000 + nmero
identificador y anotaremos como identificador en las propiedades del botn el
nmero identificador que hemos mencionado.
1300
3300
5300

300 (nmero identificador)

5.5.2 Radio botones


Los radio botones son un sistema de men montado
en torno a unos pequeos circulitos que se van
marcando sucesivamente y de los cuales solo puede
haber uno sealado simultneamente.
La forma de obtenerlo en el editor es a travs de uno de
los iconos que los representan en el men de
herramientas.
Como siempre nuestro cursor cambia de forma
indicndonos el tipo de control que vamos a depositar en
la caja de dilogo que estamos diseando. Lo llevamos a la caja de dilogo y
all hacemos 'Click' para depositarlo.

Una vez realizada la accin solo nos quedara entrar en la caja de dilogo
para variar el texto y las caractersticas que desesemos. Lo haramos
haciendo doble click sobre el rectngulo que aparece en la caja de dilogo.
Nos aparece una caja de dilogo idntica a la que vimos cuando hablamos de
los PushButton. Utilizaremos de igual forma los apartados dedicados a
Captin, ID y Attributes. Podremos ajustar el circulito a la izquierda o a la
derecha mediante la marca Left o Right del apartado Justification

____________________________________________________________________
10

Programacin Windows

Introduccin a FIVEWIN

Las dems opciones que podemos elegir son las que


aparecen en el men derecho de la caja de dialogo
que se nombran con
Radio button y Auto Radio Button. La primera se
utiliza para que solo sea el programa el que pueda modificar el radio botn. La
segunda para poderla modificar nosotros mismos.
Los comandos que utilizaremos para terminar de construir nuestros
radiobuttons son los siguientes:
REDEFINE RADIO oRadMenu VAR nVariable
ID nIdentificadores ...,
OF, WINDOW, DIALOG objeto contenedor
HELPID, HELP ID nHelpId
ON CLICK, ON CHANGE uCambio
COLOR nColorTexto [, nColorFondo ]
MESSAGE cMensaje
UPDATE
WHEN WhenFuncin
Utilizamos el comando REDEFINE RADIO para asociar al botn con un
nombre de objeto. Con VAR indicamos la opcin inicial que se mostrar
elegida. Despus tenemos que especificar los identificadores que formarn el
men de radiobotones. Como siempre hay que nombrar al objeto contenedor
del men con las clusulas OF, WINDOW o DIALOG y el nombre del objeto.
Con COLOR indicamos el color de texto y fondo. Con MESSAGE indicamos
una cadena de texto para mostrar por la barra de mensajes. La clusula de
refresco selectivo UPDATE y dos funciones: una para realizar cuando se
pulse con el botn en las opciones o se cambie de opcin con las teclas y la
otra para prevalidar la toma de foco del control. (WHEN)

____________________________________________________________________
11

Programacin Windows

Introduccin a FIVEWIN

5.5.3 Barras de Scroll


Las barras de scroll son un tipo de control que nos van a permitir representar
cantidades superiores a las que podemos manejar por medios naturales. Se
trata de un rectngulo que en los extremos tiene unos botones con un dibujo
en forma de flecha y un botn que se desliza a lo largo del citado rectngulo.
La forma de definirlas es por medio de la siguiente sintaxis:
REDEFINE SCROLLBAR objeto Scrollbar
ID nIdentificador
RANGE nMnimo , nMximo
PAGESTEP nPagSalto
UP, ON UP uUpAccin
DOWN, ON DOWN uDownAccin
PAGEUP, ON PAGEUP uPgUpAccin
PAGEDOWN, ON PAGEDOWN uPgDownAccin
ON THUMBPOS uPosicin
COLOR,COLORS nColorTexto nColorFondo
OF, WINDOW, DIALOG objeto contenedor
MESSAGE cMensaje
UPDATE

Las barras de scroll pueden ser horizontales o verticales. Tendremos que


especificar el nmero con que le identificamos dentro de la caja de dilogo o
ventana con la clusula ID y el nmero. Como hemos dicho que bamos a
representar cantidades tendremos que especificar entre que rango nos vamos
a mover. Lo hacemos con la clusula RANGE. Luego diremos como
queremos que vare el valor actual con cada pulsacin de los botones de los
extremos. Mediante PAGESTEP especificamos la cantidad que se saltar.
Despus tenemos que especificar una serie de acciones a realizar cada vez
que se pulsen los botones de los extremos, las teclas de cursores o las teclas
de pgina arriba y pgina abajo. Tambin tendremos que especificar una
accin para el caso de que 'pinchemos entre el botn deslizante y los botones
extremos. Esto se hace mediante la clusula ON THUMBPOS . Luego y de
forma mucho ms habitual, definiremos los colores, el dueo de las barras de
scroll, el mensaje que se puede visualizar por la barra de mensajes y la
famosa clusula UPDATE de refresco selectivo.
Tenemos que elegir uno de los iconos de la barra de herramientas,
y como siempre tendremos
nuestro cursor cambia de forma
que llevarlo sobre la caja de dilogo. Hacemos doble click y aparece nuestra
barra de scroll.

5.5.4 Listbox

____________________________________________________________________
1

Programacin Windows

Introduccin a FIVEWIN

Los listbox son unos rectngulos con una barra de scroll vertical que
utilizamos para mostrar los elementos de los arrays. En FiveWin podemos
mostrar tanto arrays de caracteres como arrays de dibujos. La definicin
desde cdigo la haremos de la siguiente forma:
REDEFINE LISTBOX objeto Listbox VAR cnVariable
ITEMS, PROMPTS array de datos
FILES cMascara de ficheros
ID nIdentificador
ON CHANGE uCambio
ON [ LEFT ] DBLCLICK uDobleClickBotnIzquierdo
OF, WINDOW, DIALOG objeto contenedor
HELPID, HELP ID nHelpId
BITMAPS
SIZE nSize
VALID ValidFuncin
COLOR,COLORS nColorTexto, [ nColorFondo]
MESSAGE cMensaje
UPDATE
WHEN WhenFuncin

Mediante la clusula REDEFINE indicaremos el nombre del objeto listbox y


mediante la clusula VAR indicaremos o bien el nmero del elemento que
deseamos que se seleccione al iniciarse la vida del listbox o una variable de
caracteres que coincida con uno de los elementos del array.
Mediante la clusula ITEM especificaremos el nombre del array que vamos a
mostrar. En el caso de que vayamos a mostrar bitmaps tendremos que pasar
un array con los nombres de los ficheros .BMP y combinarlo con la clusula
BITMAPS.
Si deseamos mostrar un array con ficheros especificaremos una mscara de
archivos mediante la clusula FILES.
Como siempre le tenemos que aadir el nmero que identifica el control y
tambin, como siempre, lo hacemos por medio de la clusula ID.
Especificamos el propietario del control por las clusulas OF, DIALOG o
WINDOW para que el mismo pueda mostrar el listbox en el momento
oportuno y se encargue de desactivarlo cuando lo haga l mismo.
Todos los controles estn heredados de TWindow, esto quiere decir que se
pueden utilizar la mayora de los datos y mtodos de esta clase. El autor de
FiveWin ha preprocesado varios codeblocks de tal manera que podemos
controlar cuando se cambia de elemento dentro del listbox y efectuar una
accin determinada. Lo hacemos mediante la clusula ON CHANGE.
Tambin podemos controlar cuando se hace doble click con el botn
izquierdo. Se hace mediante el comando preprocesado 0N LEFT DBLCLICK
y la accin o acciones a realizar.
La clusula HELPID nos sirve para comunicar un nmero al programa de
ayudas WinHelp.exe y este pueda saber desde donde se le llama.
SIZE es una clusula que le comunicar a la clase TListbox, la altura de los
bitmaps que vamos a mostrar en el listbox.
Con las clusulas VALID y WHEN disponemos de la posibilidad de prevalidar
y postvalidar cuando toma y pierde el foco el control listbox en la caja de

____________________________________________________________________
2

Programacin Windows

Introduccin a FIVEWIN

dilogo. Especificaremos unas funciones que devuelvan un valor lgico:


verdadero -> correcto, falso -> no se toma o no se pierde el foco.
Las dems clusulas son conocidas: COLOR, MESSAGE y UPDATE que
asignan un color para el texto y el fondo del listbox, una cadena de texto para
mostrar en la barra de mensajes y una clusula de refresco selectivo.
Cmo incluimos un listbox en nuestra caja de dilogo?
y nuestro cursor cambia de forma
. Lo
Seleccionamos el icono
llevamos hasta la caja de dilogo y all pulsamos el botn izquierdo,
aparecindonos un listbox para que podamos ajustar sus caractersticas.
Una vez que hayamos ubicado el listbox en su sitio correcto, podemos hacer
'doble click' para acceder a la caja de dilogo que nos permita realizar el
citado ajuste.
Que ajustes se pueden hacer? Vamos a verlo.
En primer lugar nos aparece el Identificador que podemos cambiar a nuestro
gusto pero teniendo cuidado para no duplicarlo.
La seccin Atributtes es comn a la prctica mayora de controles en el
Resource Workshop. Tenemos la opcin Tab Stop para poder acceder al
control, dentro de una caja de dilogo, mediante la tecla Tabulador. La opcin
Disabled la utilizamos para deshabilitar el listbox. Desde cdigo podemos
habilitar o deshabilitar el listbox utilizando el mtodo Disable o Enable
(oListbox:Disable(), oListbox:Enable()). Group sirve para hacer al control
participe de un grupo como cabecera del mismo. Border activa o desactiva la
aparicin de borde y por ltimo Visible activa o desactiva la visualizacin del
control.
En el apartado Scroll Bar podemos dotar a nuestro control de barras de scroll
tanto vertical como horizontal.
El apartado Owner Drawing nos sirve para especificar opciones de dibujo.
Not owner draw es la opcin por defecto y le indica al programa que el
listbox se encarga de dibujar la lista. Fixed lo utilizaremos cuando vayamos a
dibujar bitmaps en nuestro Listbox. Variable permite que el tamao vertical de
los elementos sea variable. No la utilizaremos.
Opciones del listbox
Notify
Sort
Multiple Select
Integral Height
Multi Column
Pass KeyBoard Input
Extend Select
Scrollbar always

Sirve para que el listbox enve un mensaje a la


ventana cuando se elijan opciones.
La lista se mostrar ordenada alfabticamente.
Podremos
elegir
ms
de
una
opcin
simultneamente.
La ltima opcin no se pintar cortada si no cabe.
La informacin se muestra en columnas.
No hacer caso al teclado.
Podemos hacer seleccin mltiple 'pinchando y
arrastrando'.
Mostrar la barra de scroll an cuando no se
necesite.

____________________________________________________________________
3

Programacin Windows

5.5.5

Introduccin a FIVEWIN

Combobox

Los Combobox son un grupo de dos controles, una caja de edicin y un


listbox.
Las tenemos de tres posibles estilos:

Los vamos a situar en la caja de dilogo en curso de la misma forma que


siempre: Elegimos el icono y
nuestro cursor toma la forma
para hacer 'click' sobre la caja.
Como siempre podemos modificar las caractersticas del combobox haciendo
doble click sobre l mismo. Nos aparece la caja de estilo donde podremos
modificar las siguientes opciones:
Control ID
Type
Simple
Drop Down
Drop Down List
Owner drawing
Fixed
Variable
Has String
Atributtes
Tab Stop
Group
Disabled
Visible
Vertical Scroll
Sorted
Integral height
OEM conversion
Auto horizontal
edicin.
Vertical scroll always

Identificador

Combo Box simple. Puede editar datos


Combo Box con botn separado.Puede editar
datos.
Combo box SIN edicin de datos.

Igual que en el ListBox


''
''

Habilita tecla tabulador.


Cabecera de grupo.
Desactiva/Activa el combo box.
Muestra/Oculta el combo box.
Muestra barra de scroll vertical.
Muestra los elementos ordenados.
Justifica el ltimo elemento visible del listbox.
Convierte lo tecleado en cdigo OEM.
Permite el scroll al teclear en la caja de
Scroll bar siempre

Una vez construido el combobox sobre la caja de dilogo tendremos que


redefinirlo desde el cdigo de nuestro programa.
REDEFINE COMBOBOX objeto Combobox VAR cVariable
ITEMS, PROMPTS array de datos

____________________________________________________________________
4

Programacin Windows

Introduccin a FIVEWIN

ID nIdentificador
OF,WINDOW,DIALOG objeto Wnd
HELPID, HELP ID nHelpId
ON CHANGE Funcin
VALID ValidFuncin
COLOR,COLORS nColorTexto [, nColorFondo ]
UPDATE
MESSAGE cMensaje
WHEN WhenFuncin

Redefinimos lo que ya estaba definido en el Resource WorkShop y le


asociamos el nombre de un objeto para poder manejarlo desde el programa.
Si especificamos el nombre del objeto tendremos que especificar la clusula
VAR y la variable que aparecer en la caja de edicin. Despus tendremos
que indicar cual va a ser el array que vamos a mostrar en el Listbox asociado.
Lo haremos con las clusulas ITEMS o PROMPTS. Como siempre indicamos
el nmero Identificador con la clusula ID y con OF, DIALOG o WINDOW
aadimos este control a una caja de dilogo o a una ventana. Podemos
indicar un nmero para pasarle al programa WinHelp.EXE.
Con la clusula ON CHANGE especificaremos una accin para realizar
cuando cambiemos de opcin con las teclas de cursor o el ratn. Disponemos
de una clusula para prevalidar y postvalidar VALID y WHEN. Por ltimo
disponemos de las clusulas de siempre: COLOR, MESSAGE y UPDATE
para especificar los colores de texto y fondo, una cadena de texto para
mostrar por la barra de mensajes y una clusula para el refresco selectivo.

5.5.6

Check Box

El siguiente control es una 'caja de marca' en castellano se trata de un


cuadradito que podemos sealar para indicar que aceptamos la caracterstica
a la que hace referencia. Siempre va a ir asociado a una variable lgica de tal
forma que si marcamos la casilla la variable adquirir valor verdadero y si la
dejamos sin marca la variable tendr valor falso.
La sintaxis de utilizacin es la siguiente:
REDEFINE CHECKBOX objeto Check box VAR Variable lgica
ID nIdentificador
OF, WINDOW, DIALOG oWnd
HELPID, HELP ID nHelpId
ON CLICK, ON CHANGE uClick
VALID ValidFuncin
COLOR, COLORS nColorTexto [, nColorFondo]
MESSAGE cMensage
UPDATE
WHEN WhenFuncin

____________________________________________________________________
5

Programacin Windows

Introduccin a FIVEWIN

Como siempre utilizamos una clusula REDEFINE y en este caso


CHECKBOX para asociar el nombre de un objeto checkbox al control y
tambin como siempre utilizaremos la clusula VAR para especificar la
variable asociada. Si no necesitsemos referirnos ms veces al control ni a
ninguno de sus mtodos o variables, no sera necesario especificar el nombre
del objeto en cuyo caso solo pondramos el nombre de la variable lgica
asociada.
Como en el Resource WorkShop no nos referimos a los controles por su
nombre sino que los identificamos por un nmero tendremos que asociar
tambin desde el cdigo de nuestro programa a este control por medio de su
nmero IDentificador. Mediante la clusula OF, WINDOW o DIALOG
asociamos el control a un contenedor que se ocupar de mostrarlo cuando l
mismo lo haga y de destruirlo cuando lo haga l mismo tambin.
Podemos especificar un nmero que nos sirva para identificar el sitio desde
donde se llam al programa de ayudas de Windows WinHelp.Exe. Lo
hacemos mediante la clusula HELPID o HELP ID y el nmero en cuestin.
En este control disponemos de dos posibilidades de controlar el dilogo
interno de Windows y FiveWin. Se trata de desviar el programa a una funcin
cuando cambiemos la marca del checkbox, ON CHANGE o ON CLICK y la
funcin en cuestin. La otra posibilidad de control es la clusula VALID con la
que podremos validar la perdida de foco del control checkbox.
Por ltimo y como siempre tambin, tenemos tres clusulas tpicas: COLOR,
MESSAGE y UPDATE para especificar colores del checkbox, una cadena de
texto para mostrar en la barra de mensajes y una clusula de refresco
selectivo.

Situaremos nuestro Checkbox en una caja de dilogo o en una ventana


pudiendo ser estas ya existentes o creadas para la ocasin. Elegimos el
icono

dependiendo de la eleccin
cambindose nuestro cursor a
realizada. El segundo tipo de checkbox es un checkbox definido por la casa
Borland no cambiando su funcionamiento sino simplemente su aspecto
externo.
Una vez elegido el icono correspondiente y con nuestro nuevo cursor nos
situamos sobre la caja de dilogo y hacemos un click en la posicin deseada.
El checkbox aparece sobre la caja aprovechando para rectificar la posicin en
ella. Podemos aprovechar para ajustar sus ltimos valores haciendo doble
click sobre el Checkbox. Nos aparecer la caja de dilogo de estilo.
De las opciones que podemos modificar solo dos son especificas del
checkbox ya que las dems son compartidas por los otros controles vistos
hasta el momento: Auto checkbox y auto 3 states. La primera es para que el
Checkbox se pueda elegir y la segunda es para poder representarse como no
elegido, como elegido o como no elegible siendo este ltimo un cuadrado
negro.

5.5.7

Static Text

____________________________________________________________________
6

Programacin Windows

Introduccin a FIVEWIN

Este control es lo que para CA-Clipper el @ fila, columna SAY. Lo vamos a


utilizar para pintar en la caja de dilogo un texto, pudiendo incluso
aparecernos en ms de una linea. La redefinicin desde el cdigo de nuestro
programa ser la siguiente:
REDEFINE SAY objeto Say
PROMPT, VAR cadena de Texto
PICTURE cPicture
ID nIddentificador
OF,WINDOW,DIALOG objeto Ventana
FONT objeto Font
COLOR,COLORS nColorTexto [ nColorFondo ]
UPDATE

La redefinicin en este control va a ser sencilla. Empezamos asociando


nuestro control a un objeto por medio de la clusula REDEFINE SAY y el
nombre del objeto. Despus mediante PROMPT o VAR la cadena de texto
que vamos a mostrar. Si no necesitsemos referirnos a los mtodos o
variables del objeto se puede omitir el poner el nombre del objeto. Tenemos
que tener presente que vamos a mostrar cadenas de texto por lo tanto, si
queremos mostrar algn tipo de variable que no sea cadena habr que
pasarla a texto con una funcin apropiada.
Podemos especificar una PICTURE del mismo
modo que hacemos en
CA-Clipper.
Como siempre especificamos el IDentificador
que tiene el control en el Resource WorkShop y
tambin el dueo del control say con una de las
clusulas OF, DIALOG o WINDOW y el nombre
del dueo.
Podemos cambiar el tipo de letra especificando
un objeto del tipo FONT creado con anterioridad.
Si queremos dotar a nuestras cajas de dilogo de la posibilidad de utilizar el
botn derecho de nuestro ratn para cambiar las cualidades de los controles
como hacen algunos programas comerciales, en lo concerniente al tipo de
letra tendremos que tener la precaucin de definir un tipo de font para cada
SAY ya que si definimos uno para todos, al cambiar un say de tipo de letra
cambiarn los dems.
Las ltimas clusulas son para cambiar el COLOR y UPDATE para el
refresco selectivo.
La forma de situar este control en nuestra caja de dilogo es la siguiente:
Elegimos uno de los iconos

dependiendo de si deseamos un fondo

y
gris para nuestro control o no. Nuestro cursor cambia de forma
como siempre lo llevamos sobre nuestra caja de dilogo y hacemos 'click'
sobre ella.
Ajustamos su posicin y hacemos 'doble click' sobre el control para acceder a
la caja de estilo del control.

____________________________________________________________________
7

Programacin Windows

Introduccin a FIVEWIN

En esta caja de estilo lo primero que podemos hacer es anotar un texto para
mostrar directamente en la caja en el apartado Caption. Tenemos que hacer
la salvedad de que si lo que vamos a mostrar en nuestra caja de dilogo es
un texto que no va a variar a lo largo del programa, no har falta redefinirlo
desde nuestro programa y en el apartado ID se anotar el nmero -1.
El apartado Attributes tiene cinco checkbox que podremos marcar o
desmarcar:
Tab Stop
Group
Visible
Disabled
Border

Para poder acceder a l con el tabulador.


Para ser cabecera de grupo.
Para que sea visible o invisible.
Para poderse elegir o no.
Para que aparezca remarcado por una caja.

El checkbox Character underline se refiere a que podamos incluir en el texto


caracteres '&' ampersand sin que nos produzca el subrayado caracterstico
del carcter siguiente.
Los controles del tipo Static style, disponen de un apartado para poder ajustar
las cadenas de texto a la izquierda, derecha, centro o repartida por una
superficie (si no queremos que esto suceda activamos la opcin No Wrap)

5.5.8

Edit Text

Si el anterior control era el @ SAY este ser el @ GET. Incorpora una nueva
posibilidad como es la de edicin de lo que en CA-Clipper era campo Memo.
La redefinicin desde el cdigo de nuestro programa se har en los siguientes
trminos:

REDEFINE GET objeto Get VAR uVariable


ID nIdentificador
OF, WINDOW, DIALOG oDialogo
HELPID, HELP ID nHelpId
COLOR,COLORS nColorTexto [, nColorFondo]
FONT objeto Font
CURSOR objeto Cursor
MESSAGE cMensaje
UPDATE
WHEN WhenFuncin
Especficas para Gets de una sola linea
VALID ValidFuncin
PICTURE cPicture
ON CHANGE uCambio
Especficas para Gets Multilinea

____________________________________________________________________
8

Programacin Windows

Introduccin a FIVEWIN

MULTILINE, MEMO, TEXT


READONLY, NO MODIFY

Siempre vamos a asociar el control con un objeto mediante la clusula


REDEFINE en este caso seguido con GET y el nombre del objeto. Si no
vamos a necesitar posteriormente referirnos al nombre del objeto podemos
poner simplemente el nombre de la variable que vamos a editar. Conviene
tener presente que seguimos tratando con un objeto Get de CA-Clipper al que
aadimos nuevas caractersticas.
Como siempre especificamos el dueo del control con las clusulas OF,
DIALOG o WINDOW y el nombre del objeto contenedor. Podemos aadir un
nmero para pasar al programa gestor de ayudas que le indique en desde
que lugar se le esta invocando. Seguimos con la tpica clusula de
establecimiento de COLOR de texto y de fondo. Podemos establecer un tipo
de letra mediante la clusula FONT seguido de un objeto Font conseguido
con anterioridad. Tambin podemos elegir un cursor de ratn para que
aparezca cuando el ratn 'sobrevuele' el control. Una cadena de texto para
mostrar en la barra de MENSAJES. La clusula de refresco selectivo y una
clusula WHEN para prevalidar la edicin del Get a la que indicaremos el
nombre de una funcin que tendr que devolver de manera obligatoria un
valor lgico para permitir que nuestro control tome el foco o no.
Estas clusulas son comunes a los gets de una y muchas lineas. Ahora
veremos las clusulas diferentes.
Para una linea existe una clusula VALID y el nombre de una funcin, para
poder validar el valor recogido en la edicin. Una clusula PICTURE para
poder editar los datos de acuerdo a un formato determinado y por ltimo un a
clusula ON CHANGE seguida del nombre de una funcin para que se realice
cuando el valor editado haya cambiado.
Para el get multilnea disponemos de una clusula MULTILINE, MEMO o
TEXT que indicar al preprocesador que en lugar de utilizar la clase TGet
tiene que utilizar la clase TMGet. Para finalizar tenemos la posibilidad de
mostrar el campo Memo sin dejar cambiar su contenido. Lo conseguimos con
la clusula READONLY o NO MODIFY.
Veamos como conseguimos situar un control Edit Text en nuestras cajas de
dilogo.

Elegimos el icono

en la barra de herramientas y nuestro cursor cambia

. Lo situamos sobre la caja de dilogo y hacemos 'click'. Nos aparece un


a
pequeo rectngulo. Si hacemos doble click sobre el mismo accederemos a
la caja de estilo.
Lo primero que tenemos que hacer es indicar si queremos que nuestro control
funcione como un SAY o como un GET. Lo conseguimos cambiando los
apartados Read Only y Want return. Si activamos Read Only se convertir

____________________________________________________________________
9

Programacin Windows

Introduccin a FIVEWIN

en un control sin posibilidad de modificar datos. Si por el contrario activamos


Want Return nuestra control devolver el dato que se introduzca en l.
En el apartado Caption podemos introducir un valor para que aparezca en el
control inicialmente. Adems este valor se mostrar seleccionado o lo que es
igual un rectngulo azul con letras en blanco.
Seguimos con el IDentificador del control que de forma automtica asigna
Resource WorkShop. Nosotros podemos modificarlo a nuestro gusto siempre
con cuidado de no duplicar ningn identificador ya que luego nuestro
programa no sabra diferenciar un control de otro.
El apartado siguiente es el dedicado a los Atributos. En el podemos indicar
que nuestro control ser accesible mediante la pulsacin del tabulador (Tab
stop), que nuestro control sea cabecera de grupo (Group), que sea un
control visible o invisible (Visible), que este habilitado o deshabilitado
(Disabled) y que tenga o no tenga borde (Border).
Podemos forzar desde la caja de estilo a que la entrada se haga en
maysculas o minsculas activando los radiobotones Upper case o Lower
case.
Indicaremos que nuestro control ser de una sola linea o Multilnea eligiendo
el radio botn Single line o Multiple line.
Tambin podemos justificar nuestro texto a la izquierda, derecha o centro
eligiendo el radio botn Left, Right o Center .
Se puede habilitar el Scroll vertical u Horizontal con los radio botones al
efecto, para los gets multilinea, as como que aparezca barra de scroll vertical
u horizontal.
Disponemos de un sistema de edicin de Password eligiendo el checkbox al
efecto, de tal manera que nos aparezcan simplemente asteriscos cuando
tecleemos las letras.
Convert OEM traduce lo que tecleemos a cdigo OEM (Windows) y por
ltimo el apartado Keep selection nos permite efectuar seleccin de texto
para pasarla al portapapeles.

5.5.9

TWBrowses

Aprovechamos este tipo de control par ilustrar la forma de incluir controles


que no son de Borland en una caja de dilogo. La mecnica seguida ser la
reserva de un espacio en la mencionada caja indicando las caractersticas

____________________________________________________________________
10

Programacin Windows

Introduccin a FIVEWIN

que conozcamos del control que vamos a redefinir desde el cdigo de nuestro
. Nos aparece una caja de
programa. Para ello elegiremos el icono
dilogo con un combobox para elegir de entre los controles que disponemos.
En lugar de elegir uno lo que hacemos es teclear el nombre de la clase que
forma nuestro control, en este caso la clase que fabrica el control es la
TWBrowse. As cuando redefinamos el control desde el cdigo de nuestro
programa, el programa 'tapar' el hueco que haba en esa caja de dilogo con
la definicin que le proporcionar la clase.
Una vez que hayamos escrito el nombre de nuestra clase en el combobox, el
cursor se transforma en una cruz que situaremos en la caja de dilogo que
estamos diseando. Hacemos 'click' y ajustamos la situacin definitiva de
nuestro control en tamao y lugar. Despus hacemos un 'doble click' sobre el
control accediendo a la caja de estilo.

Los dos primeros apartados ya son conocidos. El importante es el apartado


Style en el que anotaremos el estilo que tenga tenga nuestro control. Este
estilo es un dato de la clase, concretamente nStyle. Accediendo al cdigo
fuente de nuestra clase podemos verlo:

......................................
.......................................
::lCaptured = .f.
::lMChange = .t.
::nRowPos = 1
::nColPos = 1

____________________________________________________________________
11

Programacin Windows

::nStyle

Introduccin a FIVEWIN

= nOr( WS_CHILD, WS_VSCROLL, WS_HSCROLL,;


WS_BORDER, WS_VISIBLE, WS_TABSTOP,;
If( lDesign, WS_THICKFRAME, 0 ) )

::nId
= ::GetNewId()
::cAlias = cAlias
::bLine
= bLine
...................................
...................................

parte del cdigo fuente de la clase TWBrowse

El paso siguiente es incluir este estilo en el apartado que la caja de dilogo


tiene reservado. Lo haremos separando las palabras por una barra vertical (la
conseguimos pulsando simultaneamente la tecla ALT GR y el ' 1' ). El
apartado Style tendr el aspecto siguiente despus de terminar:
0 | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | WS_BORDER | WS_TABSTOP

Despus y desde el cdigo de nuestro programa tendramos que redefinir los


datos que no hubisemos definido en el Resource WorkShop. Lo haremos en
los siguientes trminos:
REDEFINE LISTBOX objeto Browse FIELDS Lista de campos
ALIAS cAlias
ID nIdentificador
OF,DIALOG objeto contenedor
FIELDSIZES, SIZES, COLSIZES Lista de tamaos de columnas
HEAD,HEADER,HEADERS Lista de cabeceras de columnas
SELECT cCampos FOR uValor [ TO <uValor> ]
ON CHANGE, ON CLICK uCambio
ON [ LEFT ] DBLCLICK uLDobleClick
ON RIGHT CLICK uBotnDerechoClick
FONT objeto Font
CURSOR objeto Cursor
COLOR, COLORS nColorTexto [, nColorFondo]
MESSAGE cMensaje
UPDATE
WHEN WhenFuncion

Empezaremos como siempre asociando un nombre de objeto a nuestro


control. Si nos fijamos en la sintaxis utilizada veremos que las primeras
clusulas son REDEFINE LISTBOX , no quiere decir que estemos definiendo
un Listbox. El primer editor de Bases de datos que tuvo FiveWin en la versin
1.0 s lo fue y de ah proviene el nombre. Si miramos los fuentes de la clase
TWBrowse no se ve que provenga de la clase Listbox por ninguna parte.
Una vez asociado el control con el nombre del objeto, lo primero que
tendremos que especificar ayudndonos de la clusula FIELDS es una lista
de campos de la base de datos en curso. No pondremos nada s lo que
queremos es mostrar un array multidimensional. La siguiente clusula es
ALIAS y la utilizaremos para indicar a FiveWin el nombre del alias que

____________________________________________________________________
12

Programacin Windows

Introduccin a FIVEWIN

deseamos mostrar (no es obligatorio). Ahora le toca el turno a las clusulas


FIELSIZES, SIZES o COLSIZES seguido del tamao de los campos en
pixels, despus las clusulas HEAD, HEADER o HEADERS seguidas de
cadenas de caracteres separadas por comas que indiquen cada una la
cabecera que se quiere para cada columna. Despus de estas clusulas
tenemos la posibilidad de establecer filtros basados en ndices. Lo hacemos
mediante la clusula SELECT el nombre del campo clave en el ndice, FOR
el primer valor TO el valor final.
Acto seguido nos encontramos con tres clusulas ON que como ya es sabido
sirven para interceptar el dialogo entre Windows y FiveWin. Con la primera
(ON CHANGE) haremos que se ejecute una funcin cada vez que
cambiemos de elemento en nuestro TWBrowse. Con la segunda (ON LEFT
DBLCLICK) se ejecutar una funcin cada vez que hagamos doble click en el
TWBrowse. Por ltimo con ON RIGHT CLICK podemos desviar hacia una
funcin especificada cuando pulsemos el botn derecho de nuestro ratn.
Finalizadas las clusulas ON nos encontramos con otras clusulas que son
viejas conocidas de otros controles:
FONT
CURSOR
COLOR
MESSAGE
UPDATE
WHEN

Especificamos un objeto Font para un tipo de letra concreto.


Especificamos un objeto Cursor que se mostrar en el control.
Color de texto y color de fondo.
Cadena de texto para mostrar en la barra de mensajes.
Clusula de refresco selectivo.
Clusula para una funcin de prevalidacin.

5.5.10

Bitmaps

Con el Resource WorkShop podemos incluir dibujos en nuestras cajas de


dilogo desde dos perspectivas diferentes: Estticos o dinmicos. Los
estticos no variarn en el transcurso de nuestro programa por lo que no
tendremos que redefinirlos desde el cdigo. Los dinmicos si van a variar, por
lo tanto, tendremos que asociarles un objeto Bitmap para poder cargar en el
espacio asignado los dibujos que deseemos.
Para los bitmaps estticos, cuando utilicemos un almacn de recursos tipo
DLL, tendremos que incluir el bitmap dentro del mismo y renombrarlo con un
nmero que empiece por 1000 ( 1110 por ejemplo). Una vez hecho esto
desde la caja de dilogo que estemos diseando elegiremos el icono del
men de herramientas que representa una llave (nuevos controles) y al
aparecer la caja de dilogo de nuevos controles, elegiremos el llamado
Bitmap. Situamos el control en nuestra caja de dilogo y lo editamos para
cambiarle el identificador. Si al renombrar el bitmap le pusimos el 1110 de
nombre, ahora nuestro bitmap en la caja de dilogo tendr que tener el
identificador 110. Hecho esto nos aparecer el dibujo en la caja de dilogo.
Utilizaremos esta tcnica para incluir logotipos o dibujos que no varen.
Cuando nos interesa el sitio donde mostrar el dibujo, la tcnica ser parecida
pero el dibujo se lo comunicaremos en el cdigo de nuestro programa.
Obraremos de la misma forma en cuanto a la seleccin del icono con la llave

____________________________________________________________________
13

Programacin Windows

Introduccin a FIVEWIN

y al elegir un nuevo control, anotaremos el nombre de la clase TBitmap.


Despus situamos el control en la caja de dilogo y ajustamos el tamao. No
tendremos que cambiar el nmero del identificador. Redefiniremos el control
desde el cdigo de la siguiente forma:
REDEFINE BITMAP objeto Bitmap
ID nIdentificador
OF, WINDOW, DIALOG objeto contenedor
NAME, RESNAME, RESOURCE cNombre en Recurso
FILE, FILENAME, DISK cFichero Bitmap
ON CLICK, ON LEFT CLICK uIzquierda Click
ON RIGHT CLICK uDerecha Click
SCROLL
ADJUST
CURSOR objeto Cursor
MESSAGE cMensaje
UPDATE
WHEN WhenFuncin
Asociamos el objeto bitmap a nuestro control con la clusula REDEFINE
BITMAP y el nombre del objeto, IDentificador en la caja de dilogo del control
o el espacio destinado a mostrar el bitmap en la caja de dilogo. Despus
indicaremos el nombre del contenedor del control Bitmap que ser una caja
de dilogo o una ventana. Con NAME, RESNAME o RESOURCE haremos
referencia al nombre de un Bitmap almacenado en un almacn de recursos
(ej: En m DLL almaceno un bitmap con el nombre "Dibujo"). Si en lugar de
almacenar el Bitmap en un recurso lo almaceno en un fichero de disco con
extensin .BMP utilizaremos las clusulas FILE, FILENAME o DISK y el
nombre del fichero.
Disponemos de dos clusulas ON para el control de eventos: ON CLICK y
ON RIGHT CLICK. Con la primera especificamos el nombre de una funcin
que se ejecutar en el momento que 'pinchemos' con el botn izquierdo del
ratn sobre el bitmap. La segunda clusula es igual pero con el botn
derecho.
Las dos clusulas siguientes son nuevas en el repertorio habitual. Se trata de
las clusulas SCROLL y ADJUST. La clusula SCROLL ha de ir acompaada
de un ajuste previo en la caja de dilogo: Cuando accedemos al icono 'llave' y
elegimos la clase TBitmap tenemos que especificar en el apartado Style la
variable WS_SCROLL o WS_HSCROLL. Despus al especificar en la
redefinicin la clusula SCROLL cuando ejecutemos el programa nos
aparecern dos barras de scroll con las que podremos introducir un bitmap
progresivamente en el espacio que hayamos destinado para ello. Con las
variables nVScroll y nHScroll de la clase TBitmap controlaremos los
incrementos que se producirn al manejar las barras de scroll.
La clusula ADJUST introduce un bitmap en el espacio que le asignemos sea
este cual sea. Es interesante cuando no queremos sorpresas pero cuando
variamos el tamao de un bitmap los efectos no son todo lo buenos que
esperamos. Tenemos que recordar que trabajamos con mapas de bits, no con
dibujos vectoriales.
Por ltimo cuatro clusulas conocidas CURSOR, MESSAGE, UPDATE y
WHEN. La primera para indicar un objeto cursor definido con anterioridad
para que el cursor del ratn cambie al seleccionado al pasar sobre el bitmap.

____________________________________________________________________
14

Programacin Windows

Introduccin a FIVEWIN

La segunda para mostrar una cadena de texto en la barra de mensajes. La


tercera es la clusula de refresco selectivo y la cuarta para validar la toma de
foco del control mediante una funcin que nos devuelva un valor lgico.

5.5.11

Bitmaps, iconos y cursores

Mediante el editor de recursos Resource WorkShop podemos hacer una gran


variedad de cosas. Nosotros nos vamos a limitar en la mayora de los casos a
hacer las cosas que nos liberen de mayor trabajo o dicho de otra forma, que
nos cueste menos trabajo hacer. Normalmente sern las cajas de dilogo y
los cursores. Los Bitmaps los encontramos en multitud de sitios y estoy
seguro de que salvo honrosas excepciones a nadie se le va a ocurrir dibujar a
mano imgenes en el Resource WorkShop. Normalmente usaremos el
Portapapeles para introducir dibujos ya confeccionados dentro de nuestras
DLL y en la mayora de los casos los almacenaremos en un directorio en su
formato original: Ficheros .BMP.
En lo referente a los iconos tenemos multitud de libreras de iconos para
elegir el que ms nos guste. Normalmente estn muy bien hechos y como en
el caso anterior no nos vamos a poner a dibujar a mano los iconos. Puede ser
que los dejemos en el disco en formato de fichero .ICO o los pasemos a
travs del portapapeles dentro de nuestro fichero de recursos.
Los cursores no suponen un esfuerzo muy grande para hacerlos y es por eso
que lo utilizaremos ms frecuentemente.
Vamos a ver como hacer para pasar Bitmaps e iconos a nuestros almacenes
de recursos. Despus analizaremos como se definen tanto los iconos como
los cursores desde el cdigo de nuestro programa.
Para incluir Bitmaps en nuestro almacn de recursos obraremos de dos
formas dependiendo del tipo de almacn que utilicemos:
Si estamos utilizando ficheros .RC escribiremos a mano dentro de l la
siguiente linea:
Nombre BITMAP direccin y nombre del BMP.
ejemplo:

Foto BITMAP ..\bitmaps\futbol.bmp


Si vamos a introducir el bitmap en una DLL tendremos que calcular el tamao
del bitmap. Lo cargamos en el Resource WorkShop como un Proyecto del tipo
Bitmap o con el PaintBrush eligiendo la opcin de ver la posicin del cursor.
Lo pasamos al portapapeles marcndolo y eligiendo la opcin
Edicin Pegar. Luego en el men principal del Resource WorkShop iremos eligiendo
sucesivamente:

____________________________________________________________________
15

Programacin Windows

Introduccin a FIVEWIN

Al elegir en la ltima caja de dilogo, vamos a indicar el tamao que nos


proporciona en la barra de mensajes superior en el Resource WorkShop o en
el PaintBrush. Despus y una vez en el editor de Bitmaps elegiremos las
opciones de Edicin - Pegar. Para terminar salvamos el fichero con las
opciones File - Save. Ya tenemos un fichero almacenado en un almacn de
recursos. La forma de incluir un fichero ICO (de icono) en un almacn de
recursos es similar. Si utilizamos un almacn del tipo RC incluiremos una
linea como la siguiente:
Nombre ICON direccin y nombre del fichero ICO
ejemplo:

Mano ICON ..\icons\hand.ICO


La segunda forma sera abrir el fichero ICO por medio del Resource WorkShop
eligiendo sucesivamente File - Open proyect - ICO. Elegimos el fichero .ICO y
despus de marcar y copiar cerraremos el proyecto. Abrimos una DLL y elegimos un
nuevo recurso del tipo Icono. Una vez abierto un nuevo icono sin rellenar, elegiremos

____________________________________________________________________
16

Programacin Windows

Introduccin a FIVEWIN

la opcin Pegar y cerraremos el recurso quedando as almacenado nuestro icono en


nuestra DLL.
La forma de definir los Iconos desde el cdigo de nuestro programa ser la
siguiente:
DEFINE ICON objeto Icono
NAME, RESOURCE, RESNAME cNombre del recurso
FILE, FILENAME, DISK cFichero Ico
WHEN WhenFuncin
Con DEFINE ICON asociamos el control con un nombre de objeto. Si
cogemos el icono de un almacn de recursos especificaremos el nombre que
se le dio mediante las clsulas NAME, RESOURCE o RESNAME. Si lo
cogemos del disco indicaremos el nombre del fichero ICO con las clusulas
FILE, FILENAME o DISK. Por ltimo, disponemos de una clusula WHEN
para especificar el nombre de una funcin para prevalidar la toma de foco del
control.

Los cursores van a ser definidos de una forma similar:


DEFINE CURSOR objeto Cursor
RESOURCE, RESNAME, NAME cNombre del recurso
Asociamos el nombre de un objeto a nuestro Cursor con las clusulas
DEFINE CURSOR. Mediante las clusulas RESOURCE, RESNAME o NAME
indicamos el nombre dado al cursor en el almacn de recursos

____________________________________________________________________
17

Programacin Windows

Introduccin a FIVEWIN

PROGRAMAS PROPUESTOS
1. Realizamos un programa que capture las teclas que se pulsan. La
clase TControl tiene un codeblock preparado para que se ejecute
cuando se pulsa una tecla.
Lo aprovechamos para efectuar una busqueda blanda en un TWBrowse.
Se va a ir reposicionando la barra de seleccin dependiendo de el
registro donde se posicione el puntero en la busqueda realizada

#include "fivewin.ch"
static oWnd
function main()

DEFINE WINDOW oWnd TITLE " Busqueda aproximada en Browses" ;


FROM 0,0 TO 24,79

ACTIVATE WINDOW oWnd MAXIMIZED ON INIT Dialogo()


return nil
****************************
Function Dialogo()
****************************

PUBLIC oDlg, oBrow, cBuffer := ""


USE PRUEBA
INDEX ON APEL1 TO APEX
SET INDEX TO APEX

DEFINE DIALOG oDlg TITLE "Captura de teclas en controles" FROM 2,2 TO 20,70

@ 1,1 LISTBOX oBrow FIELDS OF oDlg ;


SIZE 200,100
// la clase TWBrowse hereda de la clase TControl el codeblock que
// se ejecuta al presionar una tecla.
// Hacemos que vaya a nuestra funcin pasandole el cdigo de la
// tecla pulsada y el objeto oBrow para que sea refrescado.
oBrow:bKeyDown := { |nKey,nFlags| busca (nKey,oBrow) }

ACTIVATE DIALOG oDlg CENTERED


RETURN .t.

____________________________________________________________________
18

Programacin Windows

Introduccin a FIVEWIN

*************************************
function busca (nKey,oBrow)
*************************************
cBuffer += CHR(nKey)
// Si pulsamos una tecla que no sea alfabtica, se vaca el buffer que
// estamos formando y se devuelve el control a la caja de di logo
IF !ISALPHA(CHR(nKey))
cBuffer := ""
return .t.
ENDIF

IF PRUEBA -> (DBSEEK(cBuffer,.t.))


oBrow:Refresh()
ENDIF
return nil

2. Programa en el que se pueden ver funcionando dos cajas de dilogo


NO MODALES. Se utilizan mtodos de la clase TDialog y TButton para
cambiar los ttulos de la caja de dilogo y de los botones.

#include "fivewin.ch"
static oWnd
function main()
DEFINE WINDOW oWnd ;
TITLE "Prueba de Dialogos NOMODALES en ficheros .RC";
FROM 0,0 TO 24,79

ACTIVATE WINDOW oWnd MAXIMIZED ON INIT Dialogos()


Return nil
*********************
FUNCTION Dialogos()
********
Local oDlg1, oDlg2
Local oBoton1, oBoton2, oBoton3, oBoton4

DEFINE DIALOG oDlg1 RESOURCE "midial1"


REDEFINE BUTTON oBoton1 ID 101 OF oDlg1 ACTION oDlg2:cTitle ("Hola soy oDlg1")
REDEFINE BUTTON oBoton2 ID 102 OF oDlg1 ACTION oBoton3:SetText("Hola")

ACTIVATE DIALOG oDlg1 NOMODAL


DEFINE DIALOG oDlg2 RESOURCE "midial2"

REDEFINE BUTTON oBoton3 ID 101 OF oDlg2 ACTION oDlg1:cTitle ("Hola soy oDlg2")
REDEFINE BUTTON oBoton4 ID 102 OF oDlg2 ACTION oBoton1:SetText ("Adios")

____________________________________________________________________
19

Programacin Windows

Introduccin a FIVEWIN

ACTIVATE DIALOG oDlg2 NOMODAL


oWnd:SetFocus()

RETURN NIL

3. Programa que ilustra como podemos manejar los controles a voluntad


haciendolos aparecer y desaparecer invocando a los mtodos show y
hide adems de activarlos y desactivarlos con los mtodos enable y
disable.

#include "fivewin.ch"
static oWnd, nVisible :=1
function main()
Local oMsg

DEFINE WINDOW oWnd TITLE " Prueba de controles emergentes" ;


FROM 0,0 TO 24,79

DEFINE MESSAGE BAR oMsg OF oWnd

ACTIVATE WINDOW oWnd MAXIMIZED ON INIT dialogos()

return nil

FUNCTION Dialogos()
LOCAL oDlg, oLbx, oSay, oBoton1, oBoton2
LOCAL aItems := {"uno","dos","tres","cuatro","cinco"}
LOCAL nVar := 2
LOCAL cSay := "Hola, soy un say multilinea que aparece y desaparece"

DEFINE DIALOG oDlg RESOURCE "MIDIAL" OF oWnd


REDEFINE SAY

oSay PROMPT cSay ID 104

OF oDlg

REDEFINE BUTTON oBoton1


ID 102 OF oDlg ACTION MsgInfo("boton1") ;
MESSAGE "y desapareciendo, utilizando los "
REDEFINE BUTTON oBoton2
ID 103 OF oDlg ACTION MsgInfo("boton2") ;
MESSAGE "metodos Hide, Show, Enable y Disable"
REDEFINE LISTBOX oLbx VAR nVar ID 101 ITEMS aItems OF oDlg;
MESSAGE "Pinche en la caja e iran apareciendo los controles "
oSay:lActive := .f.
oBoton1:lActive := .f.
oBoton2:lActive := .f.
oSay:lVisible := .f.
oBoton1:lVisible := .f.
oBoton2:lVisible := .f.

//Disable()
//Disable()
//Disable()
//Hide()
//Hide()
//Hide()

____________________________________________________________________
20

Programacin Windows

Introduccin a FIVEWIN

ACTIVATE DIALOG oDlg CENTERED ON CLICK Cambia (oDlg)

Function Cambia(oDlg)
LOCAL nInd
LOCAL nLen := LEN (oDlg:acontrols)
oDlg:aControls[nVisible]:Hide()
oDlg:aControls[nVisible]:Disable()
nVisible ++
IF nVisible > nLen
nVisible := 1
ENDIF
oDlg:aControls[nVisible]:Enable()
oDlg:aControls[nVisible]:Show()
return nil

4. Programa para ensear el manejo de los controles, checkbox, listbox,


combobox, scrollbar h y v, say, get y button.

#include "fivewin.ch"
Static oWnd

function main()
LOCAL oDlg, oMsgBar

DEFINE WINDOW oWnd TITLE "Prueba de recursos" FROM 1,1 TO 20,70


DEFINE MESSAGE BAR oMsgBar OF oWnd CENTERED
ACTIVATE WINDOW oWnd MAXIMIZED;
ON INIT MiDialogo()
return nil

Function MiDialogo()
Local oDlg
Local oCheck1, oCheck2, oCheck3, oCheck4
Local lVar1 := .T.,;
lVar2 := .F.,;
lVar3 := .F.,;
lVar4 := .T.
Local oSay1, oSay2, oSay3
Local oGet1
Local cVarGet1 := "
"
Local oSbrV1, oSbrH1
Local oLbx1
Local nVar := 2,;
aItemLbx1 := {"Uno","Dos","Tres","Cuatro","Cinco","Seis","Siete"}

____________________________________________________________________
21

Programacin Windows

Introduccin a FIVEWIN

Local oCbx1, oCbx2, oCbx3


Local cVarCbx1 := "Martes",;
aItemCbx1 := {"Lunes","Martes","Miercoles","Jueves","Viernes","Sabado"}
Local cVarCbx2 := "Blanco",;
aItemCbx2 := {"Negro","Azul","Verde","Blanco","Amarillo"}
Local cVarCbx3 := "Notable",;
aItemCbx3 := {"Suspenso","Aprobado","Notable","Sobresaliente"}
Local oBtn1

DEFINE DIALOG oDlg RESOURCE "Dialogo1" OF oWnd


REDEFINE CHECKBOX oCheck1 VAR lVar1 ID 101 OF oDlg ;
ON CHANGE oSay1:SetText ("Check 1")
REDEFINE CHECKBOX oCheck2 VAR lVar2 ID 102 OF oDlg ;
ON CHANGE oSay1:SetText ("Check 2")
REDEFINE CHECKBOX oCheck3 VAR lVar3 ID 103 OF oDlg ;
ON CHANGE oSay1:SetText ("Check 3")
REDEFINE CHECKBOX oCheck4 VAR lVar4 ID 104 OF oDlg ;
ON CHANGE oSay1:SetText ("Check 4")
REDEFINE LISTBOX oLbx1 VAR nVar ID 107 OF oDlg ;
ITEMS aItemLbx1 ;
MESSAGE "Listbox"
REDEFINE COMBOBOX oCbx1 VAR cVarCbx1 ID 112 OF oDlg ;
ITEMS aItemCbx1 ;
MESSAGE "ComboBox1"
REDEFINE COMBOBOX oCbx2 VAR cVarCbx2 ID 113 OF oDlg ;
ITEMS aItemCbx2 ;
MESSAGE "ComboBox2"
REDEFINE COMBOBOX oCbx3 VAR cVarCbx3 ID 114 OF oDlg ;
ITEMS aItemCbx3 ;
MESSAGE "ComboBox3"
REDEFINE SCROLLBAR oSbrH1
ID 105 OF oDlg ;
RANGE 1,100 ;
PAGESTEP 5 ;
ON UP
oSay3:SetText (STR(oSbrH1:GetPos(),3)) ;
ON DOWN
oSay3:SetText (STR(oSbrH1:GetPos(),3)) ;
ON PAGEUP
oSay3:SetText (STR(oSbrH1:GetPos(),3)) ;
ON PAGEDOWN oSay3:SetText (STR(oSbrH1:GetPos(),3)) ;
ON THUMBPOS oSay3:SetText (STR(oSbrH1:GetPos(),3))
REDEFINE SCROLLBAR oSbrV1
ID 106 OF oDlg ;
RANGE 1,100 ;
PAGESTEP 5 ;
ON UP
oSay2:SetText (STR(oSbrV1:GetPos(),3)) ;
ON DOWN
oSay2:SetText (STR(oSbrV1:GetPos(),3)) ;
ON PAGEUP
oSay2:SetText (STR(oSbrV1:GetPos(),3)) ;
ON PAGEDOWN oSay2:SetText (STR(oSbrV1:GetPos(),3)) ;
ON THUMBPOS oSay2:SetText (STR(oSbrV1:GetPos(),3))

REDEFINE GET oGet1 VAR cVarGet1


ID 115 OF oDlg ;
VALID (oSay1:SetText("Salir get"),.t.)
oGet1:bLostFocus := {|| oSay1:SetText(oGet1:VarGet())}

____________________________________________________________________
22

Programacin Windows

Introduccin a FIVEWIN

REDEFINE SAY oSay1

ID 116 OF oDlg

REDEFINE SAY oSay2


REDEFINE SAY oSay3

ID 110 OF oDlg
ID 111 OF oDlg

REDEFINE BUTTON oBtn1

ID 117 OF oDlg ACTION oDlg:End()

ACTIVATE DIALOG oDlg CENTERED


return nil

5. Programa que muestra el manejo de listbox y la facultad que tienen


para manejar nombres de ficheros mediante la clusula FILES.

#include "fivewin.ch"
static oWnd
Function main()
LOCAL oMsgBar

DEFINE WINDOW oWnd TITLE "Prueba de recursos" FROM 1,1 TO 20,70


DEFINE MESSAGE BAR oMsgBar OF oWnd CENTERED
ACTIVATE WINDOW oWnd MAXIMIZED;
ON INIT MiDialogo()
return nil

Function MiDialogo()
Local oDlg, oBtn1, oBtn2, oGet1, oGet2, oGet3, oSay1, oSay2, oSay3, oLbx1, oLbx2
Local cVar1 := space(15)
Local cVar2 := space(15)
Local cVar3 := space(15)
Local nLbx1 := 2
Local nLbx2 := 3
Local aItem1 := {"Uno","Dos","Tres","Cuatro","Cinco"}
Local aItem2 := {}

DEFINE DIALOG oDlg RESOURCE "DIALOGO1"


REDEFINE GET oGet1 VAR cVar1 ID 101 OF oDlg ;
VALID (oSay1:SetText (oGet1:cText()),.t.)
REDEFINE GET oGet2 VAR cVar2 ID 102 OF oDlg ;
VALID (oSay2:SetText (oGet2:cText()),.t.)
REDEFINE GET oGet3 VAR cVar3 ID 103 OF oDlg ;
VALID (oSay3:SetText (oGet3:cText()),.t.)
REDEFINE SAY oSay1
REDEFINE SAY oSay2
REDEFINE SAY oSay3

ID 106 OF oDlg
ID 107 OF oDlg
ID 108 OF oDlg

REDEFINE LISTBOX oLbx1 VAR nLbx1


ITEMS aItem1 ;

ID 104 OF oDlg ;

____________________________________________________________________
23

Programacin Windows

Introduccin a FIVEWIN

ON CHANGE oSay2:SetText( oLbx1:aItems [oLbx1:GetPos()] )

REDEFINE LISTBOX oLbx2 VAR nLbx2


ID 105 OF oDlg ;
FILES "C:\WINDOWS\*.BMP" ;
ON DBLCLICK (oSay2:SetText (oLbx2:aItems [oLbx2:GetPos()] ),;
oGet2:cText (oLbx2:aItems [oLbx2:GetPos()] ) )
REDEFINE BUTTON oBtn1 ID 109 OF oDlg ACTION oWnd:End()

ACTIVATE DIALOG oDlg CENTERED


Return nil

____________________________________________________________________
24

Programacin Windows

Introduccin a FIVEWIN

6
GENERADOR DE INFORMES

6.1

EL GENERADOR DE INFORMES DE FIVEWIN

Por muy bien diseado que est un programa, por sencillo que sea su
manejo, por muchas formas de consultar la informacin que contenga,
siempre aparecern una serie de problemas que obligan a generar algn tipo
de salida impresa:

Se requerir usar dicha informacin donde


no hay ordenador.

Se prefiere ver las cosas en


papel mejor
que en la pantalla de un ordenador.

La solucin es la realizacin de una serie de programas


que procesen la informacin contenida en las bases de
datos y la vuelquen en papel.
El principal problema ha sido siempre que al disear los
programas que generaban los informes haba que prever

Programacin Windows

Introduccin a FIVEWIN

el tipo de dispositivo (impresoras matriciales, impresoras lser, ...) en que se


iba a realizar la impresin, eligiendo una de estas tres alternativas:

El informe fuera lo ms simple posible de forma que pudiera


imprimirse en cualquier tipo de dispositivo. Esto implica el no poder
utilizar ningn tipo de efecto de impresin o la utilizacin de distintos
tipos de letras.

Escribir el programa de modo que soporte un pequeo grupo de


dispositivos de amplia difusin (generalmente IBM, Epson y HP) y
esperar que si hay que imprimir en otra mquina, esta sea capaz de
emular las soportadas por el programa (lo que no siempre ocurre).

Dar soporte a un gran nmero de dispositivos existentes en el


mercado, con el problema de conseguir informacin sobre todos esos
dispositivos, y preparar el programa para soportarlos.

El sistema de generacin de informes de FiveWin permite solucionar este


problema al utilizar el sistema de impresin de Windows. De esta manera,
slo debemos indicar lo que queremos imprimir y Windows se encargar de
todo el control de cambio de tipos de letras, impresin grfica, etc.
Entre las principales caractersticas del generador de informes de FiveWin se
encuentran:

Es un sistema orientado a objetos, completamente


personalizable, derivable y de fcil utilizacin.

Independencia del dispositivo de impresin. Lo mismo puede


trabajar con una impresora, un plotter o la pantalla.

Completa gestin sobre columnas, cabeceras, totales, pies


de pgina, ...

Gestin automtica de Grupos.

Utilizacin de distintas fuentes de letra.

Completo control sobre el proceso de impresin.

Capacidad de impresin de grficos.

Programacin Windows

6.2

Introduccin a FIVEWIN

Creacin de un informe
La creacin de un informe es sumamente sencilla:

Se define un objeto informe.


Se indican las columnas que componen el informe.
Se imprime el informe.

Dicho as parece muy sencillo. Vamos a comprobar con un ejemplo


que realmente es tan fcil como parece.
Supongamos que tenemos una base de datos GENTE.DBF con los
campos NOMBRE, APELLIDO1, APELLIDO2, DIRECCION, y que deseamos
realizar un listado de esta base de datos. El programa que realiza esto sera:

#include "Fivewin.ch"
#include "Report.ch"
// Creamos una funcin que imprima el informe
FUNCTION Informe()
LOCAL oInforme // El objeto informe
// Abrimos una base de datos
USE GENTE
// Creamos el informe
REPORT oInforme
// Aadimos las columnas indicando que
// datos contienen y su cabecera
COLUMN TITLE "Nombre"
DATA GENTE->NOMBRE
COLUMN TITLE "Apell. 1"
DATA GENTE->APELLIDO1
COLUMN TITLE "Apell. 2"
DATA GENTE->APELLIDO2
COLUMN TITLE "Direccin" DATA GENTE->DIRECCION
END REPORT // Fin de la definicin del informe
ACTIVATE REPORT oInforme // Imprimimos el informe
CLOSE GENTE
RETURN NIL
Con esto obtendramos un listado

Programacin Windows

6.3

Introduccin a FIVEWIN

Informes a pantalla, disco o impresora

El generador de informes de FiveWin permite la


realizacin de informes cuyo destino final no ha de ser
la impresora. Para ello, a la hora de definir el informe,
se ha de indicar cual va a ser su destino (si no se
indica nada el destino es la impresora).
Para obtener un informe por pantalla, es necesario
especificar la clasula PREVIEW (vista previa) en la
creacin del informe:

// Creamos un informe por pantalla


REPORT oInforme PREVIEW
.........
.........
END REPORT // Fin de la definicin del informe
ACTIVATE REPORT oInforme // mostramos el informe
Cuando se genera un informe por pantalla, el generador crea todas las
pginas del informe antes de presentarlas, y muestra un cuadro de dialogo en
el que informa del proceso del trabajo. Si se trata de un informe muy largo
puede ser interrumpido pulsando el botn de Preview, con lo que veremos las
pginas que se han generado hasta ese momento.
Para obtener un informe en un fichero, se debe indicar en la creacin del
informe la clasula TO FILE y el nombre del fichero de destino, en el que se
va a grabar el informe:

// Creamos un informe a un fichero


REPORT oInforme TO FILE "c:\informe.txt"
.........
.........
END REPORT // Fin de la definicin del informe
ACTIVATE REPORT oInforme // Imprimimos el informe
Para obtener un informe por la impresora se puede incluir la clusula TO
PRINTER, aunque si no se incluye tambin funcionar al ser el dispositivo de
salida por defecto. As, cualquiera de las dos definiciones siguientes
mandara la informacin a la impresora.
// Por defecto a la impresora
REPORT oInforme
// Indicamos salida impresa
REPORT oInforme TO PRINTER

Programacin Windows

Introduccin a FIVEWIN

Cuando mandemos un informe a pantalla o impresora, es posible definir un


nombre para el informe. Esto se hace a travs de la clusula CAPTION. Este
nombr ser el ttulo de la ventana de visualizacin si se manda a pantalla, o
la descripcin del trabajo dentro del administrador de impresin
// Informe con ttulo
REPORT oInforme CAPTION "Informe de gastos mensuales
....

6.4

Cabeceras, pies de pgina y ttulos

A la hora de realizar un informe, suele haber un grupo de informacin que se


ha de repetir en todas las pginas, bien al principio o bien al final de la
pgina, como por ejemplo el ttulo del informe, el nmero de pgina, la fecha,
etc.
El texto que aparece repetido al principio de cada pgina es una cabecera, y
el texto que aparece al final de cada pgina es un pie.
El ttulo del informe se va a repetir en todas las pginas situado entre la
cabecera del informe y el comienzo de las columnas.
La forma de colocar una cabecera, un pie o un ttulo en un informe es
indicndolo en la lnea de creacin del informe:
REPORT oReport ;
TITLE "Este es el ttulo" ;
// Ttulo del informe
HEADER "Esta es la cabecera"; // Cabecera del informe
FOOTER "Este es el pe"
// El pie de pgina
Cabeceras, pies y ttulo no estn limitados a una nica lnea de texto. Si
deseamos incluir varias lneas, se ha de hacer separando las cadenas de
caracteres que componen cada una de las lneas con comas:
REPORT oReport ;
TITLE "Primera lnea del titulo" , "Segunda lnea del ttulo" ;
HEADER "Lnea 1 de la cabecera" , "Lnea 2 de la cabecera" ;
........
Asimismo, cabeceras, pies y ttulos pueden ser colocados centrados en la
pgina, a la izquierda o a la derecha. Para ello deberemos indicar la posicin
en la que queremos que aparezcan cada uno de ellos dentro de la pgina
mediante las clusulas CENTER, RIGHT o LEFT :
REPORT oReport ;
TITLE "El titulo" RIGHT ; // Ttulo a la derecha
HEADER "Esta es" , "la cabecera" CENTER // Cabecera centrada

Programacin Windows

Introduccin a FIVEWIN

En el caso de que la cabecera, el ttulo o el pie tengan varias lneas, lo que no


es posible con ste mtodo situarlos en lugar diferente de la pgina. Es decir,
todas las lneas tendrn que estar a la derecha, a la izquierda o centradas.
Adems, y esto es valido PARA CUALQUIER PARTE DE UN INFORME,
cabeceras, pies y titulo no han de ser necesariamente un literal en el
programa.
Cualquier expresin valida en Clipper que se evale a una cadena de
caracteres puede ser utilizada. Por ejemplo, si deseramos colocar la fecha
en la cabecera de la pgina, lo podramos hacer de la siguiente manera:
REPORT oReport ;
HEADER "Fecha: "+DTOS(DATE())

6.5

Las columnas del informe

El principal elemento de la mayora de los informes realizados a partir de


bases de datos son las columnas, y el aspecto final del informe va a
depender en gran medida de la correcta disposicin y aspecto de cada una
de ellas.
Ya hemos visto que el generador de informes es capaz de manejar
automticamente los datos de las columnas que definimos, pero tambin nos
deja que modifiquemos cualquier aspecto de la impresin de estas, pudiendo
cambiar tipos de letra, mscaras de los campos (PICTURE), tamaos,
posicin, sombreados, etc.

6.5.1 Contenido de las columnas


Cuando se crea una columna, es necesario indicar cual va a ser su
contenido, los datos que se van a imprimir. Ya hemos visto algn ejemplo de
como hacer esto y ahora vamos a comprobar todas las posibilidades.
Cuando definimos el contenido de una columna utilizamos la clasula DATA
y a continuacin la expresin que proporcionar el valor que se va a imprimir:
........
COLUMN DATA GENTE->NOMBRE
........
Esto creara una columna cuyo contenido sera el campo NOMBRE de la
base GENTE, imprimiendo una lnea para cada registro de la base de datos.
Si necesitsemos que la informacin apareciese dividida en ms de un lnea
(toda no cabe en una sola lnea o cualquier otra razn), simplemente se
indicar el contenido de cada una de las lneas separados por comas. As el
siguiente cdigo:

Programacin Windows

Introduccin a FIVEWIN

........
COLUMN DATA GENTE->APELLIDO1, GENTE->APELLIDO2
........
define una columna en la que los campos APELLIDO1 y APELLIDO2 de la
base GENTE se imprimirn en lneas separadas dentro del informe.

6.5.2 El ttulo de las columnas


Toda columna puede tener un ttulo, una cabecera que identifique cual es su
contenido. Esto se realiza mediante la clasula TITLE en la definicin de la
columna.
........
COLUMN DATA GENTE->NOMBRE TITLE "Nombre"
........
El cdigo anterior definira una columna con una cabecera con el texto
"Nombre" que se repetir en todas las pginas del informe al principio de la
misma.
Si el ttulo de la columna ha de contener ms de una lnea de texto, se indica
el texto de cada lnea separado por comas:
........
COLUMN DATA GENTE->RENTA TITLE "Renta","Per Capita"
........
Esto define una columna con una lnea de datos pero con un ttulo de dos
lneas.

6.5.3 Tamao, aspecto, alineacin y posicin de las


columnas
A la hora de definir una columna se puede indicar el formato que van a
presentar los datos, el ancho de la columna, la alineacin de los datos y la
posicin en la pgina de la columna. Esto se hace a travs de una serie de
clusulas en la declaracin de la columna.
La clusula PICTURE permite modificar el aspecto que presentan los datos.
Su utilizacin es igual que en los GETS de Clipper.
........
COLUMN TITLE "Sueldo" DATA GENTE->SUELDO PICTURE "99,999,999.99"
COLUMN TITLE "Nombre" DATA GENTE->NOMBRE PICTURE "@!"
........

Programacin Windows

Introduccin a FIVEWIN

Si la columna va a ser multilnea, se puede especificar una clusula picture


para cada una de las lneas de la columna
........
COLUMN TITLE "Sueldo" , "Renta Per Capita" ;
DATA GENTE->SUELDO, GENTE->RENTA ;
PICTURE "9.999.999" , "999.999"
........

La clusula SIZE permite indicar el ancho de la columna en caracteres.


........
COLUMN TITLE "Apellidos" ;
DATA GENTE->APELLIDO1 + GENTE->APELLIDO2 ;
SIZE 50
// 50 caracteres de ancho para la columna
........
La posicin de la columna dentro de la pgina se indica mediante la clusula
AT. Esto nos permite especificar el carcter a partir del cual comienza la
columna (no obstante, los creadores del generador de informes recomiendan
no utilizarlo. Sus razones tendrn)
........
COLUMN TITLE "Direccin" DATA GENTE->DIRECCION AT 65
........
La alineacin de los datos dentro de las columna se indica mediante las
clusulas LEFT, CENTER o CENTERED y RIGHT, que permiten indicar para
cada columna si est va a estar alineada a la izquierda, centro o derecha
respectivamente. Por defecto, el generador de informes alinea todos los datos
a la izquierda, menos los nmeros que van alineados a la derecha.
........
COLUMN TITLE "Sueldo" ;
DATA GENTE->SUELDO ;
PICTURE "99,999,999" ;
SIZE 10 ;
RIGHT
COLUMN TITLE "Nombre" ;
DATA GENTE->NOMBRE ;
CENTER
........

6.5.4 Tipos de letras en las columnas


Es posible utilizar distintos tipos de letra en las columnas de un informe. Para
ello, se deben seguir una serie de pasos:

Programacin Windows

Introduccin a FIVEWIN

Definir un objeto FONT para cada tipo de letra que se vaya a


usar
Definir el informe indicando que tipos de letra va a utilizar
Indicar para cada columna el tipo que se desea para esa
columna

Veamos un ejemplo:
#include "Fivewin.ch"
#include "Report.ch"
// Creamos una funcin que imprima el informe
FUNCTION Informe()
LOCAL oInforme ,;
// El objeto informe
oFont1,;
// Un tipo de letra
oFont2
// Otro tipo de letra
// Definimos los tipos de letra
DEFINE FONT oFont1 NAME "Arial" SIZE 0,-10
DEFINE FONT oFont2 NAME "Arial" SIZE 0,-10 BOLD
// Abrimos una base de datos
USE GENTE
// Creamos el informe e indicamos las fuentes
REPORT oInforme ;
FONT oFont1, oFont2
// Aadimos las columnas indicando que
// datos contienen, su cabecera y su font
COLUMN TITLE "Nombre";
DATA GENTE->NOMBRE ;
FONT 1
COLUMN TITLE "Apell. 1"
;
DATA GENTE->APELLIDO1 ;
FONT 2
COLUMN TITLE "Apell. 2" ;
DATA GENTE->APELLIDO2 ;
FONT 2
END REPORT // Fin de la definicin del informe
ACTIVATE REPORT oInforme // Imprimimos el informe
// Cerramos la base y liberamos las fuentes
CLOSE GENTE
oFont1:Release()
oFont2:Release()
RETURN NIL

Programacin Windows

Introduccin a FIVEWIN

ATENCIN: Cuando nosotros le indicamos a un columna que use un tipo de


letra, no especificamos el objeto FONT que hemos creado, sino su orden
en la lista de las fuentes que se han indicado en la creacin del informe.
No es necesario especificar las fuentes de todas las columnas. Slo de
aquellas que vayan a usar una distinta. Para las columnas en las que no se
especifique, se utilizar la fuente por defecto del dispositivo de salida.

6.5.5 Sombras y lneas en las columnas


Para conseguir que una columna aparezca con un fondo gris, en la definicin
de la columna se ha de especificar la clasula SHADOW.
........
COLUMN TITLE "Sueldo" DATA GENTE->SUELDO SHADOW
........

Para separar las columnas del informe con lneas se emplea la clusula
GRID. El empleo de esta clusula provoca que la columna en la que se utiliza
aparezca separada de las otras por dos lneas verticales (una a la derecha y
otra a la izquierda).

........
COLUMN TITLE "Sueldo" DATA GENTE->SUELDO GRID
........
Por defecto, las lneas que se dibujan son de color negro, sin trama y con un
ancho de 1 punto. Es posible modificar esto mediante la utilizacin de los
objetos PEN de FiveWin. Para ello procederemos de la misma manera que
con las fuentes de letra:

........
DEFINE PEN oLapiz1 WIDTH 4
DEFINE PEN oLapiz2 WIDTH 10
REPORT oInforme PEN oLapiz1, oLapiz2
// Columna que utiliza el lpiz de 10 puntos
COLUMN TITLE "Nombre" DATA GENTE->NOMBRE GRID 2
// Columna que utiliza el lpiz de 4 puntos
COLUMN TITLE "Sueldo" DATA GENTE->SUELDO GRID 1
........

10

Programacin Windows

Introduccin a FIVEWIN

6.5.6 Totales en las columnas


En muchas ocasiones nos encontramos con columnas numricas en un
informe que es necesario totalizar. El generador de informes de FiveWin nos
permite realizar esto de modo automtico, simplemente indicando la clusula
TOTAL en la definicin de la columna. Por ejemplo:
#include "Fivewin.ch"
#include "Report.ch"
// Creamos una funcin que imprima el informe
FUNCTION Informe()
LOCAL oInforme // El objeto informe
// Abrimos una base de datos
USE GENTE
// Creamos el informe
REPORT oInforme
// Aadimos las columnas indicando que
// datos contienen y su cabecera
COLUMN TITLE "Nombre"
DATA GENTE->NOMBRE
COLUMN TITLE "Apell. 1"
DATA GENTE->APELLIDO1
COLUMN TITLE "Apell. 2"
DATA GENTE->APELLIDO2
// Columna totalizada
COLUMN TITLE "Sueldo"

DATA GENTE->SUELDO TOTAL

END REPORT // Fin de la definicin del informe


ACTIVATE REPORT oInforme // Imprimimos el informe
CLOSE GENTE
RETURN NIL
Tambin podemos especificar una clusula FOR en el clculo del total, para
indicar que registros han de totalizarse. Por ejemplo, para totalizar solamente
los que viven en Valencia hacemos:
COLUMN TITLE "Sueldo" ;
DATA GENTE->SUELDO ;
TOTAL FOR GENTE->PROVINCIA == "Valencia"
Naturalmente, solo es posible totalizar columnas numricas.

6.6

Informes agrupados y sumarios

El generador de informes de FiveWin realiza automticamente informes


agrupados con cabeceras, pies y totales (siempre que en alguna de las
columnas se est totalizando) para cada uno de los grupos.

11

Programacin Windows

Introduccin a FIVEWIN

Para realizar un informe agrupado se deben realizar los siguientes pasos:

Definir el informe
Definir las columnas
Definir los grupos
Imprimir el informe.

La definicin del grupo se realiza mediante el comando GROUP ON y una


expresin que indique que valor es el que determina el cambio de grupo.
Naturalmente, la base de datos ha de estar ordenada por la misma expresin
del grupo.
Por ejemplo, para realizar un listado de la base GENTE agrupado por
provincias, hacemos lo siguiente:

12

Programacin Windows

FUNCTION Informe()
LOCAL oInforme
// Abrimos la base de datos con un ndice
// que para nuestro ejemplo indexa la base por la provincia
USE GENTE INDEX PROVINCIA
// Creamos el informe
REPORT oInforme
// Creamos las columnas
COLUMN TITLE "Nombre" ;
DATA GENTE->NOMBRE
COLUMN TITLE "Apellidos" ;
DATA GENTE-> APELLIDO1 + GENTE->APELLIDO2
COLUMN TITLE "Provincia"
........
DATA GENTE->PROVINCIA
GROUP ON GENTE->PROVINCIA FONT 2
........
// Definimos el grupo como PROVINCIA
GROUP ON GENTE->PROVINCIA
END REPORT

Introduccin a FIVEWIN

Para
definir
las
cabeceras y pies para
el grupo utilizaremos
las
clusulas
HEADER y FOOTER,
aunque en el caso de
los grupos, stas solo
podrn tener una
lnea.
Es posible utilizar
tipos de letra distintos
para la cabecera y el
pie de un grupo. Esto
se hace con la
clusula FONT en la
definicin del grupo.

El tipo de fuente se
define y utiliza de la
misma manera que en
las columnas.

// Imprimimos el informe
ACTIVATE REPORT oInforme
CLOSE ALL
RETURN NIL

Tambin le podemos
indicar al generador
de informes que cada
vez que acabe un
grupo y comience otro
se realice un salto de
pgina. Esto se hace mediante la clasula EJECT en la definicin del grupo.

........
GROUP ON GENTE->PROVINCIA EJECT
........

Cuando en la creacin del informe se especifica la clasula SUMMARY,


solamente se imprimir la informacin relativa a los grupos (sin el contenido
de los mismos) y sin separadores entre grupos.
........
REPORT oInforme TITLE "....." SUMMARY
........
Lgicamente, no se puede imprimir un informe de tipo sumario si no existe al
menos un grupo.

13

Programacin Windows

6.7

Introduccin a FIVEWIN

Seleccin de los registros a imprimir

A la hora de imprimir un informe, es posible indicar que registros van a ser


impresos mediante la utilizacin de las clasulas FOR y WHILE. Su
utilizacin es idntica al resto de los mandatos de Clipper que usan estas
clusulas.

........
ACTIVATE REPORT oInforme ;
FOR GENTE->PROVINCIA == "Madrid" ; // Solo los de Madrid
WHILE !EOF()
........
El generador de informes realiza internamente un bucle del tipo DO WHILE
!EOF() cuando imprime un informe, pero esto es modificado por la inclusin
de la clasula WHILE en la activacin del informe, con lo cual el generador no
hace ningn tipo de comprobacin de fin de base de datos. Por ello es
recomendable aadir esta condicin dentro de nuestra clasula WHILE, a
menos que por alguna circunstancia no sea realmente necesaria.

6.8

Gestin de sucesos en un Informe

Cuando activamos un informe, al igual que cuando activbamos una ventana,


podemos definir una serie de funciones que sern llamadas cada vez que se
produzca un determinado evento. Esto se realiza mediante una serie de
clasulas en la orden de activacin del informe. Estas clusulas y su accin
son:
ON INIT
Llama a la funcin asociada una sola vez, al principio del
informe, cuando las cabeceras de las columnas ya estn
impresas y se va a comenzar a imprimir registros.
ON END
Se llama una vez que se ha acabado de realizar todo el
trabajo y los totales han sido impresos.
ON STARTPAGE
Se llama al principio de cada pgina. Es una de las ms
tiles, utilizndose sobre todo para dibujar elementos de
fondo de la pgina antes de la impresin de la misma
(inclusin de bitmaps, lneas, etc.)
ON ENDPAGE

14

Programacin Windows

Introduccin a FIVEWIN

Es llamada cada vez que se ha acabado de imprimir una


pgina.
ON STARTGROUP
Se llama cuando se va a comenzar un grupo, justo antes
de imprimir la cabecera del grupo.
ON ENDGROUP
Es llamada cada vez que se finaliza un grupo.
ON STARTLINE
Es llamado cada vez que se comienza una de las lneas
del cuerpo del informe.
CUIDADO: Se evala para cada lnea que se imprime, no
para cada registro que se procesa.
Es decir, si estamos trabajando con columnas multilnea,
se llamar a la funcin especificada en STARTLINE por
cada lnea que se imprima. Si para cada registro se
necesitan dos lneas de la pgina, se realizarn dos
llamadas, si se requieren tres, tres llamadas etc.
ON ENDLINE
Se llama cada vez que se ha acabado de imprimir una
lnea y despus de haber incrementado el contador de
lneas (al que ya veremos como acceder)
ON CHANGE
Es llamada cada vez que se va a realizar un SKIP, pero
ANTES de realizarlo.

........
ACTIVATE REPORT oInforme ;
ON STARTLINE Funcion1() ;
ON ENDPAGE
Funcion2()
........
MUY IMPORTANTE: Cuando se utilizan estas clusulas, se est trabajando
dentro del ncleo del generador de informes. Es necesario tener mucho
cuidado con las bases de datos que se utilizan, ndices, etc.

6.9

Los objetos del Generador de Informes

Todas las opciones que hemos visto en el generador de informes son o


estn controladas por una serie de objetos, cada uno con sus propias
caractersticas, datos y mtodos. As, un informe es un objeto del tipo
TReport, que a su vez contendr al menos un objeto del tipo TRLine (para el

15

Programacin Windows

Introduccin a FIVEWIN

ttulo, las lneas, etc.), las columnas son objetos TRColumn, usar tal vez un
objeto TRGroup (uno para cada grupo), y un objeto TPrinter para imprimir.

6.9.1 El objeto TReport


Es el ncleo del sistema de informes.
6.9.1.1
oDevice
oTitle
oHeader
oFooter
oRptWnd
oBrush
aGroups
aColumns
aFonts
aCols
aText

aData
aPen
bFor
bWhile

bInit
bEnd
bStartLine
bEndLine
bStartPage
bEndPage
bStartGroup
bEndGroup
bChange

Sus principales datos son:


El dispositivo de salida. Del tipo TPrinter
El objeto ttulo del informe. Del tipo TRLine
El objeto cabecera del informe. Del tipo TRLine.
El objeto Pie de Pgina. Del tipo TRLine.
En un objeto DIALOG que contiene la ventana en la
que se muestra el proceso de impresin.
Es un objeto de tipo BRUSH con el que se realiza la
sombra de las columnas.
Es un array de objetos TRGroup. Uno elemento por
cada grupo definido.
Es un array de objetos TRColumn. Un elemento por
columna en el informe.
Es un array de objetos FONT. Uno por cada tipo a
utilizar.
Array que contiene la posicin de comienzo de cada
columna dentro de la pgina.
Array que contiene un elemento por cada columna del
informe. Cada uno de estos elementos contiene un
array con tantos elementos como lneas de ttulo tiene
la columna con ms lneas de ttulo. Estos elementos
contienen la lnea de ttulo correspondiente.
Equivalente al anterior, pero para los datos de las
columnas.
Array de objetos PEN. Un elemento por cada lpiz
definido.
Codeblock del filtro. Se evalua para cada registro.
Solo se imprime se devuelve verdadero.
Codeblock de control del informe. Se seguir
imprimiendo mientras el codeblock devuelva
verdadero.

Codeblocks que se evaluarn en cada


uno de sus eventos asociados

16

Programacin Windows

Introduccin a FIVEWIN

bSkip

Codeblock que controla el proceso de paso de un


registro al siguiente (SKIP).
bStdFont
Codeblock que devuelve el nmero de la fuente a
utilizar por defecto. Definido inicialmente como {|| 1 }
para utilizar la primera fuente.
bPreview
Es un objeto RPreview utilizado para realizar
previsualizaciones del informe.
cTotalChr
Carcter que se utiliza como separador para los
totales
cGroupChr
Carcter que swe utiliza como separador para los
grupos
cTitleUpChr
Carcter con el que se dibuja la linea superior de los
ttulos
cTitleDnChr
Carcter con el que se dibuja la lnea inferior de los
ttulos
cPageTotal
Carcter separador de los totales de pgina
cGrandTotal
Carcter separador de los grandes totales (Totales
finales)
nWidth
Resolucin horizontal del dispositivo de salida
nHeight
Resolucin vertical del dispositivo de salida
nMargin
Valor que hay que sumarle al margen izquierdo para
que el informe quede horizontalmente centrado
nRow
Posicin de la lnea actual.
nPage
Contador de pginas
nMaxTitle
Maximo nmero de lneas de ttulo en la pgina
nMaxData
Maximo nmero de lneas de datos en la pgina.
nSeparator
Separacin entre columnas
nLeftMargin
Margen Izquierdo
nRightMargin Margen derecho
nTopMargin
Margen Superior
nDnMargin
Margen Inferior
nBottomRow
Ultima lnea de la pgina
nStdLineHeight Altura de una lnea con fuente por defecto
nRptWidth
Anchura del informe
nCounter
Contador de lneas
lSpanish
Indica si los mensajes del generador aparecern en
espaol. Por defecto aparecen en ingls.
Hay otros datos en el objeto, pero dejamos al lector la tarea de ir investigando
cuales son.
6.9.1.2 Los principales METODOS del objeto TReport (los que ms
utilizaremos sin ayuda del preprocesador) son:
AddColumn(oColumn)
Aade un objeto TRColumn al informe
DelColumn(nColumn)
Elimina una columna del informe
InsColumn(oColumn , nColumn)

17

Programacin Windows

Introduccin a FIVEWIN

Inserta una columna en el informe


AddGroup(oGroup)
Aade un objeto TRGroup en el informe
DelGroup(nGroup)
Elimina un grupo del informe
Skip(n)

Mueve el puntero de la base de datos si no se ha


definido bSkip

NeedNewPage()
Indica si es necesario pasar a una nueva pgina
NewLine()

Avanza una lnea

BackLine(nLine)
Retrocede a la lnea nLine
Say(nCol, xText, nFont, nPad, nRow)
Escribe un dato (xText) dentro de una determinada
columna del informe (nCol) con una fuente del
informe (nFont) y un tipo de alineacin (nPad, ver
report.prg) en la fila indicada (nRow)
SayBitmap(nRow, nCol, cBitmap, nWidth, nHeight, nScale)
Pinta en la pgina actual un bitmap de un fichero
(cBitmap) en una fila (nRow) y columna (nRow)
determinada, con un ancho (nWidth) y alto (nHeight)
determinado por la escala (nScale) segn sea esta de
centimetros (nScale==2) o pulgadas (nScale==1)
Box(nRow, nCol, nBottom, nRight, nPen, nScale )
Dibuja una caja en la pgina actual, en las
coordenadas dadas, con un tipo de lpiz (nPen). Las
coordenadas dependen de la escala (ver SayBitmap)

Line( nTop, nLeft, nBottom, nRight, nPen, nScale )


Similar al mtodo anterior, pero dibuja una lnea.

18

Programacin Windows

Introduccin a FIVEWIN

6.9.2 El objeto TRLine


Los objetos TRLine son los encargados de procesar todos los datos que
aparecen en horizontal dentro del informe, cruzando la pgina, como por
ejemplo cabeceras, ttulos, pies, etc.
Los objetos TRLine son creados de modo automtico por los objetos TReport,
y la nica manera de acceder a ellos es a travs de estos, modificando las
variables de instancia que contienen los objetos TRLine (ver los datos de los
objetos TReport).

6.9.2.1
oReport
aLine

aFont

aRow

aWidth
aPad
nHeight
nWidth

Los principales datos de los objetos TRLine son:


Objeto TReport que contiene la lnea
Array que contiene un elemento por cada lnea impresa
que va a ocupar el objeto TRLine Cada uno de estos
elementos es un codeblock que devuelve el valor a
imprimir al evaluarse.
Array que contiene las fuentes de letra para cada una
de las lneas impresas del objeto TRLine. Cada
elemento es un codeblock que se evalua a un valor
nmerico que representa un indice dentro de la lista de
fuentes del informe.
Array que contiene las posiciones de cada una de las
lneas impresas del objeto TRLine. Cada elemento
contienen un nmero que indica la posicin de cada
lnea correspondiente.
Array que contiene el ancho de cada una de las lneas
impresas del objeto TRLine.
Array que contiene la alineacin para cada una de las
lneas impresas del objeto TRLine.
Altura ocupada por las lneas impresas del objeto
TRLine
Ancho ocupado por el objeto TRLine. Es el valor
mximo de los contenidos en aWidth.

Los objetos TRLine tienen algunos mtodos, pero son de uso propio del
objeto y son de poca utilidad si los manejamos nosotros manualmente, por lo
que no los reflejaremos aqu.

6.9.3 El objeto TRColumn


Es el objeto encargado de manejar toda la informacin que se va a desplegar
sobre el informe en modo vertical (a lo largo del informe). Las columnas
creadas en los informes pertenecen a este tipo de objeto.

19

Programacin Windows

Introduccin a FIVEWIN

Cuando se crea un informe, los objetos TRColumn son creados al utilizar el


comando COLUMN e integrados dentro del objeto TReport, de modo que son
modificables mediante la alteracin de las variables de instancia del objeto
TReport que contienen objetos TRColumn. No obstante, al definir una
columna se puede indicar una variable que contendr una referencia al objeto
creado. Para ello utilizaremos la siguiente sintaxis:
LOCAL oColumna1, oInforme
........
REPORT oInforme
COLUMN oColumna1 DATA ...... TITLE......
........
A partir de este momento, los datos de la columna (por ejemplo lShadow)
sern accesible de cualquiera de los dos modos siguientes:
........
oColumna1:lShadow := .T.
........
........
oInfome:aColumns[1]:lShadow := .T.
........

6.9.3.1 Los principales datos de los objetos TRColumn son:


oReport
aData

aTitle

aPicture
bDataFont

bTitleFont

bTotalFont

bTotalExpr
cTotalPict

nWidth

Es el objeto TReport que contiene la columna


Es el array que contiene los datos que mostrar la
columna. Cada elemento es un codeblock para cada
una de las lneas impresas para cada registro.
Es el array que contiene las lneas de ttulo de la
columna. Un elemento por lnea de ttulo. Cada uno de
los elementos es un codeblock
Formato de visualizacin de los datos de la columna.
Un elemento por cada lnea de datos de la columna
Fuente de letra para los datos de la columna. Es un
codeblock que al evaluarse devuelve un ndice a la
tabla de fuentes del informe.
Fuente de letra para el ttulo de la columna. Es un
codeblock que al evaluarse devuelve un ndice a la
tabla de fuentes del informe.
Fuente de letra para el total de la columna. Es un
codeblock que al evaluarse devuelve un ndice a la
tabla de fuentes del informe.
Es un codeblock con la clausula FOR para el clculo de
los totales.
Es la mscara de visualizacin (PICTURE) del total de
las columnas. Por defecto es el de la primera lnea de
datos de la columna.
Es el ancho de la columna.

20

Programacin Windows

nDataHeight
nTitleHeight
nTotal
nCol
nSize
nPad
nPen

lTotal
lShadow
lGrid

Introduccin a FIVEWIN

Es la altura de las lneas de datos.


Es la altura de las lneas del ttulo.
Es el acumulador para el clculo del total de la
columna.
Es la posicin horizontal de la columna en la pgina.
Es el ancho en caracteres de la columna.
Es la alineacin de los datos en la columna.
Es el ndice de la tabla de objetos PEN del informe que
se va a utilizar para dibujar las lneas a los lados de las
columnas.
Verdadero si la columna est totalizada
Verdadero si la columna est sombreada
Verdadero si la columna tiene lneas a los lados.

Al igual que pasaba con los objetos TRLine, los mtodos de los obetos
TRColumn son de uso interno y de poca utilidad, por lo que no los incluimos
aqu.

6.9.4 El objeto TRGroup


Es el encargado de manejar toda la informacin referida a grupos. Al igual
que suceda con los objetos TRColumn, los objetos TRGroup se crean en el
interior del objeto TReport, pero es posible referenciarlos mediante una
variable:
........
GROUP oGrupo1 ON ........
........
........
? oGrupo1:nCounter
........

6.9.4.1

Los principales datos de los objetos TRGroup son:

oReport
aTotal

bGroup
bHeader
bFooter
bHeadFont

Objeto TReport que contiene al objeto TRGroup


Array con los valores de los totales del grupo para
cada una de las columnas del informe. Un elemento
por cada columna.
Codeblock que contiene la expresin del grupo.
Codeblock de cabecera. Devuelve una cadena de
caracteres que se utiliza como cabecera de grupo.
Codeblock de pie. Devuelve una cadena de
caracteres que se utiliza como pie de grupo.
Codeblock que indica la fuente para la cabecera del
grupo. Devuelve un ndice a la tabla de fuentes del
informe.

21

Programacin Windows

bFootFont
cValue
nCounter
lEject

Introduccin a FIVEWIN

Codeblock que indica la fuente para el pie del grupo.


Devuelve un ndice a la tabla de fuentes del informe.
Valor actual del grupo.
Nmero de elementos procesados en el grupo actual
Indica si se efectuar salto de pgina al final del
grupo.

6.9.4.2

Los METODOS de mayor interes de TRGroup son:

Reset()

Pone a cero el contador del grupo y los totales de las


columnas
Comprueba si se ha producido un cambio de grupo

Check()

PROGRAMAS PROPUESTOS
1. Fabricar un listado de la base de datos CURSO.DBF proporcionada. El
listado ser de los campos NOMBRE en la primera columna,
APELLIDO_1 y APELLIDO_2 en la segunda y TELEFONO en la siguiente

Estructura de la base de datos: CURSO.DBF


Nmero de registros

501

Fecha de ltima actualizacin : 28-05-92


Campo Nombre
1 NOMBRE
2 APELLIDO_1
3 APELLIDO_2
4 DNI
5 TELEFONO
6 EDAD
7 ALTURA
8 VARON
9 ESPAOL
10 NACIDO
11 INGRESO
12 AFICION
* Total *

Tipo
Ancho Dec
Carcter 10
Carcter 10
Carcter 10
Carcter 8
Carcter 7
Numrico 2
Numrico 4
2
Lgico
1
Lgico
1
Fecha
8
Fecha
8
Carcter 14
84

#include "fivewin.ch"
#include "report.ch"
Function Inf01()
LOCAL oRpt
USE CURSO
REPORT oRpt TITLE "Lista de amigos" PREVIEW
COLUMN DATA CURSO->NOMBRE ;
TITLE "Nombre"
COLUMN DATA CURSO->APELLIDO_1 , CURSO->APELLIDO_2 ;
TITLE "Apellidos"
// Los dos campos en la misma columna

22

Programacin Windows

Introduccin a FIVEWIN

COLUMN DATA CURSO->TELEFONO;


TITLE "Telefono"
ENDREPORT
ACTIVATE REPORT oRpt
RETURN NIL

2. Preparar un listado utilizando la letra Arial de 6 x 6 puntos para la


primera columna en la que mostraremos los NOMBRES, y para la
segunda en la que mostraremos APELLIDO_1 y APELLIDO_2. En la
tercera columna utilizaremos la letra Arial de 14 x 10 en 'negrita'

#include "fivewin.ch"
#include "report.ch"
Function Inf02()

23

Programacin Windows

Introduccin a FIVEWIN

LOCAL oRpt, oF1, oF2


DEFINE FONT oF1 NAME "Arial" SIZE 6,6
DEFINE FONT oF2 NAME "Arial" SIZE 14,10 BOLD
USE CURSO
REPORT oRpt TITLE "Miembros del club" PREVIEW ;
FONT oF1,oF2
COLUMN DATA CURSO->NOMBRE ;
TITLE "Nombre"
COLUMN DATA CURSO->APELLIDO_1 , CURSO->APELLIDO_2 ;
TITLE "Apellidos"
COLUMN DATA CURSO->INGRESO ;
TITLE "Fecha Ingreso" FONT 2
ENDREPORT
ACTIVATE REPORT oRpt
RELEASE FONT oF1
RELEASE FONT oF2
RETURN NIL

3. Generamos un listado

24

Programacin Windows

Introduccin a FIVEWIN

#include "fivewin.ch"
#include "report.ch"
Function Inf02()
LOCAL oRpt, oF1, oF2
DEFINE FONT oF1 NAME "Arial" SIZE 6,6
DEFINE FONT oF2 NAME "Arial" SIZE 7,9
USE CURSO
INDEX ON VARON TO CURSO
REPORT oRpt TITLE "Miembros del club","Informe por Sexo" PREVIEW ;
FONT oF1,oF2
COLUMN DATA CURSO->NOMBRE ;
TITLE "Nombre"
COLUMN DATA CURSO->APELLIDO_1 , CURSO->APELLIDO_2 ;
TITLE "Apellidos"
COLUMN DATA CURSO->INGRESO ;
TITLE "Fecha Ingreso" FONT 2
GROUP ON CURSO->VARON
ENDREPORT
ACTIVATE REPORT oRpt
RELEASE FONT oF1
RELEASE FONT oF2
RETURN NIL

25

Programacin Windows

Introduccin a FIVEWIN

26

Programacin Windows

Introduccin a FIVEWIN

7
FICHEROS DE AYUDA

7.1

Creacin de ficheros de ayuda para Windows

La creacin de un fichero de ayuda para una aplicacin Windows debera ser


una parte del desarrollo tan importante como la programacin. .. y por qu ?
Bueno, existen una serie de razones por las que desarrollar una ayuda para
Windows puede ser interesante:
Es una forma de proporcionar a los usuarios una serie de informacin
en lnea sensible al contexto (o sea, tener la informacin que se
necesita en el momento en que se necesita). Cuanto mayor sea la
informacin de que dispone el usuario, menor es la probabilidad de
que tenga que llamar al servicio de apoyo y mayor es su satisfaccin.
Permite crear sistemas de informacin mucho ms atractivos gracias
al soporte de tipos de letras y grficos incorporables a los ficheros.

149

Programacin Windows

Introduccin a FIVEWIN

Los ficheros de ayuda pueden ser


aumentados o corregidos de forma realmente
simple. Ademas, su coste (comparado con el
de los clsicos manuales impresos) es
mnimo, y se
pueden incluir todos los
ejemplos, guas de referencia, tutoriales, etc.
que normalmente no es posible incluir en la
documentacin impresa.
Es fcil, eficiente, rpido, productivo y, por si
fuera poco, las herramientas necesarias para
que los usuarios puedan manejar los ficheros
de ayuda SON GRATIS (el visualizador es el
programa WINHELP.EXE que se incluye con
todas las copias de Windows).
Por simple que sea un programa, siempre se debera proporcionar a los
usuarios una forma de poder obtener informacin sobre lo que estn
haciendo, o recibir ayuda sobre el mejor modo de realizar una determinada
accin. Desgraciadamente no es mucha la gente que ve las cosas as, y
suministra programas sin ayudas o, como mucho, con un fichero separado
(preparado mediante algn procesador de texto, generalmente el Write) que
contiene un manual de la aplicacin.
Esperamos que este captulo sirva para enmendar de alguna forma esta
practica tan corriente. Para ello vamos a ir explicando el proceso ms cmodo
(o a nosotros nos lo parece) para desarrollar un fichero de ayuda, y lo vamos
a hacer creado una ayuda para el comando ATTRIB del MS-DOS. Realmente
se trata de un proyecto muy pequeo, pero vamos a usar todas las tcnicas
necesarias para el desarrollo de un gran proyecto.

7.2

Requisitos necesarios para desarrollar un fichero de


ayuda

Para el desarrollo de una ayuda para Windows es necesario contar con una
serie de herramientas:
Un compilador de ayudas para Windows. El ms corriente es el
HC31.EXE. Este se distribuye junto con casi cualquier paquete de
desarrollo que sea capaz de generar una aplicacin Windows.
Un procesador de texto con capacidad para generar ficheros en
formato RTF (Rich Text Format). Para los ejemplos de este libro
utilizaremos el Word para Windows de Microsoft (nos parece el ms
simple, el ms practico para el desarrollo de ayudas y, ademas, es el
nico que tenamos instalado a la hora de escribir esto). Se utilizar
para escribir el contenido de las pginas del fichero de ayuda.

150

Programacin Windows

Introduccin a FIVEWIN

Un editor de texto que genere ficheros de texto ASCII, sin ningn tipo
de cdigo de formato o atributos. Se utilizar para escribir el fichero
de proyecto. Solo es necesario en el caso de que la ayuda se
encuentre dividida en ms de un fichero.

7.3

Disear el fichero de ayuda

Seguro que a nadie (bueno, casi nadie) se le ocurrira ponerse a construir una
casa sin antes contar con un plano de lo que desea hacer. Pues bueno, con
los ficheros de ayuda de Windows ocurre lo mismo. El paso ms importante
en el desarrollo de una ayuda es sentarse ante un papel en blanco y disear
cual va a ser la apariencia final de la ayuda tal y como el usuario va a
encontrrsela, teniendo en cuenta una serie de reglas:
Las pantallas de ayuda ha de ser clara, precisa y ordenada.
No se ha de abusar de los tipos de letra. Es aconsejable utilizar una
sola fuente de letra con variaciones en el tamao, pero sin pasarse.
De nada sirve un texto en el que las letras no caben en la pantalla por
ser muy grande, u otro que no puede leerse por ser muy pequeo.
El desplazamiento a travs del fichero de ayuda ha de ser rpido y
eficaz, sin ambigedades, de forma que el usuario tenga que utilizar
el ratn el menor nmero de veces posible para llegar a donde quiera.
Hay que contemplar la bsqueda de cualquier informacin mediante
todos los sinnimos, alias o sobrenombres posibles.
Se debe permitir un cambio rpido desde temas generales a aspectos
especficos de un tema.
Hay que documentar todas las caractersticas del programa.

Una vez que tenemos una idea clara de lo que deseamos hacer,
comenzamos el proceso creando un diagrama de nuestro fichero de ayuda
(recordar que como ejemplo estamos documentando el comando ATTRIB)

151

Programacin Windows

Introduccin a FIVEWIN

Indice de contenidos
Descripcin del comando

Informacin de
ayuda

Parametros y
modificadores

Mensaje de
CopyRight

Ejemplos

Notas

Una vez decidida la estructura de nuestra ayuda vamos a crear una serie de
ficheros que contengan la informacin. Esta podra haber estado repartida en
ms de un fichero, pero dado lo simple del ejemplo, solo utilizaremos uno al
que llamaremos ATTRIB.DOC. El proceso que se seguira si hubisemos
utilizados varios ficheros sera el mismo.

7.4

Escribiendo en fichero de ayuda

El primer paso es colocar en el fichero las cabeceras de cada una de las


pantallas de ayuda de nuestro programa.
Editamos ATTRIB.DOC y escribimos lo siguiente dndole el tipo de letra y
colores que consideremos oportunos.
ATTRIB.COM
Parmetros y modificadores
Ejemplos
Notas
Acerca de Ayuda ATTRIB.COM
Autores

Una vez hecho esto introduciremos un salto de pgina despus de cada una
de las lneas que hemos escrito y antes de la primera lnea del documento.
Estos saltos de pgina indican al compilador de la ayuda donde empieza y
terminan cada una de las pantallas de ayuda. Tras esto el fichero queda as:

152

Programacin Windows

Introduccin a FIVEWIN

ATTRIB.COM
------------------------------------------------------------------------Parmetros y modificadores
------------------------------------------------------------------------Ejemplos
------------------------------------------------------------------------Notas
------------------------------------------------------------------------Acerca de Ayuda ATTRIB.COM
------------------------------------------------------------------------Autores
-------------------------------------------------------------------------

El espacio comprendido entre dos saltos de pgina se denomina tema. Un


tema es lo que el WINHELP.EXE presenta en una ventana y lo que el usuario
ve.

7.5

Las cadenas de contexto

Una vez que hemos creado las cabeceras de los temas, es hora de crear las
Cadenas de Contexto. Una cadena de contexto es un identificador para un
tema, de forma que si queremos saltar de un tema a otro podamos indicar a
donde queremos ir. Estas cadenas son texto normal SIN ESPACIOS EN
BLANCO que el compilador de ayuda utiliza para crear Hiperenlaces
(conexiones de un lugar a otro del fichero).
Para crear una cadena de contexto nos situamos inmediatamente despus
del salto de pgina que delimita el comienzo de un tema y antes de la
cabecera, e insertamos una nota a pe de pgina, indicando como marca para
la nota al pie el carcter # y tecleamos como nota el texto de la cadena que
queremos crear SIN ESPACIOS EN BLANCO.
Las cadenas de contexto deben ser nicas dentro del fichero de ayuda, es
decir, no puede haber dos temas con la misma cadena de contexto.
En nuestro ejemplo hemos asignado las siguientes cadenas:
attrib_indice
attrib_parametros
attrib_ejemplos
attrib_notas
attrib_acerca_de
attrib_autores
Aunque el texto de la cadena es arbitrario, se debe procurar escoger
etiquetas sencillas, fciles de recordar y que hagan referencia al contenido del
tema.

153

Programacin Windows

7.6

Introduccin a FIVEWIN

Creacin de hiperenlaces

Una vez que hemos creado las cadenas de contexto, e hora de establecer los
primeros hiperenlaces. Un hiperenlace es el punto de un fichero de ayuda
desde el que se puede efectuar un salto a otro punto del fichero. Por ejemplo,
en nuestro fichero de ayuda tendremos una pantalla principal que nos informa
de para que sirve el comando ATTRIB, y en esta pantalla aparecer un texto
resaltado de modo que si pulsamos sobre el con el ratn pasaremos a ver la
pantalla de parmetros del comando.
El primer paso para crear un hiperenlace es teclear el texto que aparecer
resaltado en la pantalla de la ayuda. Este texto puede ser cualquier cosa, no
tiene por que tener nada que ver con el contenido del tema al que se va a
saltar (aunque si fuera as no servira de mucho, no?) y puede contener
espacios en blanco. Por ejemplo, en nuestro fichero de ayuda, dentro de la
primera pgina vamos a colocar texto para poder enlazar con otras pantallas:
ATTRIB.COM
Parmetros y Modificadores
Ejemplos
Notas
------------------------------------------------------------------------Parmetros y modificadores
------------------------------------------------------------------------Ejemplos
------------------------------------------------------------------------Notas
------------------------------------------------------------------------Acerca de Ayuda ATTRIB.COM
------------------------------------------------------------------------Autores
-------------------------------------------------------------------------

Una vez que hemos escrito el texto que servir de enlace, hemos de indicar
que ese texto va a ser realmente un enlace. Esto se hace aplicando a ese
texto un formato de doble subrayado o de subrayado.
Si se da formato de doble subrayado, al pulsar sobre el enlace el visualizador
de ayuda quitar la informacin del tema que estbamos viendo y mostrar la
informacin del tema al que saltamos.
Si se da formato de subrayado, aparecer una ventana popup con la
informacin del tema enlazado.
Por regla general, si el tema con el que estamos enlazando contiene poca
informacin (un prrafo o dos breves) utilizaremos las ventanas popup
(subrayado simple). En otro caso utilizaremos subrayado doble.

154

Programacin Windows

Introduccin a FIVEWIN

Una vez que hemos formateado el texto segn el tipo de enlace que
deseamos, hemos de indicar con que es con lo que deseamos enlazar. Para
ello colocaremos el cursor justo a continuacin del texto de enlace, sin dejar
ningn espacio en blanco, y escribiremos la cadena de contexto del tema con
el que queremos enlazar, exactamente como la escribimos cuando la
definimos, sin dejar ningn espacio en blanco:

ATTRIB.COM
Parmetros y Modificadoresattrib_parametros
Ejemplosattrib_ejemplos
Notasattrib_notas
------------------------------------------------------------------------........
Una vez hecho esto, para indicarle al compilador que el texto que acabamos
de escribir es una cadena de contexto de un enlace, le daremos a la cadena
de contexto que acabamos de escribir el atributo de oculto.
Con esto hemos creado el hiperenlace, y el visualizador de ficheros de ayuda
lo mostrar en pantalla en el texto visible con color verde y un subrayado
simple de lnea continua (si nosotros lo hemos subrayado doble) o discontinua
(si hemos subrayado simple).
Una vez creados los hiperenlaces, rellenaremos los temas con el texto
necesario de la ayuda. Si dentro de un prrafo es necesario crear un
hiperenlace, lo haremos de la misma manera.
Cuando hemos acabado de escribir nuestro fichero de ayuda, aparte de
haberlo guardado con el formato del procesador que estemos utilizando,
deberemos generar un fichero con formato RTF. Esto es necesario porque el
compilador de ayudas no entiende otros formatos. As, si el fichero que hemos
creado se llama ATTRIB.DOC, tendremos tambin un fichero ATTRIB.RTF

7.7

Hiperenlaces entre ficheros

Es posible realizar un enlace entre dos ficheros .HLP. Para ello, despus de
la cadena de contexto, y todava con texto oculto, dejamos un espacio en
blanco e incluimos una carcter arroba (@) y el nombre del fichero.
El resultado es que en lugar de saltar al tema con la cadena de contexto
especificada, dentro del fichero actual, saltaremos a otro fichero .HLP, al tema
que tenga la cadena de contexto indicada.

7.8

El fichero de proyecto

155

Programacin Windows

Introduccin a FIVEWIN

Animo, que ya casi acabamos. Una vez que hemos creado nuestro fichero (o
nuestros ficheros, segn como lo hayamos organizado), y antes de poder
compilar la ayuda, es necesario crear un fichero de proyecto. Este fichero es
el encargado de indicarle al compilador (entre otras cosas) que ficheros son
los que se van a utilizar para generar la ayuda, cual es el tema principal, y
cual va a ser el ttulo para la pantalla.
El fichero de proyecto ha de ser un fichero ASCII (sin cdigos de control ni
formatos de caracteres), debe tener extensin HPJ (para nuestro ejemplo se
llama ATTRIB.HPJ y lo hemos creado mediante el editor de windows), y al
igual que los ficheros INI de windows se encuentra dividido en secciones,
cada una de las cuales tiene una serie de apartados. De momento solo
vamos a ver dos secciones.
La primera es la seccin [OPTIONS]. En ella le indicaremos al compilador
cual es el tema principal y cual es el ttulo de la ventana de ayuda. Esto se
hace mediante las clasulas CONTENTS y TITLE respectivamente
La siguiente seccin es la de [FILES]. En ella se indican los ficheros que se
van a incluir en la compilacin del fichero. As, nuestro fichero ATTRIB.HPJ
queda de la siguiente manera:
[OPTIONS]
CONTENTS=attrib_indice
TITLE=Fichero de ayuda ATTRIB.COM
[FILES]
ATTRIB.RTF
Si tuviramos la ayuda dividida en ms ficheros, se colocara cada uno en una
lnea a partir de la cabecera [FILES]
Si los ficheros que contienen los datos de la ayuda no se encuentran en el
directorio en el que estemos trabajando, o bien indicamos el camino al fichero
dentro de la seccin files:
[FILES]
C:\WINDOWS\AYUDAS\ATTRIB.RTF
o bien incluimos en la seccin [OPTIONS]la clasula ROOT que indicar al
compilador donde se pueden encontrar los ficheros. Si estn en ms de un
directorio, cada uno de los caminos se separa de los dems con una coma:
[OPTIONS]
CONTENTS=attrib_indice
TITLE=Fichero de ayuda ATTRIB.COM
ROOT=C:\WINDOWS\AYUDAS , C:\RTF

156

Programacin Windows

7.9

Introduccin a FIVEWIN

Compilacin y visualizacin de la ayuda

Bueno, ya lo tenemos todo. El siguiente paso es compilar nuestra ayuda. Para


ello llamaremos al compilador (HC31) con el nombre de nuestro fichero de
proyecto como parmetro de la lnea de comandos. Por ejemplo:
C:\> HC31 ATTRIB.HPJ
El compilador comenzar a trabajar e ir mostrando una serie de puntos (uno
por cada tema que va encontrando) y si hemos cometido algn error nos
mostrar un mensaje de advertencia.
Ya lo nico que queda es ejecutar nuestro fichero de ayuda. Para ello
utilizaremos la opcin de Archivo-Ejecutar del administrador de programas,
indicando nuestro fichero de ayuda (ATTRIB.HLP, y sin olvidar el camino de
bsqueda para llegar hasta l) y podremos contemplar el fichero que hemos
creado.

7.10

Inclusin de grficos en un fichero de ayuda

Una vez que hemos probado nuestro nuevo fichero de ayuda, y hemos visto
que podemos utilizar las fuentes, tamaos y colores de Windows a la hora de
escribir el texto (y si no lo hableis probado, ya estis tardando) diremos: "si,
pero si en Windows todo son iconos y grficos, no se pueden poner en el
fichero de ayuda?". La respuesta es si, y ademas de ms de una manera.
Podemos incluir un grfico en un tema usando las opciones de importacin o
insercin de grficos de que disponga el procesador de textos con el que
estemos desarrollando la ayuda. Este grfico aparecer despus en el fichero
de ayuda de la misma manera en que aparece en nuestro procesador. Esto
tiene la ventaja de que mientras estamos desarrollando el fichero, nos
podemos hacer una idea bastante aproximada del aspecto final de la ayuda.
Por contra, esto tiene una desventaja. El tamao mximo que puede tener un
prrafo en un fichero de ayuda es de 64KB. Cada vez que nosotros incluimos
un grfico en un prrafo, todos los bytes del grfico son incluidos dentro de
ese prrafo, y si el grfico es muy grande, o si estamos incluyendo bastantes
grficos pequeos, el tamao puede ser excesivo.
El otro mtodo para incluir grficos en un fichero de ayuda es utilizar
directamente directivas RTF de inclusin de grficos. Esta directivas no
suman bytes al prrafo, pero tienen la desventaja de que no podemos
observar en pantalla el resultado final hasta que no hemos compilado el
fichero de ayuda.

Esta directivas son:

157

Programacin Windows

Introduccin a FIVEWIN

bmc
Muestra un fichero bitmap (.BMP) en la lnea actual de texto. Su
posicin sera la equivalente al siguiente carcter de la lnea, apoyado
sobre la lnea base y con las propiedades del prrafo en curso.
bml
Muestra un bitmap en el margen izquierdo de la ventana de ayuda. La
primera lnea de texto tras el bitmap se escribe a partir de la esquina
superior derecha del bitmap, y fluye a lo largo del borde derecho del
mismo.
bmr
Muestra un bitmap en el margen derecho de la ventana de ayuda. La
primera lnea de texto tras el bitmap se escribe a la altura de la
esquina superior izquierda del bitmap, y fluye a lo largo del borde
izquierdo del mismo.
La utilizacin de estas directivas es realmente sencilla. Todas se utilizan igual,
se sita el cursor en el lugar (bmc) o al principio del prrafo (bmr y bml) en el
que debe ir el grfico y teclearemos la directiva y el nombre del fichero que
queremos incluir, todo ello encerrado entre llaves. Por ejemplo:
{bmr f1.hlp} Esta tecla se utiliza para .....
Pulse la tecla {bmc escape.bmp} para cancelar el proceso
Al igual que ocurra con los ficheros de datos, si los bitmaps no se encuentran
en el directorio en el que estamos trabajando, deberemos indicar donde
estn. O bien dentro de la misma directiva
{bmc c:\windows\malla.bmp}
o dentro de la seccin [BITMAPS] del fichero de proyecto
[BITMAPS]
C:\WINDOWS\MALLA.BMP
o indicando en la seccin [OPTIONS] la directiva BMROOT para indicar los
directorios en los que se pueden encontrar los ficheros de grficos. Se siguen
las mismas reglas que para ROOT
[OPTIONS]
BMROOT=C:\WINDOWS , C:\WINDOWS\AYUDA

158

Programacin Windows

7.11

Introduccin a FIVEWIN

El botn de buscar que no funciona

Cualquiera que halla trabajado mnimamente con una ventana de ayuda


Windows, conoce el botn de buscar. Este botn permite localizar un tema
determinado a partir de diversas palabras claves que identifican al tema. Una
vez seleccionada una palabra clave, nos muestra una lista de los ttulo de los
temas asociados a esa clave, y nos deja elegir cual queremos visualizar. Esto
se hace en una pantalla parecida a la siguiente:

Pues bien, en nuestro fichero de ayuda el botn de buscar aparece


desactivado. Por que? Por que no le hemos dicho al compilador cuales son
las claves que se pueden buscar ni cuales son los ttulos de los temas.
Veamos como se hace esto.
El primer paso consiste en darle un ttulo a los temas en los que queramos
definir palabras claves. La razn: No puedo definir una palabra clave para un
tema que no tenga ttulo.
NO es necesario definir ttulo para todos los temas. Solo para aquellos a los
que queramos que se pueda acceder a travs del botn de bsqueda. Para
ello, nos situaremos al principio del tema, justo despus del carcter de nota a
pe que define la cadena de contexto (#), e insertaremos otra nota a pie de
pgina, pero en esta ocasin el carcter que se ha de utilizar para la nota no
es la almohadilla, sino el smbolo del dlar $. El texto que tecleemos dentro de
la nota ser el ttulo del tema, y se utilizar en el botn de bsqueda y en el
botn de historia (lista los ttulos de los temas que hemos estado
consultando).

159

Programacin Windows

Introduccin a FIVEWIN

Una vez que le hemos dado ttulo a nuestro temas, pasamos a asignar a cada
tema una serie de palabras de bsqueda. Alguien se imagina como? Si. Con
notas a pies de pgina.
Para definir palabras clave para un tema, situaremos el cursor despus del
carcter $ de la nota a pie que asigna el ttulo, e insertaremos una nota a pe
de pgina, pero la personalizaremos mediante el carcter K. Dentro de la nota
escribiremos todas las palabras claves bajo las que se puede localizar el
tema, separando cada una de la siguiente con un punto y coma (;).
NOTA. Que se denominen palabras claves no quiere decir que solo hayan de
contener una palabra. Pueden ser varias palabras y contener espacios en
blanco, etc. Por ejemplo, esta sera la apariencia de una nota a pie con una
serie de palabras claves:
KIndice general;Tabla de contenidos;Contenidos
CUIDADO. Si la primera letra de la primera palabra dentro de la nota es una
K, habr que separarla de la K que identifica la nota con un espacio.

7.12

Uso de bitmaps en hiperenlaces

Cuando creamos un fichero de ayuda, y establecemos un hiperenlace,


aparece un texto en el que se puede pinchar con el ratn y que nos lleva a
otro tema del fichero de ayuda. Se puede hacer lo mismo con los bitmaps?
Si. Se puede definir un bitmap de forma que cuando se pinche sobre el, salte
a otro tema o muestre una ventana popup. Para ello deberemos utilizar una
utilidad denominada "HotSpot Editor" (Editor de puntos calientes). Esta
utilidad aparece con casi todos los paquetes de desarrollo para Windows, y lo
que permite es indicar dentro de un bitmap la cadena de contexto a la que se
saltar cuando se pulse sobre el grfico.

Dentro del fichero de ayuda no es necesario indicar nada. Solo incluir el


bitmap. El resto de la informacin necesaria (a donde se salta) se ha de incluir
con el HotSpot Editor.

160

Programacin Windows

7.13

Introduccin a FIVEWIN

Creacin de secuencias.

Cuando creamos un fichero de ayuda puede presentrsenos el caso de


necesitar incluir varios temas que por lgica deberan ser ledos uno detrs de
otro. Esto se puede implementar mediante la definicin de una serie de
hiperenlaces entra los temas, pero existe un mtodo ms adecuado: La
creacin de secuencias.
Una secuencia es una serie de temas en los que se ha definido un
cierto orden, de modo que podemos pasar de un tema al siguiente
o al anterior mediante dos botones que aparecern en la barra de
la ventana de ayuda. Estos botones tienen los smbolos "<<"
(anterior) y ">>" (siguiente) y nos permiten movernos dentro de la
secuencia.
Para crear una secuencia, es necesario indicar que temas forman
la secuencia. Adivinan como? Si. Ms notas a pie de pgina.
Situando el cursor despus de la ltima de las notas que hemos definido
(cadena de contexto, ttulo de tema y claves de bsqueda), insertamos una
nota a pie de pgina y la personalizamos con el carcter + (un signo de
sumar). Dentro de la nota indicaremos el nombre de la secuencia y el nmero
que hace este tema dentro de la secuencia separado por dos puntos. Por
ejemplo:
+tutor_parrafos:01
repitiendo este proceso (cambiando el nmero) para cada uno de los temas
de la secuencia.
Es importante recordar que todos los identificadores de una secuencia (el
nombre ms el nmero) deben tener la misma longitud. As, si nuestra
secuencia tiene solo 7 temas podremos denominarlos
+tutor_parrafos:1
........
+tutor_parrafos:7
pero si tenemos ms de 9 temas deberemos colocar ceros a la izquierda del
nmero:
+tutor_parrafos:01
..........
+tutor_parrafos:24
Naturalmente dentro de un fichero de ayuda podemos tener tantas
secuencias como queramos, teniendo cuidado de que su identificador de
secuencia sea distinto (si es igual no produce error, simplemente se mezclan
las dos)
Una vez que hemos indicado los temas que pertenecen a una secuencia, es
necesario indicarle al compilador que la vamos a usar, y que active los

161

Programacin Windows

Introduccin a FIVEWIN

botones de secuencia. Para ello, en el fichero de proyecto, crearemos la


seccin [CONFIG] e incluiremos una llamada a un macro del visor de ayuda
(ya veremos lo que son los macros y cuales tenemos, pero por hagamos un
acto de fe y creamos al escritor) BrowseButtons()
[CONFIG]
BrowseButtons()
Ya solo recompilar y probar.

7.14

Las etiquetas de construccin (build tags)

Queda un nico tipo de nota a pie de pgina por ver dentro de los ficheros de
ayuda. Son las etiquetas de construccin. Se construyen mediante notas
personalizadas mediante el carcter * (asterisco). Se indican justo a
continuacin de todas las dems notas del tema, y el texto contenido en la
nota puede ser cualquier cadena SIN ESPACIOS EN BLANCO. Pueden
definirse tantas etiquetas de construccin como se deseen dentro de cada
tema.
Y para que valen ?. Pues bien, a la hora de compilar el fichero de ayuda es
posible indicar en el fichero de proyecto una serie de
etiquetas de construccin, y solo aparecern en el
fichero compilado aquellos temas que contengan
esas etiquetas. Para ello, aparte de definir las build
tags dentro del fichero, es necesario indicar los
siguientes datos en el fichero de proyecto:
Hay que definir una seccin [BUILDTAGS] que incluir la lista de las etiquetas
de los temas que se van a incluir dentro del fichero de ayuda. Por ejemplo:
[BUILDTAGS]
Capitulo1
Capitulo2
Capitulo5
.....
Esto incluira en el fichero de ayuda todos aquellos temas que tuvieran las
etiquetas Capitulo1, Capitulo2 o Capitulo5. Se pueden incluir hasta 30
etiquetas dentro de la seccin [BUILDTAGS]
NOTA: Es importante recordar que los temas que NO tienen etiquetas de
construccin SE INCLUYEN SIEMPRE.
Ademas de poder indicar que temas se van a incluir listando sus etiquetas de
construccin, es posible realizar operaciones lgicas que limiten el grupo de
temas que se van a compilar. Esto se realiza mediante la directiva BUILD de
la seccin [OPTIONS]. Esta directiva tiene el siguiente formato:

162

Programacin Windows

Introduccin a FIVEWIN

[OPTIONS]
BUILD=expresion
donde expresin es una combinacin de etiquetas y los siguientes
operadores:
~
Operador NOT. Se aplica a una etiqueta. Solo compila los temas que no
tengan incluida la etiqueta indicada.
BUILD=~Capitulo1
Compila los temas en los que no est definida la etiqueta Capitulo1
&
Operador AND. Se aplica a dos etiquetas. Solo compila aquellos temas que
contienen las dos etiquetas
BUILD=Capitulo1 & USUARIO_FINAL
Compila los temas que tienen definidas las dos etiquetas
|
Operador OR. Se aplica a dos etiquetas. Compila los temas que contienen al
menos una de las dos etiquetas especificadas.
BUILD=Capitulo1 | Capitulo2
Compila los temas que contienen la etiqueta Capitulo1 y los que contienen la
etiqueta Capitulo2

Se puede realizar cualquier tipo de combinacin de estos operadores,


recordando que el operador ~ tiene preferencia sobre el operador &, y que
este tiene preferencia sobre el |
BUILD=(Capitulo1 | Capitulo2) & USUARIO_FINAL
Compila los temas en los que estn definidas las etiquetas Capitulo1 o
Capitulo2, y que ademas contengan la etiqueta Usuario_final
Solo se puede indicar una directiva BUILD en cada fichero de proyecto

7.15

Los ficheros de proyecto

163

Programacin Windows

Introduccin a FIVEWIN

Una vez llegados aqu, y antes de meternos en cosas mas enrevesadas (e


interesantes), vamos a dar un vistazo a las secciones y directivas de los
ficheros HPJ
Seccin [OPTIONS]
Esta seccin controla la forma en que se va a construir el fichero de ayuda, y
la informacin que va a proporcionar el compilador. Es una seccin optativa, y
en el caso de incluirse en el proyecto, debe ser la primera seccin del fichero.
La seccin OPTIONS esta compuesta por directivas con el formato:
DIRECTIVA = VALOR
Estas directivas son:
BMROOT
Indica el directorio en el que se encuentran los ficheros de grficos
incluidos en el fichero de ayuda. Su formato es:
BMROOT=directorio, [directorio,...]
Si la directiva BMROOT no se incluye, los ficheros de grficos se
buscaran en los directorio especificados mediante la directiva ROOT.
Si la directiva ROOT no se incluye, o no indica los directorios de los
grficos, deber indicarse donde se encuentra cada uno de los
grficos dentro de la seccin [BITMAPS]
BUILD
Especifica una condicin que limita los temas que se han de compilar,
usando las etiquetas de construccin. Si se especifica una directiva
BUILD, obligatoriamente se ha de especificar una seccin
[BUILDTAGS] que indique que etiquetas se van a utilizar.
Su formato es:
BUILD=expresin
COMPRESS
Indica el grado de compresin que se va a aplicar al fichero de la
ayuda al compilarlo. Su formato es:
COMPRESS=nivel-de-compresin
Donde nivel de compresin puede ser 0,NO o FALSE para indicar sin
compresin (0%), 1,YES o TRUE para indicar mxima compresin
(50%), y MEDIUM para indicar compresin mediana (40%)
Dependiendo del grado de compresin solicitado, el compilador
utilizar compresin por bloque o compresin por bloque y
compresin de frases. La compresin por bloque comprime los temas
en unidades predefinidas conocidas como bloques. La compresin
por frases combina cadenas repetidas encontradas a lo largo de los

164

Programacin Windows

Introduccin a FIVEWIN

ficheros de datos. En el proceso, el compilador crea un fichero de


frases con extensin .PH en el caso de que no encuentre uno. En el
caso de que encuentre un fichero con extensin .PH lo utilizar para
el proceso de compilacin. Debido a que el fichero .PH acelera el
proceso de compilacin cuando solo pequeos fragmentos de texto
han cambiado desde la ltima compilacin, es conveniente no
eliminarlo del directorio si se est compilando repetidamente con
compresin. Sin embargo, se obtendr mayor porcentaje de
compresin eliminando el fichero antes de cada proceso.
CONTENTS
Especifica la cadena de contexto del tema que se utilizar como
pgina de contenidos (el ndice, el primer tema que aparece al abrir el
fichero de ayuda). Su formato es:
CONTENTS=cadena-de-contexto
Si no se especifica una directiva CONTENTS, se toma como pgina
de contenidos el primer tema del primer fichero indicado en la seccin
[FILES]
COPYRIGHT
Introduce un texto que se mostrar dentro de la ventana de "AyudaAcerca de" justo debajo del CopyRight de Windows. Su formato es:
COPYRIGHT=texto
El tamao del texto no puede exceder los 50 caracteres.
ERRORLOG
Escribe los errores del proceso de compilacin dentro de un fichero
ademas de mostrarlos en pantalla. Su formato es:
ERRORLOG=fichero
FORCEFONT
Obliga al compilador a utilizar una fuente de letra determinada para
todo el fichero de ayuda. Su formato es:
FORCEFONT=Nombre-de-fuente
El nombre de la fuente ha de ser de una fuente disponible, con un
mximo de 20 caracteres y escrita tal y como aparece en la opcin de
fuentes del panel de control. Si la fuente no es valida se utilizar por
defecto MS Sans Serif.
ICON
Indica el nombre del fichero de icono que se mostrar cuando la
ventana de ayuda se minimize. Su formato es:
ICON=fichero-de-icono

165

Programacin Windows

Introduccin a FIVEWIN

Fichero-de-icono ha de ser el nombre de un fichero de icono en


formato standard windows (.ICO).
MAPFONTSIZE
Cambia el tamao de las fuentes en los temas a otro determinado
cuando se muestren en pantalla. Su formato es:
MAPFONTSIZE=original:nuevo
Mostrar las fuentes que tuvieran el tamao original con el tamao
nuevo
OLDKEYPHRASE
Indica al compilador si ha de utilizar el fichero de frases existente en
el proceso de compilacin y compresin, o ha de crear uno nuevo
cada vez. Su formato es:
OLDKEYPHRASE=valor
Donde valor puede ser 0, FALSE, NO u OFF para que lo vuelva a
crear, o 1, TRUE o YES para que no lo cree.
OPTCDROM
Optimiza la distribucin de los temas dentro del fichero de ayuda para
mejorar la velocidad de proceso en el caso de que el fichero vaya a
estar grabado en CD-ROM. Su formato es:
OPTCDROM=valor
donde valor puede ser ON, 1, YES o TRUE.

REPORT
Indica al compilador que nos informe del proceso que est llevando a
cabo. Su formato es
REPORT=ON
Cuando se activa, el compilador nos ir indicando cuando compila,
resuelve saltos o comprueba secuencias.

ROOT
Indica el directorio en el que se van a encontrar los ficheros fuente
para la compilacin.l Su formato es:
ROOT=directorio [, directorio, ...]

TITLE

166

Programacin Windows

Introduccin a FIVEWIN

Especifica el ttulo de la ventana en que se mostrar el fichero de


ayuda. Su formato es:
TITLE=ttulo

WARNING
Indica el nivel de errores que mostrar el compilador. Su formato es:
WARNING=nivel
donde nivel puede ser 1 (solo muestra los errores ms graves), 2
(muestra los errores intermedios) o 3 (muestra los errores y los
avisos)

Seccin [FILES]
Indica los ficheros (.RTF) que se van a utilizar para obtener el fichero de
ayuda final. En esta seccin no hay directivas, y cada una de las lneas
contenidas en esta seccin indica el nombre de un fichero.
[FILES]
Primero.RTF
Segundo.RTF
........
Si no se especifica un directorio con el nombre del fichero, se buscarn dentro
de los directorios indicados en la directiva ROOT del la seccin [OPTIONS]
Seccin [BUILDTAGS]
Indica una serie de etiquetas de construccin. Solo se incluirn en el fichero
de ayuda aquellos temas cuyas etiquetas de construccin aparezcan en esta
seccin.
Al igual que ocurra con la seccin [FILES], sta tampoco tiene directivas, y
cada lnea indica una etiqueta de construccin.
IMPORTANTE: Si no se indica esta seccin, todos los temas incluidos
en los fichero fuente sern incluidos en el fichero final. Ademas, los
temas para los que no se han definido etiquetas de construccin no
se ven afectados por esta seccin, y son incluido siempre.
Seccin [CONFIG]
Contiene una serie de macros de ayuda windows que se ejecutarn al cargar
el fichero de ayuda (por ejemplo habilitar los botones de secuencias). As
mismo, permite registrar funciones externas residentes en libreras de enlace
dinmico (.DLL). Su formato y utilizacin se explican ms adelante.

167

Programacin Windows

Introduccin a FIVEWIN

Seccin [BITMAPS]
El equivalente a la seccin [ROOT] pero aplicado a los fichero de grficos en
lugar de a los de texto. Indica los fichero y la localizacin de los grficos que
se han de incluir en el fichero de ayuda.
Seccin [MAP]
Se utiliza para asignar nmeros a las cadenas de contexto de los temas. Esto
es til para desarrollar ayudas en lnea para los programa, ya que el
visualizador de ficheros de ayuda permite recibir un nmero como parmetro
indicando el tema al que queremos ir. Este nmero debe estar asociado a una
cadena de contexto dentro de la seccin [MAP]. Su formato bsico es:
[MAP]
cadena-de-contexto

valor-numerico

Tambin acepta el formato


[MAP]
#define cadena-de-contexto

valor-numerico

Y es posible incluir un fichero externo que contenga declaraciones del tipo


anterior (#define). Esto se hace de la siguiente manera:
[MAP]
#include "fichero-de-definiciones"
pudiendo indicarse el nombre del fichero entre comillas dobles ("") o entre
parntesis angulares (<>).
Si se intenta generar un mapping para una cadena de contexto inexistente, el
compilador generar un mensaje de aviso.
Seccin [ALIAS]
Permite que todas las referencias a una cadena de contexto sean pasadas a
otra distinta. Su formato es
[ALIAS]
cadena-de-contexto=alias
........
Pueden definirse tantos alias como sea necesario. Estos se rigen por las
mismas normas que las cadena de contexto (solo letras de la A a la Z,
nmeros del 0 al 9, el punto y el subrayado).
Se puede utilizar para:
Referencias a temas obsoletos sean redirigidas a nuevos temas sin
necesidad de ir buscando todas las referencias a los temas antiguos.

168

Programacin Windows

Introduccin a FIVEWIN

Si existe mas de un identificador de contexto para un tema (suele


pasar en ayudas en linea), acceder al tema correcto.
etc....
Los alias definidos en esta seccin pueden ser utilizados en la seccin [MAP]
siempre y cuando la seccin [ALIAS] se haya definido primero en el fichero de
proyecto.
Seccin [WINDOWS]
Permite especificar caractersticas para la ventana principal de la ayuda y
para las ventanas secundarias (ah!, que no lo sabais? Pues si, un fichero de
ayuda se puede presentar en ms de una ventana. Luego contamos como).

El formato es:
[WINDOWS]
tipo = "Ttulo" , ( x , y , Ancho , Alto ) , tamao , (cliente-RGB) , (nonscrollRGB)
, (ltop)
Donde los parmetros tienen los siguientes significados:
tipo
Es el nombre de la ventana. Para la ventana principal es main. Para las
ventanas secundarias puede ser cualquier nombre nico de hasta 8
caracteres. Cuando en un tema, un hiperenlace realiza un salto a una ventana
secundaria, utiliza este nombre como parte de la cadena de contexto. As, si
queremos que el texto del hiperenlace se muestre en la ventana secundaria,
deberemos aadir, justo despus de la cadena de contexto (y tambin con
formato de texto oculto) un carcter de mayor que (>) y el nombre de la
ventana en la que se van a mostrar los datos. Si el enlace se realiza con otro
fichero .HLP, el > y el nombre de la ventana se han de situar antes del
carcter @.
Titulo
Es el texto que aparecer en la barra de titulo de la ventana. Solo se aplica a
las ventanas secundarias. Para fijar el ttulo de la ventana primaria es
necesario utilizar la directiva TITLE de la seccin [OPTIONS]
x
Es la coordenada x de la esquina superior izquierda de la ventana en
unidades de ayuda. Windows asume una ventana de 1024x1024
independientemente de la resolucin. As, un valor de 512 hara que el
margen izquierdo de la ventana de ayuda quedara en el centro de la pantalla.
y
Es la coordenada y de la esquina superior izquierda de la ventana en
unidades de ayuda. Se rige por las mismas reglas que la coordenada x
Ancho
Especifica el ancho en unidades de ayuda de la ventana

169

Programacin Windows

Introduccin a FIVEWIN

Alto
Especifica el alto en unidades de ayuda de la ventana
Tamao
Especifica el tamao relativo de la ventana secundaria cuando windows abre
la ventana por primera vez. Sus valores pueden ser: 0 para usar el tamao
definido por x,y,ancho y alto, o 1 para que arranque maximizada.
cliente-RBG
Es el color de fondo de la pantalla de ayuda. Es un valor de color RGB,
compuesto por tres nmeros de 0 a 256, encerrados entre parntesis y
separados por comas. Si no se especifica, se utilizar el color definido por
defecto.

nonscroll-RGB
Es el color de fondo de la zona de NO-Scroll situada al principio de los temas.
Al igual que en el caso anterior es un valor RGB.
Una zona de No-scroll se crea aplicando a los prrafos que queremos que
permanezcan siempre en pantalla (ojo, tienen que ser los primeros prrafos
del tema) el atributo de "Conservar con el siguiente".
ltop
Indica si la ventana secundaria ha de mostrarse encima de todas las dems
ventanas. Si el valor es 1, la ventana aparecer por encima de todas las otras
ventanas que no tengan definido tambin este atributo.
[WINDOWS]
main=, (, , , ), 0, (, , ), (128, 0, 128)
pictures = "Samples", (123,123,256,256), 0, (0,255,255), (255,0,0)

Seccin [BAGGAGE]
Lista una serie de ficheros que se incluirn dentro del fichero de ayuda. Estos
ficheros son accedidos desde el resto de la ayuda igual que si estuvieran en
el directorio, pero de manera ms eficiente. Pueden incluirse hasta 1000
ficheros.
Su formato es igual al de las secciones [ROOT] o [BITMAP]
[BAGGAGE]
tada.wav
carillon.wav
Dibujo.wmf

170

Programacin Windows

7.16

Introduccin a FIVEWIN

Utilizacin de macros en ficheros de proyectos

Los macros se aaden dentro de la seccin [CONFIG] del fichero de


proyectos. Cuando Windows abre el fichero de ayuda, automticamente
ejecuta los macros que se encuentra es esta seccin en el mismo orden en el
que se los va encontrando.
As, es posible modificar los mens de la ventana de ayuda, aadir botones,
etc.
7.16.1 Utilizacin de macros en temas
Si dentro de un tema se define una nota a pie de pgina,
personalizada con el carcter !, el compilador de ayuda espera
encontrar dentro de la nota una llamada a un macro de ayuda. Este
macro es ejecutado cada vez que se visualiza el tema.

7.16.2 Utilizacin de macros en hiperenlaces


Y ahora lo mejor de todo. Es posible definir un hiperenlace de modo
que al pulsar sobre l no saltamos a otro tema del fichero de ayuda,
sino que se ejecuta una accin (por ejemplo tocar un fichero de
sonido). Esto se consigue asignando al hiperenlace un macro o una
llamada a una funcin registrada. Para ello, n lugar de indicar una
cadena de contexto como texto oculto dentro del hiperenlace, se
indica un carcter exclamacin (!) y el macro o la serie de macros
(separados por punto y coma) que se desean ejecutar.
7.16.3 Macros Disponibles en ficheros de ayuda
About()
Muestra la ventana de ayuda "Acerca de"
AddAccelerator(tecla, estado, "macro...")
Asigna un macro a una pulsacin de teclas. Los parmetros
son:
Tecla
Un valor de tecla virtual de windows.

Estado
Una valor de tres bits en el que el bit 0 representa las
maysculas, el 1 el Control y el 2 el Alt. Si la tecla est
pulsada, el bit est activado, si no est desactivado
Macro
Es un macro o serie de macros a ejecutar encerrados entre
comillas dobles. Si hay ms de un macro, es necesario
separarlos por puntos y comas (;)
Puede ser abreviado como AA

171

Programacin Windows

Introduccin a FIVEWIN

Annotate()
Muestra el dialogo de anotaciones.
AppendItem("menu-id", "item-id", "item-name", "macro")
Aade un item a un men creado mediante el macro
InserMenu. Sus parmetros son:
menu-id
Nombre utilizado en el macro InsertMenu para crear un men.
Debe aparecer entre comillas dobles.
item-id
Especifica el nombre (identificador) que el sistema de ayuda
usa internamente para identificar el item del men
item-name
Es el texto que aparece dentro del men. Hay que escribirlo
entre comillas. Dentro de las comillas se puede utilizar el
carcter & para indicar el acelerador utilizado por el macro.
macro
Es el macro a ejecutar al seleccionar el item. Debe aparecer
entrecomillado. Mltiples macros se separa por puntos y
coma.
Si se aplica en una ventana secundaria es ignorado.
Si el acelerador entra en conflicto con otra tecla en los mens,
el sistema de ayuda da un error y no aade el item.
Back()
Vuelve a mostrar el tema anterior dentro de la lista de temas
vistos.
BookmarkDefine()
Muestra el dialogo del definir marcadores del sistema de
ayuda. Si se coloca en un popup, el marcador se asocia con
el tema desde el que se llam al pop-up.
BookmarkMore()
Muestra el cuadro de dialogo de "mas marcadores" que
aparece cuando hay ms de nueve marcadores definidos.
BrowseButtons()
Coloca los botones de secuencias dentro de la barra de
botones de la ayuda.
Si este macro es invocado desde una ventana secundaria es
ignorado.
ChangeButtonBinding("button-id", "button-macro")
Cambia la accin de un botn definido mediante el macro
CreateButton.
Los parmetros son:
button-id
Especifica el identificador del botn para botones
creados mediante CreateButton, o en el caso de

172

Programacin Windows

Introduccin a FIVEWIN

botones standard de windows, uno de los siguientes


identificadores:
BTN_CONTENTS
BTN_SEARCH
BTN_BACK
BTN_HISTORY
BTN_PREVIOUS
BTN_NEXT
(secuencia)

Botn de contenidos
Botn de bsqueda
Botn de Atrs
Botn de historia
Botn de anterior (secuencia)
Botn
de
siguiente

button-macro
Macro que se asigna al botn
Si el macro se ejecuta desde una ventana secundaria es
ignorado.
El macro ChangeButtonBinding puede ser abreviado como
CBB.
ChangeItemBinding("item-id", "item-macro")
Cambia el macro asociado a un item de men. Sus
parmetros son:
item-id
Identifica el item creado mediante el macro
AppendItem
item-macro
El macro a ejecutar cuando se selecciona el item.
Si es ejecutado desde una ventana secundaria no tiene
efecto.
Puede ser abreviado como CIB
CheckItem("item-id")
Pone una marca al lado del item de un men. Los parmetros
son:
item-id
Identificador del item
Puede ser abreviado como CI

CloseWindow("window-name")
Cierra una ventana secundaria o la ventana principal de la
ayuda. Los parmetros son:
window-name
Nombre de la ventana a cerrar. El nombre "main" esta
reservado para la ventana principal. Para las ventanas
secundarias el nombre est definido en la seccin
[WINDOWS]

173

Programacin Windows

Introduccin a FIVEWIN

Contents()
Salta a la pantalla de contenidos del fichero de ayuda actual
CopyDialog()
Muestra el cuadro de dialogo de Copiar del men de Editar
CopyTopic()
Copia todo el texto del tema actual en el portapapeles
CreateButton("button-id", "name", "macro")
Aade un nuevo botn a la barra de botones. Los parmetros
son:
button-id
Especifica el nombre que el sistema de ayuda utiliza
internamente para identificar el botn
name
Especifica el texto que aparece en el botn. Se puede
definir un acelerador mediante el uso del carcter &
en el nombre. La longitud mxima es de 29
caracteres.
macro
Es el macro asignado al botn. Macros mltiples
deben ser separados mediante puntos y comas.
El sistema de ayuda permite un mximo de 16 botones
personalizados, y 22 botones incluyendo los standard.
Es ignorado si se ejecuta desde una ventana secundaria.
Puede ser abreviado como CB
DeleteItem("item-id")
Elimina un item de un men. Los parmetros son:
item-id
El identificador del item creado mediante AppendItem.
Este macro es ignorado si se ejecuta desde una
ventana secundaria.
DeleteMark("marker-text")
Elimina un marcador de texto creado mediante el macro
SaveMark. Los parmetros son:

marker-text
Es el identificador del marcador
Si el marcador no existe, el sistema de ayuda muestra
un error de elemento no encontrado.
DestroyButton("button-id")

174

Programacin Windows

Introduccin a FIVEWIN

Elimina un botn creado mediante el macro CreateButton. Los


parmetros son:
button-id
Identificador del botn
Este macro es ignorado si se ejecuta desde una
ventana secundaria.
El identificador el botn no puede ser uno de los
identificadores de botones standard.
DisableButton("button-id")
Deshabilita un botn impidiendo que pueda ser ejecutado. Los
parmetros son:
button-id
Identificador del botn
Este macro es ignorado si se ejecuta desde una
ventana secundaria.
Puede ser abreviado como DB
DisableITem("item-id")
Deshabilita un item de un men. Los parmetros son:
item-id
Identificador del item
Es ignorado si se ejecuta desde una ventana
secundaria.
Puede ser abreviado como DI
EnableButton("button.id")
Activa un botn de la barra de botones del sistema de ayuda.
Los parmetros son:
button-id
Identificador del botn
Este macro es ignorado si se ejecuta desde una ventana
secundaria.
Puede ser abreviado como EB
EnableItem("item-id")
Activa un item de un men. Los parmetros son:
item-id
Identificador del item
Es ignorado si se ejecuta desde una ventana secundaria.
Puede ser abreviado como EI
ExecProgram("command-line", display-state)

175

Programacin Windows

Introduccin a FIVEWIN

Ejecuta un programa externo al visualizador de ayudas. Los


parmetros son:
command-line
Especifica la linea de comandos de la aplicacin que
va a ser ejecutada.
display-state
Indica como se mostrar la aplicacin al arrancarse.
Los valores son:
0
Normal
1
Minimized
2
Maximized
Puede ser abreviado como EP
Exit()
Sale del sistema de ayudas. Tiene la misma funcin que la
opcin Salir del men de fichero
FileOpen()
Muestra el dialogo del Abrir Fichero del men de fichero.
FocusWindow("window-name")
Cambia el foco de una ventana a otra. Los parmetros son:
window-name
Nombre de la ventana que va a obtener el foco.
GoToMark("marker-text")
Salta a un marcador generado mediante el macro SaveMark.
Los parametros son:
marker-text
El identificador del marcador.
HelpOn()
Abre el fichero de ayuda sobre la ayuda de Windows
HelpOnTop()
Hace que la ventana de ayuda permanezca siempre sobre el
resto de las ventanas.
History()
Muestra el cuadro de dialogo de temas recorridos (history =
historia)
IfThen(IsMark("marker-text"), "macro")
Ejecuta un macro si un determinado marcador de texto existe.
Los parametros son:
marker-text
Identificador del marcador de texto creado mediante
SaveMark

176

Programacin Windows

Introduccin a FIVEWIN

macro
Macro que ha de ejecutarse en el caso de que el
marcador exista. Macros multiples han de separarse
con puntos y coma.
IfThenElse(IsMark("marker-text"), "macro1", "macro2")
Ejecuta un macro si un determinado marcador de texto existe.
En el caso de que no exista ejecuta un macro diferente. Los
parametros son:
marker-text
Identificador del marcador
macro1
Macro que se ejecuta si el marcador existe. Macros
multiples han de separarse con puntos y coma.
macro2
Macro que se ejecuta si el marcador no existe.
Macros multiples han de separarse con puntos y
coma.
InsertItem("menu-id", "item-id", "item-name", "macro", position)
Inserta un item en un lugar determiado de un men existente.
El men puede haber sido creado mediante InsertMenu o ser
uno de los mens standard de Windows. Los parametros son:
menu-id
Identificador del menu. Puede haber sido creado con
InsertMenu o bien ser uno de los siguientes:
MNU_FILE
Men de fichero
MNU_EDIT
Men de edicin
MNU_BOOKMARK
Men de marcadores
MNU_HELPON Men de ayuda
item-id
Identificador que utiliza el sistema de ayuda para
identificar internamente al item.
item-name
Texto que aparece como item del men. Puede
contener un acelerador mediante el uso del caracter
&.
macro
Es el macro que se ejecutar al seleccionar el item.
Macros multiples han de separarse mediante puntos y
coma.
position
Especifica la posicin del item dentro del men. La
primera posicin es la 0
Si se aplica en una ventana secundaria es ignorado.

177

Programacin Windows

Introduccin a FIVEWIN

Si el acelerador entra en conflicto con otra tecla en los


mens, el sistema de ayuda da un error y no aade el
item.
InsertMenu("menu-id", "menu-name", menu-position)
Aade un men al sistema de ayuda. Los parametros son:
menu-id
Identificador interno para el men
menu-name
Nombre del men. Permite la utilizacin de
aceleradores mediante el caracter &
menu-position
Indica la posicin del men. El primer men es el 0
Este macro se ignora si es ejecutado desde una
ventana secundaria.
IsMark("marker-text")
Comprueba la existencia de un marcador de texto. Se utiliza
en conjuncin con los macros IfThen y IfThenElse.
JumpContents("file")
Salta a la tabla de contenidos del fichero de ayuda indicado
como paraametro.
JumpContext("filename", context-number)
Salta a un tema de un fichero de ayuda determinado. Los
parametros son:
filename
El nombre del fichero de ayuda. Si no se encuentra el
fichero, no se ejecuta el salto y se muestra un
mensaje de error.
context-number
Especifica un numero de contexto de un tema del
fichero de destino. Este numero debe haber sido
creado en la seccin [MAP] del fichero de destino. Si
no se encuentra el identificador se salta a la pantalla
de contenidos y se muestra un error.
Puede ser abreviado como JC
JumpHelpOn()
Salta a la pgina de contenidos del fichero de ayuda sobre la
ayuda.

JumpId("filename", "context-string")
Salta a un tema indicado de un fichero de ayuda externo. Los
parametros son:
filename

178

Programacin Windows

Introduccin a FIVEWIN

Fichero externo de ayuda. Si no se encuentra no se


produce el salto.
context-string
Cadena de contexto del tema al que queremos saltar.
Puede ser abreviado como JI
JumpKeyword("filename", "keyword")
Salta a otro fichero de ayuda, busca una palabra clave y
muestra el primer tema que contiene esa palabra. Los
parametros son:
filename
Nombre del fichero de ayuda. Si no se encuentra no
se efectua el salto y se produce un mensaje de error.
keyword
Palabra clave que buscamos.
Puede ser abreviado como JK
Next()
Muestra el siguiente tema dentro de una secuencia
Not(IsMark("marker-text"))
Invierte el resultado del macro IsMark(...)
PopupContext("filename", context-number)
Muestra en una ventana popup un tema de otro fichero de
ayuda, localizandolo por numero de contexto. Los parametros
son:
filename
Nombre del fchero de ayuda
context-number
Numero de contexto. Tiene que haber sido definido en
la seccin [MAP] del fichero al que se salta.
Puede ser abreviado como PC
PopupId("filename", "context-string")
Muestra en una ventana popup un tema de otro fichero de
ayuda, localizandolo por cadena de contexto. Los parametros
son:
filename
Nombre del fchero de ayuda
context-string
Cadena de contexto.
Puede ser abreviado como PI
PositionWindow(x, y, Ancho, Alto, Tamao, "nombre")
Cambia el tamao de una ventana de ayuda. Ver creacin de
ventanas secundarias para ms informacin.

179

Programacin Windows

Introduccin a FIVEWIN

Prev()
Muestra el tema anterior dentro de una secuencia.
Print()
Imprime el tema actual
PrinterSetup()
Permite configurar la impresora
RegisterRoutine("DLL-name", "function-name", "format-spec")
Registra una rutina externa residente en una DLL. Se utilizan
igual que los macros. Los parametros son:
DLL-Name
Nombre del fichero DLL en el que reside la rutina.
function-name
Nombre de la funcin
format-spec
Es una cadena que especifica el tipo de los
parametros pasados a la funcin. Los caracteres
validos son:
u
U
i
I
s
S
v

unsigned short (WORD)


unsigned long (DWORD)
short int
int
near char * (PSTR)
far char * (LPSTR)
void

Puede ser abreviado como RR


RemoveAccelerator(key, shift-state)
Elimina un acelarador de teclado. Ver AddAccelerator para
ms informacin.
SaveMark("marker-text")
Graba un marcador de textos con la informacin sobre el
fichero y el tema actual. Los parametros son:
marker-text
Nombre del marcador que identifica la localizacin del tema.
Al salir del sistema de ayuda todos los marcadores son borrados.
Search()
Activa el cuadro de dialogo de busqueda de palabras claves
SetContents("filename", context-number)
Designa un determinado tema como pgina de contenidos
dentro de un fichero de ayuda. Los parametros son:
filename

180

Programacin Windows

Introduccin a FIVEWIN

Nombre del fichero de ayuda


context-number
Nmero de contexto del tema. Debe haber sido creado en la
seccin [MAP]
SetHelpOnFile("filename")
Fija cual ser el fichero que se mostrar cuado se solicite
ayuda sobre como usar la ayuda.
UncheckItem("item-id")
Elimina la marca de un item de un men. Los parametros son:
item-id
Identificador interno para el item.
Puede ser abreviado como UI

181

Programacin Windows

Introduccin a FIVEWIN

PROGRAMAS PROPUESTOS

1. Creacin de un fichero de ayuda. El tema propuesto es una


ayuda para el comando ATTRIB del sistema operativo MS-DOS.
Los ficheros .DOC .RTF y .HPJ se suministran en los disquetes
adjuntos.
#

ATTRIB - Comando y Sintaxis

Presenta o modifica los indicadores de archivo.


Este comando presenta, establece o elimina los indicadores de
slo-lectura, lectura/escritura, sistema y oculto asignados a los
archivos o directorios.
Sintaxis
ATTRIB [+R|-R] [+A|-A] [+S|-S] [+H|H][[unidad:][ruta]nombrearchivo]
[/S]
Para presentar todos los indicadores de todos los archivos del
directorio actual, use la siguiente sintaxis:
ATTRIB
Parametros y Modificadores
Ejemplos
Notas
Creacin de ficheros de Ayuda

attrib_indice

182

Programacin Windows

Introduccin a FIVEWIN

Parametros y Modificadores

Parmetro
[unidad:][ruta]nombrearchivo
Especifica la posicin y el nombre del archivo o los archivos
que desee procesar.
Modificadores
+R
Establece el indicador de archivo de slo-lectura.
-R
Elimina el indicador de archivo de slo-lectura.
+A
Establece el indicador de lectura/escritura.
-A
Elimina el indicador de lectura/escritura.
+S
Establece el archivo como un archivo de sistema.
-S
Elimina el indicador de archivo de sistema.
+H
Establece el archivo como un archivo oculto.
-H
Elimina el indicador de archivo oculto.
/S
Procesa archivos en el directorio actual y en todos sus
subdirectorios.
Ejemplos
Notas
Sintaxis

attrib_parametros

183

Programacin Windows

Introduccin a FIVEWIN

ATTRIB - Ejemplos

Para presentar los indicadores de un archivo llamado NUEVO86,


localizado en la unidad actual, deber escribir el siguiente
comando:
attrib nuevo86
Para asignar el indicador slo-lectura al archivo INFORME.TXT,
escriba el siguiente comando:
attrib +r informe.txt
Para retirar el indicador de slo-lectura de los archivos del
directorio \CLIENTE\MONICA de un disquete en la unidad B y de
los archivos en los subdirectorios \CLIENTE\MONICA, escriba el
siguiente comando:
attrib -r b:\cliente\monica\*.* /s
Como ltimo ejemplo, supongamos que desee dar a un asociado
un disquete que contenga todos los archivos del directorio
predeterminado de la unidad A, con excepcin de los archivos
que tengan la extensin .BAK. Como <XCOPY> slo puede
copiar los archivos marcados con el indicador de archivo de
lectura/escritura, deber establecer el indicador de archivo de
lectura/escritura para los archivos que desee copiar. Para hacer
esto, usara los siguientes dos comandos para establecer el
indicador de archivo de lectura/escritura para todos los archivos
de la unidad A y despus eliminara el indicador para aquellos
archivos que tuviesen la extensin .BAK:
attrib +a a:*
attrib -a a:*.bak
Despus use el comando XCOPY para copiar los archivos del
disquete de la unidad A en el disquete de la unidad B. El
modificador /A en el siguiente comando hace que XCOPY slo
copie aquellos archivos marcados con el indicador de archivo de
lectura/escritura:

attrib_ejemplos

184

Programacin Windows

Introduccin a FIVEWIN

xcopy a: b: /a
Si desea que XCOPY elimine el indicador de archivo de
lectura/escritura despus de copiar cada archivo, use el
modificador /M en lugar del modificador /A, como se muestra en
el siguiente ejemplo:
xcopy a: b: /m
Notas
Sintaxis

185

Programacin Windows

Introduccin a FIVEWIN

ATTRIB--Notas

Combinacin de los indicadores oculto y de sistema


Si un archivo tiene establecidos tanto indicadores de oculto como
de sistema, podr eliminar los dos indicadores con un solo
comando ATTRIB. Por ejemplo, para borrar los indicadores
Oculto y Sistema del archivo GRABAR.TXT, tendra que escribir
lo siguiente:
ATTRIB -S -H GRABAR.TXT
Uso de ATTRIB con grupos de archivos
Puede usar caracteres comodines (? y *) con el parmetro
nombrearchivo para presentar o modificar los indicadores de un
grupo de archivos. Si un archivo tiene establecido el indicador de
oculto o de sistema, deber eliminar dicho indicador antes de
poder cambiar otros indicadores de dicho archivo.
Cambiar los indicadores de un directorio
Puede presentar o cambiar los indicadores de un directorio. Para
poder utilizar ATTRIB con un directorio, deber especificar
explcitamente el nombre del directorio. No podr usar
comodines para trabajar con directorios. Por ejemplo, para
ocultar el directorio C:\SECRETO, tendra que escribir lo
siguiente:
ATTRIB +H C:\SECRETO
El siguiente comando afectar slo a archivos y no a directorios:
ATTRIB +H C:*.*
Mostrar indicadores de archivo
El indicador de lectura/escritura (a) se utiliza para marcar
archivos que hayan cambiado desde la ltima copia de
seguridad. Los comandos MSBACKUP, RESTORE y XCOPY
utilizan estos indicadores de archivo. Para obtener informacin

attrib_notas

186

Programacin Windows

Introduccin a FIVEWIN

acerca de los indicadores de archivo, consulte los comandos


<MSBACKUP>, <RESTORE> y <XCOPY>.
Ejemplos
Sintaxis

187

Programacin Windows

Introduccin a FIVEWIN

Acerca De....

Fichero de ayuda creada como ejemplo para el manual de


FiveWin
Autores

attrib_acerca_de

188

Programacin Windows

Introduccin a FIVEWIN

#!

Aqu pondriamos las


fotografias

# attrib_autores
! SndPlaySound("carillon.wav",0)

189

Programacin Windows

Introduccin a FIVEWIN

[OPTIONS]
CONTENTS=attrib_indice
TITLE=Fichero de ayuda ATTRIB.COM
COPYRIGHT=Documentacin FiveWin
[CONFIG]
RegisterRoutine("MMSYSTEM.DLL","SndPlaySound","Su")
SndPlaySound("CARILLON.wav",0)
[FILES]
ATTRIB.RTF
[BAGGAGE]
C:\WINDOWS\CARILLON.WAV

190

Programacin Windows

Introduccin a FIVEWIN

#, 153; 159
$, 159
*, 162
;, 160
@, 155
About(), 171
AddAccelerator, 171
ALIAS, 168
Annotate(), 172
AppendItem, 172
Back(), 172
BAGGAGE, 170
BITMAPS, 168
bmc, 158
bml, 158
bmr, 158
BMROOT, 158; 164
BookmarkDefine(), 172
BookmarkMore(), 172
BrowseButtons(), 162; 173
BUILD, 164
build tags, 162
BUILDTAGS, 167
cadenas de contexto, 153
ChangeButtonBinding, 173
ChangeItemBinding, 173
CheckItem, 173
CloseWindow("window-name"), 174
COMPRESS, 164
CONFIG, 162; 168
CONTENTS, 156; 165
Contents(), 174
CopyDialog(), 174
COPYRIGHT, 165
CopyTopic(), 174
Creacin de secuencias, 161
CreateButton, 174
DeleteItem, 174
DeleteMark, 175
DestroyButton, 175
DisableButton, 175
DisableITem, 175
EnableButton, 175
EnableItem, 176
ERRORLOG, 165
etiquetas de construccin, 162
ExecProgram, 176
Exit(), 176
fichero de proyecto, 156
ficheros de proyecto, 164
FileOpen, 176

191

Programacin Windows

Introduccin a FIVEWIN

FILES, 156; 167


FocusWindow, 176
FORCEFONT, 165
GoToMark, 176
HC31, 157
HC31.EXE, 150
HelpOn, 176
HelpOnTop, 176
Hiperenlaces, 153
hiperenlaces, 154
History, 177
HLP, 155
HPJ, 156; 164
ICON, 166
IfThen, 177
IfThenElse, 177
InsertItem, 177
InsertMenu, 178
IsMark, 178
JumpContents, 178
JumpContext, 178
JumpHelpOn, 179
JumpId, 179
JumpKeyword, 179
K, 160
Macros Disponibles, 171
macros en ficheros de proyectos, 171
macros en hiperenlaces, 171
macros en temas, 171
MAP, 168
MAPFONTSIZE, 166
Next, 179
Not, 179
OLDKEYPHRASE, 166
OPTCDROM, 166
OPTIONS, 156; 163; 164
PopupContext, 179
PopupId, 179
PositionWindow, 180
Prev, 180
Print, 180
PrinterSetup, 180
RegisterRoutine, 180
RemoveAccelerator, 180
REPORT, 166
Rich Text Format, 150
ROOT, 156; 167
RTF, 150
SaveMark, 180
Search, 181
SetContents, 181
SetHelpOnFile, 181

192

Programacin Windows

Introduccin a FIVEWIN

TITLE, 156; 167


UncheckItem, 181
WARNING, 167
WINDOWS, 169
WINHELP.EXE, 150
Word, 150

193

#, 153; 159
$, 160
*, 162
;, 160
@, 155
3D, 47
3DLOOK, 47
About(), 172
ACCELERATOR, 45
ACTION, 45
Activar ventanas, 26
ACTIVATE DIALOG, 59
ACTIVATE MENU, 48
AddAccelerator, 172
ADJUST, 47; 66
ALIAS, 169
Annotate(), 172
AppendItem, 172
Auto horizontal, 102
Back(), 173
BAGGAGE, 171
Barras de Scroll, 98
BITMAP, 71
BITMAPS, 99; 168
Bitmaps, 71; 111
bmc, 158
bml, 158
BMP, 45
bmr, 158
BMROOT, 158; 164
BookmarkDefine(), 173
BookmarkMore(), 173
BORDER, 26
botones con dibujo, 95
BOX, 62
BrowseButtons(), 162; 173
BUILD, 164
build tags, 162
BUILDTAGS, 167
BUTTON, 66; 67
BUTTONBAR, 47
BUTTONSIZE, 47
BWCC.DLL, 96
Cabeceras, 127
cadenas de contexto, 153
Cajas de dilogo, 7
CAPTION, 127

CENTER, 63
ChangeButtonBinding, 173
ChangeItemBinding, 173
Character underline, 105
CHECK, 44
Check Box, 65; 102
CHECKBOX, 65
CHECKED, 44
CheckItem, 174
Clase TWindow, 29
CLASS, 75
CloseWindow("window-name"), 174
COLSIZES, 110
columnas, 128
Comandos preprocesados, 5
COMBOBOX, 69
ComboBox, 69
Combobox, 101
COMPRESS, 165
CONFIG, 162; 168
constructor, 4
CONTENTS, 156; 165
Contents(), 174
Controles VBX, 74
Convert OEM, 108
CopyDialog(), 174
COPYRIGHT, 165
CopyTopic(), 174
Creacin de secuencias, 161
Creacin de un informe, 125
CreateButton, 174
CURSOR, 47; 115
Cursores, 72
cursores, 112
DATA, 128
DEFAULT, 67
DEFINE BRUSH, 25
DEFINE BUTTON, 47
DEFINE BUTTONBAR, 47
DEFINE CURSOR, 47; 72; 115
DEFINE DIALOG, 58
DEFINE ICON, 25; 114
DEFINE WINDOW, 23
DeleteItem, 175
DeleteMark, 175
DestroyButton, 175
DisableButton, 175
DISABLED, 44
DisableITem, 175
DISK, 45
DLL, 58; 90
DOWN, 47; 73
Drop Down, 101
Drop Down List, 101
Edit Text, 105
Edit text, 63
EJECT, 135
EnableButton, 176
EnableItem, 176

ENDSYSMENU, 48
ERRORLOG, 165
etiquetas de construccin, 162
eventos, 2; 27
ExecProgram, 176
Exit(), 176
Extend Select, 101
fichero de proyecto, 156
ficheros de proyecto, 164
FIELDSIZES, 110
FILE, 45
FILENAME, 45
FileOpen, 176
FILES, 99; 156; 167
Fixed, 101
FocusWindow, 176
FONT, 135
FOOTER, 135
FOR, 133; 135
FORCEFONT, 165
generador de informes, 123
GET, 63; 105
GoToMark, 177
GRID, 132
GROUP, 48
GROUP ON, 134
Has String, 101
HC31, 157
HC31.EXE, 150
HEAD, 110
HEADER, 110; 135
HEADERS, 110
HELP, 45
HelpOn, 177
HelpOnTop, 177
herencia, 3
Hiperenlaces, 153
hiperenlaces, 154
History, 177
HLP, 155
HORIZONTAL, 73
HPJ, 156; 164
HSCROLL, 26
ICON, 70; 166
Iconos, 70
iconos, 112
identificador, 93
IfThen, 177
IfThenElse, 177
INCLUDE, 5
Informes agrupados y sumarios, 134
InsertItem, 178
InsertMenu, 178
instancia, 3
Integral Height, 100
Integral height, 102
InvertRect, 49
IsMark, 178
ITEMS, 68; 69

JumpContents, 179
JumpContext, 179
JumpHelpOn, 179
JumpId, 179
JumpKeyword, 179
K, 160
Keep selection, 108
lDesign, 109
LEFT, 47
LIBRARY, 58
Listbox, 68; 99
Macros Disponibles, 172
macros en ficheros de proyectos, 171
macros en hiperenlaces, 171
macros en temas, 171
MAP, 168
MAPFONTSIZE, 166
MARK, 44
MEMO, 64; 106
MENU, 24
Men, 7
MENUITEMS, 42; 43
MENUSYS, 48
Mtodo constructor, 4
mtodos, 3
Modales, 57
Multi Column, 100
MULTILINE, 64; 106
Multiple line, 107
Multiple Select, 100
NAME, 45; 47
Nantucket, 6
New, 91
Next, 179
NO MAXIMIZE, 26
NO MODIFY, 64; 106
NO TITLE, 26
No Wrap, 105
No-Modales, 57
NOBORDER, 71
NOCAPTION, 26
NOICONIZE, 26
NOMINIMIZE, 26
NOMODAL, 59
nOr, 109
NOSYSMENU, 26
Not, 180
Notify, 100
NOWAIT, 59
nStyle, 109
Objects, 4
Objetos, 3
OEM conversion, 102
OLDKEYPHRASE, 166
ON [ LEFT ] CLICK, 59
ON [ LEFT ] DBLCLICK, 68
ON CHANGE, 64; 68; 69; 137
ON CLICK, 64; 65
ON DOWN, 28; 73

ON DROPFILES, 28
ON END, 136
ON ENDGROUP, 136
ON ENDLINE, 137
ON ENDPAGE, 136
ON INIT, 27; 59; 136
ON KEYDOWN, 27
ON LEFT, 28
ON LEFT CLICK, 27
ON MOVE, 27; 59
ON PAGEDOWN, 28; 73
ON PAGELEFT, 28
ON PAGERIGHT, 28
ON PAGEUP, 28; 73
ON PAINT, 27; 59
ON RESIZE, 27
ON RIGHT, 28
ON RIGHT CLICK, 27; 59
ON STARTGROUP, 136
ON STARTLINE, 136
ON STARTPAGE, 136
ON THUMBPOS, 73
ON UP, 27; 73
OOPS, 1
Open project, 91
OPTCDROM, 166
OPTIONS, 156; 163; 164
Owner drawing, 101
PAGEDOWN, 73
PAGESTEP, 73
PAGEUP, 73
Pass KeyBoard Input, 100
Password, 108
PEN, 132
PICTURE, 61; 129
pies de pgina, 127
Pop-Up, 41
PopupContext, 180
PopupId, 180
posicin de las columnas, 129
PositionWindow, 180
preprocesador, 5
Prev, 180
PREVIEW, 126
Print, 180
PrinterSetup, 180
PROMPT, 44
PROMPTS, 68; 69
Pull-down, 7
PUSHBUTTON, 92
Pushbutton, 66
RADIO, 64
Radio botones, 96
RAISED, 62
RANGE, 73
RC, 90
Read Only, 107
READONLY, 64; 106
REDEFINE BITMAP, 111

REDEFINE BUTTON, 93
REDEFINE CHECKBOX, 103
REDEFINE COMBOBOX, 102
REDEFINE GET, 105
REDEFINE LISTBOX, 99; 109
REDEFINE MENUSYS, 48
REDEFINE RADIO, 97
REDEFINE SAY, 104
REDEFINE SCROLLBAR, 98
RegisterRoutine, 180
RemoveAccelerator, 181
REPORT, 166
RESOURCE, RESNAME, 45
Rich Text Format, 150
RIGHT, 47; 61; 63
ROOT, 156; 167
RTF, 150
SaveMark, 181
SAY, 61; 104
SCROLL, 111
Scroll Bar, 72
SCROLLBAR, 73
Scrollbar always, 101
SDK, 2
Search, 181
SELECT, 110
SET RESOURCES TO, 90
SetContents, 181
SetHelpOnFile, 181
SHADED, 62
SHADOW, 62
Simple, 101
Single line, 107
SIZE, 47; 73; 130
SIZEBUTTON, 47
SIZES, 110
Sort, 100
Sorted, 101
Static Text, 61; 104
Style, 109; 112
sumarios, 134
SUMMARY, 135
SYSMENU, 45
TDialog, 75
TEXT, 64; 106
Tipos de letras en las columnas, 130
TITLE, 129; 156; 167
ttulo de las columnas, 129
ttulos, 127
TO FILE, 126
TO PRINTER, 126
TOP, 47
TOTAL, 133
Totales en las columnas, 133
TRColumn, 141
TReport, 137
TRGroup, 143
TRLine, 140
TWBrowses, 108

UncheckItem, 181
UP, 73
VAR, 63; 64
Variable, 101
variables, 3
variables de instancia, 3
VBX, 59; 74
ventana, 21
Ventanas MDI, 28
ventanas MDI, 21
VERTICAL, 73
Vertical Scroll, 101
Vertical scroll always, 102
Visual Basic, 59
VSCROLL, 26
Want return, 107
WARNING, 167
WHILE, 135
WinApi, 6
WINDOWS, 1; 169
WINHELP.EXE, 150
WinHelp.Exe, 93
Word, 150
WS_BORDER, 109
WS_CHILD, 109
WS_HSCROLL, 109
WS_TABSTOP, 109
WS_THICKFRAME, 109
WS_VISIBLE, 109
WS_VSCROLL, 109

Potrebbero piacerti anche