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
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
Ok, me pongo en ello
Muchas gracias