posible mejora al methodo cgenprg() en Twindow

posible mejora al methodo cgenprg() en Twindow

Postby mastintin » Mon Jan 09, 2012 4:03 pm

Para poder declarar los controles como locales se puede hacer estos cambios :

Code: Select all  Expand view


  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: Select all  Expand view


   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: Select all  Expand view


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

 
Last edited by mastintin on Tue Jan 10, 2012 10:37 am, edited 1 time in total.
User avatar
mastintin
 
Posts: 1516
Joined: Thu May 27, 2010 2:06 pm

Re: posible mejora al methodo cgenprg() en Twindow

Postby mastintin » Tue Jan 10, 2012 9:08 am

añado mejora en metodo cgenprg de tSay con control de unidades en los dialogos:
Code: Select all  Expand view


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 .
User avatar
mastintin
 
Posts: 1516
Joined: Thu May 27, 2010 2:06 pm

Re: posible mejora al methodo cgenprg() en Twindow

Postby mastintin » Tue Jan 10, 2012 10:55 am

añado mejora metodo cgenprg de checkbox
Code: Select all  Expand view

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

 
User avatar
mastintin
 
Posts: 1516
Joined: Thu May 27, 2010 2:06 pm

Re: posible mejora al methodo cgenprg() en Twindow

Postby mastintin » Tue Jan 10, 2012 3:26 pm

añadido mejora en combobox :
Code: Select all  Expand view

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
 
User avatar
mastintin
 
Posts: 1516
Joined: Thu May 27, 2010 2:06 pm

Re: posible mejora al methodo cgenprg() en Twindow

Postby FiveWiDi » Tue Jan 10, 2012 6: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 24.02 + Harbour 3.2.0dev (r2403071241), BCC 7.7 Windows 10
FiveWiDi
 
Posts: 1063
Joined: Mon Oct 10, 2005 2:38 pm

Re: posible mejora al methodo cgenprg() en Twindow

Postby mastintin » Tue Jan 10, 2012 8: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.
User avatar
mastintin
 
Posts: 1516
Joined: Thu May 27, 2010 2:06 pm


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 8 guests