19 de Septiembre 2005

Browses para T-Gtk (II)

Si anteriormente vimos el ejemplo de uso de un Browse sobre una tabla DBF,
ahora veremos sobre arrays.

Siguiendo con el Browse nativo, Joaquim a dado soporte tambien para arrays,
igual que anteriormente haciamos en Fivewin con oBrw:SetArray( aArray ),
con T-Gtk se realizará de la misma forma.

La diferencia, es que mientras en Fivewin tenemos que poner FIELD ""; ,
bajo T-Gtk no es necesario:

aElements := { { 1,2,3,4,5,6,7,8,9,10,11,12 } }

DEFINE BROWSE oBrw1 ;
HEADERS "Elementos" ;
COLSIZES 50;
OF oBox

oBrw1:SetArray( aElements )

Ademas, se a introducido una data a la columna, para especificar si debe
mostrar o no la barra como seleccionado, cuando estemos encima de la fila
actual.

oBrw:aColumns[1]:lDrawSelect := .f.

Seria el equivalente a NOBAR de la clase TSBROWSE.

Pongo aqui la imagen sobre dos browses relacionados, todo basado en arrays.

brwarray.JPG

Finalmente , esto va tomando forma, y de momento nos estamos centrando en
depurar la clase , tanto a nivel de C como de prg.

Despues , me queda finalizar la implementación directamente en gClass , que
tengo al 99%, a falta de parar las caracteristicas actuales , en esta primera
revision.

Pero ya sabemos como funciona esto, no se termina nunca de contentar a nadie, y no se para nunca de intentar mejorar lo que se tiene.

Como siempre, aqui esta el codigo fuente que realiza lo de la imagen:


/**
* BrwArray.prg - Browse arrays & gclass (by TheFull)
* Copyright (C) 2005 Joaquim Ferrer Godoy
**/

#include "gclass.ch"
#include "browse.ch"

function main()

local oWnd, oBrw1, oBrw2, oBox
local aColSpa := { "rojo", " blanco", "amarillo", "verde", "marron", "rosa", ;
"negro", "naranja", "gris", "lila", "azul", "fucsia" }
local aColCat := { "roig", "blanc", "groc", "vert", "marro", "rosa", ;
"negre", "taronge", "gris", "lila", "blau", "fucsia" }
local aColEng := { "red", "white", "yellow", "green", "brown", "pink", ;
"black", "orange", "gray", "purple", "blue", "#FF00FF" }
local aNumber := { { 1,2,3,4,5,6,7,8,9,10,11,12 } }

local aNumSpa := { "Uno", "Dos", "Tres", "Cuatro", "Cinco", "Seis",;
"Siete", "Ocho", "Nueve", "Diez", "Once", "Doce" }
local aNumCat := { "U", "Dos", "Tres", "Quatre", "Cinc", "Sis", ;
"Set", "Vuit", "Nou", "Deu", "Onze", "Dotze" }
local aNumEng := { "One", "Two", "Three", "Four", "Five", "Six", ;
"Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve" }
local aDays := { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }


DEFINE WINDOW oWnd TITLE "Browse arrays T-Gtk" SIZE 500,300

DEFINE BOX oBox SPACING 2 OF oWnd

DEFINE BROWSE oBrw1 ;
HEADERS "Number" ;
COLSIZES 50;
OF oBox ;
COLORS "red" ;
ON CHANGE ( oBrw2:SetArray( { { aNumSpa[oBrw1:nAt], aColSpa[oBrw1:nAt] }, ;
{ aNumCat[oBrw1:nAt], aColCat[oBrw1:nAt] }, ;
{ aNumEng[oBrw1:nAt], aColEng[oBrw1:nAt] } } ),;
oBrw2:Refresh() )

ADD COLUMN TO BROWSE oBrw1 ;
DATA "";
HEADER "Colors" ;
COLOR "red", {|| aColEng[ oBrw1:nAt ] } ;
SIZE 70

atail( oBrw1:aColumns ):lDrawSelect := .f.

ADD COLUMN TO BROWSE oBrw1 ;
DATA {|| aDays[oBrw1:nAt] };
HEADER "Months/Days" ;
HEADER_PICTURE "browse.png" ;
COLOR {|| if( oBrw1:nAt %2 <> 0, "red", "green" ) }, ;
{|| if( oBrw1:nAt %2 <> 0, "gray", "white" ) } ;
SIZE 80

oBrw1:SetArray( aNumber )

DEFINE BROWSE oBrw2 ;
HEADERS "Spanish", "Catalan", "English" ;
COLSIZES 70,70,70 ;
OF oBox ;
COLORS "black"

oBrw2:lArrow := .f.
oBrw2:aColumns[ 2 ]:cfgColor = "#FFD700"
oBrw2:aColumns[ 2 ]:cbgColor = "#1E90FF"

ACTIVATE WINDOW oWnd CENTER

return nil

Escrito por Rafa Carmona a las 11:43 PM | Comentarios (7)

14 de Septiembre 2005

Browses para T-Gtk

Bien, Joaquim a realizado un estupendo trabajo, peleandose con C , gObjects y los widgets en su parte más oscura para conseguir un magnifico trabajo.

El funcionamiento del browse es identico al de Fivewin, Harbour, Clipper, solamente se pinta lo que se ve, no es necesario recorrer TODA la base de datos , para pintar,
en contraposicion al Modelo/Vista/Controlador.

Hasta ahora, no me habia preocupado lo más mínimo el tema de los browses para
T-Gtk, porque usando las Listores, TreeView, etc.., lo teniamos solucionado, y con
toda la tecnologica que implica usar el Modelo / Vista / Controlador.

Pero, tambien puedo dar constancia, de la complejidad que eso supone, y más cuando al dia de hoy , no he realizado todavia las clases para gClass , para encapsular toda complejidad, y de momento , hay que batallar en base a funciones. Espero poder terminar cuanto antes este tema.

Pero , desde que me enseño Joaquim el trabajo que a realizado, me he quedado realmente ilusionado con ello, por que desde un principio, soporta colores, fonts, imagenes, etc..

Por mi parte estoy mejorando la clases y creando los comandos xBase, para
una mejor manera de crear los browses.

Voy a poner una simple imagen, para que podais ver el resultado final, y el codigo fuente que realiza este ejemplo.

browse.JPG

Codigo fuente:
#include "gclass.ch"
#include "browse.ch"

static Pixbuf1

function main()
Local oWnd, oBrw, oLabel , oBox, Image

pixbuf1 := gdk_pixbuf_new_from_file( "header.png" )

USE CUSTOMER NEW SHARED ALIAS "CUSTUM"

DEFINE WINDOW oWnd TITLE "Browse Native of T-Gtk" SIZE 600,300

DEFINE BOX oBox VERTICAL OF oWnd

DEFINE BROWSE oBrw ;
FIELDS Field->First, Field->Last ;
HEADERS "Primero","Ultimo" ;
ALIAS "CUSTUM" ;
COLSIZES 150,100 ;
OF oBox ;
FONT "Tahoma Italic 10" ;
ON CHANGE oLabel:SetText( "Registro actual:" + cValToChar( Recno() ) );
COLORS "black", {|| MyColorFon() }

ADD COLUMN TO BROWSE oBrw ;
DATA Field->Set ;
HEADER "SET" ;
COLORS "black", {|| MyColorFon() } ;
TYPE COL_TYPE_RADIO ;
SIZE 50

ADD COLUMN TO BROWSE oBrw ;
DATA Field->Street;
HEADER "Street" ;
HEADER_PICTURE "header.png" ;
COLOR "red","black" ;
SIZE 150

ADD COLUMN TO BROWSE oBrw ;
DATA CogePicture() ;
HEADER "Imagenes al vuelo" ;
TYPE COL_TYPE_BITMAP ;
COLORS "black", {|| MyColorFon() } ;

DEFINE LABEL oLabel PROMPT "Registro actual:" + cValToChar( Recno() ) OF oBox

oBrw:bKeyEvent := {|o,nkey| if( nKey == K_ENTER, MsgInfo( "HOLA" ), ) }

ACTIVATE WINDOW oWnd CENTER

// Desferenciamos pixbufs
gdk_pixbuf_unref( pixbuf1 )

return nil

STATIC FUNCTION MyColorFon()
Local cColor

if ( ( "CUSTUM" )->( OrdKeyNo() )%2 <> 0 )
cColor := "gray"
else
cColor := "yellow"
endif

Return cColor

/*
Simple, fácil y potente.
Hemos implementado en las columnas, la posibilidad de que el picture sea
un fichero, poniendo simplemente una cadena de texto, o , para ser mucho
más rápido y mas eficiente ahorrando memoria, es pasarle el puntero del pixbuf
que hemos cargado previamente.

¿ Puedes ver la diferencia ?
Mientras que la viendo 20 filas, cargamos 10 PICTURES IGUALES! en el caso del texo,
con el pixbuf, solamente ocupará en memoria UN PICTURE, independientemente de los
que veamos.

Es por ello, que he implementado esa caracteristica.

*/
STATIC FUNCTION COGEPICTURE()
Local cPicture

if ( ( "CUSTUM" )->( OrdKeyNo() )%2 <> 0 )
cPicture := pixbuf1 // Asigmos el puntero del pixbuf
else
cPicture := "browse.png" // Aqui , se cargará la imagen desde el DISCO!
endif

Return cPicture

Escrito por Rafa Carmona a las 1:34 PM | Comentarios (6)