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; StringGrid1.Row:= Suc; Exit; 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 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.