Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Sumar y Dividir Combobox (https://www.clubdelphi.com/foros/showthread.php?t=71124)

ZiriusB 01-12-2010 20:17:00

Sumar y Dividir Combobox
 
Hola amigos, estoy realizando una aplicacion en donde tengo un formulario con una cantidad de Combobox (pongamos 16) cada combobox tiene dentro numeros del 1 al 4...

Yo necesito sumar todos esos combobox y que el resultado me lo muestre en un Tedit, realice esta linea de codigo:

Código Delphi [-]
procedure Tasisadmin.SpeedButton1Click(Sender: TObject);
begin
nfinal.Text := IntToStr( StrToInt(ComboBox1.Text)+
StrToInt(ComboBox2.Text) + StrToInt(ComboBox3.Text)+
StrToInt(ComboBox4.Text)+ StrToInt(ComboBox5.Text)+
StrToInt(ComboBox6.Text)+ StrToInt(ComboBox7.Text)+
StrToInt(ComboBox8.Text)+ StrToInt(ComboBox9.Text)+
StrToInt(ComboBox10.Text)+ StrToInt(ComboBox11.Text)+
StrToInt(ComboBox12.Text)+ StrToInt(ComboBox13.Text)+
StrToInt(ComboBox14.Text)+ StrToInt(ComboBox15.Text)+
StrToInt(ComboBox16.Text));
end;

luego de eso, necesito que me divida el resultado de dicha suma entre el numero de combobox totales, es decir, si el resultado me da 46 eso lo divido entre el numero de combobox y obtengo el resultado...

P.D.: existe alguna forma de que no sea tan larga la linea de codigo al sumar los combobox?

Espero poder obtener ayuda...gracias!

Vale decir que soy novato en esto del delphi!

ecfisa 01-12-2010 21:45:10

Hola.

Probá de este modo:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  i, r: Integer;
begin
  r:= 0;
  for i:= 0 to ComponentCount-1 do
   if Components[i] is TComboBox then
      r:= r + StrToInt(TComboBox(Components[i]).Text);
  nfinal.Text:= IntToSTr(r);
end;

Saludos. :)

defcon1_es 02-12-2010 11:31:18

Ampliando la solución que te ha dado ecfisa:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  i, r, c: Integer;
begin
  r := 0;
  c¨:= 0;
  for i := 0 to ComponentCount-1 do
  begin
   if Components[i] is TComboBox 
   then begin
      r := r + StrToInt(TComboBox(Components[i]).Text);
      c := c + 1;
   end;
  end; 
  nfinal.Text := FormatFloat('#,##0.##', r/c);
end;

ZiriusB 06-12-2010 21:02:32

Muchisimas gracias, me ha servido de mucho su ayuda...!

calcena 08-12-2010 17:38:02

division de una celda tstringrid
 
Buenas porque narices cuando hago una division entre en contenido de una celda entre un numero de sale error que hago mal?

var horas : integer ;
var minutos : integer;
var tiempo :Integer;
const min_hora = 60;


// calculo de horas y minutos
tiempo:= strtoint(rejilla.Cells[7,arow]);
horas:= tiempo/min_hora;

tipo de error:
[DCC Error] Unit4.pas(171): E2010 Incompatible types: 'Integer' and 'Extended'

gracias a todos

Delphius 08-12-2010 18:48:02

Hola calcena, el mensaje de error lo dice todo: Se está intentando dividir un número en forma real (es decir con decimales) y almacenar su resultado en una variable entera (números sin decimales).

La solución:
1. Declaras a la variable de tipo real o double. O bien,
2. Realizas una división entera mediante el operador DIV, como por ejemplo:
Código Delphi [-]
nro2 = nro1 DIV 123;

Saludos,

ZiriusB 16-12-2010 20:00:56

Amigos use esta formula y me funciona a la perfeccion colocandola en un BOTON con evento click...pero ahora, quiero que al yo ir seleccionando los combobox me sume automaticamente en el TEDIT(que es donde se muestra el resultado de la suma de los combobox) sin necesidad de tener un boton extra para sumar...me explico?

espero puedan ayudarme!

ecfisa 16-12-2010 20:30:47

Hola ZiriusB.

Se me ocurre que podrías usar el evento OnExit de cada ComboBox. (aunque también podría ser OnChange...)

Algo como :
Código Delphi [-]
procedure TForm1.ComboBoxExit(Sender: TObject);
var
  i, r, c: Integer;
begin
  r := 0;
  c:= 0;
  for i := 0 to ComponentCount-1 do
  begin
    if (Components[i] is TComboBox) and (TComboBox(Components[i]).Text > '') then
    begin
       r := r + StrToInt(TComboBox(Components[i]).Text);
       c := c + 1;
    end;
  end;
  Edit1.Text := FormatFloat('#,##0.##', r/c);
end;

Tendrías que asignar el procedimiento ComboBoxExit a cada ComboBox de tu form.

Saludos.

ZiriusB 16-12-2010 20:50:12

Cita:

Empezado por ecfisa (Mensaje 385186)
Hola ZiriusB.

Se me ocurre que podrías usar el evento OnExit de cada ComboBox. (aunque también podría ser OnChange...)

Tendrías que asignar el procedimiento ComboBoxExit a cada ComboBox de tu form.

Saludos.

Bueno lo que sucede es que son muchos formularios y cada formulario tiene muchas labels, de 15 a 18...

probe con un combo y me lanza el resultado de ese solo, lo probare completo a ver! gracias!

ecfisa 16-12-2010 23:58:40

Cita:

Empezado por ZiriusB (Mensaje 385189)
Bueno lo que sucede es que son muchos formularios y cada formulario tiene muchas labels, de 15 a 18...

probe con un combo y me lanza el resultado de ese solo, lo probare completo a ver! gracias!

Bueno, podés reducir la tarea aprovechando la propiedad ComponentCount nuevamente:

Código Delphi [-]
...
type
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    ComboBox2: TComboBox;
    ComboBox3: TComboBox;
    ....
    Edit1: TEdit;
    procedure FormShow(Sender: TObject);
  private
    procedure ComboBoxChange(Sender: TObject);
  public
  end;
...
implementation
...
procedure TForm1.ComboBoxChange(Sender: TObject);
var
  i, r, c: Integer;
begin
  r := 0;
  c:= 0;
  for i := 0 to ComponentCount-1 do
  begin
    if (Components[i] is TComboBox) and (TComboBox(Components[i]).Text > '') then
    begin
       r := r + StrToInt(TComboBox(Components[i]).Text);
       c := c + 1;
    end;
  end;
  Edit1.Text := FormatFloat('#,##0.##', r/c);
end;

{ Asignar ComboBoxChange al evento OnChange de todos los combos de Form1 }
procedure TForm1.FormShow(Sender: TObject);
var
  i: Integer;
begin
  for i:= 0 to ComponentCount -1 do
    if Components[i] is TComboBox then
      TComboBox(Components[i]).OnChange:= ComboBoxChange;
end;

Saludos.

ZiriusB 14-02-2011 14:15:20

Amigos, quisiera intentar esta misma formula pero con otro componente, con un RADIOGROUP, he intentado cambiarla pero me salta un error, podrian darme una mano con esto...

Código Delphi [-]
  r := 0;
  c:= 0;
  for i := 0 to ComponentCount-1 do
  begin
    if (Components[i] is TAdvOfficeRadioGroup) and (TAdvOfficeRadioGroup(Components[i]).Items > '') then
    begin
       r := r + StrToInt(TAdvOfficeRadioGroup(Components[i]).Items);
       c := c + 1;
    end;
  end;
  nfinal.Text := FormatFloat('#,##0.##', r/c);

las variables estan declaradas, todo igual... pero me salta un error!

Agradezco su ayuda!

ZiriusB 14-02-2011 16:06:25

Perdon no es
Código Delphi [-]
TAdvOfficeRadioGroup(Components[i]).Items

es
Código Delphi [-]
TAdvOfficeRadioGroup(Components[i]).Itemindex

ecfisa 14-02-2011 17:47:45

Hola ZiriusB.

Código Delphi [-]
var
  c, i, j: Integer;
  r: Double;
begin
  r:= 0;
  c:= 0;
  for i:= 0 to ComponentCount -1 do
   if (Components[i] is TRadioGroup) and
      (TRadioGroup(Components[i]).ItemIndex > -1) then
   begin
     r:= r + StrToFloat(TRadioGroup(Components[i]).Items[TRadioGroup(Components[i]).ItemIndex]);
     Inc(c);
   end;
  if c > 0 then
    ShowMessage(FormatFloat('#,##0.##', r/c));

Un saludo.


La franja horaria es GMT +2. Ahora son las 06:15:39.

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