Page 1 of 1

StatusBar en Dialogo desde una clase

Posted: Fri Jan 03, 2020 5:08 am
by Compuin
Hola Foro

Estoy creando una clase para manejar mis dialogos pero no logro que me agregue la Barra de Status al mismo

Code: Select all

#Include "FiveWin.ch"

MEMVAR oAp

CLASS TEMPLATE

   DATA oDlg

   METHOD NEW()
   METHOD ACTIVATE()
   METHOD END()

ENDCLASS

METHOD NEW( cTitle, nTop, nLeft, nBottom, nRight ) CLASS TEMPLATE

   DEFINE DIALOG ::oDlg TITLE cTitle OF oAp:oWndMain;
          FROM nTop, nLeft TO nBottom, nRight PIXEL ;
          STYLE NOR( WS_POPUP, WS_VISIBLE, WS_CAPTION, WS_THICKFRAME, WS_SYSMENU, WS_MINIMIZEBOX )

RETURN ::oDlg

METHOD ACTIVATE() CLASS TEMPLATE
   LOCAL oDlg

   ::oDlg := oDlg

   ACTIVATE DIALOG ::oDlg NOWAIT;
            ON INIT (STATUSBAR(oDlg))

RETURN NIL

METHOD END() CLASS TEMPLATE

   ::oDlg:End()

RETURN NIL

STATIC FUNCTION STATUSBAR(oDlg)
   //LOCAL oDlg

   oDlg := ::oDlg

   SET MESSAGE OF ::oDlg;
        TO "This is a status bar";

RETURN NIL

Re: StatusBar en Dialogo desde una clase

Posted: Fri Jan 03, 2020 2:50 pm
by karinha
No me gusta usar clase, siempre prefiero Fivewin normal.

Code: Select all

// Our first DialogBox sample and statusbar
 
#include "FiveWin.ch"
#include "ttitle.ch"
 
# define HTTPREQUEST_PROXYSETTING_PROXY  2

#IFDEF __XHARBOUR__
  #xtranslate hb_DateTime([<x,...>])          => DateTime(<x>)
  #xtranslate hb_tstostr([<x>])               => TToS(<x>)
  #xtranslate hb_stot([<x>])                  => SToT(<x>)
  #xtranslate hb_ttod([<x>])                  => TToD(<x>)
  #xtranslate hb_hour([<x>])                  => Hour(<x>)
  #xtranslate hb_minute([<x>])                => Minute(<x>)
  #xtranslate hb_sec([<x>])                   => Secs(<x>)
  #xtranslate hb_NumToHex([<x>])              => NumToHex(<x>)
  #xtranslate hb_StrFormat([<x,...>])         => StrFormat(<x>)
  #xtranslate <x>:__EnumIndex                 => hb_EnumIndex
#ENDIF
 
function Main()
 
   local obmp ,cBmp
   local oDlg, oIco
   local ofont
   local cCode:= space(180)
   local oGerar, oSaida
 
   DEFINE Font ofont NAME "Verdana" SIZE 0,14 
    
   DEFINE ICON oIco FILE "fivewin.ico"
 
   DEFINE DIALOG oDlg TITLE "Gerador de Qrcode - " + FWVERSION ;
      ICON oIco SIZE 350, 440

   oDlg:lHelpIcon := .F.
 
   @ 30,24  IMAGE oBmp FILE cBmp OF oDlg size 128,128 pixel NOBORDER 
     
   oBmp:lTransparent := .t.
     
   @ 160, 10 SAY OemToAnsi( "Digite o C¢digo Para Gerar: " ) ;
             size 100, 12 FONT oFont pixel OF oDlg
     
   @ 170, 10 GET cCode size 120, 12 FONT oFont pixel OF oDlg
 
   @ 190, 85 BUTTON oGerar PROMPT "&Gerar" SIZE 40, 12 OF oDlg pixel ;
             WHEN( .NOT. EMPTY( cCode ) )  FONT oFont                ;
             ACTION cargaBmp( alltrim( cCode) ,oBmp )

   oGerar:cToolTip := "Busca e Gera o Qrcode"

   @ 190,130 BUTTON oSaida PROMPT "&Saida" SIZE 40, 12 pixel OF oDlg ;
             FONT oFont                                              ;
             ACTION( LIBERA_TUDO( oDlg ) )

   oSaida:cTooltip := "Saida - Exit - Cancelar"
 
   ACTIVATE DIALOG oDlg CENTERED ;
            ON INIT  DlgBarTitle( oDlg, "  Gerador de Qrcode","" ,44 )  ;
            ON PAINT DlgStatusBar(oDlg, 68,, .t. )

   oFont:End()
   
return nil

FUNCTION LIBERA_TUDO( oDlg )

   /*
   DbCommitAll()
   DbUnLockAll()
   DbCloseAll()
   FreeResources()
   */

   Release All
   SysRefresh()

   HB_GCALL( .T. )
   CLEAR MEMORY

   PostQuitMessage( 0 )
   QUIT

RETURN NIL
 
//------------------------------------------------------------------------------
 
Function cargaBmp( cCode, oImage )
 
   local cResp
   local nZeroZeroClr
   local ogbmp := GdiBmp():new()
   local nHeight := 248
   local nWidth  := 248
   local cUrl  := "http://api.qrserver.com/v1/create-qr-code/?data="
 
   cUrl += GetSafeURL(hb_strtoutf8( cCode ) )
   cUrl += "&size=" + alltrim( str( nWidth ) )  + "x" + alltrim( str( nHeight ) )
   
   cResp := loadBmp(cUrl)
 
   if !Empty( cResp )
 
      oGbmp:hbmp := GDIPLUSIMAGELOADPNGFROMSTR( cResp,len(cResp) )
   
      oImage:hBitmap := oGBmp:GetGDIHbitmap()
      oImage:HasAlpha()
      oImage:Refresh()

      if msgYesNo( "Deseja Gravar QRCODE.PNG no Disco?")

         oGBmp:save(".\qrcode.png" )

      endif

      oGbmp:End()

   endif
 
Return nil
 
Static Function GetSafeURL(  cUrl )
 
   local cAsc
   local nChr
   local sHex
   local i
   local cGetSafeURL := ""
       
   For i = 1 To Len( cUrl )

      cASC := substr( cUrl, i, 1)
      nChr := Asc( cASC )
        
      If ( nChr > 47 .and. nChr < 58 ) .Or. ;
         ( nChr > 64 .And. nChr < 91 ) .Or. ;
         ( nChr > 96 .And. nChr < 123 )

         cGetSafeURL += cASC

      Else

         sHex :=  hb_NumtoHex( nChr )

         If Len( sHex ) = 1
            cGetSafeURL += "%0" + sHex
         Else
            cGetSafeURL += "%"  + sHex
         End If

      End If

   Next
 
Return cGetSafeURL 
 
//------------------------------------------------------------------------------
 
Function loadBmp(cUrl)

   local oHttp
   local cResp := nil
 
   Try
      oHttp := CreateObject( "winhttp.winhttprequest.5.1" )
         
      oHttp:Open("GET", cUrl, .f. )
      oHttp:Send()

      cResp := oHttp:ResponseBody()
          
   Catch

      MsgStop( "Error" )

      Return cResp

   End Try
  
Return cResp
 
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
 
Function DlgStatusBar(oDlg, nHeight, nCorrec , lColor )

   Local nDlgHeight := oDlg:nHeight
   Local aColor     := { { 0.40, nRGB( 200, 200, 200 ), nRGB( 184, 184, 184 ) },;
                       { 0.60, nRGB( 184, 184, 184 ), nRGB( 150, 150, 150 ) } }

   LOCAL cMsg := "STATUSBAR: SIMPLES GENERADOR DE QRCODE"
 
   DEFAULT nHeight  := 72
   DEFAULT nCorrec  := 0
   DEFAULT lColor   := .F.
 
   nDlgHeight:= nDlgHeight+ncorrec

   IF lColor
      GradienTfill(oDlg:hDC,nDlgHeight-( nHeight-2 ),0,nDlgHeight-20,oDlg:nWidth, aColor ,.t.)
      WndBoxIn( oDlg:hDc,nDlgHeight-( nHeight-1 ),0,nDlgHeight-( nHeight ),oDlg:nWidth )
   ELSE
      WndBoxIn( oDlg:hDc,nDlgHeight -( nHeight-1 ),4,nDlgHeight-( nHeight ),oDlg:nWidth - 10 )
   endif

   SET MESSAGE OF oDlg TO cMsg NOINSET CENTERED
 
Return Nil
 
//------------------------------------------------------------------------------
 
FUNCTION DlgBarTitle( oWnd, cTitle, cBmp ,nHeight )

   LOCAL oFont
   LOCAL oTitle
   LOCAL nColText := 180
   LOCAL nRowImg  := 0
   
 
   DEFAULT cTitle  := ""
   DEFAULT nHeight := 48
 
   IF nHeight < 48
      nColText := 60
      nRowImg  := 12
      DEFINE FONT oFont NAME "Arial" size 10, 30
   ELSE
      DEFINE FONT oFont NAME "Arial" size 12, 30
   endif
 
    @ -1, -1  TITLE oTitle size oWnd:nWidth+1, nHeight+1 of oWnd SHADOWSIZE 0
   
    @  nRowImg,  10  TITLEIMG  OF oTitle BITMAP cBmp  SIZE 48, 48 REFLEX ;
          TRANSPARENT
   
    @  nRowImg-2 ,  nColText TITLETEXT OF oTitle TEXT cTitle COLOR CLR_BLACK FONT oFont
 
    oTitle:aGrdBack := { { 1, RGB( 255, 255, 255 ), RGB( 229, 233, 238 )  } }
    oTitle:nShadowIntensity = 0
    oTitle:nShadow = 0
    oTitle:nClrLine1 := nrgb(0,0,0)
    oTitle:nClrLine2 := RGB( 229, 233, 238 )

    oWnd:oTop:= oTitle
 
RETURN oTitle

// FIM DO PROGRAMA
 
Regards, saludos.

Re: StatusBar en Dialogo desde una clase

Posted: Fri Jan 03, 2020 9:48 pm
by Compuin
Gracias Joao, pero no es lo que necesito

Necesito hacerlo desde una Clase

Re: StatusBar en Dialogo desde una clase

Posted: Fri Jan 03, 2020 10:14 pm
by cnavarro
El problema es en este tipo de asignaciones que haces, que tienes varias. No entiendo que si tienes la DATA oDlg ...., asignes al parámetro esa data sin hacer un DEFAULT, por lo menos. Pero como te digo tienes varias de esas asignaciones.
STATIC FUNCTION STATUSBAR(oDlg)
//LOCAL oDlg

oDlg := ::oDlg

SET MESSAGE OF ::oDlg;
TO "This is a status bar";

RETURN NIL

Re: StatusBar en Dialogo desde una clase

Posted: Sat Jan 04, 2020 12:57 am
by Compuin
cnavarro wrote:El problema es en este tipo de asignaciones que haces, que tienes varias. No entiendo que si tienes la DATA oDlg ...., asignes al parámetro esa data sin hacer un DEFAULT, por lo menos. Pero como te digo tienes varias de esas asignaciones.
STATIC FUNCTION STATUSBAR(oDlg)
//LOCAL oDlg

oDlg := ::oDlg

SET MESSAGE OF ::oDlg;
TO "This is a status bar";

RETURN NIL
Ya lo he hecho asi maestro pero aun no me funciona

Re: StatusBar en Dialogo desde una clase

Posted: Sat Jan 04, 2020 1:00 am
by cnavarro
El metodo new ha de devolver siempre SELF, ya que es el metodo CONSTRUCTOR

Re: StatusBar en Dialogo desde una clase

Posted: Sat Jan 04, 2020 1:14 am
by Compuin
Error

Error description: Error BASE/1004 No exported method: BLCLICKED

Re: StatusBar en Dialogo desde una clase

Posted: Sat Jan 04, 2020 1:37 am
by cnavarro
Son dos temas distintos
1.- El método New ha de devolver Self, para poder utilizar las datas y metodos de la clase
2.- Cualquier data, metodo de la clase tDialog ha de ir precedida de la data de la nueva clase que se llama ::oDlg

Code: Select all

   local oMyDlg

   oMyDlg  := Template():New( ... )

   oMyDlg:oDlg ....

 

Re: StatusBar en Dialogo desde una clase

Posted: Sat Jan 04, 2020 1:44 am
by Compuin
cnavarro wrote:Son dos temas distintos
1.- El método New ha de devolver Self, para poder utilizar las datas y metodos de la clase
2.- Cualquier data, metodo de la clase tDialog ha de ir precedida de la data de la nueva clase que se llama ::oDlg

Code: Select all

   local oMyDlg

   oMyDlg  := Template():New( ... )

   oMyDlg:oDlg ....

 

El ejemplo que estoy colocando funciona y creal el Dialogo, lo que no logra es agregarle la Barra de Status con el ON INIT

Code: Select all

#Include "FiveWin.ch"

MEMVAR oAp

CLASS TEMPLATE

   DATA oDlg

   METHOD NEW()
   METHOD ACTIVATE()
   METHOD END()

ENDCLASS

METHOD NEW( cTitle, nTop, nLeft, nBottom, nRight ) CLASS TEMPLATE

   DEFINE DIALOG ::oDlg TITLE cTitle OF oAp:oWndMain;
          FROM nTop, nLeft TO nBottom, nRight PIXEL ;
          STYLE NOR( WS_POPUP, WS_VISIBLE, WS_CAPTION, WS_THICKFRAME, WS_SYSMENU, WS_MINIMIZEBOX )

RETURN ::oDlg

METHOD ACTIVATE() CLASS TEMPLATE
   LOCAL oDlg

   ::oDlg := oDlg

   ACTIVATE DIALOG ::oDlg NOWAIT;
            ON INIT (STATUSBAR(oDlg))

RETURN NIL

METHOD END() CLASS TEMPLATE

   ::oDlg:End()

RETURN NIL

STATIC FUNCTION STATUSBAR(oDlg)
   //LOCAL oDlg

   oDlg := ::oDlg

   SET MESSAGE OF ::oDlg;
        TO "This is a status bar";

RETURN NIL

Re: StatusBar en Dialogo desde una clase

Posted: Sat Jan 04, 2020 2:01 am
by cnavarro
Que esté creando el diálogo no significa que sea correcta su implementación
En cuanto al uso de una data ::oDlg, fuera de un método de la clase ( lo estás utilizando en una function static ), tienes que pensar que no es posible tal y como lo tienes si no lo referencias al objeto de la clase a la que pertenece, para lo cual has de instanciar el metodo New de la clase Template

Re: StatusBar en Dialogo desde una clase

Posted: Sat Jan 04, 2020 4:47 am
by Compuin
cnavarro wrote:Que esté creando el diálogo no significa que sea correcta su implementación
En cuanto al uso de una data ::oDlg, fuera de un método de la clase ( lo estás utilizando en una function static ), tienes que pensar que no es posible tal y como lo tienes si no lo referencias al objeto de la clase a la que pertenece, para lo cual has de instanciar el metodo New de la clase Template
Y como puedo hacer eso maestro, porque no tengo idea de como hacerlo, de alli la razon de mi post

Re: StatusBar en Dialogo desde una clase

Posted: Sat Jan 04, 2020 5:19 pm
by cnavarro
Aqui lo tienes

Code: Select all

#Include "FiveWin.ch"

Static oAp
Static oTemplate

Function Main()

   oTemplate  := Template():New( "Titulo", 10, 10, 300, 300 )
   oTemplate:Activate()

Return nil


CLASS TEMPLATE

   DATA oDlg

   METHOD NEW()
   METHOD ACTIVATE()
   METHOD END()

ENDCLASS

METHOD NEW( cTitle, nTop, nLeft, nBottom, nRight ) CLASS TEMPLATE

   DEFINE DIALOG ::oDlg TITLE cTitle ; //OF oAp:oWndMain;
          FROM nTop, nLeft TO nBottom, nRight PIXEL TRUEPIXEL ;
          STYLE NOR( WS_POPUP, WS_VISIBLE, WS_CAPTION, WS_THICKFRAME, WS_SYSMENU, WS_MINIMIZEBOX )

RETURN Self

METHOD ACTIVATE() CLASS TEMPLATE

   ::oDlg:bInit  := { || StatusBar( ::oDlg ) }
   ACTIVATE DIALOG ::oDlg  //NOWAIT

RETURN NIL

METHOD END() CLASS TEMPLATE

   ::oDlg:End()

RETURN NIL

STATIC FUNCTION STATUSBAR( oDlg )

   SET MESSAGE OF oDlg;
        TO "This is a status bar";

RETURN NIL

 

Re: StatusBar en Dialogo desde una clase

Posted: Sat Jan 04, 2020 5:39 pm
by Compuin
Gracias maestro,

Pero sigue sin agregar la barra de status

Re: StatusBar en Dialogo desde una clase

Posted: Sat Jan 04, 2020 5:44 pm
by cnavarro
Prueba el ejemplo tal cual te lo envío, porque así funciona correctamente
Después ya veremos si tienes algún problema más

Image

Re: StatusBar en Dialogo desde una clase

Posted: Sat Jan 04, 2020 5:45 pm
by Compuin
cnavarro wrote:Prueba el ejemplo tal cual te lo envío, porque así funciona correctamente
Después ya veremos si tienes algún problema más

Image
Ok, me pongo en ello

Muchas gracias