Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-05-2017
Avatar de axesys
axesys axesys is offline
Miembro
 
Registrado: ene 2007
Ubicación: Los Mochis Sinaloa
Posts: 208
Poder: 18
axesys Va por buen camino
Te recomiendo que investigues sobre tplex y tpyacc, son metacompiladores que te pueden tokenizar y calcular las expresiones de una cadena.

http://freecode.com/projects/dyacclex
Responder Con Cita
  #2  
Antiguo 28-05-2017
Juampi Juampi is offline
Miembro
NULL
 
Registrado: may 2017
Posts: 14
Poder: 0
Juampi Va por buen camino
Retomo el proyecto

@[AgustinOrtu]

Gracias por la aclaración, y dado lo que me dijiste ya guardé para leer más adelante "TCollection" en wiki.freepascal.org. Decidí inicialmente intentar hacer funcionar la calculadora con un máximo de números y una vez consiga ese objetivo parcial, después dar el paso a todos los números que el usuario quiera. Pienso que como comienzo e ir fijándome metas es razonable.

@axesys

Gracias, lo haré ni bien avance un poco más con el proyecto, que por ahora no he salido del botón +, je. En mi defensa aclarar que desde que abrí este hilo no debo haber pasado la media hora con el programa, no he tenido tiempo y acá estoy un Domingo, el único día "100% libre" que tengo, tratando de adelantar algo.

@todos

Les cuento lo que me tiene trancado ahora mismo, que estoy seguro que es una bobada importante pero no me estoy dando cuenta. Este es el código de mi botón +:

Cita:
{--- S U M A (+) ---}

procedure TForm1.btnSumaClick(Sender: TObject);

var i : integer;

begin
display.setFocus; {---"display" es el nombre que le puse a la caja de texto donde ingreso los números, le pongo el setFocus para que enseguida quede pronto para recibir más números---}
op[i] := '+'; {---ignoren esto por ahora---}
nros[i] := StrToInt(display.text); {---nros es el array donde guardo los números que va ingresando el usuario---}
log[i] := display.text; {---esto también lo pueden ignorar por el momento, tiene que ver con mi idea de dejar un log encima de la caja de texto con las operaciones que fueron ingresadas---}
lbLog.caption := log[i]; {---lbLog se llama el label donde voy a mostrar el log---}
i := i + 1 {---acumulo en i---};
end;
Les explico:
  • ¿Estamos de acuerdo que el bloque de código que les muestro se va a ejecutar tantas veces como veces apriete el botón +, no?
  • Si dejo la variable i sin inicializar el programa me da error, aparece un mensaje que si mal no recuerdo dice 'External: SIGSEGV', que por lo poco que googleé es un 'Access Violation' y entiendo que se debe a que aleatoriamente la variable i tomó un valor que queda por fuera del rango del array. ¿Esto es así?.
  • Si inicializo la variable antes del begin me da error al compilar, o sea, no funciona el programa ya de arranque, así que entiendo que eso no se hace, que no funciona de esa manera.
  • Y después del begin ni siquiera lo probé porque entiendo que cada vez que presione el botón le voy a asignar ese valor (cero en este caso, mi array va del 0 al 9) y nunca lo podría usar como acumulador que es lo que busco justamente.

Es muy probable que la solución a esto sea extremadamente sencilla, y si bien termino de escribir esto y me voy a seguir pensando como se haría, quería que supieran en qué estaba trancado y mi decisión de por el momento acotar el array a "x" cantidad de lugares y después profundizar en arrays dinámicos, TList, etc.

Gracias una vez más.
Responder Con Cita
  #3  
Antiguo 28-05-2017
Juampi Juampi is offline
Miembro
NULL
 
Registrado: may 2017
Posts: 14
Poder: 0
Juampi Va por buen camino
Quise editar y no pude

No dije nada, no dije nada, ya se me iluminó la lamparita con lo que me tenía trancado, jeje. Quise editar el mensaje anterior pero ya habían pasado 25 minutos.

Saludos
Responder Con Cita
  #4  
Antiguo 22-07-2017
Juampi Juampi is offline
Miembro
NULL
 
Registrado: may 2017
Posts: 14
Poder: 0
Juampi Va por buen camino
I'm back!

Buenas, no me conectaba desde el 29/5, hacía rato no me daba una vuelta por aquí. Por distintos motivos la calculadora la dejé en stand by pero esta semana la retomé y les quería pedir una mano porque estoy trancado.

Lo que me pasa es lo siguiente, hago múltiples operaciones y me dan todas ok hasta que hago la siguiente combinación:

5 + 5 - 1 x 2 / 2.

Que de forma correcta (igual que la calculadora de Windows que es la que quiero emular, jeje) me da 9.

5 + 5 = 10
10 - 1 = 9
9 x 2 = 18
18 / 2 = 9

Pero la siguiente operación que hago después de esa secuencia me da mal. Ejemplo hago 5 x 5 y me da 24, 5 + 5 me da 9, 6 x 6 me da 35, 9 x 9 me da 80. Si, como podrán ver, me da uno menos del resultado correcto. Viendo eso sería sencillo identificar el problema pero no me doy cuenta que puede estar mal. Si teóricamente después de apretar el botón = vuelvo todo a cero, sería como cerrar y volver a ejecutar la calculadora (aunque evidentemente no lo es).

Es más, por las dudas también aprieto el botón C que lo que hace es "poner todo en cero", y nada, hasta que no cierre la calculadora seguirá dando un número menos.

Probando hice otra operación, en este caso 5 + 10 - 2 x 2 / 2 = 13 (correcto). Todo lo que hago luego de eso me da DOS números menos que lo correcto. Ejemplo 5 x 5 me da 23.

Les dejo lo que yo entiendo que necesitarían ver de este código para que puedan decirme donde la estoy macaneando y un link al .exe de la calculadora (no se rían, está en fase ultra beta, jaja).

Les dejo la declaración de variables, el form on create, el botón igual, el botón +, el botón C y un número, en este caso el 1.

Cita:
private
{ private declarations }
public
{ public declarations }
var res, ultNro: integer;
nros: array [0..9] of integer;
op: array [0..9] of string;
nro: string;
sobreescribo, borroLog : boolean;

end;

____________________________________________________________________________________________________ ________________________________________________________

{ TForm1 }

{--- FORM ON CREATE ---}

procedure TForm1.FormCreate(Sender: TObject);
begin
ultNro := 0;
sobreescribo := false;
borroLog := false;
end;

____________________________________________________________________________________________________ ________________________________________________________

{--- BOTÓN IGUAL (=) ---}

procedure TForm1.btnIgualClick(Sender: TObject);

var i: integer;

begin

i := 0;

if display.text = '' then
begin
display.text := '0'
end;

nros[ultNro] := StrToInt(display.text);

if lbLog.caption = '' then
begin
display.text := IntToStr(nros[ultNro]);
display.setFocus;
end;

for i := 0 to ultNro do
begin

{S U M A (+)}
if op[i] = '+' then
begin
if i = 0 then
begin
res := nros[i] + nros[i + 1];
end

else
begin
res := res + nros[i + 1];
end
end

{R E S T A (-)}

else if op[i] = '-' then
begin
if i = 0 then
begin
res := nros[i] - nros[i + 1];
end

else
begin
res := res - nros[i + 1];
end
end

{M U L T I P L I C A C I Ó N (X)}

else if op[i] = 'X' then
begin
if i = 0 then
begin
res := nros[i] * nros[i + 1];
end

else
begin
res := res * nros[i + 1];
end
end

{D I V I S I Ó N (/)}

else if op[i] = '/' then
begin
if i = 0 then
begin
res := nros[i] DIV nros[i + 1];
end

else if nros[i] = 0 then
begin
display.text := 'No se puede dividir entre 0';
display.setFocus();
btnPercentage.enabled := false;
button16.enabled := false;
button17.enabled := false;
button1.enabled := false;
button2.enabled := false;
btnComa.enabled := false;
btnSuma.enabled := false;
btnResta.enabled := false;
btnMultiplicacion.enabled := false;
btnDivision.enabled := false;
ultNro := 0;
end

else

begin
res := res DIV nros[i + 1];
end
end

else
begin
res := res;
end
end;

lbLog.caption := '';
display.text := IntToStr(res);
sobreescribo := true;
borroLog := true;
ultNro := 0;

end;

____________________________________________________________________________________________________ ________________________________________________________

{--- BOTÓN SUMA (+) ---}

procedure TForm1.btnSumaClick(Sender: TObject);

begin

if display.text = '' then
begin
display.text := '0'
end;

display.setFocus;

nros[ultNro] := StrToInt(display.text);
op[ultNro] := '+';

if lbLog.caption = '' then
begin
lbLog.caption := IntToStr(nros[ultNro]) + op[ultNro];
end

else
begin
lbLog.caption := lbLog.caption + IntToStr(nros[ultNro]) + op[ultNro];
end;

ultNro := ultNro + 1;
sobreescribo := true;

end;

____________________________________________________________________________________________________ ________________________________________________________

{--- BOTÓN BORRAR TODO (C) ---}

procedure TForm1.btnCClick(Sender: TObject);
begin
btnPercentage.enabled := true;
button16.enabled := true;
button17.enabled := true;
button1.enabled := true;
button2.enabled := true;
btnComa.enabled := true;
btnSuma.enabled := true;
btnResta.enabled := true;
btnMultiplicacion.enabled := true;
btnDivision.enabled := true;
display.text := '0';
display.setFocus;
lbLog.caption := '';
ultNro := 0;
sobreescribo := false;
end;

____________________________________________________________________________________________________ ________________________________________________________

{--- BOTÓN UNO (1) ---}

procedure TForm1.btn1Click(Sender: TObject);
begin

if borroLog then
begin
lbLog.caption := '';
end;

if (sobreescribo) or (display.text = '0') or (display.text = '') then
begin
display.text := '1';
end

else
begin
nro := display.text;
display.text := '1';
display.text := nro + display.text;
end;

sobreescribo := false;
borroLog := false;

end;
Aquí el link para descargar el .exe

drive.google.com/open?id=0B2s4ogym-XembWY5Vl8tV2tBcEE

Si les sirve más el proyecto completo les dejo el link para descargar el rar.

Aclaraciones:

*Por el momento funciona solo haciendo click con el mouse, ya aprenderé como hacer para que los botones del teclado accionen (con animación incluida es mi idea, no sé si es posible) los botones de la calculadora.

*Los únicos botones que andan son los números, los signos de +, -, X, /, el de borrar todo (C), el = y el de borrar de a uno (<).

Desde ya muchas gracias.
Responder Con Cita
  #5  
Antiguo 22-07-2017
Juampi Juampi is offline
Miembro
NULL
 
Registrado: may 2017
Posts: 14
Poder: 0
Juampi Va por buen camino
Never mind (?)

Creo haberme dado cuenta del problema, olvídense, cualquier cosa los vuelvo a molestar.

Gracias
Responder Con Cita
  #6  
Antiguo 23-07-2017
Juampi Juampi is offline
Miembro
NULL
 
Registrado: may 2017
Posts: 14
Poder: 0
Juampi Va por buen camino
KeyDown

Bueno, esta vez si me tranqué de verdad...

La calculadora ya funciona de forma correcta en lo que tiene que ver con hacer operaciones, pero ahora quiero poder ingresar los números por teclado también, y entiendo que tengo que manejar el evento KeyDown, pero no hay caso, no lo puedo hacer funcionar.

Vi algunos ejemplos en internet e intenté replicarlos pero no hubo caso. Lo que tengo es lo siguiente:

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

begin
if key = 49 then
begin
btn1.Click;
end;
end;
Es el evento KeyDown del Form1 (¿tendría que hacerlo en el TEdit en vez del Form?, yo elegí el form porque es lo que siempre tiene el foco, pero lo cierto es que no tengo claro el manejo de eventos), y la idea es que dispare el evento click del botón correspondiente. En ese código lo que quise hacer es que la tecla 1 ejecute el evento click del botón 1 de la calculadora.

Variantes probé varias, probé if key = #49, if (key = #49), if key in [49], if key in [#49] y varias más que ahora no recuerdo, algunas dieron error y otras compilaron bien pero ninguna funcionó. Claramente estoy haciendo algo mal.

Gracias por su ayuda.

P.D.: Por si a alguien le interesa, acá el link del ejecutable actual de la calculadora drive.google.com/open?id=0B2s4ogym-XemRUNPbzhtaWcxbEE
Responder Con Cita
  #7  
Antiguo 23-07-2017
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Proba seteando la propiedad KeyPreview del Form a True
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Opinión sobre la estabilidad actual de Lazarus/Free Pascal Toni Lazarus, FreePascal, Kylix, etc. 34 06-02-2016 01:04:45
Soy desarrollador de Delphi ¿Que necesito saber para usar Lazarus? Godzuki Linux 7 23-02-2012 23:54:34
Lazarus, Nemesis Pascal rmendoza83 Varios 1 08-01-2009 17:41:08
Indy soporta Free Pascal/Lazarus Delfino Noticias 6 15-01-2006 10:55:55
Free Pascal y Lazarus Magician^ Noticias 7 31-03-2004 19:12:04


La franja horaria es GMT +2. Ahora son las 12:03:41.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi