El documento proporciona una lista de trucos y consejos para PowerBuilder, incluyendo cómo crear un groupbox en una datawindow, establecer texto inclinado en una datawindow, y llamar eventos de diferentes maneras. También discute temas como usar el objeto DWObject para acceder a atributos de datawindow, eliminar columnas invisibles de una datawindow, y usar la opción "Retrieve as Needed" para mejorar el rendimiento.
1. Trucos y consejos - La página de JM Page 1 of 7
Página principal Programación PowerBuilder Volver
Trucos y consejos para PowerBuilder
Haz clic aquí si no ves correctamente la página.
Esta es mi lista de trucos que he ido recopilando durante los tres años que trabajé con PowerBuilder.
Algunos de ellos los los he encontrado en las (pocas) páginas que hay en la red sobre PowerBuilder, y otros
son de mi cosecha.
Espero que os sea de interés, y ya sabéis que si queréis publicar vuestro propio truco, no tenéis más que
enviarlo a mi dirección de mail.
Crear un Groupbox en Datawindow
Categoría Datawindow
Nivel Básico
Autor JM
En muchas ocasiones se da la necesidad de relacionar distintos objetos de una datawindow
FreeForm de manera que se agrupen visualmente. La solución rápida pasa por crear un
rectángulo, pero esto nos da un aspecto bastante raro, ya que no admite el efecto 3D. Para
crear este efecto, podremos hacerlo con dos rectángulos, el primero transparente y con la línea
gris oscuro, y el segundo del mismo tamaño con la línea blanca. Después podremos darle
efecto 3D Raised si situamos el rectángulo blanco 4 unidades por más a la izquierda y arriba, o
efecto 3D Lowered si situamos el rectángulo blanco 4 unidades por más abajo y a la derecha.
Aseguraros que el rectángulo blanco esta por detrás del gris, utilizando la opción "Send to
Back".
Enviar por correo Comentar con el autor
Texto inclinado en Datawindow
Categoría Datawindow
Nivel Básico
Autor JM
Los objetos "Text" de las datawindows tienen un atributo que nos permite establecer la
inclinación del texto: "font.escapement". Para inclinar 45 grados debemos establecer un valor
de 450. El único inconveniente es que esta inclinación no se verá en diseño ni durante la
ejecución en modo normal, sino que sólo será visible en modo "Preview".
Enviar por correo Comentar con el autor
http://www.lawebdejm.com/prog/pb/trucos_pb.htm 04/12/2008
2. Trucos y consejos - La página de JM Page 2 of 7
Formas de llamar a un evento
Categoría PowerScript
Nivel Alto
Autor JM
Cuando necesitamos lanzar un evento manualmente, hasta la versión 4 teníamos una sola
opción, utilizando las funciones TriggerEvent y PostEvent:
Objeto.TriggerEvent( evento, wParam, lParam )
Objeto.PostEvent( evento, wParam, lParam )
A partir de la versión 5, se nos ofrece una nueva sintaxis, para soportar el paso de parámetros
a eventos:
La sintaxis general es la siguiente:
Objeto.Tipo Comprobacion Momento Nombre( Argumentos )
Cada uno de los elementos tiene el siguiente significado:
- Objeto:
El objeto del cual queremos invocar el evento. Se puede omitir, asumiendo el objeto "this".
- Tipo:
Indica a qué vamos a llamar: FUNCTION o EVENT. Si se omite, se utilizará la palabra clase
FUNCTION.
- Comprobacion:
Indica en qué momento se comprobará la existencia de esa función o evento, o dicho de otro
modo: en tiempo de diseño (STATIC) o en tiempo de ejecución (DYNAMIC). Hay que tener en
cuenta que si llamamos con DYNAMIC, la comprobación se hará durante la ejecución, por lo
que será mucho más lento que STATIC. Siempre que sea posible, hay que llamar de forma
estática. Por defecto se considera STATIC.
- Momento:
Indica si se llamará la función o evento en el momento actual (TRIGGER) o al final de la cola
de mensajes (POST). Por defecto se utilizará TRIGGER.
- Nombre:
El nombre de evento o función a llamar.
- Argumentos:
Argumentos necesario en la llamada.
Ejemplos:
// esto nos permite llamar a la función SetFocus pero que se ejecute al final
// de la cadena de eventos en que estamos. Esta técnica es muy útil
// para pasar el foco a un control, y asegurarnos que ninguna
// instrucción posterior va a volver a pasar el foco a otro control.
dw_maestro.POST SetFocus()
// esta otra llamada lo que nos permite es pasar el foco a un control
// desconocido en tiempo de diseño, concretamente al primer control
// que haya en el "tab_1". Si este control, contiene la función "SetFocus()",
// se efectuará la llamada, si no es así, se producirá un error de ejecución.
tab_1.control[1].Dynamic SetFocus()
// ahora lo que hacemos es llamar estáticamente al evento "ue_evento"
// del control actual (this). Si este evento no existe, se producirá un error
// en la compilación del script durante el diseño.
Event ue_evento("el parámetro")
http://www.lawebdejm.com/prog/pb/trucos_pb.htm 04/12/2008
3. Trucos y consejos - La página de JM Page 3 of 7
// hace lo mismo que el ejemplo anterior, pero ejecutando el evento
// "ue_pegar" de "cb_aceptar" al final de la cola de mensajes.
// Además, la existencia de este evento se comprobará durante la ejecución,
// no generando ningún error si no existiese (al contrario que las funciones).
// Este ejemplo concreto, es muy útil para lanzar eventos a todos los controles
// de una ventana (por ejemplo, el evento "pegar") y que si el control lo soporta,
// reaccione al evento (si no lo soporta, no ocurrirá nada).
cb_aceptar.Event Dynamic Post ue_pegar("el parámetro")
Enviar por correo Comentar con el autor
Describe vs Object
Categoría Datawindow
Nivel Medio - bajo
Autor JM
Antes de la versión 5, la forma de acceder y manipular a un atributo de los objetos de
datawindow era con las funciones "Describe" y "Modify".
Su uso es muy flexible, pero a veces complicado, sobre todo cuando teníamos que meter
cadenas dentro de cadenas a varios niveles.
A partir de la versión 5, se nos ofrece una nueva forma de acceder: a través del objeto
"DWObject".
Este objeto, nos permite acceder a los atributos, utilizando la sintaxis normal de PowerScript,
es decir, es operador ".".
Por ejemplo, este describe:
long ll_color
ll_color = Integer( dw_1.Describe("texto.background.color") )
ahora lo podemos escribir como esto:
long ll_color
ll_color = dw_1.object.texto.background.color
Mucho más sencillo ¿no?. Además, al compilar el script, se hará una pequeña comprobación
(que el objeto "texto" exista, que la propiedad "background" sea correcta, etc.), y se nos
informará con un error si algo ha ido mal.
Las funciones "Describe" y "Modify" se siguen manteniendo, y todavía son imprescindibles
para acceder a objetos y/o propiedades que no conocemos sus nombre en tiempo de diseño, o
dicho de otro modo: para construir la expresión de datawindow en tiempo de ejecución.
Enviar por correo Comentar con el autor
Usar el 'Initial Value' para indicar los valores iniciales
Categoría Datawindow
Nivel Básico
Autor JM
http://www.lawebdejm.com/prog/pb/trucos_pb.htm 04/12/2008
4. Trucos y consejos - La página de JM Page 4 of 7
Cuando quieras establecer un valor inicial (o por defecto) a una columna, la mejor solución es
utilizando el atributo "Initial Value" dentro de la ventana "Columns Specifications".
Con esto te asegurarás que cada vez que se inserte una nueva fila, se establecerá el valor
indicado, y el estado de la fila será el correcto.
Incluso puedes modificar este valor inicial a través de un Modify() o del DWObject
correspondiente.
Con esta técnica, puedes evitar escribir los SetItem() y SetItemStatus() cada vez que hagas un
InsertRow(), y la ejecución siempre será mucho más rápida.
Enviar por correo Comentar con el autor
Eliminar columnas invisibles.
Categoría Datawindow
Nivel Básico
Autor JM
Cada vez que hagas una datawindow, puedes eliminar todos los objetos columna que no vayan
a visualizarse, en vez de ponerlos como invisibles.
Es decir, si creas un SELECT con 5 columnas, pero en la datawindow sólo vas a ver una de
ellos, puedes eliminar los 4 objetos columna que te sobran. Incluso si más adelante tienes
pensado hacer GetItem() o SetItem() sobre esas columnas, puedes hacerlo, ya que una cosa es
la columna (que existirá mientras aparezca en la ventana "Columns Specifications") o otra es
el "objeto columna" (que puede existir o no).
Lo único que debes tener en cuenta es que si quieres cambiar el nombre a una columna, debes
cambiarselo al "objeto columna" que la represente. Para asegurarte de cual es el nombre de la
columna, debes ir a la ventana de "Columns Specifications" y allí aparecerá el nombre que
tienes que usar tanto en el GetItem() y SetItem() como en cualquier otra función que haga
referencia al nombre de una columna.
Enviar por correo Comentar con el autor
Uso del 'Retrieve as Needed'
Categoría Datawindow
Nivel Medio - bajo
Autor JM
En ciertas datawindows que recuperan muchos registros, puedes utilizar la propiedad
"Retrieve as Needed" para acelerar esta recuperación.
El uso es muy sencillo: se activa la opción "Rows - Retrieve as Needed" y se mantendrá el
cursos abierto en la base de datos, para ir recuperando los registros conforme se necesitan:
cuando el usuario haga scroll, o nos situemos en una fila con el ScrollToRow().
El principal inconveniente es que si utilizas funciones sumarias en campos calculados, o has
ordenado la datawindow, esa opción no tendrá efecto, ya que en estos casos, es necesario
contar con el conjunto de datos completo.
http://www.lawebdejm.com/prog/pb/trucos_pb.htm 04/12/2008
5. Trucos y consejos - La página de JM Page 5 of 7
Ten en cuenta que en muchas ocasiones, no ahorrarás tiempo, ya que el tiempo que trascurre
desde que recuperas el primer registro hasta el último, no es demasiado grande. En estos
casos, el mayor tiempo se da desde que se lanza la instrucción SELECT, hasta que
recuperamos el primer registro.
Enviar por correo Comentar con el autor
Mover las columnas de una datawindow grid
Categoría Datawindow
Nivel Básico
Autor JM
Cuando se crea una datawindow grid, las columnas aparecen en el mismo orden en que las
hayas dentro del SELECT y aparentemente ese orden no se puede cambiar.
Lo que tienes que hacer el poner la datawindow en "preview" dentro del propio "datawindow
painter", arrastrar la columna que quieras hasta dejarla en su nuevo sitio, y volver de nuevo a
la vista diseño. Verás como la columna mantiene su nueva posición.
Enviar por correo Comentar con el autor
Uso del 'Retrieve Rows to Disk'
Categoría Datawindow
Nivel Medio - bajo
Autor JM
Cuando una datawindow recupera mucho registros (miles), a veces puedes notar como el
disco duro del equipo no para de leer y se ralentiza la recuperación.
Esto es debido a que PB intenta almacenar todas las filas en memoria, y como no caben,
Windows comienza a utilizar la memoria virtual y el archivo de intercambio para obtener más
memoria.
La mejor solución a esto puede ser activar la opción "Rows - Retrieve Rows to Disk", para que
PB cree un archivo temporal donde almacenar estas filas, evitando así que Windows tenga que
aumentar el tamaño del archivo de intercambio.
Enviar por correo Comentar con el autor
Datawindows Tabulares con lineas de Grid
Categoría Datawindow
Nivel Medio
http://www.lawebdejm.com/prog/pb/trucos_pb.htm 04/12/2008
6. Trucos y consejos - La página de JM Page 6 of 7
Autor JM
Es posible crear datawindows de tipo "Tabular" pero que tengan líneas como si fueran de tipo
"Grid".
Para ello debes crear una linea horizontal en la banda detalle, y establecer los atributos "y1" e
"y2" con la expresión "RowHeight() - 2" y en cada una de las líneas verticales, establecer el
atributo "y1" a "0" e "y2" a la expresión "RowHeight() - 1".
Con esto consigues que las líneas se ajusten automaticamente al tamaño del detalle, incluso si
está marcada la opción "Autosize Height".
Enviar por correo Comentar con el autor
Datawindow con barra de título pero que no se pueda mover
Categoría Datawindow
Nivel Alto
Autor JM
Muchas veces, queremos que un objeto datawindow tenga barra de título, pero nos molesta
bastante que el usuario pueda moverlo.
Para evitar esto podemos capturar el mensaje que Windows manda a la datawindow, y
anularlo.
Lo que tienes que hacer es declarar un evento de usuario, mapeandolo con el evento de
sistema "pbm_syscommand", y después, codificar lo siguiente en este nuevo evento:
uint wParam, lParam
wParam = message.wordparm
CHOOSE CASE wParam
CASE 61456, 61458
message.processed = TRUE
message.returnValue = 0
END CHOOSE
Enviar por correo Comentar con el autor
Descripción para el valor nulo de un campo
Categoría Datawindow
Nivel Básico
Autor JM
Cuando se añade una columna con estilo edición "DropDownListBox", se puede indicar el
valor null! en el campo "Data value" y cualquier valor que quieras en el campo "Display
value" (por ejemplo la descripción "Vacío"). Cuando este campo contenga un valor nulo,
http://www.lawebdejm.com/prog/pb/trucos_pb.htm 04/12/2008