![]() |
Componente Stringgrild
Buenas tardes, en un manual que me descargue de delphi, me pone ue haga un ejercicio con el coponente srtinggrild. Lo copio para que lo entendais:
2.- Construir un concentrado que contenga los ingresos por ventas mensuales de los 3 primeros meses del año de 4 sucursales de una cadena refaccionaría, agregar listas de ingresos totales por mes e ingresos promedios por sucursal. Tengo el sigiente codigo:
Al ejecutarlo me va todo bien pero cuando le doy al boton calcular me da el siguente error: raised excemtio class econverterror with message is not vaid floating point value. He mirado y no he encontrado el fallo, aunque seguro que sera una tonteria como siempre me suele pasar. Un saludo y gracias de antemano |
Cita:
Supongo que el problema está en la función StrToFloat. Le pasas un string y te devuelve un Float. Si el string es vacío o tiene letras o más de un punto, te dará un error de conversión Cita:
Por ejemplo:
|
Cita:
|
¿Has modificado tu procedimiento como te he comentado (try..except)?
¿Sigue fallando? ¿Con qué error? ¿En qué línea? |
Cita:
Yo creo que el fallo esta en toda las lineas. |
Cita:
Si el error es exactamente "No puedo convertir " Quiere decir que la celda en ese renglón y esa columna está vacío. Si el error es algo así como "No puedo convertir 123.456.678"; Quiere decir que la celda en ese renglón y esa columna tiene el valor "123.456.678" que no es un valor válido. (Tiene 2 puntos) Por lo que comentas, creo que es el primer error y por lo tanto se puede tomar como un 0 y es lo que hace el trozo de código si hay una excepción. Cita:
En el segundo bucle trata de convertir nuevamente los valores y vuelve a fallar. Si nos dices EXACTAMENTE qué valores tiene las celdas (con sus puntos, comas y signos) te podrémos decir qué es lo que fallará. Ten en cuenta que para convertir un número con la función StrToFloat el string que le pasas: - solo debe tener números - solo puede haber un punto que separe la parte entera de la decimal. - si fuera negativo podría empezar con el signo "-" - no debe contener espacios. |
Cita:
|
Si quieres más información sobre el error puedes agregarla al mensaje de la exceción
|
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: 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:
Ahora tenés otro error, que lógicamente aún no has podido descubrir...:) Si miramos la declaración de los arreglos 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:
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. |
Cita:
|
Cita:
Mira lo que te comenta ecfisa en el post anterior. Cita:
|
Ahora me da fallo la suma por sucursal y promedio por sucursal
El resto de cosas concuerdan pero ahora el fallo es la suma por sucursal y promedio opr sucursal que dan mal el calculo. Dejo mi codigo:
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; columnas:integer; renglones:integer; begin for renglones:=0 to 3 do begin for columnas:=0 to 2 do begin totsuc[renglones+1]:=totsuc[renglones+1]+strtofloat(stringgrid1.Cells[columnas,renglones]); end; end; for renglones:=0 to 3 do begin promsuc[renglones+1]:=totsuc[renglones+1]/3; end; for renglones:=0 to 3 do begin for columnas:=0 to 2 do begin totmes[columnas+1]:=totmes[columnas+1]+strtofloat(stringgrid1.Cells[columnas,renglones]); end; end; for columnas:=0 to 2 do begin prommes[columnas+1]:=totmes[columnas+1]/4; end; for renglones := 0 to 3 do begin listbox1.Items.Add(floattostr(totsuc[renglones+1])); listbox2.Items.Add(floattostr(promsuc[renglones+1])); end; for columnas := 0 to 2 do begin listbox3.Items.Add(floattostr(totmes[columnas+1])); listbox4.Items.Add(floattostr(prommes[columnas+1])) end; end; end. |
Hola JLMN22.
Por favor, tratá de usar las etiquetas [delphi] y [/delphi] para encerrar el código Delphi que pongas en los mensajes, de ese modo se hace mucho más legible. [ Uso de Etiquetas vB ] Un saludo. |
Ya he puiesto con etiquetas, espero que este bien
|
Hola JLMN22.
Esta muy bién. Muchas gracias por tu colaboración. Un saludo. |
Cita:
|
La franja horaria es GMT +2. Ahora son las 05:47:05. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi