Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Sumar y multiplicar varios edit automaticamente (https://www.clubdelphi.com/foros/showthread.php?t=92591)

The Cid James 05-12-2017 07:38:39

Sumar y multiplicar varios edit automaticamente
 
Buenas gente, tengo el siguiente problema tengo un form con varios edit estos representan un valor especifico, para ser mas claro el de una moneda por ejemplo billete 1 dolar, 5 dolares, 10 dolares, etc...

Quisiera hacer que al editar el valor de los edit vaya multiplicando y sumando el total

Ejemplo ingreso en el edit1 la cantidad de 10 (cada uno de un dolar) en el edit2 un ejemplo ingreso 5 (de 5 dolares) en estos datos ingresados multiplicar por su valor fijo automáticamente en código para un botón seria algo así como

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject); 
Var  n1,n2,suma: Integer;
 begin   
n1:=strtoint(Edit1.text);   
n2:=strtoint(Edit2.text);  
 suma:= (n1*1) +(n2*5);  
 tedit3:text = inttostr(suma);
 end;

ElKurgan 05-12-2017 08:25:00

Si lo he entendido bien, quieres que se sumen sin necesidad de pulsar un botón, ¿correcto?

En ese caso, podrías capturar el evento "OnExit" de cada campo de edición y poner el mismo código que para el botón. Incluso se podría capturar el evento OnChange.

Eso si, los dos botones tendrían que compartir el código, llamándolo (por ejemplo) "CambiarDatos"

Saludos

ecfisa 05-12-2017 08:26:26

Hola.

¿ Te sirve algo así ?
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  amount: Integer;
begin
  amount := StrToIntDef(Edit1.Text, 0) +      //  1 u$S
            StrToIntDef(Edit2.Text, 0) *  5 + //  5 u$s
            StrToIntDef(Edit3.Text, 0) * 10 + // 10 u$s
            StrToIntDef(Edit4.Text, 0) * 20 + // 20 u$s
            ...
end;

Saludos :)

The Cid James 05-12-2017 09:07:18

Cita:

Empezado por ElKurgan (Mensaje 523115)
Si lo he entendido bien, quieres que se sumen sin necesidad de pulsar un botón, ¿correcto?

En ese caso, podrías capturar el evento "OnExit" de cada campo de edición y poner el mismo código que para el botón. Incluso se podría capturar el evento OnChange.

Eso si, los dos botones tendrían que compartir el código, llamándolo (por ejemplo) "CambiarDatos"

Saludos

Si estuve probando con el onchange pero siempre trabaje con botones en lo que llevo aprendido por lo que se me complica hacer algo que ejecute lo mismo en muchos edits al mismo tiempo. Un procedimiento tal vez?:confused:
Con los "dos botones" te referis a los edit? la idea es hacerlo sin botones

Cita:

Empezado por ecfisa (Mensaje 523116)
Hola.

¿ Te sirve algo así ?
Código Delphi [-]procedure TForm1.Button1Click(Sender: TObject); var amount: Integer; begin amount := StrToIntDef(Edit1.Text, 0) + // 1 u$S StrToIntDef(Edit2.Text, 0) * 5 + // 5 u$s StrToIntDef(Edit3.Text, 0) * 10 + // 10 u$s StrToIntDef(Edit4.Text, 0) * 20 + // 20 u$s ... end;


Saludos :)

Claro algo asi pero que cambie cuando vaya editando el edit no en boton

ecfisa 05-12-2017 14:51:47

Hola.
Cita:

Empezado por The Cid James (Mensaje 523118)
...
Claro algo asi pero que cambie cuando vaya editando el edit no en boton

Entonces sólo debes situar el mismo código en el evento OnChange de todos los Edits, por ejemplo:
Código Delphi [-]
...
(* Asigno los eventos en tiempo de ejecución para clarificar el ejemplo,
    pero te resultará mas simple hacerlo en tiempo de diseño *)
procedure TForm1.FormCreate(Sender: TObject);
begin
  Edit1.OnChange := EditsChange;
  Edit2.OnChange := EditsChange;
  Edit3.OnChange := EditsChange;
  Edit4.OnChange := EditsChange;
  //...
end;

procedure TForm1.EditsChange(Sender: TObject);
var
  amount: Integer;
begin
  amount := StrToIntDef(Edit1.Text, 0) +      //  1 u$S
            StrToIntDef(Edit2.Text, 0) *  5 + //  5 u$s
            StrToIntDef(Edit3.Text, 0) * 10 + // 10 u$s
            StrToIntDef(Edit4.Text, 0) * 20; // + // 20 u$s
            //...
  Self.Caption := IntToStr(amount);
end;

Saludos :)

The Cid James 06-12-2017 04:25:21

Si entiendo bien creo en procedimiento edits onechanges, por ejemplo, y en el formcreate y lo asigno al onchange de cada edit para que se ejecuten?
No comprendo del todo a que te referís con asignarlos a tiempo de ejecución para el ejemplo (se lo que significa esto ultimo)

Gracias y saludos

ecfisa 06-12-2017 19:03:36

Cita:

Empezado por The Cid James (Mensaje 523157)
Si entiendo bien creo en procedimiento edits onechanges, por ejemplo, y en el formcreate y lo asigno al onchange de cada edit para que se ejecuten?
No comprendo del todo a que te referís con asignarlos a tiempo de ejecución para el ejemplo (se lo que significa esto ultimo)

En tiempo de ejecución significa que los eventos se asignan cuando se ejecuta el programa, es mas simple hacerlo en tiempo de diseño, pero me resulta mas confuso de explicar en un mensaje.

En tiempo de diseño, seleccionas todos los Edits (Ctrl+Left_Click) y luego generas el evento OnChange desde el Object Inspector para todos ellos.

Saludos :)

ecfisa 06-12-2017 19:08:36

1 Archivos Adjunto(s)
Hola de nuevo.

Confeccione el ejemplo y te adjunto el código fuente para que lo evalues. (evento asignado en diseño)


Saludos :)

Milworm99 06-12-2017 21:04:58

Cita:

Empezado por ecfisa (Mensaje 523164)
Hola de nuevo.

Confeccione el ejemplo y te adjunto el código fuente para que lo evalues. (evento asignado en diseño)


Saludos :)

Y si quiere sumar o multiplicar en números decimales, como seria el código ?

ecfisa 06-12-2017 23:51:48

Hola.
Cita:

Empezado por Milworm99 (Mensaje 523170)
Y si quiere sumar o multiplicar en números decimales, como seria el código ?

Puede usar la función StrToFloatDef y cambiar la operación aritmética por la que desee.

Saludos :)

The Cid James 07-12-2017 01:11:21

seria algo asi?

Código Delphi [-]
StrTofloatDef(Edit4.Text, 0) * 20

Ahora me quedo una duda... se puede trabajar con decimales en el tipo integer?

ecfisa 07-12-2017 01:21:02

Cita:

Empezado por The Cid James (Mensaje 523180)
seria algo asi?

Código Delphi [-]
StrTofloatDef(Edit4.Text, 0) * 20

Ahora me quedo una duda... se puede trabajar con decimales en el tipo integer?

No, el compilador daría error de compatibilidad de tipos.

Por el contrario, no hay inconveniente en asignar un valor entero a una variable de tipo flotante.

Saludos :)

The Cid James 07-12-2017 01:30:14

uff a cambiar los tipos de la tabla para poder cambiar eso ya que puse el ejemplo solo enteros, pero tambien estoy usando monedas, ahora entiendo porque no me deja copilarlo, entonces la variable amount en el ejemplo que me pasaste tambien tendria que ser flotante?

Saludos

Edit :

Asi funciona bien con decimales :D

Código Delphi [-]
procedure TFcaja.EditsChange(Sender: TObject);
var
  amount: Currency;
begin
  amount := StrToFloatDef (E1.Text, 0) * 0.1 +   //  1 u$S
            StrToFloatDef(E5.Text, 0) *  5 + //  5 u$s
            StrToFloatDef(E10.Text, 0) * 10+ // 10 u$s
            StrToFloatDef(E2 .Text, 0) * 20 ;// + // 20 u$s
            //...
  EACtotal.Text:= FloatToStr (amount);
end;

ecfisa 07-12-2017 01:46:52

Hola.

Si vas a trabajar con monedas el tipo Currency es el indicado.

Saludos :)

Milworm99 07-12-2017 17:37:17

Cita:

Empezado por ecfisa (Mensaje 523187)
Hola.

Si vas a trabajar con monedas el tipo Currency es el indicado.

Saludos :)

Y como se hace para el redondeo del resultado en decimales ?

Milworm99 07-12-2017 18:04:00

Se trabajaría con este codigo ?

Código:

FormatFloat('0.0',amount);

The Cid James 07-12-2017 18:32:32

Aca encontre lo que necesitas

https://www.clubdelphi.com/foros/showthread.php?t=40785

Saludos

Milworm99 18-12-2017 02:06:26

Cita:

Empezado por The Cid James (Mensaje 523212)
Aca encontre lo que necesitas

https://www.clubdelphi.com/foros/showthread.php?t=40785

Saludos

Código:

function Redondearagag(Valor:Real; Decimal:Integer):Real;
begin
  result := StrToFloat(FloatToStrF(StrToFloat(FloatToStr(Valor)), ffFixed, 18, Decimal));
end;

Como puedo utilizar esa funcion para redondear ?
Lo que yo quiero es que si el resultado es
7.55 lo redondee a 7.60

ecfisa 18-12-2017 13:24:48

Hola.
Cita:

Empezado por Milworm99 (Mensaje 523538)
...
Lo que yo quiero es que si el resultado es
7.55 lo redondee a 7.60

La función anterior lo hace, solo debes llamarla pasándo el valor 1 al parámetro Decimal.

Te agrego dos opciones diferentes:
Código Delphi [-]
uses Math;

function Redondear(const Value: Double; const Digit: Integer): Double;
begin
  SetRoundMode(rmUp);
  Result := RoundTo(Value, - Digit);
end;


Código Delphi [-]
function Redondear(const Numero: Double; const Digitos: Integer): Double;
var
  m: Double;
begin
  m:= Exp(Ln(10) * Digitos);
  Result:= Round(Numero * m + 5 / m) / m;
end;

Un ejemplo de uso para ambos casos:
Código Delphi [-]
...
begin
  ShowMessageFmt('%8.2f', [ Redondear(7.55, 1) ]);

Saludos :)

Milworm99 18-12-2017 17:10:06

Cita:

Empezado por ecfisa (Mensaje 523555)
Hola.

La función anterior lo hace, solo debes llamarla pasándo el valor 1 al parámetro Decimal.

Funciona perfectamente, pero en este caso como lo haría para que el resultado me lo muestre en un edit automáticamente sin ningún botón ?


La franja horaria es GMT +2. Ahora son las 02:12:14.

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