SysBase Powerbuilder
  • 1
  • 2
  • 3
Prev Next

Búsqueda Interactiva en Powerbuilder 11.5

Todos los sistemas tienen métodos de búsquedas para seleccionar determinados items al ingresar datos. Un caso típico se da en una empresa durante el proceso de facturación, por ejemplo, al...

Arrays en Powerbuilder 11.5

Una de las variables en programación que pocas veces se utilizan por desconocimiento son los arrays, también conocidos como arreglos o matrices, aquí los llamaremos por su nombre en inglés...

Fondo en una Aplicación Powerbuilder

Como lo prometido es deuda -según dicen-, aquí les dejó este pequeño tutotruco sobre cómo poner un fondo de escritorio en nuestra aplicación Powerbuilder.  Si bien constituye lo que, personalmente...

Debuggeando en Powerbuilder

Sin dudas que una de las tareas frecuentes que hacemos los programadores es el debugg del software, el testeo en caliente. En Powerbuilder existen distintas formas para debuggear un programa y...

Estructuras en Powerbuilder v11.5

Las estructuras de Powerbuilder son similares a las existentes en Pascal o Cobol, son colecciones de una o más variables, del mismo tipo o no, agrupadas bajo una misma denominación....

Caracteres ASCII de uso especial en PowerBuilder

Cuando usamos cadenas en Powerbuilder podemos incluir determinados caracteres ASCII en vistas a ciertos objetivos. Supongamos que el texto de un MessageBox queremos que aparezca en dos líneas, deberías escribirlo...

Haciendo un login como la gente en Powerbuilder

Vamos a ver cómo hacer un login como la gente para nuestro sistema Powerbuilder. Pero digamos primero qué es el login, logueo, registro, o como quieran llamarlo. El login es simplemente...

Validar CUIT -  Powerbuilder

A pedido de varios les dejo una función para validar el CUIT. CUIT significa "Código Único de Identificación Tributaria" y se refiere a un número que identifica a una persona física...

Powerbuilder: el Objeto Aplicación

Como todos sabemos, cuando creamos una aplicación en PB, éste nos crea un objeto con el mismo nombre del programa y lo coloca primero en el árbol de la librería....

Como lo prometido es deuda -según dicen-, aquí les dejó este pequeño tutotruco sobre cómo poner un fondo de escritorio en nuestra aplicación Powerbuilder.  Si bien constituye lo que, personalmente denomino "chichecitos" -tradúzcase pavadas-, hace a la buena presentación del software y "engorda" las características funcionales del mismo (aunque lo deja más "pesado").

Fondo en una Aplicación Powerbuilder

Imprimir COM_CONTENT_ICON_PDF
Por: Walt Whitman : Programador
Miércoles, 03 Febrero 2010
(Tiempo estimado: 4 - 8 minutos)

El sistema nos brinda la posibilidad de cambiar los colores de las ventanas y demás, pero no de colocar fondos con imágenes, así que para ello recurriremos a un "truco" sencillo pero eficaz y luego veremos como darle al usuario una interfaz para que coloque el fondo que le de la gana. La ventaja de lo que veremos es que cada usuario podrá poner el fondo que quiera y, además, el  que elija se guardará en la base de datos con lo que independizamos su ubicación. La desventaja es que hay que tener mayor control sobre los fondos ya que, por ejemplo, puede colocar un fondo porno... :-).

Vale aclarar que lo que sigue a continuación está hecho sobre Powerbuilder v11.5 con MySQL v5.

En primer lugar crearemos una ventana a la que llamaremos "w_fondo" que deberá ser del tipo "child!" y con un estado en el arranque del tipo "maximized!". Colocaremos en la misma un control picture con el nombre "p_tapiz", en el casillero "PictureName" le asignaremos una imagen por defecto y como propiedades marcaremos "Visible", "Enabled" y "Original Size". Aquí entra a jugar el tamaño de los monitores así que le pondremos, para empezar, una imagen de 1024x768px, luego veremos como cambiarla.

En el evento "Resize" de dicha ventana pondremos el siguiente código:

// Cambio tamaño al fondo
p_tapiz.setpicture(gblb_fondo)
p_tapiz.move((newwidth - p_tapiz.width)/2,(newheight - p_tapiz.height)/2) 

Si observan la segunda línea verán que le asigno al control "p_tapiz" una imagen que proviene de una variable global del tipo blob (gblb_fondo), ¿por qué? porque en mi aplicación "guardo" en la base de datos, en la tabla "usuarios", las preferencias de cada uno, por lo que tengo un campo llamado "user_fondo" del tipo longblob para almacenar el fondo que ha elegido. Además, esto nos permite que cuando se cierre la aplicación y vuelva a arrancar aparezca el fondo elegido y no el que está asignado por defecto, es un opcional, uds. hagan como quieran. Si deciden utilizar este método deberán declarar en "Global Variables" esto: blob gblb_fondo.

En el evento "open" de la ventana solo pondremos esto:

w_fondo.Title=".: Aplication Workspace"

Es simplemente para ponerle un título y es todo en cuanto a esta ventana se refiere.

Ahora nos vamos al arranque del sistema, es decir, lo que acontece luego de que el usuario introduce su nombre y contraseña. En primer lugar, si hemos elegido la opción de utilizar una variable global para cargar el fondo debemos agregar este código luego de todas las verificaciones:

// Cargo el fondo del usuario
SELECTBLOB user_fondo
INTO :gblb_fondo // fondo predeterminado del usuario
FROM USUARIOS
WHERE user_name=:sle_user.text;

Donde "user_fondo" es el campo de la tabla que almacena la imagen, gblb_fondo es el nombre de la variable global donde contenerla, USUARIOS es el nombre de la tabla de usuarios y con el código WHERE verificamos que tome la imagen que coincida con el nombre de usuario.

Una vez que esté todo cargado y validado cargaremos la ventana principal(w_main) y la ventana fondo(w_fondo) de la siguiente forma:

 w_main.triggerevent(resize!) // disparo evento para acomodar imagen de fondo
// Cargo el título de la ventana principal
w_main.Title=".: Mi Aplicación  v1 ::: Usuario Activo: "+gs_usuario+"---"+string(today())
opensheet(w_fondo,w_main,0,Layered!)

Brindándole una interfaz al usuario

La ventana tendrá esta apariencia:
Vista de la ventana para cambiar fondo

Crearemos una similar con el nombre "w_tapizchange" y con los siguientes controles:
-Para el título "Fondo actual:" con las Propiedades: Name=st_1; Text=Fondo actual:; Visible=true; Enabled=true.
-Para mostrar una miniatura del fondo con las Propiedades: Name=p_nuefondo; Visible=true, Enabled=true, Border=true.
-Botón "Elegir" con las Propiedades: Name=cb_cambiar; Text=&Elegir; Visible=true; Enable=true.
-Botón "Predeterminar" con las Propiedades: Name=cb_guardar; Text=&Predeterminar; Visible=true.
-Botón "Fijar Solo para esta sesión" con las Propiedades: Name=cb_mostrar; Text=Fijar S&olo para esta sesión; Visible=true.
-Botón "Cancelar" con las Propiedades: Name=cb_cancelar; Text=&Cancelar; Visible=true.
-Botón "Salir" con las Propiedades:  Name=cb_salir; Text=&Salir; Visible=true; Enabled=true.
Declararemos dos variables de instancia:
blob Emp_pic, iblb_tapizori
En el evento "open" de la ventana pondremos:

// Selección para cambiar fondo
p_nuevofondo.SetPicture(gblb_fondo)
iblb_tapizori=gblb_fondo

En el botón "Elegir" (cb_cambiar), en el evento "clicked" pondremos el siguiente código:

// Script para cambiar el fondo de pantalla
integer fh, ret,i
string txtname, named, borrar
long ll_flen //Largo del archivo
long loops,bytes_read,new_pos
blob b
cb_guardar.Enabled=true
cb_cancelar.Enabled=true
cb_mostrar.Enabled=true
string defext = "JPG"
string Filter = "Archivo de Imagen (*.jpg), *.jpg"
ret = GetFileOpenName("Abrir imagen", txtname, &
        named, defext, filter)
if ret = 1 then
    SetPointer(HourGlass!)
    ll_flen=FileLength(txtname)
    fh = FileOpen(txtname, StreamMode!,Read!,LockRead!)
     IF fh <> -1 THEN
        IF ll_flen > 32765 THEN
            IF Mod(ll_flen, 32765) = 0 THEN
                loops = ll_flen/32765
            ELSE
                loops = (ll_flen/32765) + 1
            END IF
        ELSE
            loops = 1
        END IF
        // Leer el archivo hasta terminar para evitar subidas parciales
        new_pos = 1
        FOR i = 1 to loops
            bytes_read = FileRead(fh,b)
            emp_pic = emp_pic+ b
        NEXT
        FileClose(fh)
    END IF
END IF
p_nuevofondo.SetPicture(emp_pic)

En el botón "Predeterminar" (cb_guardar), en el evento "clicked" pondremos el siguiente código:

// Script para cambiar el fondo de pantalla
int li_op
li_op=MessageBox("Advertencia","Graba el nuevo fondo en sus preferencias?",Question!,YesNo!,2)
if li_op=1 then
    gblb_fondo=emp_pic
    w_fondo.WindowState=normal!
    w_fondo.triggerevent(resize!)
    w_fondo.WindowState=maximized!
    // Actualizando la tabla
    UPDATEBLOB usuarios SET user_fondo =:emp_pic
        WHERE user_name =:gs_usuario;
        COMMIT;
    MessageBox(gs_aviso,"A partir de ahora este será su nuevo fondo")
    close(parent)
end if

En el botón "Fijar solo para esta sesión", en el evento "clicked" pondremos este código:

// Script para cambiar el fondo de pantalla
gblb_fondo=emp_pic
w_fondo.WindowState=normal!
w_fondo.triggerevent(resize!)
w_fondo.WindowState=maximized!
close(parent)

Como ven, aquí no guardamos la imagen en la base de datos por lo que al reiniciar el sistema aparecerá la que esté almacenada.
En el botón "Cancelar", en el evento "clicked" pondremos este código:

p_nuevofondo.SetPicture(iblb_tapizori)
cb_guardar.Enabled=false
this.enabled=false

En el botón "Salir", en el evento "clicked" solo pondremos: close(parent).

Como pueden apreciar en los códigos, pongo la ventana en normal y enseguida, mediante el evento trigger resize dispararo el reacomodamiento hasta que finalmente dejo la ventana maximizada.

Espero que les haya servido este "trucotuto". Hasta la próxima.

Tags: aplicaciones | códigos | comandos | filelenght | fileopen | fondos | imagenes | jpg | mysql | powerbuilder | programación | read | sistemas

Lo han leído: 15705 almas
Joomla-GNU.com not affiliated with or endorsed by Open Source Matters or the Joomla! Project. The Joomla!, logo and name is used under a limited license from Open Source Matters in the United States and other countries.

BLOG COMMENTS POWERED BY DISQUS