Alaska Software Inc. - Xbp = Xbase++ Parts = Componentes Xbase++
Username: Password:
AuthorTopic: Xbp = Xbase++ Parts = Componentes Xbase++
Jose Luis OterminXbp = Xbase++ Parts = Componentes Xbase++
on Fri, 12 Nov 2010 13:07:13 -0300
Hola,
Para construir un ABM en modo grfico es necesario saber qu es y cmo 
funciona XbpDialog.

XbpDialog es la ventana donde pondremos los controles grficos de nuestra 
aplicacin.
Si bien tiene muchas partes, podemos destacar dos principales:

:titlebar  Area donde se despliegan ttulo y botones de control.
:drawingArea  Area donde se despliegan los controles que se agregan 
(XbpGet, por ej).

Como un primer ejercicio y previo a continuar con la discusin del ABM en 
modo grfico, sugiero crear un dilogo y agregar una imagen de fondo como 
as tambin un icono diferente del preestablecido.

Primer paso:
Crear un archivo de recursos:

Por ejemplo: MisRecursos.ARC
*BOF

#ifdef __ARC__
   VERSION
      "CompanyName"      = "Alaska Software Inc"
      "ProductName"      = "Gui Standard Dialog"
      "ProductVersion"   = " 1.0"
      "FileVersion"      = " 1.000.000"
      "FileDescription"  = "Demo de XbpDialog"
      "InternalName"     = "Internal Name"
      "LegalCopyright"   = "Copyright (c) Alaska Software Inc"
      "OriginalFilename" = "test.EXE"
#endif

#define DLG_BACKGROUND   1001
#define DLG_ICON         1

ICON   DLG_ICON         = "C:\ALASKA\XPPW32\RESOURCE\icon\xppFLD.ICO"
BITMAP DLG_BACKGROUND   = "C:\ALASKA\XPPW32\RESOURCE\bitmap\keybd2.bmp"
*EOF

Segundo paso: Crear procedimiento MAIN en un archivo separado.


*BOF
#include "Gra.ch"
#include "Xbp.ch"
#include "Common.ch"
#include "Appevent.ch"
#include "Font.ch"

#PRAGMA LIBRARY( "ASCOM10.LIB" )
#define DLG_BACKGROUND   1001
#define DLG_ICON         1

PROCEDURE Main
   LOCAL nEvent, mp1, mp2, aSize
   LOCAL oDlg, oXbp, drawingArea, aEditControls := {}, oXbp1
   LOCAL aPos := {100,100}

   IF IsMemberVar(XbpDialog(),"ClientSize") == .T.
      aSize := {0,0}
   ELSE
      aSize := {600,400}
   ENDIF

   oDlg := XbpDialog():new( AppDesktop(), , aPos, aSize, , .F.)
   IF aSize[1] == 0 .AND. aSize[2] == 0
      oDlg:ClientSize := {592,370}
   ENDIF
   oDlg:taskList := .T.
   oDlg:title := "Dialogo con Icono personal e Imagen de fondo"

   oDlg:drawingArea:bitmap := DLG_BACKGROUND
   oDlg:icon  := DLG_ICON

   oDlg:create()

   drawingArea := oDlg:drawingArea
   drawingArea:setFontCompoundName( "8.Courier New" )

   oDlg:show()
   SetAppFocus(oDlg)

   nEvent := xbe_None
   DO WHILE nEvent <> xbeP_Close
      nEvent := AppEvent( @mp1, @mp2, @oXbp )
      oXbp:handleEvent( nEvent, mp1, mp2 )
   ENDDO
RETURN
*EOF

Espero comentarios.
Saludos

Jos Luis Otermin
Alaska Software
Soporte Tcnico
--------------------------------------------------------------------
Foros de Usuarios: news://news.alaska-software.com
Pgina Web: http://www.alaska-software.com
Base de Conocimientos en la Web: http://www.alaska-software.com/kbase.shtm
Oficina en Europa: Fax: +49 (0) 61 96 - 77 99 99 23
Oficina en EEUU: Fax: +1 (646) 218 1281
--------------------------------------------------------------------
Angel Pais Re: Xbp = Xbase++ Parts = Componentes Xbase++
on Fri, 12 Nov 2010 18:50:18 -0200
On Fri, 12 Nov 2010 13:07:13 -0300, Jose Luis Otermin wrote:

> Hola,
> Para construir un ABM en modo gráfico es necesario saber qué es y cómo 
> funciona XbpDialog.
> 
> XbpDialog es la ventana donde pondremos los controles gráficos de nuestra 
> aplicación.
> Si bien tiene muchas partes, podemos destacar dos principales:
> 
>:titlebar  Area donde se despliegan título y botones de control.
> :drawingArea  Area donde se despliegan los controles que se agregan 
> (XbpGet, por ej).
> 
> Como un primer ejercicio y previo a continuar con la discusión del ABM en 
> modo gráfico, sugiero crear un diálogo y agregar una imagen de fondo como 
> así también un icono diferente del preestablecido.
> 
> Primer paso:
> Crear un archivo de recursos:
> 
> Por ejemplo: MisRecursos.ARC
> *BOF
> 
> #ifdef __ARC__
>    VERSION
>       "CompanyName"      = "Alaska Software Inc"
>       "ProductName"      = "Gui Standard Dialog"
>       "ProductVersion"   = " 1.0"
>       "FileVersion"      = " 1.000.000"
>       "FileDescription"  = "Demo de XbpDialog"
>       "InternalName"     = "Internal Name"
>       "LegalCopyright"   = "Copyright (c) Alaska Software Inc"
>       "OriginalFilename" = "test.EXE"
> #endif
> 
> #define DLG_BACKGROUND   1001
> #define DLG_ICON         1
> 
> ICON   DLG_ICON         = "C:\ALASKA\XPPW32\RESOURCE\icon\xppFLD.ICO"
> BITMAP DLG_BACKGROUND   = "C:\ALASKA\XPPW32\RESOURCE\bitmap\keybd2.bmp"
> *EOF
> 
> Segundo paso: Crear procedimiento MAIN en un archivo separado.
> 
> 
> *BOF
> #include "Gra.ch"
> #include "Xbp.ch"
> #include "Common.ch"
> #include "Appevent.ch"
> #include "Font.ch"
> 
> #PRAGMA LIBRARY( "ASCOM10.LIB" )
> #define DLG_BACKGROUND   1001
> #define DLG_ICON         1
> 
> PROCEDURE Main
>    LOCAL nEvent, mp1, mp2, aSize
>    LOCAL oDlg, oXbp, drawingArea, aEditControls := {}, oXbp1
>    LOCAL aPos := {100,100}
> 
>    IF IsMemberVar(XbpDialog(),"ClientSize") == .T.
>       aSize := {0,0}
>    ELSE
>       aSize := {600,400}
>    ENDIF
> 
>    oDlg := XbpDialog():new( AppDesktop(), , aPos, aSize, , .F.)
>    IF aSize[1] == 0 .AND. aSize[2] == 0
>       oDlg:ClientSize := {592,370}
>    ENDIF
>    oDlg:taskList := .T.
>    oDlg:title := "Dialogo con Icono personal e Imagen de fondo"
> 
>    oDlg:drawingArea:bitmap := DLG_BACKGROUND
>    oDlg:icon  := DLG_ICON
> 
>    oDlg:create()
> 
>    drawingArea := oDlg:drawingArea
>    drawingArea:setFontCompoundName( "8.Courier New" )
> 
>    oDlg:show()
>    SetAppFocus(oDlg)
> 
>    nEvent := xbe_None
>    DO WHILE nEvent <> xbeP_Close
>       nEvent := AppEvent( @mp1, @mp2, @oXbp )
>       oXbp:handleEvent( nEvent, mp1, mp2 )
>    ENDDO
> RETURN
> *EOF
> 
> Espero comentarios.
> Saludos

Para poder hacer gets automaticos, se va a necesitar un dialog con un
scrollable drawing area.
Yo uso uno pero no lo puedo publicar porque forma parte del paquete
topdown.
Seria bueno hacer un dialogo de esos que este libre de copyright.

HTH
Angel
Jose Luis OterminRe: Xbp = Xbase++ Parts = Componentes Xbase++
on Fri, 12 Nov 2010 18:10:01 -0300
Hola Angel,
> Para poder hacer gets automaticos, se va a necesitar un dialog con un
> scrollable drawing area.

Tenemos uno que viene de fbrica 

> Yo uso uno pero no lo puedo publicar porque forma parte del paquete
> topdown.

Tambin soy usuario de TopDown. Excelente solucin.

> Seria bueno hacer un dialogo de esos que este libre de copyright.

Vamos a hacerlo, no te duda la menor quepa. 
Justamente por eso es que bifurqu hacia el XbpGet con formato Cl*pper y el 
XbpDialog en dos hilos separados.
Nos va a hacer falta un Font y el clculo de sus dimensiones.
Ah es donde se pone divertido :D

> HTH
> Angel

Un abrazo

Jos Luis Otermin
Alaska Software
Soporte Tcnico
--------------------------------------------------------------------
Foros de Usuarios: news://news.alaska-software.com
Pgina Web: http://www.alaska-software.com
Base de Conocimientos en la Web: http://www.alaska-software.com/kbase.shtm
Oficina en Europa: Fax: +49 (0) 61 96 - 77 99 99 23
Oficina en EEUU: Fax: +1 (646) 218 1281
--------------------------------------------------------------------
Angel Pais Re: Xbp = Xbase++ Parts = Componentes Xbase++
on Mon, 15 Nov 2010 11:38:28 -0200
On Fri, 12 Nov 2010 18:10:01 -0300, Jose Luis Otermin wrote:

> Hola Angel,
>> Para poder hacer gets automaticos, se va a necesitar un dialog con un
>> scrollable drawing area.
> 
> Tenemos uno que viene de fábrica 
> 

Nunca supe de su existencia.
Como se llama y como se usa ?
Con eso podria intentar migrar mi rutina BULKGET() hecha en topdown a algo
que no necesite TD y sea mas generico.

Saludos
Angel
Jose Luis OterminRe: Xbp = Xbase++ Parts = Componentes Xbase++
on Mon, 15 Nov 2010 10:52:05 -0300
Hola Angel,

>>> Para poder hacer gets automaticos, se va a necesitar un dialog con un
>>> scrollable drawing area.

>> Tenemos uno que viene de fbrica 

> Nunca supe de su existencia.
> Como se llama y como se usa ?
> Con eso podria intentar migrar mi rutina BULKGET() hecha en topdown a algo
> que no necesite TD y sea mas generico.

Bueno, en este hilo comenc a publicar el fuente del dilogo que trae sus 
scrollbars y en el desarrollo de la explicacin se ver cmo se maneja un 
area desplazable.

Lo bsico ya fue publicado en ese mensaje.
Revisa tu correo.

Un abrazo

Jos Luis Otermin
Alaska Software
Soporte Tcnico
--------------------------------------------------------------------
Foros de Usuarios: news://news.alaska-software.com
Pgina Web: http://www.alaska-software.com
Base de Conocimientos en la Web: http://www.alaska-software.com/kbase.shtm
Oficina en Europa: Fax: +49 (0) 61 96 - 77 99 99 23
Oficina en EEUU: Fax: +1 (646) 218 1281
--------------------------------------------------------------------
Jose Luis OterminRe: Xbp = Xbase++ Parts = Componentes Xbase++
on Mon, 15 Nov 2010 09:21:55 -0300
Contino con XbpDialog.

Toda vez que creamos un dilogo para interaccin con el usuario, existe la 
posibilidad de crear tambin un men.

Agregaremos un men al dilogo creado en el mensaje anterior.

PROCEDURE CrearMenu(oDlg, oFileDlg)
   LOCAL oMenuBar, oSubMenu

   oMenuBar := oDlg:MenuBar()

   oSubMenu       := XbpMenu():new(oMenuBar):create()
   oSubMenu:title := "~Fichero"
   oSubMenu:addItem( { "~Abrir", {|mp1| Abrir( oFileDlg ) }} )
   oSubMenu:addItem( { "~Cerrar", {|mp1| Cerrar() }} )
   oSubMenu:addItem( { "~Salir", {|| AppQuit() }} )
   oMenuBar:addItem( { oSubMenu, NIL } )

   oSubMenu       := XbpMenu():new(oMenuBar):create()
   oSubMenu:title := "A~BM"
   oSubMenu:addItem( { "~Alta", {|mp1| Alta( 
oDlg ) },,XBPMENUBAR_MIA_DISABLED})
   oSubMenu:addItem( { "~Baja", {|mp1| Baja( 
oDlg ) },,XBPMENUBAR_MIA_DISABLED})
   oSubMenu:addItem( { "~Modificacin", {|| Modifica( 
oDlg ) },,XBPMENUBAR_MIA_DISABLED})
   oMenuBar:addItem( { oSubMenu, NIL } )

RETURN

Para claridad del cdigo, separaremos al dilogo del procedimiento MAIN.

///////////////////////////////////////////

FUNCTION GuiStdDialog()

#define DLG_BACKGROUND   1001
#define DLG_ICON         1

 Se define un Dilogo genrico.
 Para una mejor experiencia de aprendizaje
 se sugiere consultar la ayuda en lnea.

///////////////////////////////////////////
   LOCAL aSize, oDlg
   LOCAL aPos := {100,100}

   IF IsMemberVar(XbpDialog(),"ClientSize") == .T.
      aSize := {0,0}
   ELSE
      aSize := {600,400}
   ENDIF

   oDlg := XbpDialog():new( AppDesktop(), , aPos, aSize, , .F.)
   IF aSize[1] == 0 .AND. aSize[2] == 0
      oDlg:ClientSize := {592,370}
   ENDIF
   oDlg:title := "Dialogo personalizado"
   oDlg:close := {|| AppQuit()}

   oDlg:drawingArea:setFontCompoundName( "8.Courier New" )
    Innecesario en un ABM.
    oDlg:drawingArea:bitmap := DLG_BACKGROUND
   oDlg:icon  := DLG_ICON

   oDlg:taskList  := .T.
   oDlg:maxButton := .T.
   oDlg:minButton := .T.

   oDlg:maxSize := {600,400}
   oDlg:minSize := {300, 200}

   oDlg:cargo := {}    Area donde puede "depositarse" un valor o arreglo.

   oDlg:create()

   #DEFINE NUMEROMAGICO 50
   aPos := {0, 25}
   aSize := { oDlg:drawingArea:currentSize()[1], 
oDlg:drawingArea:currentSize()[2]-NUMEROMAGICO }

   aPP := {}
    Opera igual que oDlg:drawingArea:setFontCompoundName( "8.Courier 
New" )
   AAdd ( aPP, { XBP_PP_COMPOUNDNAME, "8.Courier New" } )
    Utiliza origen de coordenadas al estilo D.O.S.
   AAdd ( aPP, {  XBP_PP_ORIGIN, XBP_ORIGIN_TOPLEFT   } )

   oDataArea := XbpDialog():new( oDlg:drawingArea, , aPos, aSize, aPP , .t.)
   oDataArea:titleBar := .F.
    Habilita barras de desplazamiento vertical y horizontal
   oDataArea:drawingArea:scrollbars := XBP_SCROLLBAR_VERT + 
XBP_SCROLLBAR_HORIZ
    Manejador de la rueda para el reaDeDibujo
   oDataArea:drawingArea:wheel  := {|aPos, aWheel, oWindow | 
ProcessMouse(aPos, aWheel, oWindow) }

    scroll del DrawingArea pero slo si existe una barra de desplazamiento
    Mientras se mantiene la tecla Ctrl y desplazarse horizontal o 
verticalmente.
    Ganancia de foco en el area de dibujo con LbDown
   oDataArea:drawingArea:lbDown := {|aPos, uNIL, oWindow | 
SetAppFocus(oWindow)}

   oDataArea:create()
   oDataArea:show()

RETURN oDlg

Alguien notar que he definido NUMEROMAGICO.
Bien, es el alejamiento vertical respecto del borde inferior del MenBar.
Ya se discutir ms adelante de dnde surge ese valor (si es que est 
correcto).

Preguntas?

Jos Luis Otermin
Alaska Software
Soporte Tcnico
--------------------------------------------------------------------
Foros de Usuarios: news://news.alaska-software.com
Pgina Web: http://www.alaska-software.com
Base de Conocimientos en la Web: http://www.alaska-software.com/kbase.shtm
Oficina en Europa: Fax: +49 (0) 61 96 - 77 99 99 23
Oficina en EEUU: Fax: +1 (646) 218 1281
--------------------------------------------------------------------




MenuBar.png
Jose Luis OterminRe: Xbp = Xbase++ Parts = Componentes Xbase++
on Wed, 17 Nov 2010 06:02:32 -0300
En ausencia de preguntas, seguimos.
Es importante considerar que todo dilogo debe tener:

1) Seccin de inicializacin de XbpDialog
2) Seccin de creacin del dilogo.
3) Activacin de los bloques de cdigo para los eventos.
4) Creacin de un sistema de men.
5) Agregado de contenidos.
6) Ciclo de Eventos.

En el fuente anterior se hace mencin al evento :close.
Este evento puede ser activado por:

PostAppEvent( xbeP_Close )

a) Lanzado por un componente cualquiera (un pushbutton, por ejemplo).
b) El usuario haciendo click en la cruz de cierre de ventana.
c) El Sistema Operativo intentando cerrar la aplicacin.

En el fuente anterior se observa que al evento close se le ha almacenado un 
bloque de cdigo.
Este bloque de cdigo llama a la funcin AppQuit().

Veamos qu hace:

///////////////////////////////////////////

PROCEDURE AppQuit()

#DEFINE QUIT_MESSAGE  "Desea abandonar el programa?"
#DEFINE QUIT_OPTIONS  "Salir"

///////////////////////////////////////////
   LOCAL nButton, oXbp := SetAppFocus()
   LOCAL nEvent, mp1, mp2

   nButton := ConfirmBox( , ;
                 QUIT_MESSAGE, ;
                 QUIT_OPTIONS, ;
                  XBPMB_YESNO , ;
                  XBPMB_QUESTION+XBPMB_APPMODAL+XBPMB_MOVEABLE )

   IF nButton == XBPMB_RET_YES
      CLOSE ALL
      PostAppEvent( xbeP_Quit )
   ELSE
       "limpiar" cola de eventos indeseados.
      DO WHILE NextAppEvent() <> xbe_None
         nEvent := AppEvent( @mp1, @mp2, @oXbp )
         oXbp:handleEvent( nEvent, mp1, mp2 )
      ENDDO
   ENDIF

   SetAppFocus( oXbp )
RETURN

Ntese que PostAppEvent() enva un mensaje xbeP_Quit y NO xbeP_Close.
En este caso, slo el ciclo de eventos que procese xbeP_Quit har que la 
aplicacin se cierre.

Es lo que se aprecia en el ciclo del procedimiento MAIN.

[...]
    Fin de Aplicacin es xbeP_Quit y NO xbeP_Close
    xbeP_Close es ms usual para componentes o dilogos menores
   nEvent := xbe_None
   DO WHILE nEvent <> xbeP_Quit
      nEvent := AppEvent( @mp1, @mp2, @oXbp )
      oXbp:handleEvent( nEvent, mp1, mp2 )
   ENDDO
RETURN
*EOF

Sin profundizar las explicaciones, agrego el cdigo fuente bsico para 
mostrar cmo se crea un dilogo, un men de seleccin de una tabla, tres 
acciones bsicas del men ABM con habilitacin / deshabilitacin desde 
cdigo fuente, carga de datos desde una tabla seleccionada, edicin de un 
registro en blanco (Alta), exposicin de un registro con edicin 
deshabilitada (Bajas) y edicin de los datos de un registro (Modificacin).

Queda en manos de ustedes, queridos colegas, el completar los faltantes.
Por ejemplo:
Se ha dejado intencionalmente un espacio arriba y debajo del area de datos 
del dilogo.
Pens que se podran usar XbpToolBar() y XbpStatusBar().

Si surge alguna duda, aqu estar.

Saludos

Jos Luis Otermin
Alaska Software
Soporte Tcnico
--------------------------------------------------------------------
Foros de Usuarios: news://news.alaska-software.com
Pgina Web: http://www.alaska-software.com
Base de Conocimientos en la Web: http://www.alaska-software.com/kbase.shtm
Oficina en Europa: Fax: +49 (0) 61 96 - 77 99 99 23
Oficina en EEUU: Fax: +1 (646) 218 1281
--------------------------------------------------------------------




GUIABM01.zip
Jose Luis OterminRe: Xbp = Xbase++ Parts = Componentes Xbase++
on Wed, 17 Nov 2010 19:43:00 -0300
Para quienes han compilado los fuentes que envi, probablemente hayan 
obtenido una pantalla como la que se adjunta.

La separacin entre el men y la primer entrada de datos XbpGet, es el 
NUMEROMAGICO, aun no discutido.
La separacin entre el borde externo del XbpDialog y el area de entrada de 
datos es aPos, el arreglo de valores {0,25} que se advierte en 
GuiStdDialog().

Si alguien tiene dificultad para entender el cdigo o tiene dudas sobre cmo 
funciona algo,
est a tiempo para preguntar porque el fuente se volver ms complejo a 
medida que se le agreguen prestaciones.

Es de notar que el men invocando al ABM es en realidad un substituto del 
ratn cuando en la actualidad nadie hara uso del men teniendo una barra 
llena de botones.

Hemos visto un modelo procedural hasta ahora para que sea sencillo 
comprender cmo una propuesta aparentemente fcil de programar se va 
poniendo cada vez ms oscura para seguir y el orden de ejecucin del cdigo 
tiende a parecer un plato de spaghettis.

Pues bien, todo este desarrollo culminar en una clase derivada de 
XbpDialog.
Esa clase tendr como partes principales:

a) Inicializacin (lo que vimos bajo la consigna Pre-Condiciones).
b) Creacin y ejecucin del ABM - Algoritmo
c) Estado final obtenido luego de la ejecucin del algoritmo - 
Post-Condiciones.

Quede claro que no se trata sto de una clase magistral sobre cmo programar 
un ABM.
Se trata de una discusin donde las opiniones son valiosas y probablemente 
aporten ideas creativas sobre el tema.
Estoy seguro que ms de un seguidor de este hilo tiene inquietudes que no ha 
compartido con nosotros. Sera bueno leer esas inquietudes antes que el 
cdigo se transforme en una caja negra.

Espero preguntas.
Jorge, Te parece claro hasta ahora?
Jos, Consideras que los fuentes hasta aqu vistos son ms complejos que 
los habuales?
Gustavo, Te parece que tu fuente se podra convertir con ayuda de DOSSay() 
y DOSGet()?
Angel, Qu te ha parecido el area desplazable?
Carlos, Es crptico el cdigo Xbase++?

Vamos anmense a comentar!

Jos Luis Otermin
Alaska Software
Soporte Tcnico
--------------------------------------------------------------------
Foros de Usuarios: news://news.alaska-software.com
Pgina Web: http://www.alaska-software.com
Base de Conocimientos en la Web: http://www.alaska-software.com/kbase.shtm
Oficina en Europa: Fax: +49 (0) 61 96 - 77 99 99 23
Oficina en EEUU: Fax: +1 (646) 218 1281
--------------------------------------------------------------------



ABM-GUI_01.png
Osvaldo Ramirez Re: Xbp = Xbase++ Parts = Componentes Xbase++
on Wed, 17 Nov 2010 21:15:04 -0700
Excelente amigo

Me quedo una duda, el pq del xbeP_Close y el quit ?

Saludos
Osvaldo Ramirez
Jose Luis OterminRe: Xbp = Xbase++ Parts = Componentes Xbase++
on Thu, 18 Nov 2010 08:32:48 -0300
Hola mi cuate,

> Excelente, amigo

Ya haba pensado "ser que Don Ramrez ya tiene todo resuelto y por eso ni 
mira el foro?".

> Me quedo una duda, el pq del xbeP_Close y el quit ?

Je, sta es una muy buena pregunta 

Bueno, para cerrar "fsicamente" un formulario de dilogo uno tiene que 
hacer click en el botn rojo con la cruz. Eso equivale a ejecutar 
oDlg:close() en cdigo puro y duro.
La cosa se mejora si tenemos un botn donde le decimos al usuario "cuando 
termines de jugar con los datos, hazme click".

En ese caso el botn podra ejecutar en su activacin:

{| uNIL1, uNIL2, oBoton | GuardarDatos(oBoton), oDlg:close() }

Sin embargo tendra que escribir DOS llamadas a funcin/procedimiento en una 
misma sentencia y eso no es lo ms aconsejable a la hora de depurar (usando 
XppDebug).

Entonces lo ms apropiado sera:

PROCEDURE GuardarDatos(oBoton)
LOCAL oDlg := oBoton:Setparent():SetParent()
[...]
oDlg:close()
RETURN

En este cdigo NO podemos ejecutar oDlg:close() directamente porque el 
procedimiento desconoce la existencia de oDlg. Podemos obtener su ancestro a 
travs de su padre pues la distancia (y relacin) mnima es:
XbpDialog
      |---- DrawingArea
                       |------- XbpPushButton

Cuando se ejecuta
LOCAL oDlg := oBoton:Setparent():SetParent()

Ocurre:
oBoton:SetParent() -> devuelve DrawingArea.
DrawingArea:SetParent() -> devuelve XbpDialog

Como sabemos por los manuales, el evento :close() se ejecutar en el 
XbpDialog.
Podemos hacer dos cosas:
a) Ejecutar :close() "a mano"
b) Lanzar un evento y que el sistema lo administre: PostAppEvent( 
xbeP_Close )

El evento xbeP_Close ser ejecutado en el primer ciclo de eventos que est 
controlando la ejecucin.

   nEvent := xbe_None
   DO WHILE nEvent <> xbeP_Close
      nEvent := AppEvent( @mp1, @mp2, @oXbp )
      oXbp:handleEvent( nEvent, mp1, mp2 )
   ENDDO

Es comn que un "Click" tenga un rebote y se genere ms de un xbeP_Close.
Si queremos cerrar un dilogo en especial haremos:

PostAppEvent( xbeP_Close , , , oDlg)

Si estamos cerrando no slo el dilogo sino la aplicacin misma, podemos 
evitar el procesamiento automtico de xbeP_Close y usaremos xbeP_Quit, el 
cual sabemos que no ser procesado en ningn otro ciclo de eventos que no 
sea el nuestro:

   nEvent := xbe_None
   DO WHILE nEvent <> xbeP_Quit
      nEvent := AppEvent( @mp1, @mp2, @oXbp )
      oXbp:handleEvent( nEvent, mp1, mp2 )
   ENDDO

Entonces, en el ciclo del Dilogo principal de la aplicacin usaremos 
xbeP_Quit.

Se entendi o lo enred ms? 

Gracias por participar

> Saludos
> Osvaldo Ramirez

Un abrazo

Jos Luis Otermin
Alaska Software
Soporte Tcnico
--------------------------------------------------------------------
Foros de Usuarios: news://news.alaska-software.com
Pgina Web: http://www.alaska-software.com
Base de Conocimientos en la Web: http://www.alaska-software.com/kbase.shtm
Oficina en Europa: Fax: +49 (0) 61 96 - 77 99 99 23
Oficina en EEUU: Fax: +1 (646) 218 1281
--------------------------------------------------------------------
Angel Pais Re: Xbp = Xbase++ Parts = Componentes Xbase++
on Thu, 18 Nov 2010 14:18:34 -0200
On Wed, 17 Nov 2010 19:43:00 -0300, Jose Luis Otermin wrote:

> Para quienes han compilado los fuentes que envié, probablemente hayan 
> obtenido una pantalla como la que se adjunta.
> 
> La separación entre el menú y la primer entrada de datos XbpGet, es el 
> NUMEROMAGICO, aun no discutido.
> La separación entre el borde externo del XbpDialog y el area de entrada de 
> datos es aPos, el arreglo de valores {0,25} que se advierte en 
> GuiStdDialog().
> 
> Si alguien tiene dificultad para entender el código o tiene dudas sobre cómo 
> funciona algo,
> está a tiempo para preguntar porque el fuente se volverá más complejo a 
> medida que se le agreguen prestaciones.
> 
> Es de notar que el menú invocando al ABM es en realidad un substituto del 
> ratón cuando en la actualidad nadie haría uso del menú teniendo una barra 
> llena de botones.
> 
> Hemos visto un modelo procedural hasta ahora para que sea sencillo 
> comprender cómo una propuesta aparentemente fácil de programar se va 
> poniendo cada vez más oscura para seguir y el orden de ejecución del código 
> tiende a parecer un plato de spaghettis.
> 
> Pues bien, todo este desarrollo culminará en una clase derivada de 
> XbpDialog.
> Esa clase tendrá como partes principales:
> 
> a) Inicialización (lo que vimos bajo la consigna Pre-Condiciones).
> b) Creación y ejecución del ABM - Algoritmo
> c) Estado final obtenido luego de la ejecución del algoritmo - 
> Post-Condiciones.
> 
> Quede claro que no se trata ésto de una clase magistral sobre cómo programar 
> un ABM.
> Se trata de una discusión donde las opiniones son valiosas y probablemente 
> aporten ideas creativas sobre el tema.
> Estoy seguro que más de un seguidor de este hilo tiene inquietudes que no ha 
> compartido con nosotros. Sería bueno leer esas inquietudes antes que el 
> código se transforme en una caja negra.
> 
> Espero preguntas.
> Jorge, ¿Te parece claro hasta ahora?
> José, ¿Consideras que los fuentes hasta aquí vistos son más complejos que 
> los habuales?
> Gustavo, ¿Te parece que tu fuente se podría convertir con ayuda de DOSSay() 
> y DOSGet()?
> Angel, ¿Qué te ha parecido el area desplazable?
> Carlos, ¿Es críptico el código Xbase++?
> 
> Vamos ¡anímense a comentar!

Por ahora el desarrollo viene bien.
Los gets en el area desplazable no hacen el scroll a medida que uno navega
entre ellos pero eso es un detalle.
Yo haria el ejemplo mas modular para que despues pasar a una clase sea mas
facil.

Ejemplo: una funcion que abre el archivo, otra que da el alta, otra que
edita, otra que da de baja, otra que imprime etc.

Visualmennte se ve muy dura pero eso se tunea despues.

Creo que al final se va a tener un buen ejemplo generico con codigo xbase++
puro, que cubra los 3 aspectos mas fundamentales es un paquete de
desarrollo de este tipo.
a) manejo de tablas
b) ingreso rapido de datos con validacion
c) salida impresa de datos

abrazos !!!
Gustavo M. BurgosRe: Xbp = Xbase++ Parts = Componentes Xbase++
on Thu, 18 Nov 2010 16:52:54 -0300
La verdad recien estoy viendo los comentarios, ya que no tuve el timepo 
suficiente. pero ahora voy a ver el codigo. y creo, como comente antes hasta 
ahora solo e trabjado en forma procedual. pero seguro que lo qeu se esta 
publicando es muy valioso. saludos y luego les comento a ver si puedo 
implementarlos en mis sistema. un abrazo

Gustavo M. Burgos
Rivadavia 278
Pcia Roque Saenz Pea - Chaco
Argentina
Fijo 03732-420635
Movil 03732-15408559
Burmanspm@arnet.com.ar
"Angel Pais" <amigosam@adinet.com.uy> escribi en el mensaje 
news:g7sibbqrftes.29it4g6mjvq6.dlg@40tude.net...
> On Wed, 17 Nov 2010 19:43:00 -0300, Jose Luis Otermin wrote:
>
>> Para quienes han compilado los fuentes que envi, probablemente hayan
>> obtenido una pantalla como la que se adjunta.
>>
>> La separacin entre el men y la primer entrada de datos XbpGet, es el
>> NUMEROMAGICO, aun no discutido.
>> La separacin entre el borde externo del XbpDialog y el area de entrada 
>> de
>> datos es aPos, el arreglo de valores {0,25} que se advierte en
>> GuiStdDialog().
>>
>> Si alguien tiene dificultad para entender el cdigo o tiene dudas sobre 
>> cmo
>> funciona algo,
>> est a tiempo para preguntar porque el fuente se volver ms complejo a
>> medida que se le agreguen prestaciones.
>>
>> Es de notar que el men invocando al ABM es en realidad un substituto del
>> ratn cuando en la actualidad nadie hara uso del men teniendo una barra
>> llena de botones.
>>
>> Hemos visto un modelo procedural hasta ahora para que sea sencillo
>> comprender cmo una propuesta aparentemente fcil de programar se va
>> poniendo cada vez ms oscura para seguir y el orden de ejecucin del 
>> cdigo
>> tiende a parecer un plato de spaghettis.
>>
>> Pues bien, todo este desarrollo culminar en una clase derivada de
>> XbpDialog.
>> Esa clase tendr como partes principales:
>>
>> a) Inicializacin (lo que vimos bajo la consigna Pre-Condiciones).
>> b) Creacin y ejecucin del ABM - Algoritmo
>> c) Estado final obtenido luego de la ejecucin del algoritmo -
>> Post-Condiciones.
>>
>> Quede claro que no se trata sto de una clase magistral sobre cmo 
>> programar
>> un ABM.
>> Se trata de una discusin donde las opiniones son valiosas y 
>> probablemente
>> aporten ideas creativas sobre el tema.
>> Estoy seguro que ms de un seguidor de este hilo tiene inquietudes que no 
>> ha
>> compartido con nosotros. Sera bueno leer esas inquietudes antes que el
>> cdigo se transforme en una caja negra.
>>
>> Espero preguntas.
>> Jorge, Te parece claro hasta ahora?
>> Jos, Consideras que los fuentes hasta aqu vistos son ms complejos que
>> los habuales?
>> Gustavo, Te parece que tu fuente se podra convertir con ayuda de 
>> DOSSay()
>> y DOSGet()?
>> Angel, Qu te ha parecido el area desplazable?
>> Carlos, Es crptico el cdigo Xbase++?
>>
>> Vamos anmense a comentar!
>
> Por ahora el desarrollo viene bien.
> Los gets en el area desplazable no hacen el scroll a medida que uno navega
> entre ellos pero eso es un detalle.
> Yo haria el ejemplo mas modular para que despues pasar a una clase sea mas
> facil.
>
> Ejemplo: una funcion que abre el archivo, otra que da el alta, otra que
> edita, otra que da de baja, otra que imprime etc.
>
> Visualmennte se ve muy dura pero eso se tunea despues.
>
> Creo que al final se va a tener un buen ejemplo generico con codigo 
> xbase++
> puro, que cubra los 3 aspectos mas fundamentales es un paquete de
> desarrollo de este tipo.
> a) manejo de tablas
> b) ingreso rapido de datos con validacion
> c) salida impresa de datos
>
> abrazos !!!
Jose Luis OterminRe: Xbp = Xbase++ Parts = Componentes Xbase++
on Thu, 18 Nov 2010 20:48:28 -0300
Angel,

Muchas gracias por participar!
> Por ahora el desarrollo viene bien.



> Los gets en el area desplazable no hacen el scroll a medida que uno navega
> entre ellos pero eso es un detalle.

A ver si te gusta ms en esta versin...

> Yo haria el ejemplo mas modular para que despues pasar a una clase sea mas
> facil.

Totalmente de acuerdo.

> Ejemplo: una funcion que abre el archivo, otra que da el alta, otra que
> edita, otra que da de baja, otra que imprime etc.

Si, estn en el fuente que dice "Procesos.prg"

> Visualmennte se ve muy dura pero eso se tunea despues.

Bueno, le agregu una XbpToolBar() como para que se vea un poco mejor 
terminada, le falta aun.

> Creo que al final se va a tener un buen ejemplo generico con codigo 
> xbase++
> puro, que cubra los 3 aspectos mas fundamentales es un paquete de
> desarrollo de este tipo.
> a) manejo de tablas
> b) ingreso rapido de datos con validacion
> c) salida impresa de datos

Si. Es la intencin primaria 

Lo de la salida impresa me gustara que alguien hiciera un aporte as puedo 
concentrarme ms en la funcionalidad del resto.

Un abrazo grande, capo.







GUIABM05.zip
abm-gui-conToolBar.png
Angel Pais Re: Xbp = Xbase++ Parts = Componentes Xbase++
on Thu, 18 Nov 2010 22:05:39 -0200
On Thu, 18 Nov 2010 20:48:28 -0300, Jose Luis Otermin wrote:

> 
> Lo de la salida impresa me gustaría que alguien hiciera un aporte así puedo 
> concentrarme más en la funcionalidad del resto.
> 
> Un abrazo grande, capo.

Tengo una rutina de impresion que esta bastante facil de usar y la voy a
aportar en su momento 

Saludos
Angel
Jose Luis OterminRe: Xbp = Xbase++ Parts = Componentes Xbase++
on Fri, 26 Nov 2010 13:03:01 -0300
Angel,

Le tu ltimo mensaje sobre el tema impresin.
Tu deseo de avance automtico del scroll cuando el campo get cambia de foco:

////////////////////////////////////////////////////

 Administra los eventos producidos.

PROCEDURE DoEvents()

////////////////////////////////////////////////////
   LOCAL nEvent, mp1, mp2, oXbp
   LOCAL oDataArea := GetDataArea( SetAppWindow())
    Fin de Aplicacin es xbeP_Quit y NO xbeP_Close
    xbeP_Close es ms usual para componentes o dilogos menores
   nEvent := xbe_None
   DO WHILE nEvent <> xbeP_Quit
      nEvent := AppEvent( @mp1, @mp2, @oXbp )
      oXbp:handleEvent( nEvent, mp1, mp2 )
      IF nEvent = xbeP_Keyboard
         DO CASE
         CASE mp1 $ {xbeK_UP, xbeK_SH_TAB }
            DesplazarAreaDeDatos( oDataArea, SCROLL_UP )
         CASE mp1 $ { xbeK_PGUP, xbeK_CTRL_PGUP, xbeK_CTRL_HOME }
            DesplazarAreaDeDatos( oDataArea, SCROLL_UP, .T. )
         CASE mp1 $ { xbeK_DOWN, xbeK_TAB, xbeK_ENTER }
            DesplazarAreaDeDatos( oDataArea, SCROLL_DOWN )
         CASE mp1 $ { xbeK_PGDN, xbeK_CTRL_PGDN, xbeK_CTRL_END}
            DesplazarAreaDeDatos( oDataArea, SCROLL_DOWN, .T. )
         CASE mp1 = xbeK_LEFT
            DesplazarAreaDeDatos( oDataArea, SCROLL_LEFT )
         CASE mp1 = xbeK_RIGHT
            DesplazarAreaDeDatos( oDataArea, SCROLL_RIGHT )
         ENDCASE
      ENDIF
   ENDDO

RETURN

Espero haber cumplido tu deseo 

Un abrazo

Jos Luis Otermin
Alaska Software
Soporte Tcnico
--------------------------------------------------------------------
Foros de Usuarios: news://news.alaska-software.com
Pgina Web: http://www.alaska-software.com
Base de Conocimientos en la Web: http://www.alaska-software.com/kbase.shtm
Oficina en Europa: Fax: +49 (0) 61 96 - 77 99 99 23
Oficina en EEUU: Fax: +1 (646) 218 1281
--------------------------------------------------------------------
Angel Pais Re: Xbp = Xbase++ Parts = Componentes Xbase++
on Fri, 26 Nov 2010 14:12:53 -0200
On Fri, 26 Nov 2010 13:03:01 -0300, Jose Luis Otermin wrote:

> Angel,
> 
> Leí tu último mensaje sobre el tema impresión.
> Tu deseo de avance automático del scroll cuando el campo get cambia de foco:
> 
> ////////////////////////////////////////////////////
> 
>  Administra los eventos producidos.
> 
> PROCEDURE DoEvents()
> 
> ////////////////////////////////////////////////////
>    LOCAL nEvent, mp1, mp2, oXbp
>    LOCAL oDataArea := GetDataArea( SetAppWindow())
>     Fin de Aplicación es xbeP_Quit y NO xbeP_Close
>     xbeP_Close es más usual para componentes o diálogos menores
>    nEvent := xbe_None
>    DO WHILE nEvent <> xbeP_Quit
>       nEvent := AppEvent( @mp1, @mp2, @oXbp )
>       oXbp:handleEvent( nEvent, mp1, mp2 )
>       IF nEvent = xbeP_Keyboard
>          DO CASE
>          CASE mp1 $ {xbeK_UP, xbeK_SH_TAB }
>             DesplazarAreaDeDatos( oDataArea, SCROLL_UP )
>          CASE mp1 $ { xbeK_PGUP, xbeK_CTRL_PGUP, xbeK_CTRL_HOME }
>             DesplazarAreaDeDatos( oDataArea, SCROLL_UP, .T. )
>          CASE mp1 $ { xbeK_DOWN, xbeK_TAB, xbeK_ENTER }
>             DesplazarAreaDeDatos( oDataArea, SCROLL_DOWN )
>          CASE mp1 $ { xbeK_PGDN, xbeK_CTRL_PGDN, xbeK_CTRL_END}
>             DesplazarAreaDeDatos( oDataArea, SCROLL_DOWN, .T. )
>          CASE mp1 = xbeK_LEFT
>             DesplazarAreaDeDatos( oDataArea, SCROLL_LEFT )
>          CASE mp1 = xbeK_RIGHT
>             DesplazarAreaDeDatos( oDataArea, SCROLL_RIGHT )
>          ENDCASE
>       ENDIF
>    ENDDO
> 
> RETURN
> 
> Espero haber cumplido tu deseo 
> 
> Un abrazo

En realidad es algo mas complicado que eso.
Viendo los fuentes de TopDown que por obvias razones no voy a publicar se
trata de que cuando un objeto get toma foco el programa averigua en que
posicion relativa se encuentra respecto de la ventana principal y hace el
scroll en la direccion adecuada hasta que quede en el area visible.

Gran abrazo, estoy recopilando mis rutina de impresion en algo "mostrable"
para postearlas aqui.
Jose Luis OterminRe: Xbp = Xbase++ Parts = Componentes Xbase++
on Fri, 26 Nov 2010 17:55:59 -0300
Querido Angel,

Leo y releo, pero aun no comprendo bien tu ltimo mensaje.

"PD: Aun quedan temas de toma de datos sin resolver, como por ejemplo que el
scroll no es automatico cuando cambio el foco del get."

El foco del get puede cambiar porque salimos del campo (con xbeK_ENTER, 
xbeK_TAB, xbeK_SH_TAB. xbeK_UP o xbeK_DOWN por citar algunas teclas).

En todos esos eventos (incluidos PagArr, PagAbj, Control PgArr, Control 
PgAbj) el foco es cambiado con xito.

Bajo qu circunstancias el foco podra cambiar y ser necesario el scroll?

Este es un desarrollo comunitario. As que si alguien ms quiere opinar o 
sugerir, bienvenido!

Gracias por escribir


Jos Luis Otermin
Alaska Software
Soporte Tcnico
--------------------------------------------------------------------
Foros de Usuarios: news://news.alaska-software.com
Pgina Web: http://www.alaska-software.com
Base de Conocimientos en la Web: http://www.alaska-software.com/kbase.shtm
Oficina en Europa: Fax: +49 (0) 61 96 - 77 99 99 23
Oficina en EEUU: Fax: +1 (646) 218 1281
--------------------------------------------------------------------
Angel Pais Re: Xbp = Xbase++ Parts = Componentes Xbase++
on Fri, 26 Nov 2010 23:13:24 -0200
On Fri, 26 Nov 2010 17:55:59 -0300, Jose Luis Otermin wrote:

> Querido Angel,
> 
> Leo y releo, pero aun no comprendo bien tu último mensaje.
> 
> "PD: Aun quedan temas de toma de datos sin resolver, como por ejemplo que el
> scroll no es automatico cuando cambio el foco del get."
> 
> El foco del get puede cambiar porque salimos del campo (con xbeK_ENTER, 
> xbeK_TAB, xbeK_SH_TAB. xbeK_UP o xbeK_DOWN por citar algunas teclas).
> 
> En todos esos eventos (incluidos PagArr, PagAbj, Control PgArr, Control 
> PgAbj) el foco es cambiado con éxito.
> 
> ¿Bajo qué circunstancias el foco podría cambiar y ser necesario el scroll?
> 
> Este es un desarrollo comunitario. Así que si alguien más quiere opinar o 
> sugerir, ¡bienvenido!
> 
> Gracias por escribir

Voy a intentar conseguir un software que filme una pantalla para mostrarte
el comportamiento de la TD respecto de la rutina de xbase++ pura.
Pero primero intentare hacer una decripcion escrita:

supongamos que tenemos 10 gets de los cuales 7 quedan visibles y 3 quedan
ocultos porque no entran en la pantalla

cuando doy enter despues del primer get el foco debe pasar al segundo get
pero no debe haber scroll porque ambos gets son visibles

en cambio cuando doy enter en el septimo get el foco debe pasar al octavo
get y hay la pantalla debe moverse automaticamente arriba para que el
octavo get sea visible 

se entiende ?
Jose Luis OterminRe: Xbp = Xbase++ Parts = Componentes Xbase++
on Fri, 26 Nov 2010 22:49:40 -0300
Angel,
Si substituyes la funcin que est en la ltima versin de ABM-GUI con la 
que sub en el mensaje anterior, se comporta tal como lo describes.

Prueba y me cuentas 

Un abrazo


Jos Luis Otermin
Alaska Software
Soporte Tcnico
--------------------------------------------------------------------
Foros de Usuarios: news://news.alaska-software.com
Pgina Web: http://www.alaska-software.com
Base de Conocimientos en la Web: http://www.alaska-software.com/kbase.shtm
Oficina en Europa: Fax: +49 (0) 61 96 - 77 99 99 23
Oficina en EEUU: Fax: +1 (646) 218 1281
--------------------------------------------------------------------


"Angel Pais" <amigosam@adinet.com.uy> escribi en el mensaje 
news:bugp6pl7z0zj.t35udzf2thij.dlg@40tude.net...
> On Fri, 26 Nov 2010 17:55:59 -0300, Jose Luis Otermin wrote:
>
>> Querido Angel,
>>
>> Leo y releo, pero aun no comprendo bien tu ltimo mensaje.
>>
>> "PD: Aun quedan temas de toma de datos sin resolver, como por ejemplo que 
>> el
>> scroll no es automatico cuando cambio el foco del get."
>>
>> El foco del get puede cambiar porque salimos del campo (con xbeK_ENTER,
>> xbeK_TAB, xbeK_SH_TAB. xbeK_UP o xbeK_DOWN por citar algunas teclas).
>>
>> En todos esos eventos (incluidos PagArr, PagAbj, Control PgArr, Control
>> PgAbj) el foco es cambiado con xito.
>>
>> Bajo qu circunstancias el foco podra cambiar y ser necesario el 
>> scroll?
>>
>> Este es un desarrollo comunitario. As que si alguien ms quiere opinar o
>> sugerir, bienvenido!
>>
>> Gracias por escribir
>
> Voy a intentar conseguir un software que filme una pantalla para mostrarte
> el comportamiento de la TD respecto de la rutina de xbase++ pura.
> Pero primero intentare hacer una decripcion escrita:
>
> supongamos que tenemos 10 gets de los cuales 7 quedan visibles y 3 quedan
> ocultos porque no entran en la pantalla
>
> cuando doy enter despues del primer get el foco debe pasar al segundo get
> pero no debe haber scroll porque ambos gets son visibles
>
> en cambio cuando doy enter en el septimo get el foco debe pasar al octavo
> get y hay la pantalla debe moverse automaticamente arriba para que el
> octavo get sea visible
>
> se entiende ?
Pablo BotellaRe: Xbp = Xbase++ Parts = Componentes Xbase++
on Sat, 27 Nov 2010 12:13:35 +0100
Hola,

> Si substituyes la función que está en la última versión de ABM-GUI con la 
> que subí en el mensaje anterior, se comporta tal como lo describes.

Lo que Angel quería decir es que la comprobación se debe hacer cuando un control toma el foco sea cual sea el metodo. En la fúnción ot4xb_dirty_dlgedit() yo estaba haciendo eso sin complicarme mucho la vida ya que cuando un control toma el foco el padre recibe una notificación a traves de WM_COMMAND y ahi mismo es un buen sitio para comprobar si el control es visible y hacer el scroll correspondiente en caso contrario.

Ahi adjunto las fuentes por si pudieran ser de alguna utilidad. 

//dirty_dlg_edit.cpp 
 linea 1211
      case WM_COMMAND:
      .....            switch( HIWORD(wp) )
            {
               case CBN_SETFOCUS:
               case BN_SETFOCUS: 
               case EN_SETFOCUS: { GetPage()->on_edit_focus(lp); return 0; } 
......

linea 611
void ot4xb_dirty_dlgedit::page_spec_t::on_edit_focus( LPARAM lp )
.....

La verdad es que no sería muy complicado montar una funcioncita genérica, aun no tengo decidido si sería más conveniente hacerlo con un hook para todas las ventanas que tuvieran una propiedad concreta o bien subclaseando la ventana de un dialogo ( Para los nuevos: subclasear una ventana es reemplazar el procedimiento de ventana con SetWindowLong() no tiene nada que ver con las clases que usamos en PRG ) 

Pendiente aun de decidir cual de los 2 caminos tomar para implementarlo la función desde xbase sería igual, quizas algo asi

ot4xb_automatic_scroll_focus(  VentanaContenedora , Ventana de datos )

Ahi lo suyo sería en lugar de usar scrollbars como controles diferentes que la funcioncita le cambiara el estilo a la ventana contenedora para usar los scrollbars integrados que traen todas las ventanas si se les añade el estilo WS_VSCROLL, y a partir de ahi no preocuparnos ya de nada.

No sé si podré sacar tiempo este fin de semana pero en cualquier caso el próximo ot4xb va a traer esta función, y así aporto mi granito de arena a este proyecto, para los que no quieran usar ot4xb a pesar de que es gratis, pues siempre pueden echar un ojo a las fuentes y tratar de implementarlo a base de DllCall() y BAP aunque es mucho más costoso.

El ejemplo más sencillo seria usar un XbpDialog normalito sin scroll ni nada y usar drawingarea como ventana de datos

oDlg := XbpDialog():New( blablabla.... )
oDlg:Create() 
 como necesitamos 2 handles de ventana pues hacemos primero el create
ot4xb_automatic_scroll_focus( oDlg , oDlg:drawingArea )
.... creamos los controles
y le damos el foco al que queramos
SetAppFocus( oEdit )
y ahi ya se hace el scroll automaticamente
y nada más

Saludos,
Pablo Botella


ot4xb_dirty_dlgedit.cpp
ot4xb_dirty_dlgedit_internal.hpp
Pablo BotellaRe: Xbp = Xbase++ Parts = Componentes Xbase++
on Sun, 28 Nov 2010 11:37:31 +0100
Hola a todos,

Ya quedó lista la funcioncita de autoscroll
Para poder usarle necesitais bajar el ultimo ot4xb ( 1.5.16.209 ) de mi pagina www.xbwin.com
y el uso no puede ser más facil

una vez creado el dialogo antes de meterle los controles
ot4xb_automatic_scroll_focus(contenedor,panel,altura,vrow_size , disable_wheel )

En el ejemplo que adjunto usamos un XbpDialog como contenedor y su drawingArea como panel, pero no hay ninguna limitación al respecto se puede usar cualquier par de ventanas siempre que el panel sea el unico hijo del contenedor.

En el tercer parámetro necesitamos conocer de antemano la altura total del panel,  la funcioncita lo redimensiona y asi podemos ir metiendole los controles a continuación. Esto es necesario porque Xbase++ mueve los controles al redimensionar las ventanas.

El cuarto parámetro es el la altura que van a tener los controles, incluyendo el margen, por defecto usamos el valor 20. No es demasiado importante el proposito es hacer que se vea el siguiente control cuando hacemos el scroll automatico, pero tampoco pasa nada si hay controles de distinta altura o con distinta separación. La mejor manera de ajustar el valor es jugar un poco con el una vez que tengamos nuestro dialogo montado, para ajustar un poco el efecto estetico.

El quinto parametro, por defecto .F. nos sirve para manipular nosotros los eventos de la ruedecita del ratón. En principio ot4xb_automatic_scroll_focus() maneja los eventos del mouse wheel internamente, pero en alguna ocasiós especial podemos querer manejarlo nosotros con los metodos que nos da Xbase++ , en esos casos ponemos el quito parametro a .T. y asi  ot4xb_automatic_scroll_focus() no hace nada con la ruedecita del raton.

Bueno, pues probarlo y me comentais que os parece.

Saludos,

Pablo Botella


TestAutoscroll.zip
Pablo BotellaRe: Xbp = Xbase++ Parts = Componentes Xbase++
on Sun, 28 Nov 2010 16:32:32 +0100
> Ya quedó lista la funcioncita de autoscroll
> Para poder usarle necesitais bajar el ultimo ot4xb ( 1.5.16.209 ) de mi pagina www.xbwin.com
> y el uso no puede ser más facil

Hacía alguna cosilla rara en el resize. ya esta arreglado en la 1.5.16.210
http://www.xbwin.com/download/snapshots/ot4xb_001_005_016_210.zip
Jose Luis OterminRe: Xbp = Xbase++ Parts = Componentes Xbase++
on Fri, 19 Nov 2010 12:54:20 -0300
Para quienes recin se suman a esta discusin, se sugiere mirar la imagen 
adjunta.

En ella se aprecian las capas de objetos que participan de la base del 
objeto ABM que iremos construyendo a lo largo de esta conversacin.

Todas las preguntas son bienvenidas y necesarias.
Son necesarias porque a veces hay detalles que muchos ojos ven mejor que 
slo dos (los mos).

Por favor, sintanse cmodos y opinen.

Saludos

Jos Luis Otermin
Alaska Software
Soporte Tcnico
--------------------------------------------------------------------
Foros de Usuarios: news://news.alaska-software.com
Pgina Web: http://www.alaska-software.com
Base de Conocimientos en la Web: http://www.alaska-software.com/kbase.shtm
Oficina en Europa: Fax: +49 (0) 61 96 - 77 99 99 23
Oficina en EEUU: Fax: +1 (646) 218 1281
--------------------------------------------------------------------



GUI-ABM-MainDesign.png
Jose Luis OterminRe: Xbp = Xbase++ Parts = Componentes Xbase++
on Thu, 25 Nov 2010 14:24:00 -0300
Contino con el diseo del ABM.

En el adjunto se aprecian los componentes y su jerarqua de relacin.
A menos que hayan preguntas, no voy a explicar este diagrama ni ningn otro.

Saludos

Jos Luis Otermin
Alaska Software
Soporte Tcnico
--------------------------------------------------------------------
Foros de Usuarios: news://news.alaska-software.com
Pgina Web: http://www.alaska-software.com
Base de Conocimientos en la Web: http://www.alaska-software.com/kbase.shtm
Oficina en Europa: Fax: +49 (0) 61 96 - 77 99 99 23
Oficina en EEUU: Fax: +1 (646) 218 1281
--------------------------------------------------------------------



GUI-ABM-FormContainer.png
Jose Luis OterminRe: Xbp = Xbase++ Parts = Componentes Xbase++
on Sun, 05 Dec 2010 10:17:22 -0300
Hemos desarrollado:

Organizacin Central:
- Un Dilogo bsico.
- Una Barra de Herramientas primitiva.
- Un Area de Datos donde pueden desplegarse los campos de una Tabla de 
Datos.

Rutinas Auxiliares:
- Despliegue de texto al estilo DOS.
- Despliegue de campos de entrada de datos al estilo DOS.
- Esbozo de rutinas para Altas - Bajas - Modificaciones.

Como podr advertirse, existe una ventaja en la separacin de tareas.
La separacin del cdigo que ejecuta una tarea especfica introduce claridad 
en el anlisis y, fundamental, en las tareas de mantenimiento.

La produccin de errores es propia del desarrollo de cualquier tarea.
Por tratarse de un ingrediente (indeseado) de los sistemas, es tarea del 
analista el separar en grnulos pequeos (cuanto ms pequeos, mejor) a los 
componentes de una tarea.

Ntese que digo "tarea" y no "rutina".
Tarea es un conjunto de actividades relacionadas entre s y que interactan 
con el entorno con un fin determinado.
Una rutina es una actividad determinada y forma parte de una tarea.

Dicho sto, alguien puede identificar las tareas dentro de un A-B-M?

Es importante hacerlo EN ESTE PUNTO DEL DESARROLLO.

Jos Luis Otermin
Alaska Software
Soporte Tcnico
--------------------------------------------------------------------
Foros de Usuarios: news://news.alaska-software.com
Pgina Web: http://www.alaska-software.com
Base de Conocimientos en la Web: http://www.alaska-software.com/kbase.shtm
Oficina en Europa: Fax: +49 (0) 61 96 - 77 99 99 23
Oficina en EEUU: Fax: +1 (646) 218 1281
--------------------------------------------------------------------
Osvaldo Ramirez Re: Xbp = Xbase++ Parts = Componentes Xbase++
on Fri, 26 Nov 2010 21:06:56 -0700
Me gusto la imagen don gato

Saludos
Jose Luis OterminRe: Xbp = Xbase++ Parts = Componentes Xbase++
on Sat, 27 Nov 2010 05:48:25 -0300
Bueno, ya es un comienzo 

> Me gusto la imagen don gato

> Saludos
AUGE_OHRRe: Xbp = Xbase++ Parts = Componentes Xbase++
on Sat, 27 Nov 2010 10:14:46 +0100
hi,

where do you get all those nice Picture from ?

did you work with Win7 DWM ( Desktop Window Manager ) and "Aero Glass" ?

greetings by OHR
Jimmy
Jose Luis OterminRe: Xbp = Xbase++ Parts = Componentes Xbase++
on Sat, 27 Nov 2010 08:24:00 -0300
Hallo Jimmy!!
Hola Jimmy!!

Wie gehts?
Qu tal?

> where do you get all those nice Picture from ?
In fact those pictures are a PowerPoint draw. 
De hecho esas imgenes son un dibujo hecho con PowerPoint. )

> did you work with Win7 DWM ( Desktop Window Manager ) and "Aero Glass" ?
Nope, I didn't had enough time to test Win 7.
No, no he tenido suficiente tiempo para probar Win 7.

Hope you liked them )
Espero te hayan gustado.

> greetings by OHR
> Jimmy

With my best wishes,
Con mis mejores deseos,

Jos Luis Otermin
Alaska Software
Soporte Tcnico
--------------------------------------------------------------------
Foros de Usuarios: news://news.alaska-software.com
Pgina Web: http://www.alaska-software.com
Base de Conocimientos en la Web: http://www.alaska-software.com/kbase.shtm
Oficina en Europa: Fax: +49 (0) 61 96 - 77 99 99 23
Oficina en EEUU: Fax: +1 (646) 218 1281
--------------------------------------------------------------------