Calculadora Calculator

Re: Calculadora Calculator

Postby fergonm » Tue Jan 11, 2011 11:53 am

Buenos días.

He logrado compilar y enlazar con mi programa. He quitado la coma en las dos líneas de TCALC, (188 y 227). Queda así la 188:

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

Como verás falta una "," en la línea iif(nGet<>0,( ; delante del punto y coma.

Para llamar la aplicación he modificado la línea en el programa principal para trabajar con 2 decimales.

setkey(VK_F12, {|| oCalc:calculadora(oWnd,'@E 9,999,999.99 ')})


Espero haber contribuido en algo. Un saludo. Fernando
Saludos. Fernando
fergonm
 
Posts: 133
Joined: Fri Nov 30, 2007 11:34 am
Location: Zaragoza (España)

Re: Calculadora Calculator

Postby Verhoven » Tue Jan 11, 2011 4:44 pm

Ahí va el link en MediaFire

http://www.mediafire.com/?j0k2t4idt0ckaw4

Como esto sigue usándose después de cuatro años desde su publicación tal vez lo podría Antonio meter en la carpeta de utilidades para que permaneciera siempre allí.

Saludos.
Verhoven
 
Posts: 505
Joined: Sun Oct 09, 2005 7:23 pm

Re: Calculadora Calculator

Postby albeiroval » Sat Jan 15, 2011 8:26 pm

Parece que el enlace para bajar el archivo esta roto, o el archivo fue borrado..
Saludos,
Regards,

Albeiro Valencia
www.avcsistemas.com
User avatar
albeiroval
 
Posts: 361
Joined: Tue Oct 16, 2007 5:51 pm
Location: Barquisimeto - Venezuela

Re: Calculadora Calculator

Postby Verhoven » Mon Jan 17, 2011 1:23 pm

Acabo de comprobar el link y está correcto.
Verhoven
 
Posts: 505
Joined: Sun Oct 09, 2005 7:23 pm

Re: Calculadora Calculator

Postby RodolfoRBG » Wed Mar 09, 2011 6:07 pm

Hace algun tiempo baje la Calculadora de Verhoven y fue la version del 23/09/2007.

Sabe alguien si hay alguna version mas reciente?
RodolfoRBG
FWH 1307, xHarbour123 BCC582
rodolfoerbg@gmail.com
User avatar
RodolfoRBG
 
Posts: 257
Joined: Tue May 16, 2006 4:46 pm
Location: San Luis Potosi, SLP, Mexico

Re: Calculadora Calculator

Postby Verhoven » Thu Mar 10, 2011 9:25 am

No la he vuelto a tocar desde la última versión que dejé colgada en un mensaje anterior.
Saludos.
Verhoven
 
Posts: 505
Joined: Sun Oct 09, 2005 7:23 pm

Re: Calculadora Calculator

Postby AIDA » Thu Mar 10, 2011 3:41 pm

HOLA MUCHAS GRACIAS :D

Que lindo en compartir pero que ya borraron el archivito de aqui http://www.mediafire.com/?a5px22pjtx5 :shock:

Saluditos :wink:
Que es mejor que programar? creo que nada :)
Atropellada pero aqui ando :P

I love Fivewin

séʌǝɹ ןɐ ɐʇsǝ opunɯ ǝʇsǝ
User avatar
AIDA
 
Posts: 877
Joined: Fri Jan 12, 2007 8:35 pm

Re: Calculadora Calculator

Postby joseluisysturiz » Thu Mar 10, 2011 4:03 pm

Saludos, parece que a Mediafire no le gusta FW, el link dice que esta borrado el archivo, si lo pueden subir de nuevo o a otro servidor. El 4shared es bueno y rapido...
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: Calculadora Calculator

Postby karinha » Thu Mar 10, 2011 5:16 pm

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

Re: Calculadora Calculator

Postby Bayron » Thu Mar 10, 2011 6:29 pm

Muy bonita... Te felicito a ti y a Sergio
=====>

Bayron Landaverry
(215)2226600 Philadelphia,PA, USA
+(502)46727275 Guatemala
MayaBuilders@gMail.com

FWH12.04||Harbour 3.2.0 (18754)||BCC6.5||UEstudio 10.10||
Windows 7 Ultimate

FiveWin, One line of code and it's done...
User avatar
Bayron
 
Posts: 815
Joined: Thu Dec 24, 2009 12:46 am
Location: Philadelphia, PA

Re: Calculadora Calculator

Postby Verhoven » Fri Mar 11, 2011 7:08 am

Dejo nuevamente el original, más espartano, pero el original al fin y al cabo.

http://www.mediafire.com/?av1y6bbybi7quze

En la vistosa última modificación que han dejado me ha parecido que el scroll de las operaciones no funciona bien y que para obtener el resultado hay que utilizar el ratón pulsando el igual en vez de bastar con darle a intro. La idea original era poder efectuar las operaciones sin uso de ratón.

Saludos.
Verhoven
 
Posts: 505
Joined: Sun Oct 09, 2005 7:23 pm

Re: Calculadora Calculator

Postby karinha » Fri Mar 11, 2011 12:09 pm

Verhoven wrote:Dejo nuevamente el original, más espartano, pero el original al fin y al cabo.

http://www.mediafire.com/?av1y6bbybi7quze

En la vistosa última modificación que han dejado me ha parecido que el scroll de las operaciones no funciona bien y que para obtener el resultado hay que utilizar el ratón pulsando el igual en vez de bastar con darle a intro. La idea original era poder efectuar las operaciones sin uso de ratón.

Saludos.



Gracias a los 2. Excelente calculadora.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7315
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Calculadora Calculator

Postby jbrita » Sat Oct 24, 2020 9:33 pm

Hola colegas, consulta Algun colega que tenga esta calculadora

saludos
jbrita
 
Posts: 486
Joined: Mon Jan 16, 2006 3:42 pm

Re: Calculadora Calculator

Postby Verhoven » Tue Oct 27, 2020 3:15 pm

Buenas tardes,
Adjunto el código original de la clase para que la puedan seguir disfrutando:
Code: Select all  Expand view
/*
  TCALC.PRG  
  CLASE QUE PERMITE PONER UNA CALCULADORA CON ROLLO DE PAPEL VIRTUAL.
  Necesita el fichero de recursos: calculadora.RC

  Primera Versión: Junio del 2007 DC
  Ultima Revisión: 25/03/2015
  Adaptación a XBROWSE: 25/03/2015
  Autor: Verhoven.  ¡ Seguro les resultará de utilidad !
         1.- Queda autorizado su libre distribucion y uso, incluso con fines comerciales .
         2.- El autor declina cualquier responsabilidad en caso de funcionamiento anómalo.

  Ejemplo: Hacemos una calculadora que se active pulsando F12:
           Para incluirla en un programa basta con poner después de la función main() del mismo.
           #include 'TCALC.PRG'
           public oCalc:=tCalc():new()
           setkey(VK_F12, {|| oCalc:calculadora(oWnd,'@E 9,999,999.9999 ')})
 
  Vea el significado de las variables de instancia y de las que se les pasan a los métodos para
   aprovechar algunas posibilidades de configuración.
*/


#include "fivewin.ch"
#include "XBrowse.Ch"

CLASS TCalc
 DATA nResult             //Resultado de las operaciones en curso.    
 DATA aRolloCalc          //Operaciones realizadas desde la última vez que se borró todo.
 
 DATA cUltima, cUltimaop      
 DATA cPatronSalida       // cPatronSalida  -> Formato en que se pinta el resultado.    
   
 METHOD New() CONSTRUCTOR
 
 METHOD End()
     
 METHOD nCalculadigual(nGet)
     
 METHOD calculadora(oPadre,cPatronSalida,lBorraAlInicio)
                    // lBorraAlInicio -> Al llamar al método si está en .t. borra lo que hubiera.
                    //                    Si está en .f. ó NIL conserva las operaciones anteriores.
     
 METHOD TCalc_Teclas(nKey, oDlg)
ENDCLASS

//----------------------------------------------------------------------------//

METHOD New() CLASS TCalc
 ::aRolloCalc:={{'C',' '}}  
 ::nResult   :=0            
 
 ::cUltima   :=''
 ::cUltimaop :=''    
return SELF

//----------------------------------------------------------------------------//

METHOD End() CLASS TCalc
 ::aRolloCalc:={{'C',' '}}
 ::nResult   :=0

 ::cUltima   :=''
 ::cUltimaop :=''
return NIL

//----------------------------------------------------------------------------//

METHOD calculadora(oPadre,cPatronSalida,lBorraAlInicio) CLASS TCalc
local oDlg
local oBtnSalir
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, nGet:=0 ,cGet:='', nGetAnt:=0
local oFont1
local oFontLst

if cPatronSalida=NIL .AND. ::cPatronSalida=NIL
   cPatronSalida:='@E 9,999,999,999.99 '  //Formato en que se pinta el resultado.
endif

//default cPatronSalida:='@E 9,999,999,999.99 '  //Formato en que se pinta el resultado.
default lBorraAlInicio :=.f.  // Al llamar al método si está en .t. borra lo que hubiera.
                              //  Si está en .f. entonces conserva las operaciones anteriores.

::cPatronSalida:=cPatronSalida

    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 'CALCULADORA' FONT oFont

    REDEFINE BUTTON oBtnSalir ID 500 OF oDlg MESSAGE 'SALIR';
             ACTION 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,NIL)),;
                     ::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,NIL)),;
                     ::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() ),NIL ),;
                     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()),NIL),;
                     iif(nGet<>0,(              ,;
                     cGet:=LEFT(cGet,len(cget)-1),;
                     nGet:=val(cGet)),NIL)       ,;
                     oGet:SetText(cGet)         ,;
                     oBtnIgual:Setfocus()       ,;
                     sysrefresh() ) UPDATE
             oBtnDel:cargo:=chr(8)
*/

    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()),NIL),;
                     iif(nGet<>0,(cGet:=LEFT(cGet,len(cget)-1),nGet:=val(cGet)),NIL),;
                     oGet:SetText(cGet)         ,;
                     oBtnIgual:Setfocus()       ,;
                     sysrefresh() ) UPDATE
             oBtnDel:cargo:=chr(8)
             
    REDEFINE BUTTON oBtnConv ID 407 OF oDlg MESSAGE 'Convierte de euros a PTS';
             ACTION ( iif(nGet<>0,::nResult:=round(nGet*166.386,0),::nResult:=round(::nResult*166.386,0)),;
                     aadd( ::aRolloCalc, {transform(::nResult,'@E 9,999,999,999      '),'pts'} ),;
                     oBrw:gobottom(),;                   
                     oBrw:refresh(),;
                     ::cUltimaOp:='AP'             ,;  // AP = a Pesetas
                     oSay:SetText(transform(::nResult,'@E 9,999,999,999 pts')),;
                     nGet:=0                       ,;
                     cGet:=''                      ,;
                     oGet:SetText('')              ,;
                     oBtnIgual:Setfocus()          ,;
                     sysrefresh() ) UPDATE
             oBtnConv:cargo:='E'                 
   
    REDEFINE BUTTON oBtnConv2 ID 408 OF oDlg MESSAGE 'Convierte de PTS a Euro';
             ACTION ( iif(nGet<>0,::nResult:=round(nGet/166.386,2),::nResult:=round(::nResult/166.386,2)),;
                     aadd( ::aRolloCalc, {transform(::nResult,'@E 9,999,999,999.99 '),' €'} ),;
                     oBrw:gobottom(),;                   
                     oBrw:refresh(),;
                     ::cUltimaOp:='AE'             ,;  // AE = a Euros
                     oSay:SetText(transform(::nResult,'@E 9,999,999,999.99 €')),;
                     nGet:=0                       ,;
                     cGet:=''                      ,;
                     oGet:SetText('')              ,;
                     oBtnIgual:Setfocus()          ,;
                     sysrefresh() ) UPDATE
             oBtnConv:cargo:='P'    
             
    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()),NIL),;
                     iif(nGet<>0 .OR. at(".",cGet)>0,(;
                     cGet:=cGet+::cUltima       ,;
                     nGet:=val(cGet)),NIL)         ,;
                     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()),NIL),;
                     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()),NIL),;
                     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()),NIL),;
                     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()),NIL),;
                     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()),NIL),;
                     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()),NIL),;
                     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()),NIL),;
                     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()),NIL),;
                     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()),NIL),;
                     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()),NIL),;
                     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()),NIL),;
                     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

/*  // TIENE QUE PONER TWBrowse en el .RC en vez de TXBrowse
    REDEFINE LISTBOX oBrw FIELDS ;
                     ::aRolloCalc[n][1],;
                     ::aRolloCalc[n][2];
             HEAD 'valor',' ';
             ID 212 OF oDlg FONT oFontLst COLOR  nrgb(0,0,0),nrgb(255,255,200) ;
             UPDATE
   
    oBrw:aJustify  :={.t.,.f.}
    oBrw:aColSizes :={GetFontInfo(oFontLst)[2] * 1.25 * 17, GetFontInfo(oFontLst)[2] * 1.25 * 3} //Empírico
    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)}
*/

    REDEFINE XBROWSE oBrw DATASOURCE ::aRolloCalc ;
             COLUMNS 1,2 ;
             HEADERS 'valor',' ';
             ID 212 OF oDlg FONT oFontLst COLOR  nrgb(0,0,0),nrgb(255,255,200) ;
             COLSIZES {GetFontInfo(oFontLst)[2] * 1.25 * 14, GetFontInfo(oFontLst)[2] * 1.25 * 3} ;//Empírico
             UPDATE
   
    WITH OBJECT oBrw
         :nRowDividerStyle:= LINESTYLE_NOLINES
         :nColDividerStyle:= LINESTYLE_NOLINES
         :nStretchCol:=STRETCHCOL_LAST
         :aJustify  :={.t.,2}
         //:lHScroll:= .F.
         //:lVScroll:= .T.
    end    
    oBrw:bClrStd := {|| {CLR_BLACK,iif(oBrw:aCols[2]:Value=='=',nrgb(200,255,125),nrgb(255,255,200)) } }
    oDlg:bKeyDown:={|nKey| ::TCalc_Teclas(nKey,oDlg)}

   ACTIVATE DIALOG oDlg CENTERED ON INIT (if(lBorraAlInicio,oBtnBorra:CLICK(),.f.),oBrw:gobottom(),oBrw:refresh())
 
 //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) 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
return nil


Para el fichero de recursos "calculadora.RC" es el código siguiente:
Code: Select all  Expand view
// RESOURCE SCRIPT generated by "Pelles C for Windows, version 7.00".

#include <windows.h>
#include <commctrl.h>
#include <richedit.h>

LANGUAGE LANG_ENGLISH,SUBLANG_ENGLISH_US

CALCULADORA DIALOG DISCARDABLE 198, 20, 209, 176
STYLE WS_POPUP|WS_THICKFRAME|WS_CAPTION|WS_SYSMENU|WS_VISIBLE
CAPTION "CALCULADORA"
{
  CONTROL "&1", 101, "Button", WS_TABSTOP, 114, 115, 14, 14
  CONTROL "&2", 102, "Button", WS_TABSTOP, 128, 115, 14, 14
  CONTROL "&4", 104, "Button", WS_TABSTOP, 114, 101, 14, 14
  CONTROL "&5", 105, "Button", WS_TABSTOP, 128, 101, 14, 14
  CONTROL "&6", 106, "Button", WS_TABSTOP, 142, 101, 14, 14
  CONTROL "&3", 103, "Button", WS_TABSTOP, 142, 115, 14, 14
  CONTROL "&7", 107, "Button", WS_TABSTOP, 114, 87, 14, 14
  CONTROL "&8", 108, "Button", WS_TABSTOP, 128, 87, 14, 14
  CONTROL "&9", 109, "Button", WS_TABSTOP, 142, 87, 14, 14
  CONTROL "&.", 110, "Button", WS_TABSTOP, 142, 129, 14, 14
  CONTROL "", 212, "TXBrowse", WS_TABSTOP|0x00a00000, 4, 6, 100, 163
  CONTROL "&-", 401, "Button", WS_TABSTOP, 161, 87, 14, 14
  CONTROL "&0", 100, "Button", WS_TABSTOP, 114, 129, 28, 14
  CONTROL "&*", 403, "Button", WS_TABSTOP, 161, 115, 14, 14
  CONTROL "&SALIR", 500, "Button", WS_TABSTOP, 167, 155, 39, 14
  CONTROL "&+", 402, "Button", WS_TABSTOP, 161, 101, 14, 14
  CONTROL "&/", 404, "Button", WS_TABSTOP, 161, 129, 14, 14
  CONTROL "&=", 405, "Button", WS_TABSTOP, 179, 129, 20, 14
  CONTROL "&RC", 425, "Button", WS_TABSTOP, 179, 87, 20, 14
  CONTROL "CE", 426, "Button", WS_TABSTOP, 179, 101, 20, 14
  CONTROL "+ / -", 111, "Button", WS_TABSTOP, 179, 115, 20, 14
  CONTROL "a &PTS", 407, "Button", WS_TABSTOP, 176, 14, 27, 14
  CONTROL "a &Euros", 408, "Button", WS_TABSTOP, 148, 14, 27, 14
  CONTROL "Text", 200, "Static", SS_RIGHT|WS_GROUP, 109, 49, 95, 13
  CONTROL "Text", 211, "Static", SS_RIGHT|WS_BORDER|WS_GROUP, 114, 71, 85, 13
  CONTROL "Resultado =", -1, "Static", SS_RIGHT|WS_GROUP, 164, 39, 40, 10
  CONTROL "", -1, "Static", SS_BLACKFRAME, 108, 67, 98, 80
  CONTROL "", -1, "Static", SS_BLACKFRAME, 108, 39, 98, 26
  CONTROL "Conversor", -1, "Button", BS_GROUPBOX, 144, 4, 62, 26
}
 
Verhoven
 
Posts: 505
Joined: Sun Oct 09, 2005 7:23 pm

Re: Calculadora Calculator

Postby Verhoven » Tue Oct 27, 2020 3:16 pm

Buenas tardes,
Adjunto el código original de la clase para que la puedan seguir disfrutando:
Code: Select all  Expand view
/*
  TCALC.PRG  
  CLASE QUE PERMITE PONER UNA CALCULADORA CON ROLLO DE PAPEL VIRTUAL.
  Necesita el fichero de recursos: calculadora.RC

  Primera Versión: Junio del 2007 DC
  Ultima Revisión: 25/03/2015
  Adaptación a XBROWSE: 25/03/2015
  Autor: Verhoven.  ¡ Seguro les resultará de utilidad !
         1.- Queda autorizado su libre distribucion y uso, incluso con fines comerciales .
         2.- El autor declina cualquier responsabilidad en caso de funcionamiento anómalo.

  Ejemplo: Hacemos una calculadora que se active pulsando F12:
           Para incluirla en un programa basta con poner después de la función main() del mismo.
           #include 'TCALC.PRG'
           public oCalc:=tCalc():new()
           setkey(VK_F12, {|| oCalc:calculadora(oWnd,'@E 9,999,999.9999 ')})
 
  Vea el significado de las variables de instancia y de las que se les pasan a los métodos para
   aprovechar algunas posibilidades de configuración.
*/


#include "fivewin.ch"
#include "XBrowse.Ch"

CLASS TCalc
 DATA nResult             //Resultado de las operaciones en curso.    
 DATA aRolloCalc          //Operaciones realizadas desde la última vez que se borró todo.
 
 DATA cUltima, cUltimaop      
 DATA cPatronSalida       // cPatronSalida  -> Formato en que se pinta el resultado.    
   
 METHOD New() CONSTRUCTOR
 
 METHOD End()
     
 METHOD nCalculadigual(nGet)
     
 METHOD calculadora(oPadre,cPatronSalida,lBorraAlInicio)
                    // lBorraAlInicio -> Al llamar al método si está en .t. borra lo que hubiera.
                    //                    Si está en .f. ó NIL conserva las operaciones anteriores.
     
 METHOD TCalc_Teclas(nKey, oDlg)
ENDCLASS

//----------------------------------------------------------------------------//

METHOD New() CLASS TCalc
 ::aRolloCalc:={{'C',' '}}  
 ::nResult   :=0            
 
 ::cUltima   :=''
 ::cUltimaop :=''    
return SELF

//----------------------------------------------------------------------------//

METHOD End() CLASS TCalc
 ::aRolloCalc:={{'C',' '}}
 ::nResult   :=0

 ::cUltima   :=''
 ::cUltimaop :=''
return NIL

//----------------------------------------------------------------------------//

METHOD calculadora(oPadre,cPatronSalida,lBorraAlInicio) CLASS TCalc
local oDlg
local oBtnSalir
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, nGet:=0 ,cGet:='', nGetAnt:=0
local oFont1
local oFontLst

if cPatronSalida=NIL .AND. ::cPatronSalida=NIL
   cPatronSalida:='@E 9,999,999,999.99 '  //Formato en que se pinta el resultado.
endif

//default cPatronSalida:='@E 9,999,999,999.99 '  //Formato en que se pinta el resultado.
default lBorraAlInicio :=.f.  // Al llamar al método si está en .t. borra lo que hubiera.
                              //  Si está en .f. entonces conserva las operaciones anteriores.

::cPatronSalida:=cPatronSalida

    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 'CALCULADORA' FONT oFont

    REDEFINE BUTTON oBtnSalir ID 500 OF oDlg MESSAGE 'SALIR';
             ACTION 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,NIL)),;
                     ::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,NIL)),;
                     ::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() ),NIL ),;
                     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()),NIL),;
                     iif(nGet<>0,(              ,;
                     cGet:=LEFT(cGet,len(cget)-1),;
                     nGet:=val(cGet)),NIL)       ,;
                     oGet:SetText(cGet)         ,;
                     oBtnIgual:Setfocus()       ,;
                     sysrefresh() ) UPDATE
             oBtnDel:cargo:=chr(8)
*/

    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()),NIL),;
                     iif(nGet<>0,(cGet:=LEFT(cGet,len(cget)-1),nGet:=val(cGet)),NIL),;
                     oGet:SetText(cGet)         ,;
                     oBtnIgual:Setfocus()       ,;
                     sysrefresh() ) UPDATE
             oBtnDel:cargo:=chr(8)
             
    REDEFINE BUTTON oBtnConv ID 407 OF oDlg MESSAGE 'Convierte de euros a PTS';
             ACTION ( iif(nGet<>0,::nResult:=round(nGet*166.386,0),::nResult:=round(::nResult*166.386,0)),;
                     aadd( ::aRolloCalc, {transform(::nResult,'@E 9,999,999,999      '),'pts'} ),;
                     oBrw:gobottom(),;                   
                     oBrw:refresh(),;
                     ::cUltimaOp:='AP'             ,;  // AP = a Pesetas
                     oSay:SetText(transform(::nResult,'@E 9,999,999,999 pts')),;
                     nGet:=0                       ,;
                     cGet:=''                      ,;
                     oGet:SetText('')              ,;
                     oBtnIgual:Setfocus()          ,;
                     sysrefresh() ) UPDATE
             oBtnConv:cargo:='E'                 
   
    REDEFINE BUTTON oBtnConv2 ID 408 OF oDlg MESSAGE 'Convierte de PTS a Euro';
             ACTION ( iif(nGet<>0,::nResult:=round(nGet/166.386,2),::nResult:=round(::nResult/166.386,2)),;
                     aadd( ::aRolloCalc, {transform(::nResult,'@E 9,999,999,999.99 '),' €'} ),;
                     oBrw:gobottom(),;                   
                     oBrw:refresh(),;
                     ::cUltimaOp:='AE'             ,;  // AE = a Euros
                     oSay:SetText(transform(::nResult,'@E 9,999,999,999.99 €')),;
                     nGet:=0                       ,;
                     cGet:=''                      ,;
                     oGet:SetText('')              ,;
                     oBtnIgual:Setfocus()          ,;
                     sysrefresh() ) UPDATE
             oBtnConv:cargo:='P'    
             
    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()),NIL),;
                     iif(nGet<>0 .OR. at(".",cGet)>0,(;
                     cGet:=cGet+::cUltima       ,;
                     nGet:=val(cGet)),NIL)         ,;
                     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()),NIL),;
                     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()),NIL),;
                     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()),NIL),;
                     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()),NIL),;
                     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()),NIL),;
                     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()),NIL),;
                     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()),NIL),;
                     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()),NIL),;
                     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()),NIL),;
                     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()),NIL),;
                     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()),NIL),;
                     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

/*  // TIENE QUE PONER TWBrowse en el .RC en vez de TXBrowse
    REDEFINE LISTBOX oBrw FIELDS ;
                     ::aRolloCalc[n][1],;
                     ::aRolloCalc[n][2];
             HEAD 'valor',' ';
             ID 212 OF oDlg FONT oFontLst COLOR  nrgb(0,0,0),nrgb(255,255,200) ;
             UPDATE
   
    oBrw:aJustify  :={.t.,.f.}
    oBrw:aColSizes :={GetFontInfo(oFontLst)[2] * 1.25 * 17, GetFontInfo(oFontLst)[2] * 1.25 * 3} //Empírico
    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)}
*/

    REDEFINE XBROWSE oBrw DATASOURCE ::aRolloCalc ;
             COLUMNS 1,2 ;
             HEADERS 'valor',' ';
             ID 212 OF oDlg FONT oFontLst COLOR  nrgb(0,0,0),nrgb(255,255,200) ;
             COLSIZES {GetFontInfo(oFontLst)[2] * 1.25 * 14, GetFontInfo(oFontLst)[2] * 1.25 * 3} ;//Empírico
             UPDATE
   
    WITH OBJECT oBrw
         :nRowDividerStyle:= LINESTYLE_NOLINES
         :nColDividerStyle:= LINESTYLE_NOLINES
         :nStretchCol:=STRETCHCOL_LAST
         :aJustify  :={.t.,2}
         //:lHScroll:= .F.
         //:lVScroll:= .T.
    end    
    oBrw:bClrStd := {|| {CLR_BLACK,iif(oBrw:aCols[2]:Value=='=',nrgb(200,255,125),nrgb(255,255,200)) } }
    oDlg:bKeyDown:={|nKey| ::TCalc_Teclas(nKey,oDlg)}

   ACTIVATE DIALOG oDlg CENTERED ON INIT (if(lBorraAlInicio,oBtnBorra:CLICK(),.f.),oBrw:gobottom(),oBrw:refresh())
 
 //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) 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
return nil


Para el fichero de recursos "calculadora.RC" es el código siguiente:
Code: Select all  Expand view
// RESOURCE SCRIPT generated by "Pelles C for Windows, version 7.00".

#include <windows.h>
#include <commctrl.h>
#include <richedit.h>

LANGUAGE LANG_ENGLISH,SUBLANG_ENGLISH_US

CALCULADORA DIALOG DISCARDABLE 198, 20, 209, 176
STYLE WS_POPUP|WS_THICKFRAME|WS_CAPTION|WS_SYSMENU|WS_VISIBLE
CAPTION "CALCULADORA"
{
  CONTROL "&1", 101, "Button", WS_TABSTOP, 114, 115, 14, 14
  CONTROL "&2", 102, "Button", WS_TABSTOP, 128, 115, 14, 14
  CONTROL "&4", 104, "Button", WS_TABSTOP, 114, 101, 14, 14
  CONTROL "&5", 105, "Button", WS_TABSTOP, 128, 101, 14, 14
  CONTROL "&6", 106, "Button", WS_TABSTOP, 142, 101, 14, 14
  CONTROL "&3", 103, "Button", WS_TABSTOP, 142, 115, 14, 14
  CONTROL "&7", 107, "Button", WS_TABSTOP, 114, 87, 14, 14
  CONTROL "&8", 108, "Button", WS_TABSTOP, 128, 87, 14, 14
  CONTROL "&9", 109, "Button", WS_TABSTOP, 142, 87, 14, 14
  CONTROL "&.", 110, "Button", WS_TABSTOP, 142, 129, 14, 14
  CONTROL "", 212, "TXBrowse", WS_TABSTOP|0x00a00000, 4, 6, 100, 163
  CONTROL "&-", 401, "Button", WS_TABSTOP, 161, 87, 14, 14
  CONTROL "&0", 100, "Button", WS_TABSTOP, 114, 129, 28, 14
  CONTROL "&*", 403, "Button", WS_TABSTOP, 161, 115, 14, 14
  CONTROL "&SALIR", 500, "Button", WS_TABSTOP, 167, 155, 39, 14
  CONTROL "&+", 402, "Button", WS_TABSTOP, 161, 101, 14, 14
  CONTROL "&/", 404, "Button", WS_TABSTOP, 161, 129, 14, 14
  CONTROL "&=", 405, "Button", WS_TABSTOP, 179, 129, 20, 14
  CONTROL "&RC", 425, "Button", WS_TABSTOP, 179, 87, 20, 14
  CONTROL "CE", 426, "Button", WS_TABSTOP, 179, 101, 20, 14
  CONTROL "+ / -", 111, "Button", WS_TABSTOP, 179, 115, 20, 14
  CONTROL "a &PTS", 407, "Button", WS_TABSTOP, 176, 14, 27, 14
  CONTROL "a &Euros", 408, "Button", WS_TABSTOP, 148, 14, 27, 14
  CONTROL "Text", 200, "Static", SS_RIGHT|WS_GROUP, 109, 49, 95, 13
  CONTROL "Text", 211, "Static", SS_RIGHT|WS_BORDER|WS_GROUP, 114, 71, 85, 13
  CONTROL "Resultado =", -1, "Static", SS_RIGHT|WS_GROUP, 164, 39, 40, 10
  CONTROL "", -1, "Static", SS_BLACKFRAME, 108, 67, 98, 80
  CONTROL "", -1, "Static", SS_BLACKFRAME, 108, 39, 98, 26
  CONTROL "Conversor", -1, "Button", BS_GROUPBOX, 144, 4, 62, 26
}
 
Verhoven
 
Posts: 505
Joined: Sun Oct 09, 2005 7:23 pm

PreviousNext

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 41 guests