Page 2 of 3

Re: Codigo vs Recursos

PostPosted: Tue Jan 10, 2012 10:29 pm
by Antonio Linares
Mgsoft,

Muchas de las pruebas que hacemos son pruebas de concepto principalmente, puesto que no tenemos los recursos suficientes (tiempo, programadores, financiación) para completarlos. Nuestra intención en esos casos es "abrir la puerta" para que quienes esten interesados puedan continuar su desarrollo y adaptarlos a sus necesidades.

Nos gustaría poder completar cada idea, cada proyecto que iniciamos, pero nuestra responsabilidad principal es que FWH funcione correctamente, que esté en sincronía con Harbour y xHarbour, y hacerlo crecer para que los usuarios de FWH esten respaldados y puedan usarlo con todas las garantias :-)

Es por esto que desde el inicio de FW, siempre hemos optado por recomendar herramientas de terceros, para completar las funcionalidades que nos hagan falta.

Re: Codigo vs Recursos

PostPosted: Wed Jan 11, 2012 8:44 am
by mgsoft
Antonio,

Muchas gracias por la respuesta.

En todo caso, ¿no habéis pensado en priorizar alguno de tales desarrollos pendientes y comercializarlos como un nuevo producto que debe adquirirse?. De este modo, se abrirían nuevas líneas y también ingresos adicionales.

Un saludo

Re: Codigo vs Recursos

PostPosted: Wed Jan 11, 2012 12:53 pm
by antolin
Todo lo que estais diciendo está muy bien, recursos, scripts, etc, facilitan mucho el trabajo. Pero a mi, de un tiempo a esta parte me he encontrado con un problema gordo (imagino que vosotros tambien) y es las distintas resoluciones con las que te puedes encontrar. Una pantalla en DLL para 1024X768 en una de 1280X1024 se ve pequeña y en una esquina, y no digamos en una 1280X768. Y si la diseñas para 1280X1024 en 1024X768 pierdes la mitad del diseño. Esto me obliga a programar los dialogs a código y con coordenadas relativas en lugar de absolutas. Y eso sí es un problema grande.

Saludos

Re: Codigo vs Recursos

PostPosted: Wed Jan 11, 2012 2:25 pm
by Bayron
Ambas formas son necesarias, y dependiendo de lo que quiera hacerse, se utiliza una o la otra...

La mayoria de dialogos pueden ser diseñados desde recursos sin problemas tomando solamente una regla de oro:
No diseñarlos mayores de 800 x 600, o mejor dicho, verificar que se observen correctamente en esa resolucion (algunos usuarios podrian usar esta resolucion)...

En casos especiales y cuando se haga desde código, yo obtengo la resolución de la pantalla, el tamaño de la TaskBar y calculo el tamaño de todos los controles, incluyendo los Fonts...

Code: Select all  Expand view
@ ( Cuadro4[1][1] + ( ( ( Btn4Height - ( Btn4Size * 5 ) ) / 2 )  + ( Btn4Size * 1 ) + 2 ) ) , ;
   ( Cuadro4[1][2] + ( ( Btn4Width - (Btn4Size * 3) ) / 2 ) + ( Btn4Size * 0 ) + 2 ) ;
   BTNBMP ocal [ 7] OF oDialog PROMPT '7' ;
   FILENAME PathToFile + 'graficos\botones\BOTON1.bmp' FONT oFont2 ;
   SIZE  ( Btn4Size - 5 ), ( Btn4Size - 5 ) CENTER PIXEL ADJUST NOBORDER ACTION Calc('7')


Quedando la aplicacion de la misma manera sin importar la resolucion....

Image

Re: Codigo vs Recursos

PostPosted: Wed Jan 11, 2012 3:15 pm
by lucasdebeltran
Antolín,

Sí, es un problema grave que debería corregirse haciendo que Fivewin ajustara automáticamente los diálogos a la resolución.

Existe una contribución que lo hace pero tienes que llamarla desde cada diálogo:

Code: Select all  Expand view
#include "FiveWin.ch"
#include "common.ch"
#include "xbrowse.ch"

*********************************************************************
* NOME......: DISPLAY(oWnd,nResolution)
*
* VERSAO....: 3.0 - Julho de 2010
*
* AUTOR.....: William de Brito Adami e FiveWidi, que iniciou este projeto
*             no Forum Espanhol de Fivewin .
*
* DESCRICAO.: Funcao para exibir a tela sempre igual em qualquer
*             resolucao, independente da fonte ou controle utilizado.
*
* PARAMETROS: oWnd: Window ou Dialog a ser redimensionado
*             nResolution: Numero correspondente a resolucao
*                             que se desenhou inicialmente a tela.
*
*********************************************************************
function display(  oWnd, nResolution, lFullres )
  local lAutoresize:=.t. , nWhatSize:=0, lRepaint:=.t.
 
 * atencao: nResolution identifica em que resolucao foram inicialmente
 *          desenhadas as telas, e DEVE ter um dos seguintes valores:
 *
 *  1 =  640 X 480
 *  2 =  800 X 600
 *  3 = 1024 X 768
 *  4 = 1152 X 864
 *  5 = 1280 X 800
 *  6 = 1280 X 1024
 *  7 = 1600 X 1200
 *  8 =  768 X 1024
 *  9 = 1440 X 900
 * 10 = 1280 X 768
 * 11 = 1280 X 720

 AutResiz( lAutoresize, nWhatSize, oWnd, nResolution, lRepaint, lFullres )

return nil



/*
(20/08/2009) Inicio do REdesenvolvimento da funcao.
Parametros recebidos :

lAutoresize: ativa / desativa redimensionamento automatico

nWhatSize:   permite for‡ar o redimensionamento a valores concretos;
             permitindo desta maneira que a aplica‡ao possa ter um valor
             ao qual redimensionar as telas.

oWnd:        Objeto/janela/dialogo/controle a ser redimensionado.

nResolution: Numero que identifica que resolucao tinha a tela na qual
             se desenhou o objeto.

lRepaint:    Indicador se deve repintar o objeto uma vez redimensionado.

lFullres:   Indica se os textos devem ser redimensionados no tamanho maximo
            do resource desenhado.
           

Esta funcao deve ser utilizada no evento ON INIT do ACTIVATE das WINDOWs
           e DIALOGs .

Exemplo:

ACTIVATE DIALOG oDlg ON INIT display(oDlg,2,.t.) //desenhada em 800 X 600


-* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -* -*
*/




FUNCTION AutResiz( lAutoresize, nWhatSize, oWnd, nResolution, lRepaint,lFullres )

// Resolucao da tela no momento de definir os controles.
Local nOriWidth, nOriHeight

// o normal seria que fosse a resolucao atual da tela (nWhatSize=0).
// Se permite forcar esta resolucao mediante o valor de nWhatSize=1,2,3,4,5,6,7,....
Local nWidth, nHeight

// Sao as relacoes entre a resolucao de tela e a resolucao de desenho.
Local nFactorWitdh, nFactorHeight

Local nContador,ofonttmp

DEFAULT lRepaint := .T.

nOriWidth := 0
nOriHeight := 0
nWidth := 0
nHeight := 0
nContador := 0

If ABS(nResolution) = 1
   nOriWidth := 640
   nOriHeight := 480
ElseIf ABS(nResolution) = 2
   nOriWidth := 800
   nOriHeight := 600
ElseIf ABS(nResolution) = 3
   nOriWidth := 1024
   nOriHeight := 768
ElseIf ABS(nResolution) = 4
   nOriWidth := 1152
   nOriHeight := 864
ElseIf ABS(nResolution) = 5
   nOriWidth := 1280
   nOriHeight := 800
ElseIf ABS(nResolution) = 6
   nOriWidth := 1280
   nOriHeight := 1024
ElseIf ABS(nResolution) = 7
   nOriWidth := 1600
   nOriHeight := 1200
ElseIf ABS(nResolution) = 8
   nOriWidth := 768
   nOriHeight := 1024
ElseIf ABS(nResolution) = 9
   nOriWidth := 1440
   nOriHeight := 900
ElseIf ABS(nResolution) = 10
   nOriWidth := 1280
   nOriHeight := 768
ElseIf ABS(nResolution) = 11
   nOriWidth := 1280
   nOriHeight := 720

Else
   ScrResolution( @nOriWidth, @nOriHeight )
Endif


If nWhatSize = 1
   nWidth := 640
   nHeight := 480
ElseIf nWhatSize = 2
   nWidth := 800
   nHeight := 600
ElseIf nWhatSize = 3
   nWidth := 1024
   nHeight := 768
ElseIf nWhatSize = 4
   nWidth := 1152
   nHeight := 864
ElseIf nWhatSize = 5
   nWidth := 1280
   nHeight := 800
ElseIf nWhatSize = 6
   nWidth := 1280
   nHeight := 1024
ElseIf nWhatSize = 7
   nWidth := 1600
   nHeight := 1200
ElseIf nWhatSize = 8
   nWidth := 768
   nHeight := 1024
ElseIf nWhatSize = 9
   nWidth := 1440
   nHeight := 900
ElseIf nWhatSize = 10
   nWidth := 1280
   nHeight := 768
ElseIf nWhatSize = 11
   nWidth := 1280
   nHeight := 720

Else

   ScrResolution( @nWidth, @nHeight )

Endif


If lAutoresize .and. nOriHeight != nHeight

   /* Este sera o caso habitual, ao qual se pretende redimensionar
   os controles na resolucao da tela na qual estao viendo. */


   If nResolution > 0

     nFactorWitdh := nWidth / nOriWidth
     nFactorHeight := nHeight / nOriHeight

   ElseIf nResolution < 0

     nFactorWitdh := nOriWidth / nWidth
     nFactorHeight := nOriHeight / nHeight

   EndIf

   If lRepaint
      oWnd:Hide()
   EndIf


   * se aumentou a altura
   If nFactorHeight > 1

     *****************************
     * se tiver barbutton * NOVO *
     *****************************
     if ownd:obar <> NIL
         ownd:obar:nwidth:=ownd:obar:nwidth* nfactorwitdh
         ownd:obar:nHeight:=ownd:obar:nHeight*nfactorheight
         ownd:obar:nbtnwidth:=ownd:obar:nbtnwidth*nfactorwitdh
         ownd:obar:nbtnHeight:=ownd:obar:nbtnHeight*nfactorheight
         for i= 1 to len(ownd:obar:acontrols)
             ownd:obar:acontrols[i]:Move( ownd:obar:acontrols[i]:nTop * nFactorHeight , ;
             ownd:obar:acontrols[i]:nLeft * nFactorWitdh, ;
             ownd:obar:acontrols[i]:nWidth * nFactorWitdh, ;
             ownd:obar:acontrols[i]:nHeight * nFactorHeight , ;
             .F. )
             * redimensiona o BMP da BARBUTTON
             o:=ownd:obar:acontrols[i]:hbitmap1
             if o<>0
                hbmp:=ownd:obar:acontrols[i]:hbitmap1
                nbmpwidth := nbmpwidth(hbmp)
                nbmpheight:= nbmpheight(hbmp)  
                larg:=nbmpwidth*nfactorwitdh
                alt:=nbmpheight*nfactorheight
                o:=resizebmp(o,larg ,alt )
                ownd:obar:acontrols[i]:hbitmap1:=o
             endif  
         next
         ownd:obar:refresh()
     endif


     If oWnd:ClassName()$"/TIMAGE/"

        ad:=getcoors(ownd:hWnd)
        oWnd:Move( oWnd:nTop * nFactorHeight , ;
        oWnd:nLeft * nFactorWitdh, ;
        ((ad[4]-ad[2])) * nFactorWitdh, ;
        ((ad[3]-ad[1])) * nFactorHeight , ;
        .F. )

     Else

         oWnd:Move( oWnd:nTop * nFactorHeight , ;
         oWnd:nLeft * nFactorWitdh, ;
         oWnd:nWidth * nFactorWitdh, ;
         oWnd:nHeight * nFactorHeight , ;
         .F. )

     EndIf
   EndIf



   if oWnd:ClassName()$"/TFOLDER/TPAGES/"

      If ValType( oWnd:aDialogs ) = "A"
        For nContador := 1 To Len( oWnd:aDialogs )
         AutResiz( lAutoresize, nWhatSize, oWnd:aDialogs[nContador], nResolution, .F.,lFullres )
        EndFor
      EndIf


      Elseif oWnd:ClassName()$"/TBTNBMP/"

         *********************************
         * redimensiona o BMP do BTNBMP
         o:=oWnd:hbitmap1
         if o<>0
            hbmp:=ownd:hbitmap1
            nbmpwidth := nbmpwidth(hbmp)
            nbmpheight:= nbmpheight(hbmp)  
            larg:=nbmpwidth*nfactorwitdh
            alt:=nbmpheight*nfactorheight
            o:=resizebmp(o,larg ,alt )
            oWnd:hbitmap1:=o
         endif
         *********************************



   elseif oWnd:ClassName()$"/TCOMBOBOX/TDBCOMBO/"


   Else
      If ValType( oWnd:aControls ) = "A"
        For nContador := 1 To Len( oWnd:aControls )

            AutResiz( lAutoresize, nWhatSize, oWnd:aControls[nContador], nResolution, .F.,lFullres )

            * ajuste de fontess
            * controle TSAY
            if ownd:acontrols[nContador]:classname$"/TSAY/TSAYREF/"
               ajustaalt(ownd:acontrols[nContador],nfactorheight,lFullres)
               ajustalarg(ownd:acontrols[nContador],ownd,nfactorwitdh,lFullres)

            ELSEif ownd:acontrols[nContador]:classname$"/TGET/TSSAY/TDSAY/"
               ajustaalt(ownd:acontrols[nContador],nfactorheight,lFullres)
               ajl_FLD(ownd:acontrols[nContador],nFactorWitdh)

            ELSEif ownd:acontrols[nContador]:classname$"/TFOLDER/TPAGES/TCOMBOBOX/TGROUP/TTREE/TCHECKBOX/TBTNBMP/TTOOLBAR/TRADIO/TDBCOMBO/TTABS/TXBROWSE/TSBROWSE/TWBROWSE/"
               aja_FLD(ownd:acontrols[nContador],nFactorHeight)
               ajl_FLD(ownd:acontrols[nContador],nFactorWitdh)
            endif

        EndFor
      EndIf
   EndIf

   * se diminuiu a altura
   If nFactorHeight < 1

     *****************************
     * se tiver barbutton * NOVO *
     *****************************
     if ownd:obar <> NIL
         ownd:obar:nwidth:=ownd:obar:nwidth* nfactorwitdh
         ownd:obar:nHeight:=ownd:obar:nHeight*nfactorheight
         ownd:obar:nbtnwidth:=ownd:obar:nbtnwidth*nfactorwitdh
         ownd:obar:nbtnHeight:=ownd:obar:nbtnHeight*nfactorheight
         for i= 1 to len(ownd:obar:acontrols)
             ownd:obar:acontrols[i]:Move( ownd:obar:acontrols[i]:nTop * nFactorHeight , ;
             ownd:obar:acontrols[i]:nLeft * nFactorWitdh, ;
             ownd:obar:acontrols[i]:nWidth * nFactorWitdh, ;
             ownd:obar:acontrols[i]:nHeight * nFactorHeight , ;
             .F. )

             * redimensiona o BMP da BARBUTTON
             o:=ownd:obar:acontrols[i]:hbitmap1
             if o<>0
                hbmp:=ownd:obar:acontrols[i]:hbitmap1
                nbmpwidth := nbmpwidth(hbmp)
                nbmpheight:= nbmpheight(hbmp)  
                larg:=nbmpwidth*nfactorwitdh
                alt:=nbmpheight*nfactorheight
                o:=resizebmp(o,larg ,alt )
                ownd:obar:acontrols[i]:hbitmap1:=o
             endif  
         next
         ownd:obar:refresh()
     endif
     ***************************************

      if oWnd:ClassName()$"/TIMAGE/"

        ad:=getcoors(ownd:hWnd)
        oWnd:Move( oWnd:nTop * nFactorHeight , ;
        oWnd:nLeft * nFactorWitdh, ;
        ((ad[4]-ad[2])) * nFactorWitdh, ;
        ((ad[3]-ad[1])) * nFactorHeight , ;
        .F. )

      Elseif oWnd:ClassName()$"/TBTNBMP/"

         oWnd:Move( oWnd:nTop * nFactorHeight , ;
         oWnd:nLeft * nFactorWitdh, ;
         oWnd:nWidth * nFactorWitdh, ;
         oWnd:nHeight * nFactorHeight , ;
         .F. )

         *********************************
         * redimensiona o BMP do BTNBMP
         o:=oWnd:hbitmap1
         if o<>0
            hbmp:=ownd:hbitmap1
            nbmpwidth := nbmpwidth(hbmp)
            nbmpheight:= nbmpheight(hbmp)  
            larg:=nbmpwidth*nfactorwitdh
            alt:=nbmpheight*nfactorheight
            o:=resizebmp(o,larg ,alt )
            oWnd:hbitmap1:=o
         endif
         *********************************


      Else


         oWnd:Move( oWnd:nTop * nFactorHeight , ;
         oWnd:nLeft * nFactorWitdh, ;
         oWnd:nWidth * nFactorWitdh, ;
         oWnd:nHeight * nFactorHeight , ;
         .F. )

      endif


      If ValType( oWnd:aControls ) <> "A"

            * ajuste de fontess
            * controle TSAY
            if ownd:classname$"/TSAY/TSAYREF/"
               ajustaalt(ownd,nfactorheight,lFullres)
               ajustalarg(ownd,ownd,nfactorwitdh,lFullres)
            ELSEif ownd:classname$"/TGET/TSSAY/TDSAY/"
               ajustaalt(ownd,nfactorheight,lFullres)
               ajl_FLD(ownd,nFactorWitdh)

            ELSEif ownd:classname$"/TFOLDER/TPAGES/TCOMBOBOX/TGROUP/TTREE/TCHECKBOX/TBTNBMP/TTOOLBAR/TRADIO/TDBCOMBO/TTABS/TXBROWSE/TSBROWSE/TWBROWSE/"
               aja_FLD(ownd,nFactorHeight)
               ajl_FLD(ownd,nFactorWitdh)

            endif


      EndIf

   EndIf

   If lRepaint

      if oWnd:lCentered   // *** AAA ***//
         oWnd:Center()    // *** AAA ***//
      endif               // *** AAA ***//

      oWnd:Show()

   EndIf

    ***************************************
    * se for resolucao igual a que desenhou
    ***************************************
elseif lAutoresize .and. nOriHeight = nHeight


if lfullres

   If nResolution > 0
      nFactorWitdh := nWidth / nOriWidth
      nFactorHeight := nHeight / nOriHeight
   ElseIf nResolution < 0
      nFactorWitdh := nOriWidth / nWidth
      nFactorHeight := nOriHeight / nHeight
   EndIf

   If oWnd:ClassName()$"/TFOLDER/TPAGES/"
      If ValType( oWnd:aDialogs ) = "A"
        For nContador := 1 To Len( oWnd:aDialogs )
         AutResiz( lAutoresize, nWhatSize, oWnd:aDialogs[nContador], nResolution, .F.,lfullres )
        EndFor
      EndIf
   elseif oWnd:ClassName()$"/TIMAGE/"    //TBITMAP/TLISTBOX/TWBROWSE/TSSAY/TDSAY/TSAYREF/"    
       ad:=getcoors(ownd:hWnd)
       oWnd:Move( oWnd:nTop * nFactorHeight , ;
       oWnd:nLeft * nFactorWitdh, ;
       ((ad[4]-ad[2])) * nFactorWitdh, ;
       ((ad[3]-ad[1])) * nFactorHeight , ;
       .F. )

   elseif oWnd:ClassName()$"/TCOMBOBOX/TDBCOMBO/"


   Else
      If ValType( oWnd:aControls ) = "A"
        For nContador := 1 To Len( oWnd:aControls )

            AutResiz( lAutoresize, nWhatSize, oWnd:aControls[nContador], nResolution, .F.,lfullres )

           * ajuste de fontes
            * controle TSAY
            if ownd:acontrols[nContador]:classname$"/TSAY/TSAYREF/"
               ajustaalt(ownd:acontrols[nContador],nfactorheight,lFullres)
               ajustalarg(ownd:acontrols[nContador],ownd,nfactorwitdh,lFullres)
            ELSEif ownd:acontrols[nContador]:classname$"/TGET/TSSAY/TDSAY/"
               ajustaalt(ownd:acontrols[nContador],nfactorheight,lFullres)
               ajl_FLD(ownd:acontrols[nContador],nFactorWitdh)
            ELSEif ownd:acontrols[nContador]:classname$"/TFOLDER/TPAGES/TCOMBOBOX/TGROUP/TTREE/TCHECKBOX/TBTNBMP/TTOOLBAR/TRADIO/TDBCOMBO/TTABS/TXBROWSE/TSBROWSE/TWBROWSE/"
               aja_FLD(ownd:acontrols[nContador],nFactorHeight)
               ajl_FLD(ownd:acontrols[nContador],nFactorWitdh)

            endif

        EndFor
      EndIf
   EndIf

endif
EndIf

Return Nil




FUNCTION AjustaLarg(oq,ownd,nfact,lfullres)
   * se nao tiver fonte atribuida, nao faz !
   LOCAL cFontName  := iif ( oq:oFont=NIL , "NAOFAZ" ,oq:oFont:cFaceName )
   LOCAL   lFlagReleaseFont   := .F.,;
      nAlturaDaFonte,;
      nLarguraDaFonte    := oq:ofont:nwidth,;
      nLarguraDoControle ,;
      nTime              := SECONDS()+3,;
      oFontTmp,ofont

   if cFontName="NAOFAZ"
      return nil
   endif

   if oq:oFont:nWidth = NIL    // *** AAA ***//
      oq:oFont:nWidth := 0     // *** AAA ***//
   endif                       // *** AAA ***//

   nAlturaDaFonte     := oq:oFont:nHeight
   nlarguradafonte:=nlarguradafonte*nfact
   nLarguraDoControle := oq:nWidth

if lFullres


   WHILE SECONDS() < nTime  // Evita congelamento da aplicação caso não seja possível recalcular a fonte

      nLarguraDaFonte += 1  // Nao funciona com numeros facionados

      DEFINE FONT oFontTmp;
             NAME cFontName;
             SIZE nLarguraDaFonte,ABS(nAlturaDaFonte)

      lFlagReleaseFont := .T.
 
      IF oWnd:GetWidth(oq:varget(),oFontTmp) >= nLarguraDoControle
         EXIT
      ENDIF

      oq:SetFont(oFontTmp)
      oFont := oq:ofont   //osay:GetFont()

      RELEASE FONT oFontTmp
      lFlagReleaseFont := .F.

   ENDDO

   IF lFlagReleaseFont
      RELEASE FONT oFontTmp
   ENDIF

   oq:SetFont(oFont)
else


      DEFINE FONT oFontTmp;
             NAME cFontName;
             SIZE abs(nLarguraDaFonte),ABS(nAlturaDaFonte)

      oq:SetFont(oFontTmp)
      oFont := oq:ofont   //osay:GetFont()

   RELEASE FONT oFontTmp


endif



*   oq:Refresh()

RETURN NIL


FUNCTION AjustaAlt(oq,fact,lFullres)
   * se nao tiver fonte , nao faz !
   LOCAL cFontName  := iif ( oq:oFont=NIL , "NAOFAZ" ,oq:oFont:cFaceName )
   LOCAL lFlagReleaseFont   := .F., nAlturaDaFonte, nAlturaDoControle  
   LOCAL nLarguraDaFonte,  nTime:= SECONDS()+3, oFontTmp,ofont

   * se nao tiver fonte, volta sem ajustar
   if cfontname="NAOFAZ"
      return nil
   endif

   if oq:oFont:nWidth = NIL    // *** AAA ***//
      oq:oFont:nWidth := 0     // *** AAA ***//
   endif                       // *** AAA ***//

   nAlturaDaFonte:=oq:ofont:nheight



if lFullres
       

   * se tiver fonte , ajusta
   nAlturaDoControle  := (oq:nHeight)-6

   nLarguraDaFonte    := oq:oFont:nWidth

   nAlturadaFonte:=nalturadafonte*fact

   WHILE SECONDS() < nTime  // Evita congelamento da aplicação caso não seja possível recalcular a fonte

      nAlturaDaFonte += 0.1 // Na altura o fracionamento funcionou

      DEFINE FONT oFontTmp;
             NAME cFontName;
             SIZE nLarguraDaFonte,nAlturaDaFonte

      lFlagReleaseFont := .T.

      IF oFontTmp:nHeight >= nAlturaDoControle
         EXIT
      ENDIF

      oq:SetFont(oFontTmp)
      oFont := oq:ofont    //oSay:GetFont()

      RELEASE FONT oFontTmp
      lFlagReleaseFont := .F.

   ENDDO

   IF lFlagReleaseFont
      RELEASE FONT oFontTmp
   ENDIF

   oq:SetFont(oFont)
else

      nLarguraDaFonte := oq:oFont:nWidth
      nAlturadaFonte:=nalturadafonte*fact

      DEFINE FONT oFontTmp;
             NAME cFontName;
             SIZE abs(nLarguraDaFonte),ABS(nAlturaDaFonte)

      oq:SetFont(oFontTmp)
      oFont := oq:ofont   //osay:GetFont()

   RELEASE FONT oFontTmp


endif

*    oq:Refresh()


RETURN NIL



FUNCTION ajl_FLD(oq,nf)
   * se nao tiver fonte , nao faz
   LOCAL cFontName := iif ( oq:oFont=NIL , "NAOFAZ" ,oq:oFont:cFaceName )
   LOCAL lFlagReleaseFont   := .F., nAlturaDaFonte, nLarguraDaFonte := 0,;
         nLarguraDoControle ,nTime:= SECONDS()+3, oFontTmp,ofont
 
      if cfontname="NAOFAZ"
         return nil
      endif

      if oq:oFont:nWidth = NIL    // *** AAA ***//
         oq:oFont:nWidth := 0     // *** AAA ***//
      endif                       // *** AAA ***//
       

      nLarguraDoControle := oq:nWidth
      nAlturaDaFonte     := oq:oFont:nHeight
      nLarguraDaFonte = nLarguraDaFonte*nf

      DEFINE FONT oFontTmp;
             NAME cFontName;
             SIZE abs(nLarguraDaFonte),ABS(nAlturaDaFonte)

      oq:SetFont(oFontTmp)
      oFont := oq:ofont   //osay:GetFont()

   RELEASE FONT oFontTmp


   If oq:ClassName()$"/TXBROWSE/"

      for i=1 to len(oq:acols)
          * pega tamanho anterior X factor
          ov:=oq:aCols[i]:nWidth * nf
          * atualiza o novo tamanho da coluna
          oq:aCols[i]:nWidth := ov
      next

   elseif oq:classname$"/TDSAY/"

      oq:Refresh()

   elseif  oq:ClassName()$"/TWBROWSE/"

      * atualiza a largura das colunas
      for i=1 to len(oq:acolsizes)
          oq:acolsizes[i]:=oq:acolsizes[i]*nf
      next

   endif

*   oq:Refresh()

RETURN NIL



FUNCTION aja_FLD(oq,nf)
   LOCAL cFontName := iif ( oq:oFont=NIL , "NAOFAZ" ,oq:oFont:cFaceName )
   LOCAL lFlagReleaseFont := .F., nAlturaDaFonte := 0,;
         nLarguraDaFonte, oFontTmp,ofont

      if cfontname="NAOFAZ"
         return nil
      endif

      if oq:oFont:nWidth = NIL    // *** AAA ***//
         oq:oFont:nWidth := 0     // *** AAA ***//
      endif                       // *** AAA ***//

      nLarguraDaFonte := oq:oFont:nWidth
      nAlturadaFonte:=nalturadafonte*nf

      DEFINE FONT oFontTmp;
             NAME cFontName;
             SIZE abs(nLarguraDaFonte),ABS(nAlturaDaFonte)

      oq:SetFont(oFontTmp)
      oFont := oq:ofont   //osay:GetFont()

   RELEASE FONT oFontTmp

   If oq:ClassName()$"/TXBROWSE/"
      oq:nRowHeight   :=   oq:nRowHeight* nf
      oq:nStretchcol:=STRETCHCOL_LAST

   elseif oq:ClassName()$"/TSBROWSE/"

      oq:nHeightCell:=oq:nHeightCell * nf
      *   oq:nheightHead:=oq:nheightHead*nf
      *   oq:nheightFoot:=oq:nheightFoot*nf



   endif

*   oq:Refresh()

RETURN NIL







Re: Codigo vs Recursos

PostPosted: Wed Jan 11, 2012 3:19 pm
by Bayron
Esa fué la primera opción que usé, pero se demoraba mucho para pintar mi modulo (por alguna razón cerca de 10 segundos), y tuve que optar por hacerlo de la otra manera...

Para dialogos normales, creo que es una exelente opción...

Re: Codigo vs Recursos

PostPosted: Wed Jan 11, 2012 3:53 pm
by lucasdebeltran
Quizás Fivetech podría optimizar esa función y añadir un set global para ajustar la resolución de los diálogos a la resolución de pantalla.

Sería una novedad muy buena para el producto ;).

Re: Codigo vs Recursos

PostPosted: Wed Jan 11, 2012 5:36 pm
by George
mgsoft escribio:
En todo caso, ¿no habéis pensado en priorizar alguno de tales desarrollos pendientes y comercializarlos como un nuevo producto que debe adquirirse?. De este modo, se abrirían nuevas líneas y también ingresos adicionales.

Antonio,
Siempre he estado de acuerdo con lo expresado por mgsoft.
No hay duda que el camino a tomar es el de añadir, por parte de fivetechsoft, herramientas utiles para que se haga mas facil, eficiente y poderoso el uso del FWH por parte de nosotros.
Si te fijas, por el numero de usuarios de este forum, no estamos creciendo como todos deseariamos, a pesar de tener en mi opinion unos de los mejores entorno de desarrollo para Windows existente hoy dia en el mercado. Un entorno que tambien funciona, no al mismo nivel de FWH aun, en Mac, iPhone, Android y Windows Mobile.

Talvez el asunto esta en el marketing.

Mi consejo seria retrasar al menos 2 meses la proxima pubicacion de FWH a fin de enfocarse en lo siguiente:
1. Estabilizar la ultima actualizacion de FWH a fin de corregir todos los posibles "bugs" detectados.
2. Escribir un manual en formato PDF, basado en esta ultima actualizacion de FWH, y el cual contenga varios ejempos detallados.
3. Iniciar un plan de marketing en los EE.UU.

Finalmente quiero darte las gracias por haber puesto a nuestro alcance tan excelente producto FWH y por permitirnos dar nuestra opinion al respecto en este forum.

Saludos.

George

Re: Codigo vs Recursos

PostPosted: Wed Jan 11, 2012 11:02 pm
by mgsoft
George,

Me alegro de no ser el único que piensa en el futuro de FWH + Harbour ;).

También quiero reiterar mi agradecimiento a Antonio y al equipo, y este post en ningún caso es una crítica.

Pero creo que deben replantearse todas las vías y ventanas abiertas, ya que no resultan viables ni utilizables. A fecha de hoy no es posible convertir al 99% una aplicación de FWH a FiveMac o a FiveLinux. Y el futuro de Fivetech pasa por permitir dicha interoperabilidad de plataformas y también crear un Fiveweb, todo con una misma sintáxis.

Sin embargo, deben ser productos 100% funcionales y operativos, no nuevas "ventanas" o prototipos que no acaban de funcionar. Y lógicamente, hay que pagar por ello. No podemos tener todos los productos gratis o con el precio actual del FTDN.

Por eso, deseo que el 2012 traiga un impulso al equipo de desarrollo de Fivetech para evitar la caida en picado de usuarios, cuando se trata de una plataforma sólida y robusta que no tiene que envidiar nada a C++ o a Visual Basic.

Y reitero que todo esto debe entenderse en positivo y nunca como crítica al enorme esfuerzo de Fivetech que nos ha brindado una herramienta tan útil como Fivewin, reiterando nuevamente mi agradecimiento.

Re: Codigo vs Recursos

PostPosted: Thu Jan 12, 2012 7:19 am
by Carles
Antolin,

El tema de las pantallas es mas un tema de funcionalidad que uno quiere aportar a su aplicacion pero no creo que sea la mejor opcion. Si tu quieres ver los dialogos mas grandes o mas pequeños, pues cambias la resolucion de pantalla y listos, y antes de que me digas que esto ya lo sabias (q por supuesto ya lo se :-) ), es la correcta solucion. Si tu cojes el mismo office y cambias la resolucion no cambia el tamaño de los dialogos, y como este, la mayoria de los paquetes.

Ahora, si es una necesidad para solventar una problematica particular, de acuerdo, pero no como para ponerlo como una funcionalidad por defecto en la FWH

Re: Codigo vs Recursos

PostPosted: Thu Jan 12, 2012 8:07 am
by Carles
Mgsoft,

Yo estoy de acuerdo en parte y me explico.

1.- Compatibilidad entre sistemas
FWH nunca sera 100% compatible con las diferentes versiones para mac, linux, ... por la sencilla razon que la madurez de FWH no se encuentra en las otras librerias, y las numerosas clases que tiene no se encuentran porque o no se han portado o bien no se pueden portar, pero dicho esto.... Es bueno entender que la funcionalidad en si del producto, te permite facilmente portar una app de un sistema a otro, y facilmente "adaptarlo". Yo recuerdo que una mañana ya realice al principio app con la pocket, y pasa lo mismo con los otros entornos. Es mas complejo conocer el otro sistema y configurarlo, adaptarlo, emuladores, ... que no crear tu primera ventana de "Hello FWH...", porque es aqui donde uno ve la potencia de este lenguaje.

2.- IDE
Personalmente creo que FWH es uno de los productos mas robustos que existe. Es cierto que existen pequeños bugs, pero no dejan de ser esto, bugs q se van ajustando con el tiempo, pero muy lejos de los numerosos bugs que tambien tienen otros productos. A partir de esta posicion, creo que los que llevamos años trabajando sin un IDE nos deja dormir igual y somos igual o mas productivos debido tambien a nuestra evolucion personal de trabajar con estas librerias, pero.... si, seria bonito un IDE para mi como cerecita al producto y la gente ajena a este entorno lo viera quizas con un poco mas de "respeto" :-).

Ahora, crear un IDE se tendria de apostar por varios temas:

1.- Un IDE multiplataforma no me lo creo, por la sencilla razon descrita mas arriba, problema entre entornos

2.- Quizas a nivel de "orgullo" nuestro nos gustaria crear un IDE 100% FWH, pero yo creo que seria mejor enfocarlo de otra manera, por ejemplo: Una parte de las mas importantes de un IDE es el propio editor de codigo: O lo creamos integramente con FWH o integramos un componente de terceros, que hay muchos, open source, y con unas funcionalidades completas y brutales, preparadas para usarlos p.e. -> http://www.scintilla.org/ que es usado ya en numerosos entornos, y como este hay un monton . Para que reinventar la rueda ? Este es uno de los puntos para mi mas importante: Un editor agil, rapido, ayuda en linea, posicionamientos,....

3.- En un primera version se puede integrar de manera "sencilla": Gestor de proyectos, librerias, recursos, editor, gestor de compilacion, enlazado. Para de una manera mas transparente e independiente añadir facilmente otros componentes como por ejemplo un gestor de db, ayudas, reporting.

4.- Todo y este enfoque que digo "sencillo", evidentemente ya comporta un enorme esfuerzo q implica recursos y valoracion

5.- Este IDE te ayudaria a poner quizas un poco de orden e "higienizar" tu sistema, pero NO ha hacer mejores programas :-) (pero esto es otro tema... :wink: )

Re: Codigo vs Recursos

PostPosted: Thu Jan 12, 2012 8:42 am
by mastintin
Suscribo lo dicho por Carles.
Pretender hacer compatible FWH con FWMac es casi un sueño .
FWH al final hace llamadas a las funciones del api de windows , al igual FWMAc hace llamadas a los objetos y metodos de los distintos apis de macosx .

Los apis de uno y otro son diferentes totalmente , incluso en construcción , uno es totalmente objeto el otro en muchos casos puro C .

Los controles son diferentes en ambos entornos , muchos de los controles que usamos en windows no existen en MAC y otros muchos de mac no existen en windows .
La filosofia de uso es diferente tambien , yo no recuerdo en windows de usar en un programa el drag&drop mas que como "adorno" o para usar la papelera :-) , en mac es "el espiritu" de uso del sistema.
La impresión en mac funciona totalmente diferente , etc, etc ,etc .
Cada aspecto del SO es diferente , y sin entrar en mejor o peor ,hacer que funcione igual o es usando como java o Realbasic una capa de runtime intermedio o no se puede . Por concepto FWH no es eso sino llamadas directas a api asi que o se hace un nuevo FWH o olvidarse de esto.

Lo que se pretende es que partiendo de una sintaxis conocida y similar se puedan adaptar programas con rapidez aprovechando todo el código de los procesos y haciendo pocos cambios en el codigo relacionado con los controles , pero nunca que un codigo funcione en otro sistema.

En cuanto el tema del IDE , uso Xmate con buenos resultados ,y solo hecho de menos un "generador de codigo visual" para construir los dialogos rapido como el rayo ,propio de fivetech .Veo que otras opciones existen , para Recursos Pellesc funciona perfecto y es free , asi que poco mas necesitaría salvo "cosillas pendientes" que se van arreglando.

Saludos.

Re: Codigo vs Recursos

PostPosted: Thu Jan 12, 2012 9:40 am
by mgsoft
Carlos y Manuel,

Muchas gracias por expresar vuestro punto de vista. Lógicamente la compatibilidad Mac/Linux/Windows no es fácil pero tampoco tan imposible. En todo caso, si que sería posible un grado mucho mayor que el actual y, desde luego, que el núcleo de las clases de Fivewin funcionen en ellas. Claro que probablemente TVistaMenu no funcione, pero esto es salvable. Y además, en todo caso, esto hay que pagarlo.

Tampoco decís nada sobre Fiveweb, que es otra de las líneas de futuro del producto. Y esta línea, además, permite que la aplicación corra sobre cualquier plataforma. Un chico brasileño de 23 años, insolvente y timador, ha mostrado que es posible. Fácil no es, pero es posible desde luego, y también hay que pagar por ello.

Pero si no pensamos en el futuro y pensamos que lo que tenemos es lo mejor del mercado corremos el riesgo de quedarnos solos. Un vistazo a la actividad de los foros y nuevas incorporaciones no corrobora un sentimiento tan optimista.

Re: Codigo vs Recursos

PostPosted: Thu Jan 12, 2012 10:18 am
by Carles
Mgsoft,

Tampoco decís nada sobre Fiveweb, que es otra de las líneas de futuro del producto. Y esta línea, además, permite que la aplicación corra sobre cualquier plataforma. Un chico brasileño de 23 años, insolvente y timador, ha mostrado que es posible. Fácil no es, pero es posible desde luego, y también hay que pagar por ello.


Recuerdas las primeras pantallas ? Esto hace 4 años que esta hecho --> http://www.soyos.net/tl_files/demos/Win ... -Websites/

Sobre Fivewin Web Interface, vamos a ver como se desarrolla..., pero tambien ten en cuenta que si quieres entrar en este mundo de Inet, tendras te guste o no, empezar a mirarte temas relacionados y lenguajes ya se de parte del cliente como javascript a cara servidor como php...Noesperes la formula magica q te resuleva todas las situaciones. El Fiveweb este de brasil, no se como funciona pero intuyo q se debe programar en harbour, el cual genera un exe que sera ejecutado como un cgi por un servidor q te lo permita. Aqui ya te empiezan las limitaciones, el depender de un proveedor o de una maquina que te permita esto con sus principales desventajas y limitaciones, pero vuelvo decir q tampoco lo he visto y perdonad si me equivoco.

Pero si no pensamos en el futuro y pensamos que lo que tenemos es lo mejor del mercado corremos el riesgo de quedarnos solos.


Solos, pero resistiremos jajaja :-)

Re: Codigo vs Recursos

PostPosted: Thu Jan 12, 2012 10:54 am
by mgsoft
Carles,

Por cierto, enhorabuena por tu diseñador de documentos, tiene muy buena pinta la verdad. Y muchas gracias por donarlo opensource.

Fiveweb trabaja con IIS y Apache, funcionando tanto bajo Linux y Windows. Pero el que mucho abarca nada aprieta...

Por eso, creo que debería escogerse un servidor web con el que sea más fácil la portabilidad (IIS o Apache). Para dar servicio con la aplicación es necesario tener un servidor dedicado a tal fin. Ahora son bastante asequibles. Pero no es posible lo que alguno quería con Fiveweb, y es poder meterlo en un hosting compartido tipo Arsys o Piensasolutions.

Antonio ha empezado a crear su propio servidor web. Creo que humildemente no es la opción, porque llevaría mucho tiempo su desarrollo y, además, solo funciona en Crome.

Por el contrario, Laiton consiguió en muy poco tiempo hacer algo bastante chulo bajo IIS y Apache. Debería escogerse el servidor web más potente y que permitiera la portabilidad de un modo más fácil.