Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Calculadora (https://www.clubdelphi.com/foros/showthread.php?t=43522)

sebaguillen 14-05-2007 03:09:32

Calculadora
 
Hola gente como va? bueno les cuento que estoy haciendo una calculadora en delphi, esta funciona bien para numeros enteros, pero tengo un problema para que me realice las operaciones con reales... estoy usando la funcion float para transformarlo de string a extended pero cuando lo quiero ejecutar me da un error y no me deja continuar... como debo hacer?
desde ya gracias...

droguerman 14-05-2007 04:12:03

intenta con strToFloat o strToFloatDef

Delphius 14-05-2007 05:30:16

Hola, bienvenido al foro. Aparte de lo que comenta droguerman, sería mejor que nos indique el error y que expongas tu código. De esta manera te podemos ayudar mejor en tu problema.

Como recién ingresas a los fotos, te sugiero que dediques unos minutos para leer la guia de estilo: unas pequeñas y sanas normas de convivencia.

Saludos,

PD: Lo de las normas no lo digo por el hecho de que hayas violado alguna. Sólo lo expongo para que lo tengas en cuenta.

sebaguillen 14-05-2007 20:40:33

Calculadora
 
Hola Delphius, antes que nada gracias por los consejos. Bueno el error me aparece cuando en tiempo de ejecucuion ingreso un numero real y posteriormente aprieto cualquiera de las operaciones que tengo, basicamente me dice que ese valor que ingrese al principio no es valido... Te dejo el codigo de los procedimientos y desde ya gracias.... Saludos.

Código Delphi [-]
unit UCalculadora;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
    Edicion: TEdit;
    B7: TButton;
    B4: TButton;
    B1: TButton;
    BProducto: TButton;
    B8: TButton;
    B5: TButton;
    B2: TButton;
    BResta: TButton;
    B9: TButton;
    B6: TButton;
    B3: TButton;
    BSuma: TButton;
    B0: TButton;
    BPunto: TButton;
    BDivision: TButton;
    BIgual: TButton;
    Button1: TButton;
    BCE: TButton;
    procedure B7Click(Sender: TObject);
    procedure B8Click(Sender: TObject);
    procedure B9Click(Sender: TObject);
    procedure B4Click(Sender: TObject);
    procedure B5Click(Sender: TObject);
    procedure B6Click(Sender: TObject);
    procedure B1Click(Sender: TObject);
    procedure B2Click(Sender: TObject);
    procedure B3Click(Sender: TObject);
    procedure B0Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure EdicionKeyPress(Sender: TObject; var Key: Char);
    procedure BSumaClick(Sender: TObject);
    procedure BIgualClick(Sender: TObject);
    procedure BRestaClick(Sender: TObject);
    procedure BProductoClick(Sender: TObject);
    procedure BDivisionClick(Sender: TObject);
    procedure BCEClick(Sender: TObject);
    procedure BPuntoClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
  f,b: integer;
  i: extended;
implementation
{$R *.dfm}
procedure TForm1.B7Click(Sender: TObject);
begin
    f:=0;
    if Edicion.Text= '0' then
      Edicion.Text:= B7.Caption
    else
      Edicion.Text:= Edicion.Text + B7.Caption;
end;
procedure TForm1.B8Click(Sender: TObject);
begin
    if Edicion.Text= '0' then
      Edicion.Text:= B8.Caption
    else
      Edicion.Text:= Edicion.Text + B8.Caption;
end;
procedure TForm1.B9Click(Sender: TObject);
begin
    if Edicion.Text= '0' then
      Edicion.Text:= B9.Caption
    else
      Edicion.Text:= Edicion.Text + B9.Caption;
end;
procedure TForm1.B4Click(Sender: TObject);
begin
    if Edicion.Text= '0' then
      Edicion.Text:= B4.Caption
    else
      Edicion.Text:= Edicion.Text + B4.Caption;
end;
procedure TForm1.B5Click(Sender: TObject);
begin
    if Edicion.Text= '0' then
      Edicion.Text:= B5.Caption
    else
      Edicion.Text:= Edicion.Text + B5.Caption;
end;
procedure TForm1.B6Click(Sender: TObject);
begin
    if Edicion.Text= '0' then
      Edicion.Text:= B6.Caption
    else
      Edicion.Text:= Edicion.Text + B6.Caption;
end;
procedure TForm1.B1Click(Sender: TObject);
begin
    if Edicion.Text= '0' then
      Edicion.Text:= B1.Caption
    else
      Edicion.Text:= Edicion.Text + B1.Caption;
end;
procedure TForm1.B2Click(Sender: TObject);
begin
    if Edicion.Text= '0' then
      Edicion.Text:= B2.Caption
    else
      Edicion.Text:= Edicion.Text + B2.Caption;
end;
procedure TForm1.B3Click(Sender: TObject);
begin
    if Edicion.Text= '0' then
      Edicion.Text:= B3.Caption
    else
      Edicion.Text:= Edicion.Text + B3.Caption;
end;
procedure TForm1.B0Click(Sender: TObject);
begin
      if Edicion.Text <> '0' then
        Edicion.Text:= Edicion.Text + B0.Caption;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
    close;
end;
procedure TForm1.EdicionKeyPress(Sender: TObject; var Key: Char);
begin
    if not (key in ['0'..'9']) then
      key:= #0;
end;
procedure TForm1.BSumaClick(Sender: TObject);
begin
    i:= strtofloat (Edicion.Text);
    Edicion.Text:= '';
    f:=0;
    b:=0;
end;
procedure TForm1.BIgualClick(Sender: TObject);
var
  x: extended;
begin
    if b= 0 then
    begin
    if f=0 then
      begin
      x:= i + strtofloat (Edicion.Text);
      Edicion.Text:= floattostr (x);
      end
    else
      if f=1 then
        begin
        x:= i - strtofloat(Edicion.Text);
        Edicion.Text:= floattostr (x);
        end
      else
        if f=2 then
          begin
          x:= i * strtofloat (Edicion.Text);
          Edicion.Text:= floattostr (x);
          end
        else
          begin
          if Edicion.Text= '0' then
            begin
            showmessage ('No se puede dividir por 0');
            Edicion.Text:= '0';
            end
          else
            begin
            //x:= i div strtofloat (Edicion.Text);
            //Edicion.Text:= inttostr (x);
            end;
          end;
      b:=1;
      end;
end;
procedure TForm1.BRestaClick(Sender: TObject);
begin
    i:= strtofloat (Edicion.Text);
    Edicion.Text:= '';
    f:=1;
    b:=0;
end;
procedure TForm1.BProductoClick(Sender: TObject);
begin
    i:= strtofloat (Edicion.Text);
    Edicion.Text:= '';
    f:=2;
    b:=0;
end;
procedure TForm1.BDivisionClick(Sender: TObject);
begin
    i:= strtofloat (Edicion.Text);
    Edicion.Text:= '';
    f:=3;
    b:=0;
end;
procedure TForm1.BCEClick(Sender: TObject);
begin
    Edicion.Text:= '0';
end;

procedure TForm1.BPuntoClick(Sender: TObject);
begin
    if Edicion.Text = '' then
      Edicion.Text:= '0.'
    else
      Edicion.Text:= Edicion.Text + '.';

end;
end.

Delphius 14-05-2007 21:45:38

sebaguillen, de lo que estuve viendo, el error se debe a el punto:

Código Delphi [-]
procedure TForm1.BPuntoClick(Sender: TObject);
begin
    if Edicion.Text = '' then
      Edicion.Text:= '0.'
    else
      Edicion.Text:= Edicion.Text + '.';

Lo cambié por coma y listo:

Código Delphi [-]
procedure TForm1.BPuntoClick(Sender: TObject);
begin
    if Edicion.Text = '' then
      Edicion.Text:= '0,'
    else
      Edicion.Text:= Edicion.Text + ',';

Esto se debe a la configuración regional. No me acuerdo cual es la función que permite cambiar esta configuración... se que se ha hablado en los foros sobre esta función (o API).... la verdad no me la acuerdo...

Ahora, te aconsejaría que el código en el botón igual lo mejores. Creo que sería mejor esto:

Código Delphi [-]
case f of:
1: sentencias....
2: sentencias....
3: sentencias....
else 
end;

También se puede reutilizar los eventos Click de los botones. Empleando la proiedad tag:

Código Delphi [-]
procedure TForm1.B1Click(Sender: TObject);
begin
  Edicion.Text := IntToStr((Sender as TButton).Tag);
end;

De modo que pones en el tag el número (para el B1 es 1, etc). Y haces que todos los botones compartan el mismo evento.

Espero que se entienda.
Si tienes mayores dudas avisa.

Saludos,

sebaguillen 16-05-2007 23:00:03

Calculadora
 
Hola Delphius te cuento que ya resolvi mi principal problema asi que gracias... Ahora de las recomendaciones que me diste, la ultima no la entendi del todo... que tengo que poner ese codigo en todos los botones?. Otra consulta como tengo que hacer para que tambien pueda escribir por teclado tanto los numeros como las operaciones? Te cuento que yo use el evento 'on key press' pidiendo que escuche solamente los numeros, pero esto funciona solamente cuando el cursor esta en el cuadro de edicion...Como podria hacer? Desde ya muchas gracias...

Delphius 17-05-2007 05:15:59

sebaguillen, con respecto a la última recomendación te la explico mejor.
Como el dódigo de los botones que corresponden a los números es el mismo, ya que en definitiva, lo único que se cambia es el caption que se pasa, yo me valgo de una de las ventajas que tiene Delphi: los eventos compartidos.
¿Que significa esto? Que varios controles pueden hacer uso del mismo evento.

Pones este código en evento onClick del botón 0:

Código Delphi [-]
procedure TForm1.B0Click(Sender: TObject);
begin
  Edicion.Text := IntToStr((Sender as TButton).Tag);
end;

Te explico: El parámetro sender es del tipo TObjet y representa al objeto que envia la orden. Con la orden (Sender as TButton) restringo el tipo de dato y me aseguro de que el objeto sea del tipo TButton.
La propiedad Tag es una propiedad comodín que se le incorpora a los controles y no tiene uso definido... se puede usar para lo que quieras. Valiendome de que es tipo integer, almaceno en ésta el valor del botón. Es decir que para el botón 1, el valor del tag será 1.

Al decir (Sender as TButton).Tag lo que hago es obtener el Tag si el objeto que envia la orden es un botón Y devuelvo dicho valor en el TEdit.

Como verás, en ninguna parte del código pregunto si el botón es el botón 1, 5 o 0... o cualquiera. La magia está en el Tag y el compartir dicho botón. Ya te sigo comentando... esta magia...

Ahora, para cada botón (desde el 1 al 9) haz lo siguiente:
1. Seleccionalo.
2. En el inspector de propiedades busca el evento OnClick. Haz click en la fecha del combo. Te aparecerá en la lista el evento ButtonoClick. Seleccionalo.

Esto, que hiciste, es asignar un evento compartido.

Entonces, la magia consiste ahora en que cuando se pulse cualquier botón (del 0 al 9) se aplique un solo evento. Por ejemplo: se pulsa en botón 5 (Button5). El parámetro sender contendrá el valor "Button5" como Button5 es del tipo TButton se extrae el valor del Tag, que le corresponde, es decir 5.

Es sencillo... y como verás... puede ser muy util.

Con respecto a lo segundo: Si deseas que se escriba en el Edit sin tener el foco en él y que se reciba la orden desde el teclado... debes hacer lo siguiente:
1. Poner la propiedad KeyPreviuw del formulario en true.
2. En el evento onKeyPress del formulario pones el código necesario para que el Edit copie dicho valor.

Espero que se entienda.
Saludos,

PD: Si tienes más dudas, ya sabes...
PD2: Me alegro que hayas solucionado el problema.

sebaguillen 19-06-2007 22:11:09

Calculadora
 
hola gente como va? bueno les cuento que pude resolver mi problema gracias a delphius... lo que me estaria quedando es el tema de la conversion de sistemas de numeros, es decir, de decimal a binario, etc. para ello lo que nose es el comando que debo utilizar para sacar el valor absoluto de un numero... desde ya muchas gracias

Delphius 20-06-2007 06:12:36

Hola sebaguillen,
¡Tanto tiempo!

Me alegro que hayas resuelto el problema.
Para obtener el valor absoluto debes emplear la función Abs().

Para hacer las conversiones ve a la ayuda de Delphi. Allí busca por Type conversion routines y numeric formatting routines. Encontrarás las funciones que necesitas: tanto para binario y hexadecimal.

Saludos,

sebaguillen 19-07-2007 20:38:00

Hacer una barra de menu y herramientas
 
Hola como estan? bueno estoy haciendo un sistema de control de Stock y habia pensado en hacer una barra de menu desplegable comun como la de word o cualquier otro programa (archivo, edicion, etc.) se que existe un boton para hacer esto pero la verdad es que no lo encuentro:D como tengo que hacer?... Desde ya muchas gracias

P/D: En el caso de que quiera hacer un login para que los usuarios se identifiquen, existe algun metodo de encriptacion predeterminado?

eduarcol 19-07-2007 20:48:09

Pues son dos preguntas deberias abrir un hilo para cada una de ellas

Con el menu: utiliza el componente TMenu

Con el asunto de la encriptacion hay algoritmos distintos, deberas elegir segun tus necesidades

sebaguillen 23-07-2007 15:14:37

Menu desplegable
 
Hola como estan? primero que nada gracias eduarcol a resolver mi problema... lo que no pregunte es como hacer los enlaces entre dos formularios ya teniendo el menu listo... Me hago entender?:D supongamos que estoy en el menu principal y me voy a inicio => guardar (por ej.) y me aparece otro form... desde ya gracias

eduarcol 23-07-2007 17:26:52

en el uses de la unidad principal haces referencia a la segunda, y luego cuando quieras llamarlo si no esta creado lo creas y por ultimo

Form2.Show;

sebaguillen 26-07-2007 04:24:16

Menu desplegable
 
Muchas gracias por la ayuda!... Otra consulta como hago para volver desde el formulario 2 al principal? ya que trate con el mismo metodo y no me da resultados..Lo que tambien note es que se abre una ventana independiente para cada formulario que tenga... hay alguna manera (aparte de aliniarlos manualmente) de que parezca una sola ventana??... Desde ya muchas gracias

axesys 26-07-2007 07:17:07

Quizas deberias investigar como hacer Aplicaciones MDI

Delphius 26-07-2007 19:22:47

sebaguillen, tus preguntas no están ubicadas en el contexto del tema inicial del hilo. Por favor... primero fijate si tus dudas no fueron tratadas en el foro y luego inicia (si es que no fue tratado) un hilo nuevo para tratar tu duda.

No soy moderador... pero creo que lo que estás pidiendo no cumple, ni hace a los contenidos de este hilo.

No lo tomes a mal, se que recién estás iniciandote en estos foros, pero en la guia de estilo se ha dejado en claro que un tema que no tiene relación con un hilo debe ser tratado en otro.

Saludos,

sebaguillen 28-08-2007 15:22:35

Gracias por el consejo
 
Hola antes que nada doy las gracias por la ayuda otorgada y sepan que pude solucionar mi problema asi que gracias!! Ahora Delphius tenes razon, gracias por el consejo y perdon...

jhonny 28-08-2007 15:27:23

Cita:

Empezado por sebaguillen (Mensaje 226519)
Hola antes que nada doy las gracias por la ayuda otorgada y sepan que pude solucionar mi problema asi que gracias!! Ahora Delphius tenes razon, gracias por el consejo y perdon...

Bueno, otra cosa :), si ya solucionaste el problema pues sería bueno que digas "De que manera lo hiciste", pues en un futuro abran personas con el mismo problema y podran arreglar el asunto de la misma manera que tu lo haz hecho ;).


La franja horaria es GMT +2. Ahora son las 14:27:11.

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