Check the new version here

Popular channels

Programación: el código fuente de la calculadora científi

Es de la Oficalc mencionada en este post:
http://noforeen.taringa.com.ar/posts/69229/Excelente-Calculadora-ofim%C3%A1tica-y-.html

Este es el código fuente básico. Programado como aprendizaje en lenguaje Pascal, para Delphi ©Borland

Al pulsar una tecla, enviamos al procedimiento correspondiente

Existen dos eventos de captación de teclas: On key press y On key down

En On key press, se puede recoger la variable key del tipo Char (carácter) que representa el símbolo ASCII pulsado.

En On key down, se recoge la variable key del tipo numérica word (256 números) que representa el número de tecla pulsada.

Estos procedimientos son llamados tanto al pulsar el botón correspondiente de la calculadora como al pulsar la tecla.

Creamos dos variables del tipo variant: Result y resultp que serán los resultados que se mostrarán en los display para euros (calculadora normal) y pesetas (o moneda local). Estas serán del tipo variant, que mejoran la conversión entre otros tipos de variables (entre texto y números) ya que en un momento dado, puede ser texto y en otro número.

op1 y op2 son las dos variables públicas del tipo texto (string) destinadas a almacenar los dos operandos recogidos en el display.

Si el usuario pulsa el operador "+" la variable op2 pasa a contener el valor de op1. Al pulsar el signo igual, la variable op1 almacena el contenido de número del display y se realiza la operación de suma correspondiente entre los dos operandos. El resultado se almacena en la variable Result que luego es mmostrada de nuevo en el display.

En el procedimiento calcu recogemos en el parámetro sender del tipo string (no confundir con el sender object) el operador pulsado. (+ - * ...)

procedure TForm1.numeKeyPress(Sender: TObject; var Key: Char);

begin

case key of

#13,#61:operarClick(opeigual); //intro o =

#27: inicia(sender); {escape y retroceso pone a cero}

#8: numeClick(cancelaent); {retroceso quita uno}

#43 : operarClick(opemas);

#45 : operarClick(opemenos);

#42 : operarClick(opepor);

#47 : operarClick(opediv);

#37 :opercientoClick(Sender); //tecla %

#44 : numecomaClick(sender);{coma}

#46 : numecomaClick(sender);{punto como coma}

#48 : numeClick(nume0);

#49 : numeClick(nume1);

#50 : numeClick(nume2);

#51 : numeClick(nume3);

#52 : numeClick(nume4);

#53 : numeClick(nume5);

#54 : numeClick(nume6);

#55 : numeClick(nume7);

#56 : numeClick(nume8);

#57 : numeClick(nume9);

end;

end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

begin

if panel1.visible=true then

begin

case key of

38,33:indipClick(sender); //flecha arriba o Re pag

40,34:indieClick(sender); //flecha abajo o Av pag}

112:config1Click(instrucciones1); //-> F1 ayuda

116uentegrande1Click(Sender); //-> F5...

117uentemediana1Click(Sender);

118uentepequea1Click(Sender); //->F7

113:indipClick(Sender); //F2-Moneda local

114:indieClick(sender);

115:calClick(Sender);

120:Estandard1Click(Sender); //-> F9

121:Extendida1Click(Sender); //-> F10

122:Compacta1Click(Sender);

123:Minimizada1Click(Sender);

33:indipClick(sender); //Re pag

34:indieClick(sender); //Av pag}

46:inicia(sender); //tecla suprimir

end;

end;

end;

********************************

En el procedimiento operarClick recogemos el operador metemático que ha pulsado el usuario y se lo asignamos a la variable: operador

porque si la tecla pulsada es un número, no realiza ningún cálculo, sino que este número lo recoge y lo concatena con el anterior, pero si la tecla pulsada es un operador matemático, lo manda a ejecutar el procedimineto calcu con el parámetro (operador).

Operantes es una variable booleriana del tipo "flag" que conmuta si la tecla anterior era un número o un operador.

procedure TForm1.operarClick(Sender: TObject);

var

operador: string;

begin

siguienteoper:=true;

coma:=false;

if sender=opemas then operador:='+'

else if sender=opemenos then operador:='-'

else if sender=opeigual then operador:='='

else if sender=opepor then operador:='*'

else if sender=opediv then operador:='/'

else if sender=opeinverso then operador:='1/x'

else if sender=opeigual then

begin

if pesetas.down then (memo1.lines.add(pantap.caption))else (memo1.lines.add pantae.caption));

end;

labelinf.caption:=labelinf.caption+' '+ pantae.caption+operador;

calcu(operador);

if operador='=' then

begin

if pesetas.down then (memo1.lines.add(pantap.caption))else (memo1.lines.add(pantae.caption));

memo1.lines.add('');

tamano('');

labelinf.alignment:=taRightJustify;

if pantae.caption='0' then labelinf.caption:='' else

begin

if operantes=false then labelinf.caption:=labelinf.caption +' '+ pantae.caption + ' '

else labelinf.caption:= pantae.caption+' ';

end

end;

operantes:=true;
end;

********************************

En el procedimiento calcu recogemos en el parámetro sender del tipo string (no confundir con el sender object) el operador pulsado.

Creamos dos variables del tipo variant: Result y resultp que serán los resultados que se mostrarán en los display para euros (calculadora normal) y pesetas (o moneda local).

Las variables del tipo variant mejoran la conversión entre otros tipos de variables (entre texto y números) ya que en un momento dado, puede ser texto y en otro número.

op1 y op2 son dos variables públicas del tipo texto (string) destinadas a almacenar los dos operandos recogidos en el display.

Si el usuario pulsa el operador "+" la variable op2 pasa a contener el valor de op1. Al pulsar el signo igual, la variable op1 almacena el contenido de número del display y se realiza la operación de suma correspondiente entre los dos operandos.

procedure Tform1.calcu(sender:string);

var

result:variant;

resultp:variant;

begin

if operaflag=false then {si no se ha pulsado antes un operador}

begin

if pesetas.down then op1:=(pantap.caption) else op1:=(pantae.caption);

operaflag:=true; //-> ya se ha pulsado un operador ej: +

operadorantes:=sender; //-> y se guarda en operadorantes

indie.caption:='€';

indip.caption:=simbolop.text;

//labelinf.caption:=pantae.caption;

end

else //-> si ya tiene operacion, pasamos a op2

begin

if pesetas.down then

begin

op2:=(pantap.caption);

indip.caption:=sender;

memo1.lines.add(pantap.caption);

memo1.lines.add(sender);

end

else

begin

op2:=(pantae.caption);

indie.caption:=sender;

memo1.lines.add(pantae.caption);

memo1.lines.add(sender);

end;

if operantes=false then

begin

if operadorantes = '+' then result:=StrToCurr(op1)+StrToCurr(op2) //-> aquí suma

else if operadorantes = '-' then result:=op1-op2 //-> aquí resta

else if operadorantes = '*' then result:=op1*op2 //-> aquí multiplica

else if operadorantes = '%' then result:=op1*op2 //-> aquí multiplica por %

else if operadorantes = '/' then //-> aquí divide

begin

if op2=0 then //-> si el denominador-divisor es cero no debe realizar la operación de dividir

begin

if idioma='ing' then Infor('No divide by 0') else Infor('No divisible por cero');

result:=0;

end

else result:=op1/op2; //-> si no es cero, divide

end

else if operadorantes = '=' then

begin

result:=op2;

op1:=op2;

operaflag:=true; //-> variable del tipo booleriana del tipo flag para indicar que ya se ha hecho la operación

end

end

else

begin

result:=op2;

operaflag:=true;

end;

if result<0 then //-> Si el resultado sale negativo, ponemos el display en rojo...

begin

pantap.font.color:=clred;

pantae.font.color:=clred;

end

else //-> y si no lo ponemos en negro

begin

pantap.font.color:=clblack;

pantae.font.color:=clblack;

end;

if pesetas.down then pantap.caption:=result

else pantae.caption:=result; //-> muestra en display el resultado

if cal.down=false then //-> si no está en modo calc. hace cambio moneda

begin

if euros.down then

begin

resultp:=result*cambiop.text;

pantap.caption:=resultp;

end

else

begin

resultp:=result/cambiop.text;

pantae.caption:=resultp;

end;

end;

op1:=result;

operadorantes:=sender;

end;

operantes:=true;

pp:=pantap.caption; //pantalla pesetas

pe:=pantae.caption; //pantalla euros

if pantap.caption<>'' then pantap.caption:=FormatFloat(formato,pp);

if pantae.caption<>'' then pantae.caption:=FormatFloat(formato,pe);

end;

//-----------------------------------------------------------------------------
0
9
0
9Comments
      Patagonik-O

      te dejo 10 muy bueno
      gracias papá 😉

      0
      matias0001

      te dejo 10 muy bueno

      0
      satch boogie

      😯 😯

      0
      Patagonik-O

      ... pero que las postee en "Apto" , jajaaa !

      0
      CHIPI

      ajajajaj pornographer sos un capo, después posteate las fotos en T!

      0
      EstebanBianchi

      el problema de los gran fragata es que la caja es muy grandota...
      y despues la calculadora no te entra en el bolsillo del jean

      0
      selfmade

      los Gran Fragata no sirven 😢

      0
      Patagonik-O

      jaja sos mortal

      Nota: procurá no olvidar el "." entre labelinf y caption (error común!). Y la
      caja de Patito, preferentemente el modelo nuevo, con división interna reforzada. De
      nada capo! 😉

      0
      pornographer

      "//labelinf.caption:=pantae.caption", Aja!, aca estaba el error que me faltaba solucionar
      para poder terminar mi calculadora casera hecha a base de una caja patito de 220
      fosforos, un reloj digital, 2 escarbadientes, una gomita, algunos tornillos, una plantilla
      tactil de goma, y 2 pilas AA comunes, esta lista para ser sacada al mercado, gracias
      amigo patagonik...😄

      0