Sie sind auf Seite 1von 7

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
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
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
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
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
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
Trucos y consejos - La página de JM Page 7 of 7

aparecerá la descripción que hayamos indicado.


Este truco también sirve para los campos con estilos de edición "CheckBox" y "RadioButton"

Enviar por correo Comentar con el autor

Crear un Datawindow a través de una instrucción SELECT

Categoría Datawindow

Nivel Medio - bajo

Autor Raúl Pacheco Huanca

El siguiente código permite crear un Datawindow mediante una instrucción SELECT. Este
ejemplo permite crear un Datawindow (También DataStore) dw_1 (Tipo Grid) de la fuente del
DataWindow generada en la función de SyntaxFromSQL. Si ocurren errores de secuencia que
se exhiben al usuario en una caja de mensaje. Observe que usted necesita llamar
SetTransObject con SQLCA como su discusión antes de que usted pueda llamar la función de
recuperación (Retrieve).

String ERRORS, strConsulta


String strEstilo, strSintaxis

Setpointer(HourGlass!)

//(Consulta SQL)
strConsulta = "SELECT * FROM products ORDER BY productname Asc"

// Estilo de presentación del datawindow


//(Default) Tabular, Grid, Form (for freeform), Graph, Group y Label
strEstilo = "style(type=grid)"

// Generamos el Datawindow!
strSintaxis = SQLCA.SyntaxFromSQL(strConsulta, strEstilo, ERRORS)

// Preguntamos si ocurrio alguna exepción...


if Len(ERRORS) > 0 then
MessageBox("Cuidado", "Sintaxis Select genero el errors: " + ERRORS)
return
end if

// Creamos el Objeto Datawindow


dw_1.Create(strSintaxis, ERRORS)

// Preguntamos si ocurrio alguna exepción...


if Len(ERRORS) > 0 then
// Preguntamos si ocurrio alguna exepción...
MessageBox("Cuidado", "La creación del objeto genero el error: " + ERRORS)
return
end if

// Asignamos la Transacción y Refrescamos


dw_1.settransobject(sqlca)

dw_1.retrieve()

Enviar por correo Comentar con el autor

Página principal Programación PowerBuilder Volver © 2003 by JM

http://www.lawebdejm.com/prog/pb/trucos_pb.htm 04/12/2008

Das könnte Ihnen auch gefallen