Incrustar Calculadora de Windows en Dialogo

Incrustar Calculadora de Windows en Dialogo

Postby JoseAlvarez » Tue Jul 13, 2021 8:48 pm

Saludos a la gran familia del foro FiveWin.

Necesito saber si hay alguna manera de incrustar la calculadora de windows en un control dentro de un dialogo fivewin, que se abra al entrar al dialogo y se cierre al salir del mismo y que no pueda moverse fuera del control.

Quizas no se pueda, de ser el caso, ¿existe una calculadora hecha con fivewin que sea lo mas parecida posible a la de windows y con la que se pueda hacer ?

Quedo atento a su gentil respuesta.

Acá dejo una imagen para graficar lo que se quiere.

Image
"Los errores en programación, siempre están entre la silla y el teclado..."

Fwh 19.06 32 bits + Harbour 3.2 + Borland 7.4 + MariaDB + TDolphin

Carora, Estado Lara, Venezuela.
User avatar
JoseAlvarez
 
Posts: 797
Joined: Sun Nov 09, 2014 5:01 pm

Re: Incrustar Calculadora de Windows en Dialogo

Postby karinha » Wed Jul 14, 2021 1:28 pm

José, Uso esta:

Code: Select all  Expand view  RUN


   SETKEY( VK_F11, { | nKey | CALCULAD() } )


//-> MODIFICADO EM: 10/03/2021 - Joao.

#Include "FiveWin.Ch"

#Define CLR_VERMELHO  nRGB( 255, 000, 000 ) //--> Vermelho Para a Letra
#Define CLR_AMARELO   nRGB( 255, 255, 000 ) //--> Amarelo Para o Fundo

Static cLg, cLastOpe

//-Calculadora For Windows Para a Tela de Vendas Acionamento: ALT+X/F9-------//

FUNCTION CALCULAD( nVal, X, oCtrl )

   LOCAL cTitle      := IF( cLg == "L", "Calculator", "Calculadora" )
   LOCAL cPastMsg    := " M + "
   LOCAL cConfirmMsg := IF( cLg == "L", "Paste", "&Leva Resultado" )
   LOCAL cAbortMsg   := IF( cLg == "L", "Exit", "&Saida" )
   LOCAL cPict       := "@E 9,999,999,999.99", xresul:=0
   LOCAL n := 1.3
   LOCAL nInit := 0
   LOCAL oDlg, oFont, oFnt, oFontSoma, oCursor, oRes, cRes := ""
   LOCAL nMemo := 0, nOpe, oBrush
   LOCAL oGet, cGet := space( 100 ), oBtnOk, oBtnAb, oBtn, OBTNIMP
   LOCAL oBt1, oBt2, oBt3, oBt4, oBt5, oBt6, oBt7, oBt8, oBt9, oBt0, oBtC
   LOCAL oBSum, oBMin, oBMol, oBDiv, oBPer, oBCan, oBRes
   LOCAL lRet := .F., aGrad

   PUBLIC nSoma_Calc  //-> Para Pegar a Soma da Calculadora

   DEFAULT nVal := 0

   nInit := nVal

   cLastOpe := '+'

   nSoma_Calc := 0

   aGrad := { { 0.30, CLR_WHITE, CLR_WHITE },{ 0.50, CLR_WHITE, CLR_WHITE } }

   DEFINE FONT oFont     NAME "Ms Sans Serif" SIZE 0, -8
   DEFINE FONT oFnt      NAME "Ms Sans Serif" SIZE 0, -18
   DEFINE FONT oFontSoma NAME "Ms Sans Serif" SIZE 0, -14

   DEFINE DIALOG oDlg SIZE 205, 290 TITLE cTitle FONT oFont GRADIENT aGrad

   oDlg:lHelpIcon := .F.

   Set( _SET_INSERT, ! Set( _SET_INSERT ) )

   //-> Get dos Valores Digitados
   @ 3.7, 0.5 GET oGet VAR cGet OF oDlg SIZE 96, 12 RIGHT FONT oFontSoma

   //-> Get da Apresenta‡Æo dos Valores Digitados, Tipo Uma ListBox. Display.
   @ 0.1, 0.5 GET oRes VAR cRes OF oDlg MULTILINE SIZE 95, 45 RIGHT FONT oFnt ;
              COLOR CLR_YELLOW, CLR_BLACK

   //-> Display do Get, a Mascara.
   oGet:bChange  := { |nKey, nFlag, oB| ( Chr( nKey ) $ "0123456789." ) }

   //-> Dispara Para VerKey...
   oGet:bKeyDown := { | nKey | TESTE1(OGET), VerKey( nKey, oBSum, oBMin,    ;
                                              oBMol, oBDiv, oBPer, oBCan,   ;
                                              oBRes ),                      ;
                               IF ( nKey = VK_ESCAPE, oDlg:End(), ) } // JRICARTE

   //-> Seta o Foco
   oRes:bGotFocus := { || TESTE(OGET)} // JRICARTE

   /*
   @ 1.3, 1 BUTTON oBtn PROMPT cPastMsg OF oDlg ;
            ACTION ( oBCan:Click(), SayNum(oGet, nVal ) ) ;
            FONT oFont SIZE 38, 10
   */


   // Numbers - N£meros
   @ n + 2.05,0.6 BUTTON oBt1 PROMPT "1" OF oDlg    ;
         SIZE 20,13                                 ;
         ACTION SayNum( oGet, 1 ) FONT oFont

   @ n + 2.05,4.0 BUTTON oBt2 PROMPT "2" OF oDlg    ;
                  SIZE 20,13                        ;
                  ACTION SayNum( oGet, 2 ) FONT oFont

   @ n + 2.05,7.5 BUTTON oBt3 PROMPT "3" OF oDlg    ;
                  SIZE 20,13                        ;
                  ACTION SayNum( oGet, 3 ) FONT oFont

   @ n + 2.85,0.6 BUTTON oBt4 PROMPT "4" OF oDlg    ;
                  SIZE 20,13                        ;
                  ACTION SayNum( oGet, 4 ) FONT oFont

   @ n + 2.85,4.0 BUTTON oBt5 PROMPT "5" OF oDlg    ;
                  SIZE 20,13                        ;
                  ACTION SayNum( oGet, 5 ) FONT oFont

   @ n + 2.85,7.5 BUTTON oBt6 PROMPT "6" OF oDlg    ;
                  SIZE 20,13                        ;
                  ACTION SayNum( oGet, 6 ) FONT oFont

   @ n + 3.6,0.6 BUTTON oBt7 PROMPT "7" OF oDlg     ;
                 SIZE 20,13                         ;
                 ACTION SayNum( oGet, 7 ) FONT oFont

   @ n + 3.6,4.0 BUTTON oBt8 PROMPT "8" OF oDlg     ;
                 SIZE 20,13                         ;
                 ACTION SayNum( oGet, 8 ) FONT oFont

   @ n + 3.6,7.5 BUTTON oBt9 PROMPT "9" OF oDlg     ;
                 SIZE 20,13                         ;
                 ACTION SayNum( oGet, 9 ) FONT oFont

   @ n + 4.4,0.6 BUTTON oBt0 PROMPT "  0  " OF oDlg ;
                 SIZE 41,13                         ;
                 ACTION SayNum( oGet, 0 ) FONT oFont

   @ n + 4.4,7.5 BUTTON oBtC PROMPT "." OF oDlg     ;
                 SIZE 20,13                         ;
                 ACTION SayNum( oGet, "." ) FONT oFont

   oBtC:cToolTip := OemToAnsi( "Ponto Decimal: . " )

   // Operators - Operadores
   @ n+2.05, 11.4 BUTTON oBSum PROMPT " + " OF oDlg ;
                  SIZE 15,13                        ;
                  ACTION(CalcRes( cLastOpe, @nMemo, oGet, oRes, cPict,,'+' ), ;
                         cLastOpe := "+" )          ;
                  FONT oFont

   oBSum:cToolTip := OemToAnsi( "Soma: + " )

   @ n+2.05, 14.1 BUTTON oBMin PROMPT " - " OF oDlg ;
                  SIZE 15,13                        ;
                  ACTION(CalcRes( cLastOpe, @nMemo, oGet, oRes, cPict,,'-'  ), ;
                         cLastOpe := "-" )          ;
                  FONT oFont

   oBMin:cToolTip := OemToAnsi( "Subtra‡Æo: - " )

   @ n+2.85, 11.4 BUTTON oBMol PROMPT " * " OF oDlg ;
                  SIZE 15,13                        ;
                  ACTION(CalcRes( cLastOpe, @nMemo, oGet, oRes, cPict,,'*'  ), ;
                         cLastOpe := "*" )          ;
                  FONT oFont

   oBMol:cToolTip := OemToAnsi( "Multiplica‡Æo: * " )

   @ n+2.85, 14.1 BUTTON oBDiv PROMPT " / " OF oDlg ;
                  SIZE 15,13 ;
                  ACTION(CalcRes( cLastOpe, @nMemo, oGet, oRes, cPict,,'/'  ), ;
                         cLastOpe := "/" )          ;
                  FONT oFont

   oBDiv:cToolTip := OemToAnsi( "DivisÆo: / " )

   @ n+3.6, 11.4 BUTTON oBPer PROMPT " % " OF oDlg ;
                 SIZE 15,13                        ;
                 ACTION(CalcRes( cLastOpe, @nMemo, oGet, oRes, cPict,.T.,'%'  ), ;
                        cLastOpe := "%" )          ;
                 FONT oFont

   oBPer:cToolTip := OemToAnsi( "Porcentagem: %" )

   @ n+3.6, 14.1 BUTTON oBCan PROMPT "&C " OF oDlg                          ;
                 SIZE 15,13                                                 ;
                 ACTION ( cLastOpe := "+", nMemo := 0, oRes:cText( "" ),    ;
                          oGet:cText( Space( 100 ) ), xFOCUS( oGet ) )      ;
                 FONT oFont

   oBCan:cToolTip := OemToAnsi( "AlT+C, Faz a Limpeza do Display" )

   @ n+4.4, 11.4 BUTTON oBRes PROMPT "    =    " OF oDlg                    ;
                 SIZE 31,13                                                 ;
                 ACTION ( TESTE1(OGET), CalcRes( cLastOpe, @nMemo, oGet,    ;
                                                 oRes, cPict, .T. ),        ;
                           cLastOpe := "=" )                                ;
                 DEFAULT                                                    ;
                 FONT oFont // JRICARTE

   oBRes:cToolTip := OemToAnsi( "Resultado: = " )

   // Exit - Saida
   @ n+5.15,0.6 BUTTON oBtnOk PROMPT cConfirmMsg OF oDlg SIZE 48, 13        ;
      FONT oFont ACTION ( lRet:=.T., xResul:=1, oDlg:End() ) CANCEL

   oBtnOk:cToolTip := OemToAnsi( "Copiar Resultado " )

   @ n+5.15,8.7 BUTTON oBtnAb PROMPT cAbortMsg OF oDlg SIZE 47, 13          ;
      FONT oFont ACTION ( lRet:=.F., oDlg:End() ) CANCEL

   oBtnAb:cToolTip := OemToAnsi( "Saida - Exit - Cancelar" )

   @ n+5.97,0.6 BUTTON oBtnIMP PROMPT "Im&primir" OF oDlg SIZE 96, 13       ;
      FONT oFont ACTION ( IMP(ORES) )

   oBtnIMP:cToolTip := OemToAnsi( "ImpressÆo dos Resultados" )

   ACTIVATE DIALOG oDlg CENTERED

   oFont:End()
   oFnt:End()
   oFontSoma:End()

   Set( _SET_INSERT, ! Set( _SET_INSERT ) )

   //-> Armazena Resultado da C¢pia - Traz Para o Get Ativo
   IF lRet

*        nSoma_Calc := ( STR(nMemo,15,2) )
*        ?STR(nMemo,15,2)
*        __KeyBoard( sTR(nMemo,15,2))

   ENDIF

RETURN NIL

//( iif(xResul:=0, .T., &var:=IIF(VALTYPE(&var)="C","EDVALDO",100)))

FUNCTION SayNum(oGet,xNum)

    LOCAL cText // JRICARTE

    TESTE1(OGET) // JRICARTE

    cText := ALLTRIM(oGet:cText())

    IF ValType(xNum) == "C"

        IF !"."$cText
            IF xNum = "."
                oGet:cText( PADR(ALLTRIM(cText)+".",100,' ') )
             ELSE    // '<'
                oGet:cText( PADR(LEFT(ALLTRIM(cText),LEN(cText)-1),100,' ') )
            ENDIF
         ELSE
            TONE(500)
        ENDIF

        IF xNum <> '.' .and. xNum <> '<'
            xNum := VAL(xNum)
            oGet:cText( PADR(ALLTRIM(cText)+cValToChar(xNum),100,' ') )
        ENDIF
     ELSE
        oGet:cText( PADR(ALLTRIM(cText)+cValToChar(xNum),100,' ') )
    ENDIF

RETURN NIL

Static Function CalcRes( cOpe, nMemo, oGet, oRes, cPict, lRes, cnOpe  )

    LOCAL cVal  := StrTran( ALLTRIM(oGet:cText()), ",", ".")
    LOCAL nVal  := VAL( cVal )
    LOCAL nLine := 0, mval1 := "", X

    Default lRes := .F., cnOpe := ''

    IF !LEFT( cVal, 1 ) $ "0123456789."
        cVal := SUBSTR( cVal, 2 )
        nVal := VAL( cVal )
    ENDIF

    IF !right( cVal, 1 ) $ "0123456789."
        cVal := LEFT( cVal, LEN( cVal ) - 1 )
        nVal := VAL( cVal )
    ENDIF

    IF nVal <> 0

        IF cnOpe == '%'
            nMemo := (nMemo * nVal) / 100
         ELSE
            IF cOpe == "+"
                nMemo += nVal
            ELSEIF cOpe == "-"
                nMemo -= nVal
            ELSEIF cOpe == "*"
                nMemo *= nVal
            ELSEIF cOpe == "/"
                nMemo /= nVal
            ELSEIF cOpe == "%"
                nMemo := (nMemo * nVal) / 100
            ENDIF

        ENDIF

    ENDIF

    IF nVal = 0 .and. cOpe = '='
        cVal := ALLTRIM(STR(nMemo,15,2))
        nVal := nMemo
    ENDIF

    oGet:cText( Space(36)+Transform( nMemo, cPict )) // JRICARTE

    ORES:SETFOCUS() // JRICARTE

    IF lRes

        IF nVal <> 0
            oRes:cText( oRes:cText()+IIF(EMPTY(oRes:cText),'',CRLF)+          ;
                 Transform( nVal , cPict )+IIF(!EMPTY(cnOpe),cnOpe,cOpe))
        ENDIF

        oRes:cText( oRes:cText()+IIF(EMPTY(oRes:cText),'',CRLF)+              ;
             Transform( nMemo, cPict )+'=')
     ELSE
        oRes:cText( oRes:cText()+IIF(EMPTY(oRes:cText),'',CRLF)+              ;
             Transform( nVal, cPict )+IIF(!EMPTY(cnOpe),cnOpe,cOpe))

    ENDIF

    ORES:SETPOS( LEN(ORES:CTEXT())) // JRICARTE

    TONE(500,1)

Return Nil

Static Function VerKey( nKey, oBSum, oBMin, oBMol, oBDiv, oBPer, oBCan, oBRes )

    IF nKey == 107             // "+"
        oBSum:Click()
    ELSEIF nKey == 109         // "-"
        oBMin:Click()
    ELSEIF nKey == 106         // "*"
        oBMol:Click()
    ELSEIF nKey == 111         // "/"
        oBDiv:Click()
    ELSEIF nKey == 187         // "="  JRICARTE
        oBRes:Click()
    ENDIF

Return( 0 )

STATIC FUNCTION TESTE(OGET) // JRICARTE

    Keybd_Event(" ",,0)

    xFOCUS(OGET)

RETURN NIL

STATIC FUNCTION TESTE1(OGET) // JRICARTE

    IF LEN(ALLTRIM(OGET:CTEXT))>0

        IF LEN(ALLTRIM(LEFT(OGET:CTEXT,1)))=0
            OGET:CTEXT(LEFT(OGET:CTEXT(),1)+Space(100))
        ENDIF

    ENDIF

RETURN( .T. )
//-----------------ImpressÆo------------------------------------------------//
STATIC FUNCTION IMP(ORES)

    LOCAL OPRN, OFONT, TAM := LEN(ORES:CTEXT()), LINHA, CONTADOR

    PRINT oPrn NAME "" PREVIEW MODAL

    oFont := TFont():New("Courier New",Int(oPrn:nHorzRes)/60,                 ;
             Int(oPrn:nVertRes)/58 ,.F.,.F.,0,0,0,.F.,.F.,.F.,0,0,0,0 )

    oPrn:SetFont (oFont)

    PAGE

        LINHA := 0

        FOR CONTADOR=1 TO TAM STEP 22

            SYSREFRESH()

            LINHA := LINHA+1

            OPRN:CHARSAY(LINHA,01,SUBS(ORES:CTEXT(),CONTADOR,20))

            IF LINHA > 58

                LINHA := 0

                ENDPAGE
                PAGE

            ENDIF

        NEXT CONTADOR

        ENDPAGE

        oFont:End()

    ENDPRINT

RETURN NIL

/*---- Funcao do XSetFocus() ----*/

/*
Static Func XSetFocus(oObj)

    Local oTempo := ""
    Define Timer oTempo Interval 10 Of oObj:oWnd Action (oObj:SetFocus(),oObj:SetPos(0),oTempo:Deactivate())
    Activate Timer oTempo

Retu(" ")
*/


* JRICARTE
DLL32 FUNCTION keybd_event(bVk AS 7,bScan AS 7,dwFlags AS 8,dwExtrainfo AS 7) AS 7 PASCAL LIB "User32.dll"

/* // TAMBEM EM WINORCAM.PRG
// ***********************************************************
DLL32 FUNCTION keybd_event( bVk as _INT, bScan as _INT, dwFlags ;
      as LONG, dwExtraInfo as LONG ) AS LONG PASCAL LIB "user32.dll"
// ***********************************************************
*/


//-> Fim do Programa - kapiabafwh@gmail.com
 


Regards, saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7831
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Incrustar Calculadora de Windows en Dialogo

Postby JoseAlvarez » Wed Jul 14, 2021 9:53 pm

Hola Joao,

Gracias por la ayuda y el codigo.

Me pide la funcion xFocus.

La tienes?
"Los errores en programación, siempre están entre la silla y el teclado..."

Fwh 19.06 32 bits + Harbour 3.2 + Borland 7.4 + MariaDB + TDolphin

Carora, Estado Lara, Venezuela.
User avatar
JoseAlvarez
 
Posts: 797
Joined: Sun Nov 09, 2014 5:01 pm

Re: Incrustar Calculadora de Windows en Dialogo

Postby karinha » Thu Jul 15, 2021 12:34 am

Claro, mi caro amigo:

Code: Select all  Expand view  RUN


Ejemplo:  XFOCUS( oBtn )

//-------------------------------------------------------------------------//
// As vezes simples SetFocus( oObj ) nao faz um objeto ganhar foco
// neste caso pode apelar para estas duas funcoes a seguir
// Forcar foco para um objeto especifico - Ednaldo Rolim...
//-------------------------------------------------------------------------//
FUNCTION xFocus( oObj )

   xSetFocus( oObj )
   xSetFocus( oObj )

RETURN( .T. )

FUNCTION xSetFocus( oObj )    

   LOCAL _oWnd := oObj:oWnd, _oTempo := ""

   DEFINE TIMER _oTempo INTERVAL 10 OF _oWnd ;
          ACTION ( oObj:SetFocus(), _oTempo:End() )

   ACTIVATE TIMER _oTempo

RETURN( .T. )
 


Regards, saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7831
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Incrustar Calculadora de Windows en Dialogo

Postby acuellar » Thu Jul 15, 2021 12:42 pm

José
Aquí otra opción

Code: Select all  Expand view  RUN

#Include "FiveWin.Ch"
* By: Adhemar Cuéllar
*
Function Main()
   Local oDlg
   Local oGet
   local cVar := 0.00
   local lCalcula := .f.
   DEFINE DIALOG oDlg from 0,0 to 400,400 pixel
   @ 15,15 get oGet var cVar picture "@E"  bitmap "..\bitmaps\calc.bmp" action Calc(oDlg,oGet,@cVar);
   size 120,12 of oDlg pixel
   oGet:lAdjustBtn := .t.
   ACTIVATE DIALOG oDlg
return nil

Function Calc(oDlg,oGet,cVar)
   Local oCalc:=tCalc():new()
   oCalc:calculadora(oDlg,'@E 9,999,999.9999',.F.,oGet)
   cVar := iif(!Empty(oCalc:nResult), oCalc:nResult, cVar)
   oGet :Refresh()
   oCalc:End()
Return .T.
*
CLASS TCalc
   DATA nResult            
   DATA aRolloCalc          
   DATA cUltima, cUltimaop
   DATA cPatronSalida      
   METHOD New() CONSTRUCTOR
   METHOD Init()
   METHOD End()
   METHOD nCalculadigual(nGet)
   METHOD calculadora(oPadre,cPatronSalida,lBorraAlInicio)
   METHOD TCalc_Teclas(nKey, oDlg)
   METHOD Init(oGet,nKey)
ENDCLASS
//----------------------------------------------------------------------------//
METHOD New() CLASS TCalc
   ::aRolloCalc:={{'C',' '}}
   ::nResult   :=0
   ::cUltima   :=''
   ::cUltimaop :=''
return SELF
//----------------------------------------------------------------------------//
METHOD Init(oGet,nKey) CLASS tCalc
   LOCAL oCalc
   IF nKey <> VK_F3
      RETURN(1)
   ENDIF
   oCalc:=tCalc():new()
   oCalc:calculadora( oGet:oWnd, '@E 9,999,999.9999 ',,oGet )
RETURN(0)
//----------------------------------------------------------------------------//
METHOD End() CLASS TCalc
   ::aRolloCalc:={{'C',' '}}
   ::nResult   :=0
   ::cUltima   :=''
   ::cUltimaop :=''
return NIL
//----------------------------------------------------------------------------//
METHOD calculadora(oPadre,cPatronSalida,lBorraAlInicio,oTGet) CLASS TCalc
   local oDlg
   local oBtnSalir,oBtnTrans
   local oBtnmenos, oBtnmas, oBtnpor, oBtndividir, oBtnigual, oBtnBorra
   local oBtn0, oBtn1, oBtn2, oBtn3, oBtn4, oBtn5, oBtn6, oBtn7, oBtn8, oBtn9, oBtnP, oBtnSigno
   local oBtnConv, oBtnConv2
   local oBtnDel
   local oSay
   local oBrw, n:=1
   local oGet :=0 ,cGet:='', nGetAnt:=0,nGet:=0
   local oFont
   local oFont1
   local oFontLst
   ::nResult  := IIF(VALTYPE(oTGet) == "O" .AND. "GET" $oTGet:ClassName  .AND.;
                     VAL(oTGet:GetText()) > 0,VAL(oTGet:GetText()),;
                     IIF(VALTYPE(oTGet) == "N",oTGet,0))
   if cPatronSalida=NIL .and. ::cPatronSalida=NIL
      cPatronSalida:='@E 9,999,999,999.99 '
   endif
   
   default lBorraAlInicio :=.f.  
                                 
   ::cPatronSalida:=cPatronSalida
   DEFINE FONT oFont    NAME "Ms Sans Serif" SIZE 0,-14 BOLD
   DEFINE FONT oFont1   NAME "Arial"         SIZE 0,-20
   DEFINE FONT oFontLst NAME "MS Sans Serif" SIZE 0,-14

   DEFINE DIALOG oDlg RESOURCE 'Calculadora' OF oPadre TITLE '(OASyS) Calculadora' FONT oFont

   REDEFINE BUTTON oBtnTrans ID 112 OF oDlg MESSAGE 'Lleva el resultado para o campo numérico.';
            ACTION oDlg:end() CANCEL UPDATE
            oBtnTrans:cargo:='T'

   REDEFINE BUTTON oBtnSalir ID 500 OF oDlg MESSAGE 'Cancela';
            ACTION (::nResult:=0,oDlg:end()) default CANCEL UPDATE
            oBtnSalir:cargo:='S'

   REDEFINE BUTTON oBtnmenos ID 401 OF oDlg MESSAGE 'Resta';
            ACTION (iif(nGet<>0,(nGetAnt:=nGet,aadd(::aRolloCalc,{transform(nGet,::cPatronSalida),'-'})),(::nResult:=::nResult-nGetAnt,aadd(::aRolloCalc,{transform(iif(::cUltimaOp='=',::nResult,nGetAnt),::cPatronSalida),'-'}))) ,;
                    oBrw:gobottom(),;
                    oBrw:refresh(),;
                    iif(::nResult=0,::nResult:=nGet,::nResult:=::nResult-nGet),;
                    ::cUltimaOp:='-'           ,;
                    oSay:SetText(transform(::nResult,::cPatronSalida)),;
                    nGet:=0                    ,;
                    cGet:=''                   ,;
                    oGet:SetText('')           ,;
                    oBtnIgual:Setfocus()       ,;
                    sysrefresh() ) UPDATE
            oBtnmenos:cargo:='-'

   REDEFINE BUTTON oBtnmas   ID 402 OF oDlg MESSAGE 'Suma';
            ACTION (iif(nGet<>0,(nGetAnt:=nGet,aadd(::aRolloCalc,{transform(nGet,::cPatronSalida),'+'})),(::nResult:=::nResult+nGetAnt,aadd(::aRolloCalc,{transform(iif(::cUltimaOp='=',::nResult,nGetAnt),::cPatronSalida),'+'}))) ,;
                    oBrw:gobottom(),;
                    oBrw:refresh(),;
                    iif(::nResult=0,::nResult:=nGet,::nResult:=::nResult+nGet),;
                    ::cUltimaOp:='+'           ,;
                    oSay:SetText(transform(::nResult,::cPatronSalida)),;
                    nGet:=0                    ,;
                    cGet:=''                   ,;
                    oGet:SetText('')           ,;
                    oBtnIgual:Setfocus()       ,;
                    sysrefresh() ) UPDATE
            oBtnmas:cargo:='+'

   REDEFINE BUTTON oBtnpor   ID 403 OF oDlg MESSAGE 'Multiplica';
            ACTION (aadd( ::aRolloCalc, iif(nGet=0 .and. ::nResult<>0,{transform(::nResult,::cPatronSalida),'x'},{transform(nGet,::cPatronSalida),'x'}) ),;
                    oBrw:gobottom(),;
                    oBrw:refresh(),;
                    iif(::nResult=0,::nResult:=nGet,iif(nGet<>0,::nResult:=::nResult*nGet,)),;
                    ::cUltimaOp:='*'           ,;
                    oSay:SetText(transform(::nResult,::cPatronSalida)),;
                    nGet:=0                    ,;
                    cGet:=''                   ,;
                    oGet:SetText('')           ,;
                    oBtnIgual:Setfocus()       ,;
                    sysrefresh() ) UPDATE
            oBtnpor:cargo:='*'

   REDEFINE BUTTON oBtndividir ID 404 OF oDlg MESSAGE 'Divide';
            ACTION (aadd( ::aRolloCalc, iif(nGet=0 .and. ::nResult<>0,{transform(::nResult,::cPatronSalida),'/'},{transform(nGet,::cPatronSalida),'/'}) ),;
                    oBrw:gobottom(),;
                    oBrw:refresh(),;
                    iif(::nResult=0,::nResult:=nGet,iif(nGet<>0,::nResult:=::nResult/nGet,)),;
                    ::cUltimaOp:='/'           ,;
                    oSay:SetText(transform(::nResult,::cPatronSalida)),;
                    nGet:=0                    ,;
                    cGet:=''                   ,;
                    oGet:SetText('')           ,;
                    oBtnIgual:Setfocus()       ,;
                    sysrefresh() ) UPDATE
            oBtndividir:cargo:='/'

   REDEFINE BUTTON oBtnigual   ID 405 OF oDlg MESSAGE 'Calcula resultado';
            ACTION (iif(nGet=0,,aadd( ::aRolloCalc, {transform(nGet,::cPatronSalida),iif(::cUltimaOp='+' .or. ::cUltimaOp='-' .or. ::cUltimaOp='*' .or. ::cUltimaOp='/',' ',::cUltimaOp)} )),;
                    ::nCalculadIgual(nGet),;
                    aadd( ::aRolloCalc, {transform(::nResult,::cPatronSalida),'='} ),;
                    oBrw:gobottom(),oBrw:gobottom(),;
                    oBrw:refresh(),;
                    ::cUltimaOp:='='              ,;
                    oSay:SetText(transform(::nResult,::cPatronSalida)),;
                    nGet:=0                       ,;
                    nGetAnt:=0                    ,;
                    cGet:=''                      ,;
                    oGet:SetText('')              ,;
                    oBtnIgual:Setfocus()          ,;
                    sysrefresh() ) UPDATE
            oBtnigual:cargo:='='

   REDEFINE BUTTON oBtnBorra ID 425 OF oDlg MESSAGE 'Borra todos los cálculos';
            ACTION (iif( len( ::aRolloCalc ) > 0,;
                         ( aSize( ::aRolloCalc, 0 ), oBrw:Refresh() ), ),;
                    aadd( ::aRolloCalc, {' ','C'} ),;
                    oBrw:gotop()                 ,;
                    oBrw:refresh()               ,;
                    ::nResult:=0                 ,;
                    ::cUltimaOp:='R'             ,;
                    oSay:SetText('0')            ,;
                    nGet:=0                      ,;
                    cGet:=''                     ,;
                    oGet:SetText('')             ,;
                    oBtnIgual:Setfocus()         ,;
                    sysrefresh() ) UPDATE
            oBtnBorra:cargo:='R'

   REDEFINE BUTTON oBtnDel ID 426 OF oDlg MESSAGE 'Borra último dígito';
            ACTION (::cUltima:='CE'            ,;
                    iif(::cUltimaOp='=' .or. ::cUltimaOp='AP' .or. ::cUltimaOp='AE',(::cUltimaOp:='',::nResult:=0,aadd( ::aRolloCalc, {' ',' '} ), oBrw:gobottom(),oBrw:refresh()),),;
                    iif(nGet<>0,(cGet:=LEFT(cGet,len(cget)-1),nGet:=val(cGet)),)         ,;
                    oGet:SetText(cGet)         ,;
                    oBtnIgual:Setfocus()       ,;
                    sysrefresh() ) UPDATE
            oBtnDel:cargo:=chr(8)

   REDEFINE BUTTON oBtn0   ID 100 OF oDlg;
              ACTION (::cUltima:='0'             ,;
                    iif(::cUltimaOp='=' .or. ::cUltimaOp='AP' .or. ::cUltimaOp='AE',(::cUltimaOp:='',::nResult:=0,aadd( ::aRolloCalc, {' ',' '} ), oBrw:gobottom(),oBrw:refresh()),),;
                    cGet:=cGet+::cUltima       ,;
                    nGet:=val(cGet)            ,;
                    oGet:SetText(cGet)         ,;
                    oBtnIgual:Setfocus()       ,;
                    sysrefresh() ) UPDATE      
            oBtn0:cargo:='0'
   REDEFINE BUTTON oBtn1   ID 101 OF oDlg;
            ACTION (::cUltima:='1'             ,;
                    iif(::cUltimaOp='=' .or. ::cUltimaOp='AP' .or. ::cUltimaOp='AE',(::cUltimaOp:='',::nResult:=0,aadd( ::aRolloCalc, {' ',' '} ), oBrw:gobottom(),oBrw:refresh()),),;
                    cGet:=cGet+::cUltima       ,;
                    nGet:=val(cGet)            ,;
                    oGet:SetText(cGet)         ,;
                    oBtnIgual:Setfocus()       ,;
                    sysrefresh() ) UPDATE
            oBtn1:cargo:='1'
   REDEFINE BUTTON oBtn2   ID 102 OF oDlg;
            ACTION (::cUltima:='2'             ,;
                    iif(::cUltimaOp='=' .or. ::cUltimaOp='AP' .or. ::cUltimaOp='AE',(::cUltimaOp:='',::nResult:=0,aadd( ::aRolloCalc, {' ',' '} ), oBrw:gobottom(),oBrw:refresh()),),;
                    cGet:=cGet+::cUltima       ,;
                    nGet:=val(cGet)            ,;
                    oGet:SetText(cGet)         ,;
                    oBtnIgual:Setfocus()       ,;
                    sysrefresh() ) UPDATE
            oBtn2:cargo:='2'
   REDEFINE BUTTON oBtn3   ID 103 OF oDlg;
            ACTION (::cUltima:='3'             ,;
                    iif(::cUltimaOp='=' .or. ::cUltimaOp='AP' .or. ::cUltimaOp='AE',(::cUltimaOp:='',::nResult:=0,aadd( ::aRolloCalc, {' ',' '} ), oBrw:gobottom(),oBrw:refresh()),),;
                    cGet:=cGet+::cUltima       ,;
                    nGet:=val(cGet)            ,;
                    oGet:SetText(cGet)         ,;
                    oBtnIgual:Setfocus()       ,;
                    sysrefresh() ) UPDATE
            oBtn3:cargo:='3'
   REDEFINE BUTTON oBtn4   ID 104 OF oDlg;
            ACTION (::cUltima:='4'             ,;
                    iif(::cUltimaOp='=' .or. ::cUltimaOp='AP' .or. ::cUltimaOp='AE',(::cUltimaOp:='',::nResult:=0,aadd( ::aRolloCalc, {' ',' '} ), oBrw:gobottom(),oBrw:refresh()),),;
                    cGet:=cGet+::cUltima       ,;
                    nGet:=val(cGet)            ,;
                    oGet:SetText(cGet)         ,;
                    oBtnIgual:Setfocus()       ,;
                    sysrefresh() ) UPDATE
            oBtn4:cargo:='4'
   REDEFINE BUTTON oBtn5   ID 105 OF oDlg;
            ACTION (::cUltima:='5'             ,;
                    iif(::cUltimaOp='=' .or. ::cUltimaOp='AP' .or. ::cUltimaOp='AE',(::cUltimaOp:='',::nResult:=0,aadd( ::aRolloCalc, {' ',' '} ), oBrw:gobottom(),oBrw:refresh()),),;
                    cGet:=cGet+::cUltima       ,;
                    nGet:=val(cGet)            ,;
                    oGet:SetText(cGet)         ,;
                    oBtnIgual:Setfocus()       ,;
                    sysrefresh() ) UPDATE
            oBtn5:cargo:='5'
   REDEFINE BUTTON oBtn6   ID 106 OF oDlg;
            ACTION (::cUltima:='6'             ,;
                    iif(::cUltimaOp='=' .or. ::cUltimaOp='AP' .or. ::cUltimaOp='AE',(::cUltimaOp:='',::nResult:=0,aadd( ::aRolloCalc, {' ',' '} ), oBrw:gobottom(),oBrw:refresh()),),;
                    cGet:=cGet+::cUltima       ,;
                    nGet:=val(cGet)            ,;
                    oGet:SetText(cGet)         ,;
                    oBtnIgual:Setfocus()       ,;
                    sysrefresh() ) UPDATE
            oBtn6:cargo:='6'
   REDEFINE BUTTON oBtn7   ID 107 OF oDlg;
            ACTION (::cUltima:='7'             ,;
                    iif(::cUltimaOp='=' .or. ::cUltimaOp='AP' .or. ::cUltimaOp='AE',(::cUltimaOp:='',::nResult:=0,aadd( ::aRolloCalc, {' ',' '} ), oBrw:gobottom(),oBrw:refresh()),),;
                    cGet:=cGet+::cUltima       ,;
                    nGet:=val(cGet)            ,;
                    oGet:SetText(cGet)         ,;
                    oBtnIgual:Setfocus()       ,;
                    sysrefresh() ) UPDATE
            oBtn7:cargo:='7'
   REDEFINE BUTTON oBtn8   ID 108 OF oDlg;
            ACTION (::cUltima:='8'             ,;
                    iif(::cUltimaOp='=' .or. ::cUltimaOp='AP' .or. ::cUltimaOp='AE',(::cUltimaOp:='',::nResult:=0,aadd( ::aRolloCalc, {' ',' '} ), oBrw:gobottom(),oBrw:refresh()),),;
                    cGet:=cGet+::cUltima       ,;
                    nGet:=val(cGet)            ,;
                    oGet:SetText(cGet)         ,;
                    oBtnIgual:Setfocus()       ,;
                    sysrefresh() ) UPDATE
            oBtn8:cargo:='8'
   REDEFINE BUTTON oBtn9   ID 109 OF oDlg;
            ACTION (::cUltima:='9'             ,;
                    iif(::cUltimaOp='=' .or. ::cUltimaOp='AP' .or. ::cUltimaOp='AE',(::cUltimaOp:='',::nResult:=0,aadd( ::aRolloCalc, {' ',' '} ), oBrw:gobottom(),oBrw:refresh()),),;
                    cGet:=cGet+::cUltima       ,;
                    nGet:=val(cGet)            ,;
                    oGet:SetText(cGet)         ,;
                    oBtnIgual:Setfocus()       ,;
                    sysrefresh() ) UPDATE
            oBtn9:cargo:='9'
   REDEFINE BUTTON oBtnP   ID 110 OF oDlg;
            ACTION (::cUltima:='.'             ,;
                    iif(::cUltimaOp='=' .or. ::cUltimaOp='AP' .or. ::cUltimaOp='AE',(::cUltimaOp:='',::nResult:=0,aadd( ::aRolloCalc, {' ',' '} ), oBrw:gobottom(),oBrw:refresh()),),;
                    cGet:=cGet+::cUltima       ,;
                    nGet:=val(cGet)            ,;
                    oGet:SetText(cGet)         ,;
                    oBtnIgual:Setfocus()       ,;
                    sysrefresh() ) UPDATE WHEN int(nGet)==nGet
            oBtnP:cargo:='.'
   REDEFINE BUTTON oBtnSigno ID 111 OF oDlg;
            ACTION (::cUltima:='signo'    ,;
                    iif(::cUltimaOp='=' .or. ::cUltimaOp='AP' .or. ::cUltimaOp='AE',(::cUltimaOp:='',::nResult:=0,aadd( ::aRolloCalc, {' ',' '} ), oBrw:gobottom(),oBrw:refresh()),),;
                    nGet:=(-1)*nGet       ,;
                    oGet:SetText(nGet)    ,;
                    cGet:=alltrim(str(nGet)),;
                    oBtnIgual:Setfocus()  ,;
                    sysrefresh() ) UPDATE
            oBtnSigno:cargo:=' '

   REDEFINE SAY oGet VAR nGet ID 211 OF oDlg FONT oFont1 ;
            COLOR nrgb( 0,  0, 0),nrgb(255,255,200) UPDATE

   REDEFINE SAY oSay VAR ::nResult ID 200 OF oDlg FONT oFont1 ;
            COLOR nrgb(50,250,50),nrgb(0,0,0) UPDATE

   REDEFINE LISTBOX oBrw FIELDS ;
                    ::aRolloCalc[n][1],;
                    ::aRolloCalc[n][2];
            HEAD 'valor','op';
            ID 212 OF oDlg FONT oFontLst COLOR  nrgb(0,0,0),nrgb(255,255,200) ;//clrLtrBrow,clrFonBrow ;
            UPDATE

   oBrw:aJustify  :={.t.,.f.}
   oBrw:aColSizes :={GetFontInfo(oFontLst)[2] * 1.25 * 17, GetFontInfo(oFontLst)[2] * 1.25 * 3} //aMatrizTc({17,3},oFontLst)
   oBrw:bGotop    := { || n := 1 }
   oBrw:bGoBottom := { || n := eval( oBrw:bLogicLen ) }
   oBrw:bSkip     := { | nwant, nold | nold := n , n += nwant,;
                                n := max( 1, min( n, eval( oBrw:bLogicLen ))),;
                                n - nOld }
   oBrw:bLogicLen := { || len( ::aRolloCalc ) }

   oBrw:nClrPane:={|| iif(::aRolloCalc[n][2]=='=',nrgb(200,255,125),nrgb(255,255,200)) }

   oDlg:bKeyDown:={|nKey| ::TCalc_Teclas(nKey,oDlg,oTget)}

   ACTIVATE DIALOG oDlg CENTERED ON INIT (if(lBorraAlInicio,oBtnBorra:CLICK(),.f.),oBrw:gobottom(),oBrw:refresh())
   oFont:end()
   oFont1:end()
   oFontLst:end()
return ::nResult
*
METHOD nCalculadigual(nGet) CLASS TCalc
   do CASE
   CASE ::cUltimaOp = '-'
        ::nResult := ::nResult - nGet
   CASE ::cUltimaOp = '+'
        ::nResult := ::nResult + nGet
   CASE ::cUltimaOp = '*'
        ::nResult := ::nResult * nGet
   CASE ::cUltimaOp = '/'
        ::nResult := ::nResult / nGet
   endcase
return NIL
*
METHOD TCalc_Teclas(nKey, oDlg,oTGet) class TCalc
   local ny
   for ny:=1 TO len(oDlg:aControls)
      if oDlg:aControls[ny]:cargo==upper(chr(nKey))
         oDlg:aControls[ny]:CLICK()
      endif
   next ny
   IF nKey == 84 .AND. VALTYPE(oTGet) == "O"
    oDlg:End()
    oTGet:VarPut(::nResult)
    oTGet:REFRESH()
   ENDIF
return nil

 


RECURSO.RC
Code: Select all  Expand view  RUN


// RECURSO (.RC)
//----------------------------------------------------------------------------//
/*
Calculadora DIALOG 198, 51, 209, 145
STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
CAPTION "CALCULADORA"
{
 PUSHBUTTON "&1", 101, 114, 84, 14, 14
 PUSHBUTTON "&2", 102, 128, 84, 14, 14
 PUSHBUTTON "&4", 104, 114, 70, 14, 14
 PUSHBUTTON "&5", 105, 128, 70, 14, 14
 PUSHBUTTON "&6", 106, 142, 70, 14, 14
 PUSHBUTTON "&3", 103, 142, 84, 14, 14
 PUSHBUTTON "&7", 107, 114, 56, 14, 14
 PUSHBUTTON "&8", 108, 128, 56, 14, 14
 PUSHBUTTON "&9", 109, 142, 56, 14, 14
 PUSHBUTTON "&.", 110, 142, 98, 14, 14
 CONTROL "", 212, "TWBrowse", 0 | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP, 4, 8, 100, 130
 PUSHBUTTON "&-", 401, 161, 56, 14, 14
 PUSHBUTTON "&0", 100, 114, 98, 28, 14
 PUSHBUTTON "&*", 403, 161, 84, 14, 14
 PUSHBUTTON "&Cancelar", 500, 162, 124, 44, 14
 PUSHBUTTON "&+", 402, 161, 70, 14, 14
 PUSHBUTTON "&/", 404, 161, 98, 14, 14
 PUSHBUTTON "&=", 405, 179, 98, 20, 14
 PUSHBUTTON "&C", 425, 179, 56, 20, 14
 PUSHBUTTON "C&E", 426, 179, 70, 20, 14
 PUSHBUTTON "&Inv", 111, 179, 84, 20, 14
 RTEXT "Text", 200, 109, 18, 95, 13
 RTEXT "Text", 211, 114, 40, 85, 13, SS_RIGHT | WS_BORDER | WS_GROUP
 RTEXT "Resultado =", -1, 164, 8, 40, 10
 CONTROL "", -1, "static", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE, 108, 36, 98, 80
 CONTROL "", -1, "static", SS_BLACKFRAME | WS_CHILD | WS_VISIBLE, 108, 8, 98, 26
 PUSHBUTTON "&Llevar", 112, 108, 124, 44, 14
}



Espero te ayude
Saludos,

Adhemar C.
User avatar
acuellar
 
Posts: 1644
Joined: Tue Oct 28, 2008 6:26 pm
Location: Santa Cruz-Bolivia

Re: Incrustar Calculadora de Windows en Dialogo

Postby karinha » Thu Jul 15, 2021 1:30 pm

Adhemar, no compila ni con HARBOUR, y ni con xHARBOUR.

ERROR.LOG:

ACUELAR.prg(114) Warning W0001 Ambiguous reference 'DEFAULT'
ACUELAR.prg(351) Warning W0027 Meaningless use of expression 'Logical'

Code: Select all  Expand view  RUN

#include "FiveWin.ch"

// By: Adhemar Cuéllar

FUNCTION Main()

   LOCAL oDlg
   LOCAL oGet
   LOCAL cVar := 0.00
   LOCAL lCalcula := .F.

   DEFINE DIALOG oDlg FROM 0, 0 TO 400, 400 pixel
   @ 15, 15 GET oGet VAR cVar PICTURE "@E"  bitmap "..\bitmaps\calc.bmp" action Calc( oDlg, oGet, @cVar );
      size 120, 12 of oDlg pixel
   oGet:lAdjustBtn := .T.
   ACTIVATE DIALOG oDlg

   RETURN NIL

FUNCTION Calc( oDlg, oGet, cVar )

   LOCAL oCalc := tCalc():new()

   oCalc:calculadora( oDlg, '@E 9,999,999.9999', .F., oGet )
   cVar := iif( !Empty( oCalc:nResult ), oCalc:nResult, cVar )
   oGet :Refresh()
   oCalc:End()

   RETURN .T.
//
CLASS TCalc

   DATA nResult
   DATA aRolloCalc
   DATA cUltima, cUltimaop
   DATA cPatronSalida
   METHOD New() CONSTRUCTOR
   METHOD Init()
   METHOD End()
   METHOD nCalculadigual( nGet )
   METHOD calculadora( oPadre, cPatronSalida, lBorraAlInicio )
   METHOD TCalc_Teclas( nKey, oDlg )
   METHOD Init( oGet, nKey )

ENDCLASS
// ----------------------------------------------------------------------------//
METHOD New() CLASS TCalc

   ::aRolloCalc := { { 'C', ' ' } }
   ::nResult   := 0
   ::cUltima   := ''
   ::cUltimaop := ''

   RETURN SELF
// ----------------------------------------------------------------------------//
METHOD Init( oGet, nKey ) CLASS tCalc

   LOCAL oCalc

   IF nKey <> VK_F3
      RETURN( 1 )
   ENDIF
   oCalc := tCalc():new()
   oCalc:calculadora( oGet:oWnd, '@E 9,999,999.9999 ',, oGet )

   RETURN( 0 )
// ----------------------------------------------------------------------------//
METHOD End() CLASS TCalc

   ::aRolloCalc := { { 'C', ' ' } }
   ::nResult   := 0
   ::cUltima   := ''
   ::cUltimaop := ''

   RETURN NIL
// ----------------------------------------------------------------------------//
METHOD calculadora( oPadre, cPatronSalida, lBorraAlInicio, oTGet ) CLASS TCalc

   LOCAL oDlg
   LOCAL oBtnSalir, oBtnTrans
   LOCAL oBtnmenos, oBtnmas, oBtnpor, oBtndividir, oBtnigual, oBtnBorra
   LOCAL oBtn0, oBtn1, oBtn2, oBtn3, oBtn4, oBtn5, oBtn6, oBtn7, oBtn8, oBtn9, oBtnP, oBtnSigno
   LOCAL oBtnConv, oBtnConv2
   LOCAL oBtnDel
   LOCAL oSay
   LOCAL oBrw, n := 1
   LOCAL oGet := 0, cGet := '', nGetAnt := 0, nGet := 0
   LOCAL oFont
   LOCAL oFont1
   LOCAL oFontLst

   ::nResult  := iif( ValType( oTGet ) == "O" .AND. "GET" $ oTGet:ClassName  .AND. ;
      Val( oTGet:GetText() ) > 0, Val( oTGet:GetText() ), ;
      iif( ValType( oTGet ) == "N", oTGet, 0 ) )

   IF cPatronSalida = NIL .AND. ::cPatronSalida = NIL
      cPatronSalida := '@E 9,999,999,999.99 '
   ENDIF

   DEFAULT lBorraAlInicio := .F.

   ::cPatronSalida := cPatronSalida
   DEFINE FONT oFont    NAME "Ms Sans Serif" SIZE 0, - 14 BOLD
   DEFINE FONT oFont1   NAME "Arial"         SIZE 0, - 20
   DEFINE FONT oFontLst NAME "MS Sans Serif" SIZE 0, - 14

   DEFINE DIALOG oDlg RESOURCE 'Calculadora' OF oPadre TITLE '(OASyS) Calculadora' FONT oFont

   REDEFINE BUTTON oBtnTrans ID 112 OF oDlg MESSAGE 'Lleva el resultado para o campo numérico.';
      ACTION oDlg:end() CANCEL UPDATE
   oBtnTrans:cargo := 'T'

   REDEFINE BUTTON oBtnSalir ID 500 OF oDlg MESSAGE 'Cancela';
            ACTION (::nResult:=0,oDlg:end()) default CANCEL UPDATE

   oBtnSalir:cargo:='S'

   REDEFINE BUTTON oBtnmenos ID 401 OF oDlg MESSAGE 'Resta';
      ACTION ( iif( nGet <> 0, ( nGetAnt := nGet, AAdd( ::aRolloCalc, { Transform( nGet, ::cPatronSalida ), '-' } ) ), ( ::nResult := ::nResult - nGetAnt, AAdd( ::aRolloCalc, { Transform( iif( ::cUltimaOp = '=', ::nResult, nGetAnt ), ::cPatronSalida ), '-' } ) ) ), ;
      oBrw:gobottom(), ;
      oBrw:refresh(), ;
      iif( ::nResult = 0, ::nResult := nGet, ::nResult := ::nResult - nGet ), ;
      ::cUltimaOp := '-', ;
      oSay:SetText( Transform( ::nResult, ::cPatronSalida ) ), ;
      nGet := 0, ;
      cGet := '', ;
      oGet:SetText( '' ), ;
      oBtnIgual:Setfocus(), ;
      sysrefresh() ) UPDATE
   oBtnmenos:cargo := '-'

   REDEFINE BUTTON oBtnmas   ID 402 OF oDlg MESSAGE 'Suma';
      ACTION ( iif( nGet <> 0, ( nGetAnt := nGet, AAdd( ::aRolloCalc, { Transform( nGet, ::cPatronSalida ), '+' } ) ), ( ::nResult := ::nResult + nGetAnt, AAdd( ::aRolloCalc, { Transform( iif( ::cUltimaOp = '=', ::nResult, nGetAnt ), ::cPatronSalida ), '+' } ) ) ), ;
      oBrw:gobottom(), ;
      oBrw:refresh(), ;
      iif( ::nResult = 0, ::nResult := nGet, ::nResult := ::nResult + nGet ), ;
      ::cUltimaOp := '+', ;
      oSay:SetText( Transform( ::nResult, ::cPatronSalida ) ), ;
      nGet := 0, ;
      cGet := '', ;
      oGet:SetText( '' ), ;
      oBtnIgual:Setfocus(), ;
      sysrefresh() ) UPDATE
   oBtnmas:cargo := '+'

   REDEFINE BUTTON oBtnpor   ID 403 OF oDlg MESSAGE 'Multiplica';
      ACTION ( AAdd( ::aRolloCalc, iif( nGet = 0 .AND. ::nResult <> 0, { Transform( ::nResult, ::cPatronSalida ), 'x' }, { Transform( nGet, ::cPatronSalida ), 'x' } ) ), ;
      oBrw:gobottom(), ;
      oBrw:refresh(), ;
      iif( ::nResult = 0, ::nResult := nGet, iif( nGet <> 0, ::nResult := ::nResult * nGet, ) ), ;
      ::cUltimaOp := '*', ;
      oSay:SetText( Transform( ::nResult, ::cPatronSalida ) ), ;
      nGet := 0, ;
      cGet := '', ;
      oGet:SetText( '' ), ;
      oBtnIgual:Setfocus(), ;
      sysrefresh() ) UPDATE
   oBtnpor:cargo := '*'

   REDEFINE BUTTON oBtndividir ID 404 OF oDlg MESSAGE 'Divide';
      ACTION ( AAdd( ::aRolloCalc, iif( nGet = 0 .AND. ::nResult <> 0, { Transform( ::nResult, ::cPatronSalida ), '/' }, { Transform( nGet, ::cPatronSalida ), '/' } ) ), ;
      oBrw:gobottom(), ;
      oBrw:refresh(), ;
      iif( ::nResult = 0, ::nResult := nGet, iif( nGet <> 0, ::nResult := ::nResult / nGet, ) ), ;
      ::cUltimaOp := '/', ;
      oSay:SetText( Transform( ::nResult, ::cPatronSalida ) ), ;
      nGet := 0, ;
      cGet := '', ;
      oGet:SetText( '' ), ;
      oBtnIgual:Setfocus(), ;
      sysrefresh() ) UPDATE
   oBtndividir:cargo := '/'

   REDEFINE BUTTON oBtnigual   ID 405 OF oDlg MESSAGE 'Calcula resultado';
      ACTION ( iif( nGet = 0,, AAdd( ::aRolloCalc, { Transform( nGet, ::cPatronSalida ), iif( ::cUltimaOp = '+' .OR. ::cUltimaOp = '-' .OR. ::cUltimaOp = '*' .OR. ::cUltimaOp = '/', ' ', ::cUltimaOp ) } ) ), ;
      ::nCalculadIgual( nGet ), ;
      AAdd( ::aRolloCalc, { Transform( ::nResult, ::cPatronSalida ), '=' } ), ;
      oBrw:gobottom(), oBrw:gobottom(), ;
      oBrw:refresh(), ;
      ::cUltimaOp := '=', ;
      oSay:SetText( Transform( ::nResult, ::cPatronSalida ) ), ;
      nGet := 0, ;
      nGetAnt := 0, ;
      cGet := '', ;
      oGet:SetText( '' ), ;
      oBtnIgual:Setfocus(), ;
      sysrefresh() ) UPDATE
   oBtnigual:cargo := '='

   REDEFINE BUTTON oBtnBorra ID 425 OF oDlg MESSAGE 'Borra todos los cálculos';
      ACTION ( iif( Len( ::aRolloCalc ) > 0, ;
      ( ASize( ::aRolloCalc, 0 ), oBrw:Refresh() ), ), ;
      AAdd( ::aRolloCalc, { ' ', 'C' } ), ;
      oBrw:gotop(), ;
      oBrw:refresh(), ;
      ::nResult := 0, ;
      ::cUltimaOp := 'R', ;
      oSay:SetText( '0' ), ;
      nGet := 0, ;
      cGet := '', ;
      oGet:SetText( '' ), ;
      oBtnIgual:Setfocus(), ;
      sysrefresh() ) UPDATE
   oBtnBorra:cargo := 'R'

   REDEFINE BUTTON oBtnDel ID 426 OF oDlg MESSAGE 'Borra último dígito';
      ACTION ( ::cUltima := 'CE', ;
      iif( ::cUltimaOp = '=' .OR. ::cUltimaOp = 'AP' .OR. ::cUltimaOp = 'AE', ( ::cUltimaOp := '', ::nResult := 0, AAdd( ::aRolloCalc, { ' ', ' ' } ), oBrw:gobottom(), oBrw:refresh() ), ), ;
      iif( nGet <> 0, ( cGet := Left( cGet, Len( cget ) - 1 ), nGet := Val( cGet ) ), ), ;
      oGet:SetText( cGet ), ;
      oBtnIgual:Setfocus(), ;
      sysrefresh() ) UPDATE
   oBtnDel:cargo := Chr( 8 )

   REDEFINE BUTTON oBtn0   ID 100 OF oDlg;
      ACTION ( ::cUltima := '0', ;
      iif( ::cUltimaOp = '=' .OR. ::cUltimaOp = 'AP' .OR. ::cUltimaOp = 'AE', ( ::cUltimaOp := '', ::nResult := 0, AAdd( ::aRolloCalc, { ' ', ' ' } ), oBrw:gobottom(), oBrw:refresh() ), ), ;
      cGet := cGet + ::cUltima, ;
      nGet := Val( cGet ), ;
      oGet:SetText( cGet ), ;
      oBtnIgual:Setfocus(), ;
      sysrefresh() ) UPDATE
   oBtn0:cargo := '0'
   REDEFINE BUTTON oBtn1   ID 101 OF oDlg;
      ACTION ( ::cUltima := '1', ;
      iif( ::cUltimaOp = '=' .OR. ::cUltimaOp = 'AP' .OR. ::cUltimaOp = 'AE', ( ::cUltimaOp := '', ::nResult := 0, AAdd( ::aRolloCalc, { ' ', ' ' } ), oBrw:gobottom(), oBrw:refresh() ), ), ;
      cGet := cGet + ::cUltima, ;
      nGet := Val( cGet ), ;
      oGet:SetText( cGet ), ;
      oBtnIgual:Setfocus(), ;
      sysrefresh() ) UPDATE
   oBtn1:cargo := '1'
   REDEFINE BUTTON oBtn2   ID 102 OF oDlg;
      ACTION ( ::cUltima := '2', ;
      iif( ::cUltimaOp = '=' .OR. ::cUltimaOp = 'AP' .OR. ::cUltimaOp = 'AE', ( ::cUltimaOp := '', ::nResult := 0, AAdd( ::aRolloCalc, { ' ', ' ' } ), oBrw:gobottom(), oBrw:refresh() ), ), ;
      cGet := cGet + ::cUltima, ;
      nGet := Val( cGet ), ;
      oGet:SetText( cGet ), ;
      oBtnIgual:Setfocus(), ;
      sysrefresh() ) UPDATE
   oBtn2:cargo := '2'
   REDEFINE BUTTON oBtn3   ID 103 OF oDlg;
      ACTION ( ::cUltima := '3', ;
      iif( ::cUltimaOp = '=' .OR. ::cUltimaOp = 'AP' .OR. ::cUltimaOp = 'AE', ( ::cUltimaOp := '', ::nResult := 0, AAdd( ::aRolloCalc, { ' ', ' ' } ), oBrw:gobottom(), oBrw:refresh() ), ), ;
      cGet := cGet + ::cUltima, ;
      nGet := Val( cGet ), ;
      oGet:SetText( cGet ), ;
      oBtnIgual:Setfocus(), ;
      sysrefresh() ) UPDATE
   oBtn3:cargo := '3'
   REDEFINE BUTTON oBtn4   ID 104 OF oDlg;
      ACTION ( ::cUltima := '4', ;
      iif( ::cUltimaOp = '=' .OR. ::cUltimaOp = 'AP' .OR. ::cUltimaOp = 'AE', ( ::cUltimaOp := '', ::nResult := 0, AAdd( ::aRolloCalc, { ' ', ' ' } ), oBrw:gobottom(), oBrw:refresh() ), ), ;
      cGet := cGet + ::cUltima, ;
      nGet := Val( cGet ), ;
      oGet:SetText( cGet ), ;
      oBtnIgual:Setfocus(), ;
      sysrefresh() ) UPDATE
   oBtn4:cargo := '4'
   REDEFINE BUTTON oBtn5   ID 105 OF oDlg;
      ACTION ( ::cUltima := '5', ;
      iif( ::cUltimaOp = '=' .OR. ::cUltimaOp = 'AP' .OR. ::cUltimaOp = 'AE', ( ::cUltimaOp := '', ::nResult := 0, AAdd( ::aRolloCalc, { ' ', ' ' } ), oBrw:gobottom(), oBrw:refresh() ), ), ;
      cGet := cGet + ::cUltima, ;
      nGet := Val( cGet ), ;
      oGet:SetText( cGet ), ;
      oBtnIgual:Setfocus(), ;
      sysrefresh() ) UPDATE
   oBtn5:cargo := '5'
   REDEFINE BUTTON oBtn6   ID 106 OF oDlg;
      ACTION ( ::cUltima := '6', ;
      iif( ::cUltimaOp = '=' .OR. ::cUltimaOp = 'AP' .OR. ::cUltimaOp = 'AE', ( ::cUltimaOp := '', ::nResult := 0, AAdd( ::aRolloCalc, { ' ', ' ' } ), oBrw:gobottom(), oBrw:refresh() ), ), ;
      cGet := cGet + ::cUltima, ;
      nGet := Val( cGet ), ;
      oGet:SetText( cGet ), ;
      oBtnIgual:Setfocus(), ;
      sysrefresh() ) UPDATE
   oBtn6:cargo := '6'
   REDEFINE BUTTON oBtn7   ID 107 OF oDlg;
      ACTION ( ::cUltima := '7', ;
      iif( ::cUltimaOp = '=' .OR. ::cUltimaOp = 'AP' .OR. ::cUltimaOp = 'AE', ( ::cUltimaOp := '', ::nResult := 0, AAdd( ::aRolloCalc, { ' ', ' ' } ), oBrw:gobottom(), oBrw:refresh() ), ), ;
      cGet := cGet + ::cUltima, ;
      nGet := Val( cGet ), ;
      oGet:SetText( cGet ), ;
      oBtnIgual:Setfocus(), ;
      sysrefresh() ) UPDATE
   oBtn7:cargo := '7'
   REDEFINE BUTTON oBtn8   ID 108 OF oDlg;
      ACTION ( ::cUltima := '8', ;
      iif( ::cUltimaOp = '=' .OR. ::cUltimaOp = 'AP' .OR. ::cUltimaOp = 'AE', ( ::cUltimaOp := '', ::nResult := 0, AAdd( ::aRolloCalc, { ' ', ' ' } ), oBrw:gobottom(), oBrw:refresh() ), ), ;
      cGet := cGet + ::cUltima, ;
      nGet := Val( cGet ), ;
      oGet:SetText( cGet ), ;
      oBtnIgual:Setfocus(), ;
      sysrefresh() ) UPDATE
   oBtn8:cargo := '8'
   REDEFINE BUTTON oBtn9   ID 109 OF oDlg;
      ACTION ( ::cUltima := '9', ;
      iif( ::cUltimaOp = '=' .OR. ::cUltimaOp = 'AP' .OR. ::cUltimaOp = 'AE', ( ::cUltimaOp := '', ::nResult := 0, AAdd( ::aRolloCalc, { ' ', ' ' } ), oBrw:gobottom(), oBrw:refresh() ), ), ;
      cGet := cGet + ::cUltima, ;
      nGet := Val( cGet ), ;
      oGet:SetText( cGet ), ;
      oBtnIgual:Setfocus(), ;
      sysrefresh() ) UPDATE
   oBtn9:cargo := '9'
   REDEFINE BUTTON oBtnP   ID 110 OF oDlg;
      ACTION ( ::cUltima := '.', ;
      iif( ::cUltimaOp = '=' .OR. ::cUltimaOp = 'AP' .OR. ::cUltimaOp = 'AE', ( ::cUltimaOp := '', ::nResult := 0, AAdd( ::aRolloCalc, { ' ', ' ' } ), oBrw:gobottom(), oBrw:refresh() ), ), ;
      cGet := cGet + ::cUltima, ;
      nGet := Val( cGet ), ;
      oGet:SetText( cGet ), ;
      oBtnIgual:Setfocus(), ;
      sysrefresh() ) UPDATE WHEN Int( nGet ) == nGet
   oBtnP:cargo := '.'
   REDEFINE BUTTON oBtnSigno ID 111 OF oDlg;
      ACTION ( ::cUltima := 'signo', ;
      iif( ::cUltimaOp = '=' .OR. ::cUltimaOp = 'AP' .OR. ::cUltimaOp = 'AE', ( ::cUltimaOp := '', ::nResult := 0, AAdd( ::aRolloCalc, { ' ', ' ' } ), oBrw:gobottom(), oBrw:refresh() ), ), ;
      nGet := ( - 1 ) * nGet, ;
      oGet:SetText( nGet ), ;
      cGet := AllTrim( Str( nGet ) ), ;
      oBtnIgual:Setfocus(), ;
      sysrefresh() ) UPDATE
   oBtnSigno:cargo := ' '

   REDEFINE SAY oGet VAR nGet ID 211 OF oDlg FONT oFont1 ;
      COLOR nrgb( 0,  0, 0 ), nrgb( 255, 255, 200 ) UPDATE

   REDEFINE SAY oSay VAR ::nResult ID 200 OF oDlg FONT oFont1 ;
      COLOR nrgb( 50, 250, 50 ), nrgb( 0, 0, 0 ) UPDATE

   REDEFINE LISTBOX oBrw FIELDS ;
      ::aRolloCalc[ n ][ 1 ], ;
      ::aRolloCalc[ n ][ 2 ];
      HEAD 'valor', 'op';
      ID 212 OF oDlg FONT oFontLst COLOR  nrgb( 0, 0, 0 ), nrgb( 255, 255, 200 ) ;// clrLtrBrow,clrFonBrow ;
      UPDATE

   oBrw:aJustify  := { .T., .F. }
   oBrw:aColSizes := { GetFontInfo( oFontLst )[ 2 ] * 1.25 * 17, GetFontInfo( oFontLst )[ 2 ] * 1.25 * 3 } // aMatrizTc({17,3},oFontLst)
   oBrw:bGotop    := {|| n := 1 }
   oBrw:bGoBottom := {|| n := Eval( oBrw:bLogicLen ) }
   oBrw:bSkip     := {| nwant, nold | nold := n, n += nwant, ;
      n := Max( 1, Min( n, Eval( oBrw:bLogicLen ) ) ), ;
      n - nOld }
   oBrw:bLogicLen := {|| Len( ::aRolloCalc ) }

   oBrw:nClrPane := {|| iif( ::aRolloCalc[ n ][ 2 ] == '=', nrgb( 200, 255, 125 ), nrgb( 255, 255, 200 ) ) }

   oDlg:bKeyDown := {| nKey | ::TCalc_Teclas( nKey, oDlg, oTget ) }

   ACTIVATE DIALOG oDlg CENTERED  ;
      ON INIT ( if( lBorraAlInicio, oBtnBorra:CLICK(), .F. ), oBrw:gobottom(), oBrw:refresh() )

   oFont:end()
   oFont1:end()
   oFontLst:end()

   RETURN ::nResult
//
METHOD nCalculadigual( nGet ) CLASS TCalc

   DO CASE
   CASE ::cUltimaOp = '-'
      ::nResult := ::nResult - nGet
   CASE ::cUltimaOp = '+'
      ::nResult := ::nResult + nGet
   CASE ::cUltimaOp = '*'
      ::nResult := ::nResult * nGet
   CASE ::cUltimaOp = '/'
      ::nResult := ::nResult / nGet
   ENDCASE

   RETURN NIL
//
METHOD TCalc_Teclas( nKey, oDlg, oTGet ) CLASS TCalc

   LOCAL ny

   FOR ny := 1 TO Len( oDlg:aControls )
      IF oDlg:aControls[ ny ]:cargo == Upper( Chr( nKey ) )
         oDlg:aControls[ ny ]:CLICK()
      ENDIF
   NEXT ny
   IF nKey == 84 .AND. ValType( oTGet ) == "O"
      oDlg:End()
      oTGet:VarPut( ::nResult )
      oTGet:REFRESH()
   ENDIF

   RETURN NIL

// FIN
 


Regards, saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7831
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Incrustar Calculadora de Windows en Dialogo

Postby JoseAlvarez » Thu Jul 15, 2021 3:35 pm

Saludos Adhemar y Joao.

Logré compilar y hacer funcionar ambas opciones. Muchas Gracias.. solo me queda decidir con cual me quedaré.

Ahora, las dos se ejecutan en una ventana independiente y allí tengo un problema.

Quiero de ser posible que la calculadora forme parte del dialogo de donde la llamo. Es decir que sea como un boton, un get, un listbox o cualquier otro control.

Como podria hacerlo? la verdad que no tengo ni idea. Y no tengo conocimientos para crear clases, apenas las leo y entiendo una que otra cosa.

Alguna sugerencia?

Gracias !
"Los errores en programación, siempre están entre la silla y el teclado..."

Fwh 19.06 32 bits + Harbour 3.2 + Borland 7.4 + MariaDB + TDolphin

Carora, Estado Lara, Venezuela.
User avatar
JoseAlvarez
 
Posts: 797
Joined: Sun Nov 09, 2014 5:01 pm

Re: Incrustar Calculadora de Windows en Dialogo

Postby karinha » Thu Jul 15, 2021 4:22 pm

Acá está my dear friend:

https://mega.nz/file/EIVA2ZxY#CuEyGFgYaOOruUqgWSPowsFafJshKDd2R5G-DcQJTL8

Dúdas, estamos aqui.

Regards, saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7831
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Incrustar Calculadora de Windows en Dialogo

Postby JoseAlvarez » Thu Jul 15, 2021 4:38 pm

Gracias Joao! voy a darle un vistazo y te comento. :D
"Los errores en programación, siempre están entre la silla y el teclado..."

Fwh 19.06 32 bits + Harbour 3.2 + Borland 7.4 + MariaDB + TDolphin

Carora, Estado Lara, Venezuela.
User avatar
JoseAlvarez
 
Posts: 797
Joined: Sun Nov 09, 2014 5:01 pm

Re: Incrustar Calculadora de Windows en Dialogo

Postby JoseAlvarez » Fri Jul 16, 2021 1:55 pm

José
Aquí otra opción


Adhemar, saludos...

Ya tengo implementada tu calculadora... me gusta bastante y decidi quedarme con ella para mis programas.
La de Joao tambien es excelente, pero la tuya tiene "rollo" o sea, va llevando el registro de operacion en pantalla y eso se adapta mejor a mis necesidades.

Solo me tomo el atrevimiento de solicitarte una integracion, si puedes disponer del tiempo y disculpar la molestia, por supuesto.
Si se pudiera aumentar el numero de decimales segun la necesidad del usuario, la calculadora quedaria perfecta para mi y seguro seria una muy buena herramienta para muchos usuarios, más de lo que es ahora.

Yo tengo hecho esto de ajustar decimales (+/-) pero en un GET, como puedes ver en la primera imagen.
Estuve observando tu codigo y lamentablemente para mi, es una clase y en clases yo soy nulo. No tengo conocimientos sobre ello.
Por lo que pude ver tu utilizas un SAY para mostrar los resultados y no pude dar con la parte donde modificarla y reasignarle el picture que corresponda al numero de decimales que se desee.

Te dejo esta imagen como muestra. Ahi puede ver como lo tengo en los gets y una sugerencia para la calculadora.


Image


Nuevamente te pido disculpas por el atrevimiento de solicitarte cambios al codigo. De todas maneras todo queda sujeto a de tu tiempo.

Gracias hermano.
"Los errores en programación, siempre están entre la silla y el teclado..."

Fwh 19.06 32 bits + Harbour 3.2 + Borland 7.4 + MariaDB + TDolphin

Carora, Estado Lara, Venezuela.
User avatar
JoseAlvarez
 
Posts: 797
Joined: Sun Nov 09, 2014 5:01 pm

Re: Incrustar Calculadora de Windows en Dialogo

Postby JoseAlvarez » Fri Jul 16, 2021 1:57 pm

karinha wrote:Acá está my dear friend:

https://mega.nz/file/EIVA2ZxY#CuEyGFgYaOOruUqgWSPowsFafJshKDd2R5G-DcQJTL8

Dúdas, estamos aqui.

Regards, saludos.


Joao, muchisimas gracias, funciona excelente. Ya la guardé en mis librerias personales.

Gracias al foro FW

Un abrazo a todos.
"Los errores en programación, siempre están entre la silla y el teclado..."

Fwh 19.06 32 bits + Harbour 3.2 + Borland 7.4 + MariaDB + TDolphin

Carora, Estado Lara, Venezuela.
User avatar
JoseAlvarez
 
Posts: 797
Joined: Sun Nov 09, 2014 5:01 pm


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 41 guests