Oficalc

 

Así se hizo Oficalc  ©www.ofimega.es


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

116:Fuentegrande1Click(Sender); //-> F5...

117:Fuentemediana1Click(Sender);

118:Fuentepequea1Click(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;

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

 

 


 

 


Principal__ |__ Aviso legal __| __Privacidad__ | __Contacto__ |__ Facebook F |__ Tweter F |__ Tweter