Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   sumando valores de un listview (https://www.clubdelphi.com/foros/showthread.php?t=87077)

danielmj 12-11-2014 10:22:38

sumando valores de un listview
 
Hola, buenos dias a todos

Estoy intentando sumar el contenido de una columna dada de un listview, pero me tira el siguiente error:

Cita:

[dcc64 Error] datos.pas(147): E2250 There is no overloaded version of 'FloatToStr' that can be called with these arguments
Mi código es este:
Código Delphi [-]
...
for i:= 0 to lista.Items.Count -1 do
        total:= total + (FloatToStr(lista.Items[9].Caption));
...

Luego de probar varias cosas, aquí en el foro encontre este hilo supongo que no es algo muy complicado, pero no sé por qué a mi me da error.
¿alguna sugerencia? Por cierto, la variable total está definida como "extended"

Gracias y saludos.

ecfisa 12-11-2014 13:47:24

Hola danielmj.
Cita:

Empezado por danielmj (Mensaje 484506)
...
Estoy intentando sumar el contenido de una columna dada de un listview, pero me tira el siguiente error:
Cita:

[dcc64 Error] datos.pas(147): E2250 There is no overloaded version of 'FloatToStr' that can be called with these arguments
...

Ese error se produce por que estas intentando convertir una cadena a número flotante con la función FloatToStr cuyo trabajo es precisamente el inverso. La función indicada para ese caso es StrToFloat.

Saludos :)

danielmj 12-11-2014 14:13:40

Hola ecfisa, es cierto, después de enviar el post me di cuenta y lo cambié pero ahora después de cambiarlo me encuentro con esto:



El código lo cambié a esto (y la variable total la cambie de extended a real):

Código Delphi [-]
...
      for i:= 0 to lista.Items.Count -1 do
        begin
          total:= total + (StrToFloat(lista.Items[9].Caption));
          rForm.Label35.Caption:= FloatToStr(total);
        end;
...

Y si en cambio la variable la sigo definiendo como "extended", me tira este otro error:



Si en ese dialogo pulso sobre "break" me marca la siguiente linea:


Así que he pasado de un error por descuido a otro sobre el que no tengo ni idea ni control (siendo honesto) y obviamente no sé muy bien como solucionarlo.
Un saludo y gracias por tu tiempo.

ecfisa 12-11-2014 14:27:20

Hola danielmj.

Revisa que exista el índice 9 (lista.Items[9].Caption).

Saludos :)

danielmj 12-11-2014 16:46:09

Hola de nuevo ecfisa,

Mira la captura del listview con su distribución de columnas sería esta:


El codigo es este:
Código Delphi [-]
for i:= 0 to lista.Items.Count -1 do
begin
     total:= total + (StrToFloat(lista.Items.Item[10].Caption ));
     Label35.Caption:= FloatToStr(total);
end;

Me estaba liando con el indice, no contaba con la columna 0 que no se ve por eso de tener el width a 0. En lugar de poner 10, usaba el indice 9.
A parte de eso, lo unico que he cambiado es que esta parte del codigo ahora se inicia en el oncreate del formulario. He hecho estos cambios y ya no tira ningun error, eso si, sigue sin sumarme nada. Ahora me pondre con eso para que sume todas las cantidades.

Gracias y un saludo.

Casimiro Notevi 12-11-2014 16:53:13

Código Delphi [-]
for i:= 0 to lista.Items.Count -1 do
begin
     total:= total + (StrToFloat(lista.Items.Item[ i ].Caption ));
     Label35.Caption:= FloatToStr(total);
end;

danielmj 12-11-2014 19:15:59

Hola casimiro, gracias pero me temo que no funciona. Practicamente he copiado y pegado tu código y no suma nada, lo unico que hace es meter en "label35.caption" el precio del ultimo articulo introducido, pero no suma este con los anteriores.



La columna de al lado de "precio" está vacia por que aún ando liado con ella para agregar elementos desde otro formulario.

Como puedes ver en la captura, hace eso, mostrar el ultimo precio introducido pero no los suma.

Saludos

Casimiro Notevi 12-11-2014 19:23:28

No entiendo el contexto, ¿puedes explicarlo y también poner el código que usas, y qué valores tiene esa lista y cómo y dónde lo asignas?

danielmj 12-11-2014 20:08:40

Hola,

mira el siguiente es el codigo del evento oncreate:
Código Delphi [-]
procedure TrForm.FormCreate(Sender: TObject);
var
  i: integer;
  total: extended;
//  total2: extended;

begin
  total:= 0;
  for i:= 0 to lista.Items.Count -1 do
    begin
//      total:= total + (StrToFloat(lista.Items.Item[i].Caption )); //total + (StrToFloat(lista.Items.Item[10].SubItems[i]));// .Caption ));
//      total2:= StrToFloat(label35.Caption) + total;
//      Label35.Caption:= FloatToStr(total);// label35.Caption  FloatToStr(total);

        total:= total + (StrToFloat(lista.Items.Item[ i ].Caption ));
        Label35.Caption:= FloatToStr(total);
    end;
end;

**Lo que está como comentario, son pruebas que he ido haciendo sin mayor importancia **

Por otra parte, el código que le manda el valor precio a la lista (TlistView) es este:
Código Delphi [-]
procedure TpDatos.Button2Click(Sender: TObject);
var
  valores : array[1..100 , 1..100] of longint;
  i,j, valor: longint;

begin
  
  ...


    with rForm.lista.Items.Add do
    begin

    ...
     if Form1.ch3.Checked then
        subItems.Add('Si')
      else
        subItems.Add('No');

      if Form1.ch4.Checked then
        subItems.Add('Si')
      else
        subItems.Add('No');
      SubItems.Add(form1.Label17.Caption);
    ...
    end;

...
end;

A su vez, Label17 parte del formulario 1 y almacena la suma de los precios segun los articulos seleccionados por el cliente. Al hacer clic sobre el boton2 se envia el valor de label17 del formulario 1 directamente a la columna de precios de la lista. Así cada vez que se agregan nuevos articulos, al final, en el oncreate del rForm (ver más arriba), debería sumar esa columna de precios, pero como has visto solo muestra el valor del ultimo elemento introducido en la lista.

Espero haberme explicado mejor ahora. Otra cosa, lo del label17 del formulario 1 que va directamente a la lista del formulario rForm... etc sé que no es lo mas elegante ni lo mas eficiente, pero no conozco otra forma de hacerlo, quiero decir, sin saltar de un form a otro.

Un saludo.

danielmj 13-11-2014 11:57:05

Sigo sin poder sumar nada, y probando cosas, he situado un boton en el formulario y en su evento clic, el siguiente codigo:
Código Delphi [-]
label36.Caption:= lista.Items.Item[3].SubItems[5]

Mi pregunta es ¿tal como está esa linea debería mostrar en el label36, el valor 5 de la columna 3 del listview? por que no entiendo muy bien, y esa linea da error cuando pulso el boton.

La idea es saber si almacena o no valores en la etiqueta y de este modo ver si se suman valores de la lista o no.

Gracias y un saludo.

danielmj 13-11-2014 12:46:15

Hola de nuevo,

he cambiado el codigo a esto:
Código Delphi [-]
procedure TrForm.FormActivate(Sender: TObject);
var
  i: integer;
  total: extended;
  total2: TStringList; //variable de pruebas

begin
  total2.Create;
  for i:= 0 to lista.Items.Count -1 do
    begin
      total2.Add(lista.Items[i].SubItems[9]); //Esta linea da error "access violation"
      total:= total + strToFloat(total2.Text) ; //(StrToFloat(lista.Items.Item[i].SubItems[11]));
      Label35.Caption:= FloatToStr(total);
      label36.Caption:= total2.Text;
    end;
end;

He intentado basarme en este código:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
   i : Integer;
   StrList : TStringList;
begin
   StrList := TStringList.Create;
   StrList.Duplicates := dupIgnore;
   StrList.Sorted := True;
   for i := ListView1.Items.Count-1 downto 0 do
   begin
      if LowerCase(ListView1.Items[i].SubItems[0]) = LowerCase(Edit1.Text) then
         StrList.Add(ListView1.Items[i].SubItems[0])
      else
         ListView1.Items.Delete(i);
   end;
   ShowMessage(StrList.Text);
   StrList.Free;
end;

Que peternece a este post http://www.clubdelphi.com/foros/showthread.php?t=82673, ahí se usa un messagebox para mostrar el valor y yo uso una etiqueta, creo que es la unica diferencia, aun asi, no me funciona. Ni puedosumar los valores de una columna ni me muestra en el label el contenido de una celda de la lista.
Ya estoy desesperao, incluso he cerrado delphi varias veces cabreao y al rato vuelvo a insistir en vano.

En fin, saludos.

ecfisa 13-11-2014 13:54:18

1 Archivos Adjunto(s)
Hola Daniel.
Cita:

Empezado por danielmj (Mensaje 484611)
...
Ya estoy desesperao, incluso he cerrado delphi varias veces cabreao y al rato vuelvo a insistir en vano.

No desesperes que algo va a salir... :)

Revisa el demo que te adjunto a ver si es lo que estás buscando.

Saludos :)

Casimiro Notevi 13-11-2014 13:56:25

Pero, te estás liando tú solo. Divide y vencerás.
Antes pregunté y no has contestado: ¿dónde está el código que da los valores a la lista?, ¿qué valore son?

danielmj 13-11-2014 15:36:56

Hola, Casimiro y ecfisa,

Al primero (casimiro), el código que envia los datos a la lista es este:

Form1. button2.click.... //envia datos al tercer formulario (rForm), que contiene la lista.

Código Delphi [-]
Public
    { Public declarations }

    precios : array[0..8] of Real;
....

procedure TForm1.Button2Click(Sender: TObject);
begin
  case cmbHebillas.ItemIndex of
    0: precios[0]:= 0.30;
    1: precios[1]:= 0.35;
    2: precios[2]:= 0.60;
    3: precios[3]:= 1.00;
    4: precios[4]:= 1.20;
    5: precios[5]:= 1.30;
    6: precios[6]:= 1.70;
    7: precios[7]:= 1.50;
    8: precios[8]:= 1.50;
  end;

  i:= (StrToFloat(label9.Caption)+StrToFloat(label10.Caption)+StrToFloat(label11.Caption)+
  StrToFloat(label12.Caption)+StrToFloat(label13.Caption)+StrToFloat(label14.Caption)+
  StrToFloat(label15.Caption)+StrToFloat(label16.Caption));

  label17.Caption:= FormatFloat('0.00',i); //-----------------------------> Uso una etiqueta para almacenar el valor de i (no sé si será lo mas correcto)
  rForm.Label35.Caption:= FormatFloat('0.00',i*StrToInt(edit1.Text)); //---> Esta etiqueta "label35", es la que tiene que mostrar la suma de todas las cantidades en el rForm (último formulario que contiene la lista)
  pDatos.showModal; //.......................> Siguiente formulario donde se piden los datos de contacto y direcciones. (pDatos)
End;

Segundo formulario (pDatos)
Código Delphi [-]
procedure TpDatos.Button2Click(Sender: TObject);
var
  valores : array[1..100 , 1..100] of longint; //----------> Array para obtener un valor aleatorio que concatenado al telef. del cliente me daría la referencia del pedido.
  i,j, valor: longint;                                  //----------> variables locales para dos "For". Usadas para recorrer el array

begin
  if (cmbProvincia.Text = '') then
    button2.Enabled:= false
  else
    button2.Enabled:= true;

  for i:= 0 to 99 do                                 //-----------> Desde aquí...
    for j:= 0 to 99 do
      begin
        valor:= random(valores[i,j]);
        label8.Caption:= 'R'+IntToStr(valor);
      end;
  with rForm.plista.Items.Add do
    begin
      subItems.Add(mask1.Text+'_'+label8.Caption); //------> ...hasta aquí para generar la referencia del pedido. Y desde aquí empieza a enviar datos a la segunda lista (plista) del siguiente formulario (rForm). 
                                                                                  //Con esta lista no tengo problemas, así que no la comento.
      SubItems.Add(edit1.Text);
      SubItems.add(edit2.Text);
      SubItems.add(edit3.Text);
      SubItems.add(cmbProvincia.Text);
      SubItems.add(mask2.Text);
      SubItems.add(mask1.Text);
    end;

    with rForm.lista.Items.Add do //........................> Desde aquí 
    begin
      subItems.Add(mask1.Text+'_'+label8.Caption);
      SubItems.Add(Form1.cmbHebillas.Text);
      SubItems.add(Form1.Label7.Caption+', '+form1.Label8.Caption);

      if Form1.opc1.Checked then
        subItems.Add(form1.opc1.Caption);

      if Form1.opc2.Checked then
        subItems.Add(form1.opc2.Caption);

      if Form1.opc3.Checked then
        subItems.Add(Form1.opc3.Caption);


      if Form1.ch1.Checked then
        subItems.Add('Si')
      else
        subItems.Add('No');

      if Form1.ch2.Checked then
        subItems.Add('Si')
      else
        subItems.Add('No');

      if Form1.ch3.Checked then
        subItems.Add('Si')
      else
        subItems.Add('No');

      if Form1.ch4.Checked then
        subItems.Add('Si')
      else
        subItems.Add('No');

      SubItems.Add(form1.Label17.Caption);
      SubItems.Append(form1.edit1.Text); //....................> El edit1, envia las cantidades de un mismo articulo a la lista.

    end; //.................................................................> hasta aquí, envía datos a la lista 1 (llamada "lista" en formulario)

  with rForm do
    begin
      Label4.Caption:= edit1.Text;
      Label2.Caption:= mask1.Text+'_'+pDatos.label8.Caption;
      Label6.Caption:= edit2.Text;
      Label8.Caption:= edit3.Text;
      label10.Caption:= cmbProvincia.Text;
      label12.Caption:= mask2.Text;
      label14.Caption:= mask1.Text;
    end;
  rForm.showModal;
End.

Por ultimo el rForm que contiene la lista:
Código Delphi [-]
procedure TrForm.FormActivate(Sender: TObject);
var
  i: integer;
  total: extended;
  total2: TStringList; //variable de pruebas

begin
  total2.Create;
  for i:= 0 to lista.Items.Count -1 do
    begin
      total2.Add(lista.Items[i].SubItems[9]);
      total:= total + strToFloat(total2.Text) ; //(StrToFloat(lista.Items.Item[i].SubItems[11]));
      Label35.Caption:= FloatToStr(total);
      label36.Caption:= total2.Text;
    end;
end;

De este último trozo, label35 no muestra la suma de nada, tan solo el precio del ultimo articulo introducido en la lista. Y la linea que hace mencion a "total2",da error de "access violation"
Ya he probado con todos los indices por si meto alguno que no exista, pero no hay forma.

Espero no haberme liado explicando todo.

Hola ecfisa, ahora me pongo con tu demo, a ver si consigo algo, estuve escribiendo este post antes de mirarlo, en cuanto sepa algo te digo.

Gracias a los dos, con lo que vaya surgiendo os comento, y si empiezo a rallar la pesadez decirmelo eh.
Un saludo.

danielmj 13-11-2014 16:26:29

Hola ecfisa,

He mirado tu demo, la he puesto a andar y tira bien, va sin problemas. Ahora copio y pego tu codigo (el del boton) + la constante maxitem de la seccion implementation, lo acomodo a mi programa, le cambio los nombres de los controles para que no de error y esas cosas y lo que pasa es esto https://www.youtube.com/watch?v=IFnz...ature=youtu.be

Si, he llegado a un punto, que ya no sé que hacer para que funcione el asunto, y he optado por hacer una captura de video y que veais los pasos que sigo hasta que salta la liebre (el error).

Saludos y gracias.

Tu código modificado:

...
implementation
Código Delphi [-]
const
MAXITEMS = 10;
...

procedure TrForm.Button5Click(Sender: TObject);
var
  i: Integer;
  total: Double;
  li: TListItem;

begin
  total:= 0;
  for i:= 0 to MAXITEM -1 do
  begin
    li:= Lista.Items.Item[i];
    total:= total + StrToFloat(li.SubItems[Lista.Columns.Count-1]);
  end;
  label36.Caption:= FormatFloat('0.00', total)
  //ShowMessage(FormatFloat('0.00', total));
end;

ecfisa 13-11-2014 16:45:38

Hola Daniel.

Es que el índice debería ser
Código Delphi [-]
...
  total:= total + StrToFloat(li.SubItems[Lista.Columns.Count-2]);
O dicho de otro modo: Count - 1 - columna 0 (que no usas) , es decir que no sería 9 sino 8.

Saludos :)

danielmj 13-11-2014 17:00:08

Hola ecfisa, he probado a poner ".columns.count -2" pero entonces pasa esto:



Asi que, sigo igual, sin poder sumar nada.

Un saludo y gracias por tu tiempo.

ecfisa 13-11-2014 17:33:04

Hola Daniel.

Acabo de mirar el video, fijate que la constante MAXITEM es un valor arbitrario que usé solo para el ejemplo.

En el video que mostras intenta recorrer diez items cuando sólo hay dos ingresados, deberías usar:
Código Delphi [-]
var
  i: Integer;
  total: Double;
  li: TListItem;
begin
  total:= 0;
  for i:= 0 to ListView1.Items.Count-1 do // (MAXITEM no)
  begin
    li:= ListView1.Items.Item[i];
    total:= total + StrToFloat(li.SubItems[ListView1.Columns.Count-2]);
  end;
  ShowMessage(FormatFloat('0.00', total));
end;

Saludos :)

TiammatMX 13-11-2014 18:02:43

No veo dónde está la complicación..., si en lugar de sumar EL CONTENIDO del TListView en ése momento, sumaras LOS DATOS QUE COMPONEN el TListView mientras lo llenas antes de mostrarlo...

Cuestión de pensar lateralmente para resolver un problema...

danielmj 13-11-2014 18:29:59

Hola ecfisa

muchas gracias!!!! por que no está aquí el icono ese de la cabeza dandose golpes con el pc, sino lo pondría. Por fin ha funcionado, solo he tenido que poner "-3" en el .columns.count para hacer referencia a la columna que guarda las cantidades.
Debo reconocer, que estaba enfrascado en el "lista.items.count" y no le hacia caso al "columns.count" ese tambien ha sido un error por mi parte.

Ahora tengo una pelea nueva con el boton "volver atras" que cuando me lleva de regreso al formulario anterior, limpia la lista y cuando regreso, solo tengo el ultimo elemento añadido, pero bueno eso no me preocupa, en comparacion es un mal menor, que espero resolver pronto.

Muchas gracias otra vez, tanto a ti como a casimiro y a todos los que han prestado su ayuda.
Un saludo.


La franja horaria es GMT +2. Ahora son las 11:37: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