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
116
uentegrande1Click(Sender); //-> F5...
117
uentemediana1Click(Sender);
118
uentepequea1Click(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;
//-----------------------------------------------------------------------------
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
116


117


118


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;
//-----------------------------------------------------------------------------