Ver Mensaje Individual
  #9  
Antiguo 13-02-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Reputación: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola JLMN22.

Estuve mirando tu código y dos motivos causan tus errores.

(Error de conversión)
Si lees la propiedad Cells de TStringGrid, verás que no es: [Fila, Columna], sino:[Columna, Fila].
Cuando haces:
Código Delphi [-]
  for renglones:=0 to 3 do 
    for columnas:=0 to 2 do 
      totsuc[renglones]:=totsuc[renglones]+
          strtofloat(stringgrid1.Cells[renglones,columnas]);
y la variable 'renglones' alcanza el valor 3, es lógico que allí haya un espacio vacío por que esa es la posición de los meses y estos sólo tendrían que alcanzar el valor 2. Ojalá hubiesen sido 4 meses...

Entonces lo correcto sería:
Código Delphi [-]
 for renglones:=0 to 3 do 
    for columnas:=0 to 2 do 
      totsuc[renglones]:=totsuc[renglones]+
          strtofloat(stringgrid1.Cells[columnas, renglones]);

Ahora tenés otro error, que lógicamente aún no has podido descubrir...
Si miramos la declaración de los arreglos
Código Delphi [-]
var
 totsuc: array [1..4] of real;
 promsuc: array [1..4] of real;
 totmes: array [1..3] of real;
 prommes: array [1..3] of real;
y los valores en que inician y finalizan los for, no nos dan las cuentas...
Empiezan en una posición inexistente(0) y terminan una posición antes(3) como por ejemplo: totsuc. Cuando recorremos los arreglos tenemos que sumar 1 tanto a filas como a columnas.

Bueno, resumiendo:
Código Delphi [-]
procedure TForm1.CalcularClick(Sender: TObject);
var
  totsuc: array [1..4] of real;
  promsuc: array [1..4] of real;
  totmes: array [1..3] of real;
  prommes: array [1..3] of real;
  Suc, Mes:integer;
  Aux: Double;
begin
  for Suc:= 0 to 3 do
   for Mes:= 0 to 2 do
     if TryStrToFloat(StringGrid1.Cells[Mes,Suc],Aux) then
       totsuc[Suc+1]:= totsuc[Suc+1] + Aux
     else
     begin
       ShowMessage(Format('Error: Sucursal: %d, Mes: %d',[Suc+1,Mes+1]));
       StringGrid1.Col:= Mes;  // Posicionar en la celda,
       StringGrid1.Row:= Suc; // donde se produjo el error
       Exit; // Salir
     end;

  for Suc:= 0 to 3 do
    promsuc[Suc+1]:= totsuc[Suc+1]/3;

  for Suc:= 0 to 3 do
    for Mes:= 0 to 2 do // TryStrToFloat no es necesario, ya se controló arriba
       totmes[Mes+1]:= totmes[Mes+1]+StrToFloat(StringGrid1.Cells[Mes, Suc]);

  for Mes:= 0 to 2 do
   prommes[Mes+1]:=totmes[Mes+1]/4;

  for Suc := 0 to 3 do
  begin
    listbox1.Items.Add(floattostr(totsuc[Suc+1]));
    listbox1.Items.Add(floattostr(promsuc[Suc+1]));
  end;

  for Mes := 0 to 2 do
  begin
    listbox3.Items.Add(floattostr(totmes[Mes+1]));
    listbox4.Items.Add(floattostr(prommes[Mes+1]))
  end;
end;

Para evitar posibles errores de conversión en el ingreso de los valores, use la función TryStrToFloat, informando sucursal y mes en que se produjo en tal caso.

Otra cosa, el begin / end es innecesario cuando hay una sola instrucción, lo único que logra es oscurecer el código.

No comprobé si el resultado concuerda con la lógica del algorítmo, eso lo dejo a tu buen criterio...


Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 13-02-2011 a las 12:26:48.
Responder Con Cita