Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-04-2012
Avatar de PaulaGV
PaulaGV PaulaGV is offline
Miembro
NULL
 
Registrado: mar 2012
Posts: 34
Poder: 0
PaulaGV Va por buen camino
StringGrid

hola!tengo un StringGrid y quiero sumar los elementos de cada fila y colocar es resultado en el ultimo casillero del stringGrid de cada fila respectivamente, ya intente varias veces y siempre me salta el mismo error, ademas de borrar los blancos que puedan quedar luego de ingresar cada elemento del StringGrid, yo hice esto, pero me salta el error '' is not a valid integer value:


Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
i,j,suma:integer;
begin
suma:=0;
with StringGrid1 do
begin
for j := 1 to ColCount- 1 do
Trim(Cells[1,j]);
suma:=suma+StrToInt(Cells[1,j]);
end;
StringGrid1.Cells[1,3]:=IntToStr(suma);
end;
Responder Con Cita
  #2  
Antiguo 24-04-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Por favor, tal y como te he comentado antes, debes seguir las normas de clubdelphi, entre ellas está el poner títulos descriptivos a las preguntas. Gracias por tu colaboración.
Responder Con Cita
  #3  
Antiguo 24-04-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por PaulaGV Ver Mensaje
hola!tengo un StringGrid y quiero sumar los elementos de cada fila y colocar es resultado en el ultimo casillero del stringGrid de cada fila respectivamente, ya intente varias veces y siempre me salta el mismo error, ademas de borrar los blancos que puedan quedar luego de ingresar cada elemento del StringGrid, yo hice esto, pero me salta el error '' is not a valid integer value:
Por favor, haz caso de lo que dice Casimiro.

Ahora, en cuanto a tu duda, de entrada hay varias cosas a notar en el código que pones.

1. Según lo que describes, necesitarías un doble ciclo; uno externo para recorrer las filas y otro interno para sumar los valores de las columnas. Tú sólo tienes el interno.

2. En este ciclo interno tienes dos instrucciones y debes encerrarlas en un bloque begin-end.

3. Trim es una función, lo que significa que debes asignar el valor que devuelve, por ejemplo:

Código Delphi [-]
Cells[i,j] := Trim(Cells[i,j]);

En la forma que lo haces, realmente no eliminas los espacios de las celdas.

4. No es seguro usar StrToInt a menos que estés 100% segura de que todas las entradas del StringGrid son números bien formados. Por ejemplo, celdas vacías o con letras causarán el error que ves. Creo que es más adecuado usar StrToIntDef:

Código Delphi [-]
suma := suma + StrToIntDef(Cells[i,j], 0);

De esta manera, si un celda tiene algo que no sea un número, lo que sumas será cero y no obtendrás el error.

Otra opción es verificar en cada caso antes de sumar el valor de la celda y mandar un aviso de error al usuario en caso de error.

// Saludos
Responder Con Cita
  #4  
Antiguo 25-04-2012
Avatar de PaulaGV
PaulaGV PaulaGV is offline
Miembro
NULL
 
Registrado: mar 2012
Posts: 34
Poder: 0
PaulaGV Va por buen camino
Thumbs up

disculpen!!!soy nueva acá y no lo había tenido en cuenta!! pero ya lo hice de todas formas.
Con respecto a la respuesta, muchas gracias!
Responder Con Cita
  #5  
Antiguo 25-04-2012
Avatar de gatosoft
[gatosoft] gatosoft is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Bogotá, Colombia
Posts: 833
Poder: 21
gatosoft Va camino a la fama
Adicionalmente a lo que dice Román, debes hacer unos ajustes a tu código...

1) Si quieres sumar todas las filas de todas las columnas, debes hacer un doble ciclo anidado...

For i:= 1 to ColCount-1 do
For j:=1 to RowCount -1 do
{Aqui sumas tus FILAS....Cells[i,j]}

2) Asignar el resultado de la casilla modificada como dice Román
Cells[i,j] := Trim(Cells[i,j]);


3) Recordar que si quieres que el for trabaje para mas de una linea debes encerrar la sentencia en un bloque Begin..end, ya que en tu ejemplo, el for termina y al final (solo al final del recorrido) ejecuta la sentencia:
suma:=suma+StrToInt(Cells[1,j]); lo cual quiere decir que solo sumaste una casilla...


Espermos la versión dos de tu tarea...!
Responder Con Cita
  #6  
Antiguo 25-04-2012
Avatar de PaulaGV
PaulaGV PaulaGV is offline
Miembro
NULL
 
Registrado: mar 2012
Posts: 34
Poder: 0
PaulaGV Va por buen camino
Thumbs up sumar elementos de un StringGrid

muchísimas gracias!!!muy claras las respuestas, apenas tenga la segunda versión la estaré publicando!
Responder Con Cita
  #7  
Antiguo 25-04-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 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 PaulaGV.

Agregando algo a lo que correctamente te han sugerido, noté que mencionas que vas a usar la última columna de cada fila para poner el resultado de la sumatoria de sus columnas, es decir que deberías impedir que se pueda escribir en ColCount - 1:
Código Delphi [-]
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
   CanSelect := ACol <> StringGrid1.ColCount - 1;
end;

Otra opción que sumaría los valores enteros, sin provocar una excepcion ante posibles valores alfanuméricos, es usando la función TryStrToInt:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  c ,f ,v, suma: integer;
begin
  with StringGrid1 do
  begin
    for f:= FixedRows to RowCount - 1 do
    begin
      suma:= 0;
      for c:= FixedCols to ColCount - 2 do
        if TryStrToInt(Trim(Cells[c,f]), v) then
          suma:= suma + v;
      Cells[ColCount-1, f]:= IntToStr(suma)
    end
  end
end;

Saludos.
__________________
Daniel Didriksen

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

Última edición por ecfisa fecha: 25-04-2012 a las 06:29:24.
Responder Con Cita
  #8  
Antiguo 25-04-2012
Avatar de PaulaGV
PaulaGV PaulaGV is offline
Miembro
NULL
 
Registrado: mar 2012
Posts: 34
Poder: 0
PaulaGV Va por buen camino
Smile Sumar el contenido de una fila o columna en un String Grid

muchas gracias!!igual lo voy a probar... ya arme un código con las primeras respuestas y me quedo así:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
i,j,suma:integer;
begin
with StringGrid1 do
begin
suma:=0;
  for i := 1 to ColCount - 1 do
    for j := 1 to RowCount - 1 do
      begin
        Cells[i,j]:=Trim(Cells[i,j]);
        suma:=suma+ StrToIntDef(Cells[i,j],0);
      end;
end;
StringGrid1.Cells[1,4]:=IntToStr(suma);
end;

es una simple prueba para ver si funcionaba la parte de contar cada elemento en el StringGrid, por eso se le asigne el resultado yo misma a la ultima celda, luego tengo que modificar el código para que haga lo mismo con cada fila del StringGrid, ahora mi duda es otra, yo entiendo que la funcion TRIM quita los blancos en una cadena, entonces por que si no uso StrToIntDef en vez de StrToInt en el siguiente fragmento de codigo aparece el error '' is no a integer value?. Ademas que yo le puse una mascara para que solo se puedan ingresar números.Desde ya gracias!!


Código Delphi [-]
 suma:=suma+ StrToIntDef(Cells[i,j],0);
Responder Con Cita
  #9  
Antiguo 25-04-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 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
Cita:
entonces por que si no uso StrToIntDef en vez de StrToInt en el siguiente fragmento de codigo aparece el error '' is no a integer value?.
Hola Paula.

Eso sucede por que Trim no produce ningún efecto cuando se aplica a una celda vacía ya que no tiene 'nada' para quitar. Es decir que tanto
Código Delphi [-]
  StrToInt('');
como
Código Delphi [-]
  StrToInt(Trim(''));
lanzarán una excepción.


El uso que haces de StrToIntDef es correcto, incluso más simple que TryStrToInt (aunque igual realiza la tarea).
Podrías eso sí, ahorrarte una línea y un begin/end usando Trim dentro de StrToIntDef:
Código Delphi [-]
    for j := 1 to RowCount - 1 do
      suma:= suma + StrToIntDef(Trim(Cells[i,j]), 0);

Creo que te quedaría de este modo:
Código Delphi [-]
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
   CanSelect := ACol <> StringGrid1.ColCount - 1; // no permite selección si es últimca columna
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  c , f, suma: integer;
begin
  with StringGrid1 do
  begin
    for f:= FixedRows to RowCount - 1 do // para c/fila
    begin
      suma:= 0; 
      for c:= FixedCols to ColCount - 2 do // para c/columna (menos la última)
        suma:= suma + StrToIntDef(Trim(Cells[c, f]), 0); // sumar
      Cells[ColCount-1, f]:= IntToStr(suma) // mostrar resultado en última columna
    end
  end
end;

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #10  
Antiguo 25-04-2012
Avatar de PaulaGV
PaulaGV PaulaGV is offline
Miembro
NULL
 
Registrado: mar 2012
Posts: 34
Poder: 0
PaulaGV Va por buen camino
Talking Como sumar elementos de un stringGrid

muchisimas gracias por las respuestas todas me fueron muy utiles!!!
Responder Con Cita
  #11  
Antiguo 26-04-2012
Avatar de PaulaGV
PaulaGV PaulaGV is offline
Miembro
NULL
 
Registrado: mar 2012
Posts: 34
Poder: 0
PaulaGV Va por buen camino
Exclamation como sumar los elementos de una fila de un StringGrid

hola buenas noches!!!les cuento, tengo un StringGrid, la fila 0 y la columna 0 contienen títulos, así que no deben ser modificados de ninguna manera, eso ya lo tengo controlado, quiero sumar los valores de cada fila y poner el resultado en el ultimo casillero de la fila correspondiente, pero por mas que lo intente no logro que resuelva el calculo por cada fila, si no, que el código que hice realiza el calculo por columna, que estoy haciendo mal? creí conocer el funcionamiento de la sentencia for cuando están anidados pero se me armo lío bárbaro

Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
var
filas, columnas, suma:integer;
begin
with StringGrid1 do
begin
  for filas := FixedRows to RowCount - 2 do
  begin
    suma:=0;
    for columnas := FixedCols to ColCount - 2 do
      suma:=suma+ StrToIntDef((Trim(Cells[columnas,filas])),0);
      cells[filas,colCount-1]:=Inttostr(suma)
  end;
end;
end;

desde ya, muchas gracias!!!
Responder Con Cita
  #12  
Antiguo 26-04-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Creo recordar que el stringgrid es columna, fila y lo estás poniendo al revés.

Código Delphi [-]
grDato[columna,fila]
Responder Con Cita
  #13  
Antiguo 26-04-2012
Avatar de gatosoft
[gatosoft] gatosoft is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Bogotá, Colombia
Posts: 833
Poder: 21
gatosoft Va camino a la fama
Hola Paula, Veo que sigues luchando con tus grillas.... y como sugerencia, es bueno que contiinues los temas en los hilos que ya empezaste, y no abrir post nuevos con el mismo tema....asi todos pueden documentarse con las respuestas que ya se han venido dando.

Aunque no es política del foro hacerle la tarea a las personas... y con el perdon de los moderadores... aquí te va una posible solución a tu problema.

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var filas, columnas, suma:integer;
begin
with StringGrid1 do
begin
  for filas := 1 to RowCount - 1 do {recorres todas las filas menos la primera (0)}
  Begin
    suma:= 0; {Cada vez que comiences una nueva fila, inicializas en cero}
    for Columnas := 1 to ColCount - 2 do {Recorres todas las columnas menos la primera y la última por que allí pondrás los resultados}
    begin
      suma:=suma + StrToIntDef((Trim(Cells[columnas,filas])),0);
    end;//for columnas
    cells[colCount-1, filas]:=Inttostr(suma); {Al finalizar la suma de cada columna, (al salir del for columnas) pones el resultado en la última columna que estas evaluando.}
  end;//for filas
end;//with

end

un saludo,
Responder Con Cita
  #14  
Antiguo 26-04-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
He combinado ambos hilos en uno.
Responder Con Cita
  #15  
Antiguo 26-04-2012
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Creo recordar que el stringgrid es columna, fila y lo estás poniendo al revés.

Código Delphi [-]grDato[columna,fila]
Tarde me lo recuerdas amigo, tarde... tarde.
Hace unas semanas me volví loco tratando de encontrar un error en mi mar de código. No veía donde estaba haciendo supuestamente mal unos cálculos... Todo estaba en orden. Todo estaba correcto. El único defecto es que al momento de presentar los datos confundí un A[j, i] con A[i, j]. Y Claro, como veía que los datos no coincidían con lo esperados que me puse en plan NewDelphius Super Sayayin en que alguna de las miles de operaciones fallaba.

Así que lección aprendida: ahora tengo pegado un post-it en el monitor que dice, con letras rojas: "NO CONFUNDIR FILAS CON COLUMNAS" y una imagen indicando el sentido de filas y columnas con flechas de una matriz que lo acompaña.
Por cierto... ya me quedé sin espacio en el monitor... tengo muchos post-its (afortunadamente ninguno es de la contraseña... a ese lo guardo en el cajón )

Saludos pegados,
PD: Se han pedido los derechos de autor a Al para dar este saludo
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #16  
Antiguo 26-04-2012
Avatar de PaulaGV
PaulaGV PaulaGV is offline
Miembro
NULL
 
Registrado: mar 2012
Posts: 34
Poder: 0
PaulaGV Va por buen camino
Thumbs up Como sumar elementos de un stringGrid

es cierto lo de las filas y columnas, a pesar de que ya lo sabia no lo había tenido en cuenta. Muchas gracias por la información, y con respecto a "resolver mi tarea" simplemente pedí que me ayudaran a encontrar mi error, de todas formas agradezco que te tomes el tiempo de reescribir el código.
Responder Con Cita
  #17  
Antiguo 26-04-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 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 Paula.

Si revisas el mensaje [ #9 ], verás que el último código hace exáctamente lo que buscas.

Tu única equivocación estuvo en la línea:
Código Delphi [-]
  cells[filas,colCount-1]:=Inttostr(suma)
Debería haber sido:
Código Delphi [-]
  Cells[ColCount-1, filas]:= IntToStr(suma)

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #18  
Antiguo 26-04-2012
Avatar de PaulaGV
PaulaGV PaulaGV is offline
Miembro
NULL
 
Registrado: mar 2012
Posts: 34
Poder: 0
PaulaGV Va por buen camino
Como sumar elementos de un stringGrid

muchas gracias!!!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
como borrar elementos de un stringGrid PaulaGV OOP 3 25-04-2012 20:19:43
Como Borrar una fila del Stringgrid de forma correcta? escorpionrojo43 OOP 1 24-07-2011 19:11:52
Sumar elementos de una list box yessika19 Varios 4 05-01-2008 20:57:18
Sumar elementos de un ListBox creus Varios 4 16-01-2007 19:34:05
como eliminar una fila del stringGrid. Arturo Varios 3 12-10-2006 20:54:04


La franja horaria es GMT +2. Ahora son las 17:19:34.


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
Copyright 1996-2007 Club Delphi