FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour posible mejora al methodo cgenprg() en Twindow
Posts: 1516
Joined: Thu May 27, 2010 02:06 PM
posible mejora al methodo cgenprg() en Twindow
Posted: Mon Jan 09, 2012 04:03 PM
Para poder declarar los controles como locales se puede hacer estos cambios :

Code (fw): Select all Collapse
聽 if ::oBar != nil
聽 聽 聽 cPrg += " 聽 local oBart " + CRLF
聽 聽endif

//------------------- a帽adir ----------------------------------------
聽 聽if ! Empty( ::aControls )
聽 聽 聽 cPrg += " 聽 local aObj:= array("+AllTrim(str(Len(::aControls )) )+")"+CRLF
      cPrg += " 聽  local aVar:= array("+AllTrim(str(Len(::aControls )) )+")"+CRLF
聽 聽endif
//----------------- end a帽adir ----------------------------------------


luego al procesar los controles :

Code (fw): Select all Collapse
聽 聽if ! Empty( ::aControls )
聽 聽 聽 cPrg += CRLF
聽 聽 聽 AEval( ::aControls, { | oCtrl,nindex | cPrg += oCtrl:cGenPRG( lDlgUnits,nindex ) } ) 聽 // a帽adir nindex a todos los controles .....
聽 聽endif


Mejora a tbmp a帽adiendo el methodo cgenprg()

Code (fw): Select all Collapse
METHOD cGenPRG( lDlgUnits,nindex ) 聽 CLASS TBitmap

聽 聽local nFactorX, nFactorY
聽 聽local cTop, cLeft, cWidth, cHeight
聽 聽local cCode
聽 聽local cBmpCode

聽 聽DEFAULT lDlgUnits := .F.
聽 聽DEFAULT nindex:= 1

聽 聽nFactorX = If( lDlgUnits, 4 / nLoWord( GetDlgBaseUnits() ), 1 )
聽 聽nFactorY = If( lDlgUnits, 8 / nHiWord( GetDlgBaseUnits() ), 1 )

聽 聽::CoorsUpdate()

聽 聽cTop 聽 聽= LTrim( Str( Int( ::nTop * nFactorX 聽 ) ) )
聽 聽cLeft 聽 = LTrim( Str( Int( ::nLeft *nFactorY ) ) )
聽 聽cWidth 聽= LTrim( Str( INT (::nWidth * 聽nFactorX 聽 聽) ))
聽 聽cHeight = LTrim( Str( INT ( ::nHeight *nFactorY) 聽) )

聽if ! Empty( ::cResName )
聽 聽 聽 cBmpCode:= 聽' RESNAME "' + ::cResName+ ' " '
聽 聽else
聽 聽 聽 cBmpCode:= 聽' FILENAME "' + ::cBmpFile+' " '
聽 聽endif

聽 聽cCode := CRLF + " 聽 @ " + cTop + ", " + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 cLeft + ' BITMAP aObj['+alltrim(str(nindex))+']'+cBmpcode + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 ' SIZE ' + cwidth + ", " + cHeight + " ADJUST NOBORDER PIXEL OF oWnd" + CRLF

聽 
聽 聽Return cCode
Posts: 1516
Joined: Thu May 27, 2010 02:06 PM
Re: posible mejora al methodo cgenprg() en Twindow
Posted: Tue Jan 10, 2012 09:08 AM
a帽ado mejora en metodo cgenprg de tSay con control de unidades en los dialogos:
Code (fw): Select all Collapse
METHOD cGenPrg(lDlgUnits,nindex ) CLASS TSay

聽 聽local nFactorX, nFactorY
聽 聽local cTop, cLeft, cWidth, cHeight
聽 聽local cCode := ""

聽 聽DEFAULT lDlgUnits := .F.
聽 聽DEFAULT nindex:= 1

聽 聽nFactorX = If( lDlgUnits, 4 / nLoWord( GetDlgBaseUnits() ), 1 )
聽 聽nFactorY = If( lDlgUnits, 8 / nHiWord( GetDlgBaseUnits() ), 1 )

聽 聽::CoorsUpdate()

聽 聽cTop 聽 聽= LTrim( Str( Int( ::nTop 聽 聽* nFactorX ) ) )
聽 聽cLeft 聽 = LTrim( Str( Int( ::nLeft 聽 * nFactorY ) ) )
聽 聽cWidth 聽= LTrim( Str( Int(( ::nRight - ::nTop ) * nFactorY ) ) )
聽 聽cHeight = LTrim( Str( Int( (::nBottom - ::nTop )* nFactorX ) ) )


聽 聽 cCode := CRLF + " 聽 @ " + cTop + ", " + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 cLeft + ' SAY "' + ::cCaption + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 '" SIZE ' + cWidth + ", " + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 cHeight + " PIXEL OF oWnd" + CRLF

return cCode



A帽ado correcion en el metodo settext del say que ya fu茅 propuesta hace tiempo en : viewtopic.php?f=3&t=17900&p=93532&hilit=bget#p93532
Si realizamos un setText en el say y lo movemos en modo dise帽o , vuelve a mostrar el valor original , con este cambio no ocurre .
----------------- edito ---------------------------------------
Atenci贸n el cambio no vale ya que produce que no refresque el say correctamente .
queda pendiente solucionar este problema .
Posts: 1516
Joined: Thu May 27, 2010 02:06 PM
Re: posible mejora al methodo cgenprg() en Twindow
Posted: Tue Jan 10, 2012 10:55 AM
a帽ado mejora metodo cgenprg de checkbox
Code (fw): Select all Collapse
METHOD cGenPRG(lDlgUnits,nindex ) CLASS TCheckBox

   local cPrg := ""
   local nFactorX, nFactorY
   local cTop, cLeft, cWidth, cHeight

   DEFAULT lDlgUnits := .F.
   DEFAULT nindex:=1

   nFactorX = If( lDlgUnits, 4 / nLoWord( GetDlgBaseUnits() ), 1 )
   nFactorY = If( lDlgUnits, 8 / nHiWord( GetDlgBaseUnits() ), 1 )

   ::CoorsUpdate()

   if ::cCaption == nil
      ::cCaption = GetWindowText( ::hWnd )
   endif

   cTop    = LTrim( Str( Int( ::nTop    * nFactorX ) ) )
   cLeft   = LTrim( Str( Int( ::nLeft   * nFactorY ) ) )
   cWidth  = LTrim( Str( Int( ::nWidth  * nFactorY ) ) )
   cHeight = LTrim( Str( Int( ::nHeight * nFactorX ) ) )


   cPrg += CRLF + ;
           "   @ " +cTop  + ", " + cLeft + ;
           ' CHECKBOX aObj['+AllTrim(str(nIndex)) +"] VAR aVar["+AllTrim(str(nIndex))+"]"+;
           ' PROMPT "' + ::cCaption + '" SIZE ' + ;
            cWidth + ", " + cHeight + ;
           " PIXEL OF oWnd " + CRLF

return cPrg
Posts: 1516
Joined: Thu May 27, 2010 02:06 PM
Re: posible mejora al methodo cgenprg() en Twindow
Posted: Tue Jan 10, 2012 03:26 PM
a帽adido mejora en combobox :
Code (fw): Select all Collapse
METHOD cGenPrg( lDlgUnits,nindex ) CLASS TComboBox

   local cCode := ""
   local n
   local nFactorX, nFactorY
   local cTop, cLeft, cWidth, cHeight

   DEFAULT lDlgUnits := .F.
   DEFAULT nindex:=1

   nFactorX = If( lDlgUnits, 4 / nLoWord( GetDlgBaseUnits() ), 1 )
   nFactorY = If( lDlgUnits, 8 / nHiWord( GetDlgBaseUnits() ), 1 )

   ::CoorsUpdate()

   cTop    = LTrim( Str( Int( ::nTop    * nFactorX ) ) )
   cLeft   = LTrim( Str( Int( ::nLeft   * nFactorY ) ) )
   cWidth  = LTrim( Str( Int( (( ::nRight - ::nLeft )+1 ) * nFactorY ) ) )
   cHeight = LTrim( Str( Int( (( ::nBottom - ::nTop )+1 )  * nFactorX ) ) )

   cCode += CRLF + "   @ " + cTop + ", " + cLeft  + ;
            ' COMBOBOX  aObj['+AllTrim(str(nIndex)) +"] VAR aVar["+AllTrim(str(nIndex)) +"]" + ;
            " ITEMS { "

   for n = 1 to Len( ::aItems )
      if n > 1
         cCode += ", "
      endif
      cCode += '"' + ::aItems[ n ] + '"'
   next

   cCode += " } ;" + CRLF + ;
            "      SIZE " + cWidth + ", " + ;
            cHeight + " PIXEL OF oWnd" + CRLF

return cCode
Posts: 1445
Joined: Mon Oct 10, 2005 02:38 PM
Re: posible mejora al methodo cgenprg() en Twindow
Posted: Tue Jan 10, 2012 06:52 PM

Manuel,

Perdonad todos que me intrometa, pero quiz谩s mi experiencia sirva de algo.

No creo que deban ir por ah铆 los "tiros". El METHOD cGenPrg() tal como est谩 no creo que nos sirva, es m谩s no creo que se llegue a usar dado que requerimos de otros pasos previos a la obtenci贸n del c贸digo (como es la propia creaci贸n de la ventana/di谩logo/control) que nos permiten susbsituirlo completamente; me explico.

Yo empezar铆a desde el principio y seguir铆a estos pasos:

A) Tengo una pared blanca.
B) Creo una ventana en ella
C) Creo 'n' controles en la ventana
D) Obtengo el c贸digo, que usar茅 en el PRG de la compilaci贸n de mi aplicaci贸n de "gesti贸n de almacenes" (por decir algo).

Hasta ah铆 es muy posible que estemos de acuerdo, otra cosa ser谩 c贸mo hacerlo.

C贸mo lo har铆a yo?
Yo, en el punto B) usar铆a un interfaz para indicar como debe ser esta ventana: su tama帽o, su t铆tulo, si es ventana o di谩logo, su color, etc. y que d谩ndole al 'Aceptar' del interfaz se dibuje en la pared blanca; si no ya me direis como le digo el t铆tulo de la ventana.
Una vez dibujada se puede habilitar que con doble clic sobre la ventana dibujada se vuelva a llanmar al interfaz para escribir el t铆tulo si lo queremos cambiar, o escoger un nuevo color, o lo que sea, o incluso escribir el c贸digo de su cl谩usula ON INIT.

Lo mismo har铆a o muy parecido en el punto C) para el caso de los controles, y naturalmente contemplar铆a el uso de rat贸n para dimensionar, posicionar, alinear, duplicar, escoger tipos de letra, BMP, colores, etc.

Y aqu铆 voy:
entonces, si he llamado a un interfaz para escribir contenido de lo que sea, 茅ste mismo interfaz en su bot贸n 'Aceptar' tambi茅n podr铆a guardar ese contenido en HASES, ARRAY, variables p煤blicas, o donde sea.
Si he guardado la informaci贸n, en este momento soy el due帽o de lo que estoy haciendo; estoy desvinculado del comportamiento de Fivewin, y Fivewin est谩 desvinculado del comportamiento del editor de ventanas; no puedo permitir que algun d铆a uno pueda penalizar el desarrollo/evoluci贸n del otro.

Sigo:
posteriormente en el punto D) examinar铆a esos HASES, ARRAY, variables p煤blicas, o lo que sea, y en base a sus valores (y otros como el orden de creaci贸n) crear铆a c贸digo Fivewin.
Adem谩s en este punto D) puedo decirle que guarde las definiciones de las variables locales en un fichero.... digamos .LCL, as铆 como la definici贸n completa de la ventana y sus controles en otro fichero... digamos SCR.
Porque? Para que? Sencillo, en el PRG mi aplicaci贸n de "gesti贸n de almacenes" tendr茅 "#include" como el de este ejemplo:

Ejemplo:
*-------------------------------
FUNCTION uAltacliente()

include ventanaaltacliente.lcl

../.. c贸digo Fivewin de lo que sea, o inicializando variables, etc.

include ventanaaltacliente.scr

ACTIVATE DIALOG oVentanitaCliente CENTER

../.. c贸digo Fivewin de lo que sea, o enviando avisos al operador, etc.

Return Nil
*-------------------------------

Por tanto estar铆a prescindiendo del METHOD cGenPRG(), y sin necesidad de alterar las clases propias de Fivewin.

A partir de aqu铆 la imaginaci贸n, la informaci贸n la genero y la manipulo yo, por ejemplo el nombre de las variables lo decido yo. Si tengo que examinar c贸digo, un array no me dir谩 tanta informaci贸n como el nombre propio de la variable ( 'aControles[25] vs cnombreCliente' por ejemplo ).

Otro asunto ser铆a como:
- releer c贸digo PRG y crear una ventana y sus controles.
- usar controles de terceros no est谩ndar de Fivewin.
- personalizar controles para que se creen directamente con una valores por defecto.
- tener un editor de PRG que al hacer doble clic sobre "#include ventanaaltacliente.scr" abra directamente el dise帽o de la ventana.
- establecer el orden de creaci贸n de los controles para que en ejecuci贸n el orden del foco sea el deseado.
- provocar que los controles de un GROUP (por ejemplo) se "vean" cuando hemos modificado el GROUP (que no queden 'debajo' del GROUP).

En fin, que no veo claro que cGenPRG() sea el camino.

Y te he soltado este rollo, porque ya has demostrado de lo que eres capaz y tu puedes crear una herramienta que haga todo eso y m谩s.

Si consigo contenerme ya no dar茅 m谩s la lata.

Gracias.

Un Saludo

Carlos G.



FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

Posts: 1516
Joined: Thu May 27, 2010 02:06 PM
Re: posible mejora al methodo cgenprg() en Twindow
Posted: Tue Jan 10, 2012 08:54 PM

Efectivamente tu plantamiento es correcto cara a realizar un ide , dise帽ador o generador de c贸digo , cara a poder recuperar el c贸digo escrito y mucho mas.
En este caso , la 煤nica intenci贸n de los cambios que propongo en este post es completar correcciones pendientes del c贸digo fivewin que ya existe , siguiendo la misma filosof铆a ( e incluso haciendo un copia-pega ) de los 煤ltimos cambios realizados en 茅l ( Tbotton:cgenprg() ) con la intenci贸n que el ejemplo propuesto rdesign.prg corra sin problemas y que funcione el a帽adido que puse en un post de poder ejecutar "en linea" el c贸digo generado.
Todo esto me sirve para ponerme al d铆a de las cosas nuevas de fivewin a la vez que hecho un cable con el c贸digo que ha quedado desactualizado.
Gracias a ello tambi茅n me he dado cuenta que las medidas que ponemos en c贸digo en un dialogo no corresponden con las medidas que luego tiene el dialogo ejecutandose ( un bug que solucionar) y alguna cosilla mas ira apareciendo .
Es bueno que quede toda tu exposici贸n aqu铆 cara a poder realizar un generador completo e independiente o mejorar y actualizar tu herramienta de generaci贸n de c贸digo , pero no es la intenci贸n de estos cambios.
Gracias por tu inter茅s y saludos a Todos.

Continue the discussion