Foros Club Delphi

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

chelo_lpa 26-02-2012 20:05:06

ayuda con calculadora
 
mi idea es hacer una calculadora que me sirva para el negocio. pero me estoy volviendo loco. les muestro como es la idea de la calculadora
(k18.kn3.net/D7130472A.png) esa es la imagen de la calculadora. si me pueden ir ayudando.
donde calcula precio por cantidad, y siempre va poniendos los resultados en el total de abajo
los edit de la izquierda se les ingresa enteros o flotantes, en cambio los del medio solo enteros, y a la derecha van los subtotales. pero a la hora de programar las tareas me estoy volviendo loco, no se ni por donde empezar
la idea es qe no se use el mouse, todo con el teclado. (Escape se encarga de limpiar y volver la calculadora al principio)
y cada vez qe se ingrea un numero va cambiando los subtotales y por supuesto, un cambio en un subtotal cmabia el total. espero respuestas gracias

Delphius 26-02-2012 20:19:13

A ver tiro idea, y luego tu le das forma, chapa, pintura y quizá un cambio de aceite:

Código Delphi [-]
type
  TSubTotal = record
    Precio: currency;
    Cant: integer;
    SubTotal: currency;
  end;

  TVentas = array of TSubTotal;

var
  MisVentas: TVentas;

Código Delphi [-]
begin
  SetLength(MiVentas, 10);
  for i := Low(MisVentas) to High(MisVentas) do
  begin
    MisVentas[i].Precio := StrToCurr(FrameSubTotal.EditPrecio);
    MisVentas[i].Cant := StrToInt(FrameSubTotal.EditCant);
    MisVentas[i].SubTotal := MisVentas[i].Precio x MisVentas[i].Cant;
    FrameSubTotal.EditSubTotal := CurrToStr(MisVentas[i].SubTotal);
    Total := Total + MisVentas[i].SubTotal;
  end;
end;

En el ejemplo me baso en el uso de Frames. Básicamente el Frame contiene los edits para el precio, cantidad y subtotal. La aplicación crea tanto frames como se requiera.
En cuanto a la lógica es muy simple, dispongo de un arreglo dinámico y creo tantos registros subtotales como frames, les paso los datos y calculo.

Ahora te resta pulir y ver el modo de "actualizar" los cálculos antes algún cambio en algún frame... juega con los eventos.

Por otro lado, es muy fácil caer así sin nada sin siquiera al menos tirar una idea; es como pedir que te lo hagan. Pon de tu parte primero; PUNTUALIZA en tus propias dudas, que llevas hecho, o como lo estuviste al menos encarando, etc.

Saludos,

Caral 26-02-2012 20:23:59

Hola
Demasiado sencillo para ponerle interes.
Me parece que deberias complicarlo algo mas para que fuera interesante y poder aprender.
Por ejemplo:
1- tener los precios y la descripcion de los articulos en una BD
2- buscar el articulo y colocarlo en el primer edit. asi sucesivamente.
3- Calcular el monto fina.
Asi si merece la pena trabajar.
Por otro lado:
En cuanto al tema de sumas en edits hay mucha informacion en el foro.
Saludos

Delphius 26-02-2012 20:34:38

Cita:

Empezado por Caral (Mensaje 426203)
Hola
Demasiado sencillo para ponerle interes.
Me parece que deberias complicarlo algo mas para que fuera interesante y poder aprender.
Por ejemplo:
1- tener los precios y la descripcion de los articulos en una BD
2- buscar el articulo y colocarlo en el primer edit. asi sucesivamente.
3- Calcular el monto fina.
Asi si merece la pena trabajar.

Parecería ser que el ya cuenta en el negocio con una aplicación, sea propia o no, y busca algo que le ayude a sacar algunas cuentas que dicha aplicación no le hace.
O bien no tiene una base de datos, ni aplicación alguna y hace las cosas con la "libreta de almacenero" y quiere algo simple y rápido.

Saludos,

Caral 26-02-2012 20:42:26

Hola
Es que la idea es ponerlo dificil para aprender, si no, que gusto tiene :).
Saludos

chelo_lpa 26-02-2012 22:34:42

es qe solamente necesito algo para cuando hago una nueva venta. la idea es hacer una calculadora, pero facil de usar, para no tener qe anotar los subtotales, y despues sumarlos. solo qiuero la aplicacion qe sume es decir 2 cosas de $34, 123 cosas de $12.45 y 132 cosas de $1.30, y tener el total de la venta, y tmb los resultados parciales para mostrar ante cualquier duda. es simple. pero me tira errores por todos lados

Casimiro Notevi 26-02-2012 23:06:20

Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo?, gracias por tu colaboración.


No somos adivinos para saber los errores que te salen ;)

Caral 27-02-2012 02:18:13

Hola
Un realito adjunto.:)
Colocas el Precio y con solo cambiar el dato de la cantidad te cambia el subTotal y el Total.
Saludos
PD: Ahora te toca mejorarlo.:)

chelo_lpa 27-02-2012 06:50:43

Código:

unit Calculadora1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, RpDefine, RpRender, RpRenderPDF, Grids, Calendar, ExtCtrls, DBGrids,
  DB, DBTables, ComCtrls, StdCtrls, jpeg, OleCtrls, SHDocVw, IdBaseComponent,
  IdComponent, IdIPWatch;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Edit7: TEdit;
    Edit8: TEdit;
    Edit9: TEdit;
    Edit10: TEdit;
    Edit11: TEdit;
    Edit12: TEdit;
    Edit13: TEdit;
    Edit14: TEdit;
    Edit15: TEdit;
    Edit16: TEdit;
    Edit17: TEdit;
    Edit18: TEdit;
    Edit19: TEdit;
    Edit20: TEdit;
    Edit21: TEdit;
    Edit22: TEdit;
    Edit23: TEdit;
    Edit24: TEdit;
    Edit25: TEdit;
    Edit26: TEdit;
    Edit27: TEdit;
    Edit28: TEdit;
    Edit29: TEdit;
    Edit30: TEdit;
    Edit31: TEdit;
    Button1: TButton;
    Calculadora: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label1: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    Label15: TLabel;
    Label16: TLabel;
    Label17: TLabel;
    Label18: TLabel;
    Label19: TLabel;
    Label20: TLabel;
    Recordatorio: TMemo;
    DateTimePicker1: TDateTimePicker;
    Memo1: TMemo;
    Label21: TLabel;
    enREDados: TLabel;
    Label22: TLabel;
    Label23: TLabel;
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
    procedure Edit30Change(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure Edit2Change(Sender: TObject);
    procedure Edit3Change(Sender: TObject);
    procedure Edit6Change(Sender: TObject);
    procedure Edit7Change(Sender: TObject);
    procedure Edit9Change(Sender: TObject);
    procedure Edit12Change(Sender: TObject);
    procedure Edit14Change(Sender: TObject);
    procedure Edit15Change(Sender: TObject);
    procedure Edit17Change(Sender: TObject);
    procedure Edit19Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var

  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Edit12Change(Sender: TObject);
begin
    if((Edit11.Text <> ('')) and (Edit12.Text <> ('')))then
        Edit26.Text := IntToStr((StrToInt(Edit12.Text)*(StrToInt(Edit11.Text))))
    else
        Edit26.Text := IntToStr(0);
end;

procedure TForm1.Edit14Change(Sender: TObject);
begin
    if((Edit13.Text <> ('')) and (Edit14.Text <> ('')))then
        Edit27.Text := IntToStr((StrToInt(Edit13.Text)*(StrToInt(Edit14.Text))))
    else
        Edit27.Text := IntToStr(0);
end;

procedure TForm1.Edit15Change(Sender: TObject);
begin
    if((Edit15.Text <> ('')) and (Edit16.Text <> ('')))then
        Edit28.Text := IntToStr((StrToInt(Edit15.Text)*(StrToInt(Edit16.Text))))
    else
        Edit28.Text := IntToStr(0);
end;

procedure TForm1.Edit17Change(Sender: TObject);
begin
    if((Edit17.Text <> ('')) and (Edit18.Text <> ('')))then
        Edit29.Text := IntToStr((StrToInt(Edit17.Text)*(StrToInt(Edit18.Text))))
    else
        Edit29.Text := IntToStr(0);
end;

procedure TForm1.Edit19Change(Sender: TObject);
begin
    if((Edit19.Text <> ('')) and (Edit20.Text <> ('')))then
        Edit30.Text := IntToStr((StrToInt(Edit19.Text)*(StrToInt(Edit20.Text))))
    else
        Edit30.Text := IntToStr(0);
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if not ((Key in ['0'..'9'] )or (Key = #08)) then
    begin
      Key:= #0;
      Beep;
    end;

end;

procedure TForm1.Edit2Change(Sender: TObject);
begin
    if((Edit1.Text <> ('')) and (Edit2.Text <> ('')))then
        Edit21.Text := IntToStr((StrToInt(Edit2.Text)*(StrToInt(Edit1.Text))))
    else
        Edit21.Text := IntToStr(0);
end;

procedure TForm1.Edit30Change(Sender: TObject);
var
  a , I: integer;
begin
  a:=0;
  for I := 21 to 30 do
    if(((FindComponent('Edit' + IntToStr(i)) as TEdit).Text))<>('')then
        begin
            a:=a + (  StrToInt((FindComponent('Edit' + IntToStr(i)) as TEdit).Text));
        end
    else
        a:=a+0;
  Edit31.Text := IntToStr(a);
end;

procedure TForm1.Edit3Change(Sender: TObject);
begin
    if((Edit3.Text <> ('')) and (Edit4.Text <> ('')))then
        Edit22.Text := IntToStr((StrToInt(Edit3.Text)*(StrToInt(Edit4.Text))))
    else
        Edit22.Text := IntToStr(0);
end;

procedure TForm1.Edit6Change(Sender: TObject);
begin
    if((Edit5.Text <> ('')) and (Edit6.Text <> ('')))then
        Edit23.Text := IntToStr((StrToInt(Edit5.Text)*(StrToInt(Edit6.Text))))
    else
        Edit23.Text := IntToStr(0);

end;

procedure TForm1.Edit7Change(Sender: TObject);
begin
    if((Edit7.Text <> ('')) and (Edit8.Text <> ('')))then
        Edit24.Text := IntToStr((StrToInt(Edit7.Text)*(StrToInt(Edit8.Text))))
    else
        Edit24.Text := IntToStr(0);

end;

procedure TForm1.Edit9Change(Sender: TObject);
begin
    if((Edit9.Text <> ('')) and (Edit10.Text <> ('')))then
        Edit25.Text := IntToStr((StrToInt(Edit9.Text)*(StrToInt(Edit10.Text))))
    else
        Edit25.Text := IntToStr(0);

end;

procedure TForm1.FormActivate(Sender: TObject);
var
  i, a: Integer;
begin
 for i := 1 to 20 do
  begin
    if ((i mod 2)= 0) then
      begin
        (FindComponent('Edit' + IntToStr(i)) as TEdit).text := '1';
      end
    else
      begin
      (FindComponent('Edit' + IntToStr(i)) as TEdit).text := '0';
      end;
  end;
  for a := 21 to 30  do
  (FindComponent('Edit' + IntToStr(a)) as TEdit).text := '0';
end;





end.

asi me qedo el codigo. anda todo de diez hace lo que quiero. ahora es el tema donde tengo una duda...
$1
eso es un peso, pero yo quiero mostrarlo asi
1.00
y asi con tengo qe encontrar lamanera de acceder a los ultimos dos caracteres de mi string, correrlos un lugar para la derecha y agregar la coma donde estaba el anteultimo. bien se qe un string es un array of caracteres. tendria qe acceder por array size. existe una funcion asi? y hay alguna manera de aumentar el array en ese momento? sigo probando y leyendo. :)

Casimiro Notevi 27-02-2012 10:13:10

Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo?, gracias por tu colaboración.

Una de las normas, lógica, es: preguntas distintas en temas distintos. No vamos a mezclar las cosas, se convertirían los foros en algo imposible de controlar.
Además puedes hacer una búsqueda, las máscaras de presentación de números es un tema que se ha tratado multitud de veces, recuerda que tenemos cerca de 78000 temas en nuestra base de datos, ahí está 'casi' todo lo que necesites.

Delphius 27-02-2012 10:55:07

Me encanta cuando los usuarios vienen, tiran una pantalla y luego esperan que se les caiga de arriba.
Lo bueno es que al menos te hemos sacado algo de tu parte, y diste un comienzo.

Voy a hacer de cuenta que ese código no lo he visto... Con todo respeto, ¡Que te lo complicas demasiado! conversiones de un tipo a otro, código por demás repetido, :eek:
Se que para una primera aproximación, y que el sistema tampoco es para mucho, y que al parecer eres iniciado puede ser una posibilidad; pero es que puede mejorarse mucho, e incluso añadir controles que te pasas de largo.

Yo te he tirado algunos conceptos que te pueden dar mucho alivio:
El uso de records, un arreglo o array y unos frames (quizá esto último es lo que más te puede costar entender; busca en los foros sobre frames).

Ahora respecto a tu nueva duda, la verdad es que no se te entiende demasiado. ¿Porqué no piensas tus palabras y te explicas mejor? Eso hará más fácil asesorarte.

Tengo una duda:
Y si necesitas de más "items" que los que pusiste, cómo te las ingenias? En la foto hay lugar para 10 items. ¿Van a ser como máximo 10, o pueden ser más? ¿Una cantidad no determinada quizá?
De ser indeterminada, entonces con más razón debe llevarse el problema por otro lado e implementar un proceso que permita extenderse según se requiera.

La propuesta del uso del array dinámico y del frame va justo en este sentido. El array nos permite llevar la estructura en cuanto a la lógica; y el frame en cuanto a la interfaz.
Explico lo del frame: Es como un form, plantilla, en que se van a disponer los elementos que hacen a un ítem. Luego, se crean tantas instancias de este frame como items se necesiten.

En el frame es posible incorporar código que nos permita llevar el control necesario para operar adecuadamente con los valores, y además es donde se llenan justamente la posición i-ésima del arreglo (siendo i el item correspondiente). Un método de interés, de nombre hipotético UpdateSubTotal, lo que hace es recalcular el subtotal ante cualquier cambio en el precio o cantidad.
Por consiguiente, indirectamente este método manda a llamar a un UpdateTotal que recalculará el total. Este UpdateTotal puede, y yo recomiendo, que esté en el form.

El uso del arreglo permite hacer los cálculos sin complicarse la vida de utilizar StrToXXX y sus inversas. Una vez que se guardan los datos en el la operatoria es elemental.

DEJA la interfaz para cuestiones de interfaz... piensa en un arreglo.

Saudos,


La franja horaria es GMT +2. Ahora son las 23:39:27.

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