Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ayuda con Listbox (https://www.clubdelphi.com/foros/showthread.php?t=86729)

nuxbaster 23-09-2014 20:54:36

Ayuda con Listbox
 
Bueno el detalle es que estoy haciendo una aplicación sencilla que toma el peso de una bascula y muestro los datos en un ListBox pero quiero que me vaya mostrando la suma de los pesos en un label y cada que vaya añadiendo un peso nuevo se vaya actualizando, no soy programador avanzado pero tengo algo de conocimiento he estado leyendo desde ayer pero no logro realizarlo, el dato que me regresa la bascula lo almaceno en una variable String.... Espero su ayuda muchas gracias!.

roman 23-09-2014 21:26:47

Muy sencillo. Cada vez que obtengas el datos de la báscula lo conviertes a entero usando la función StrToInt y el resultado lo sumas a una variable que tengas declarada para tal efecto. Usa la función inversa IntToStr para convertir el total a string y copiarlo al Label...

Eso o espera que alguien te ponga el código completo :)

// Saludos

Casimiro Notevi 23-09-2014 22:49:26

Cita:

Empezado por roman (Mensaje 481952)
Eso o espera que alguien te ponga el código completo :)

Creo que lo mejor es que nuxbaster ponga su código para que lo corrijamos.

nlsgarcia 23-09-2014 23:23:19

nuxbaster,

Cita:

Empezado por nuxbaster
...estoy haciendo una aplicación...toma el peso de una bascula y muestra los datos en un ListBox...quiero que me vaya mostrando la suma de los pesos...cada que vaya añadiendo un peso nuevo se vaya actualizando...

:rolleyes:

¡Bienvenido al Club Delphi!

Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Math;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Label1: TLabel;
    Button1: TButton;
    Edit1: TEdit;
    Label2: TLabel;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// Inicializa la aplicación
procedure TForm1.FormCreate(Sender: TObject);
begin
   Randomize;
   Edit1.ReadOnly := True;
end;

// Simula una Balanza Digital
procedure TForm1.Button1Click(Sender: TObject);
var
   Peso : Double;
begin
   Peso := RoundTo(Random(100) + Random,-2);
   ListBox1.Items.Add(FormatFloat('0.00',Peso));
   Edit1.Text := FormatFloat('0.00',StrToFloatDef(Edit1.Text,0) + Peso);
end;

// Inicializa la Simulación de Balanza Digital
procedure TForm1.Button2Click(Sender: TObject);
begin
   ListBox1.Clear;
   Edit1.Text := EmptyStr;
end;

end.
El código anterior en Delphi 7 sobre Windows 7 Professional x32, permite simular una Balanza Digital, pasar sus valores a un TListBox y visualizar la suma de los mismos de forma automática, como se muestra en la siguiente imagen:



Revisa esta información:
Espero sea útil :)

Nelson.

nuxbaster 23-09-2014 23:54:31

Agradezco a todos su apoyo y comentarios, como les comente no soy programador avanzado, solo entiendo un poco de lógica e investigo pero este detalle ha sido un quebradero de cabeza les dejo las lineas que he colocado, estoy utilizando el Comport y el simulador de balanzas y Delphi XE3
Código Delphi [-]
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, CPort, Vcl.StdCtrls,StrUtils, Vcl.Grids,
  Vcl.ComCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ComPort1: TComPort;
    Button2: TButton;
    ListBox1: TListBox;
    Edit1: TEdit;
    Label1: TLabel;
    Button3: TButton;
    CheckBox1: TCheckBox;
    Label2: TLabel;
    Button4: TButton;
    ListView1: TListView;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure ComPort1RxChar(Sender: TObject; Count: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation


{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
comport1.ShowSetupDialog
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if ComPort1.Connected then
    ComPort1.Close
  else
    ComPort1.Open;
    Application.MessageBox('El puerto ha sido abierto de forma satisfactoria.','Abierto',0);
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  Str: String;
begin
  Str := Edit1.Text;
  if CheckBox1.Checked then
    Str := Str + #13#10;
    ComPort1.WriteStr(Str);
end;

procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var
  Str: String;
  begin

  ComPort1.ReadStr(Str, Count);
  while (length(Str)>1) and (Copy(Str,1,1)='0') do
    delete(Str,1,1);
    if Copy(Str,1,1)='.' then
    Str:= '0' + Str;

    ListBox1.Items.Add(Str);

end;
end.

nuxbaster 25-09-2014 18:39:02

Muy buenos días, quiero me ayuden a revisar el código de sumar los elementos de un listbox,
Código:

var
valorSum:Double;
i:integer;

begin
valorSum := 0;

for i := 0 to ListBox1.Items.Count - 1 do
valorSum := valorSum + StrToFloat(ListBox1.Items[i]);
 label2.Caption:= FloatToStr(valorSum);

Valide el código y si me hace la suma de los valores del listbox cuando los pongo en las propiedades del listbox en string, pero quiero pedirles apoyo ya que los datos me los envía el puerto COM, y los añado al listbox cuando intento hacer la suma de dichos datos me manda is not a valid floating point value

Por su anticipado apoyo muchas gracias!

ecfisa 25-09-2014 19:07:18

Hola nuxbaster.

Podes hacerte una función que te devuelva la sumatoria de cualquier TStrings:
Código Delphi [-]
function SumStrings(ts: TStrings): Double;
var
  i: Integer;
begin
  ts.Text:= Trim(ts.Text); // quitar posibles espacios al inicio o fin
  Result:= 0;
  for i:= 0 to ts.Count-1 do
   try
     Result:= Result + StrToFloat(ts[i]);
   except
     raise Exception.Create('Error de conversión: Existe un valor erróneo');
   end;
end;

Entonces podes usarlo para varios controles:
Código Delphi [-]
  ShowMessage(FloatToStr(SumStrings(ListBox1.Items)));
  ShowMessage(FloatToStr(SumStrings(ComboBox1.Items)));
  ShowMessage(FloatToStr(SumStrings(Memo1.Lines)));

Saludos :)

nuxbaster 25-09-2014 20:37:51

Muchas gracias a todos en especial a ecfisa ya he logrado resolver (con su ayuda) el principal problema sumar los datos de un listbox recibidos por una bascula electronica, adjuntare el codigo resultante y un video. Saludos!!!

nuxbaster 25-09-2014 21:00:07

Anexo código y vídeo del funcionamiento youtu.be/7XIXTsePNX4
Código Delphi [-]
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, CPort, Vcl.StdCtrls,StrUtils, Vcl.Grids,
  Vcl.ComCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ComPort1: TComPort;
    Button2: TButton;
    ListBox1: TListBox;
    Edit1: TEdit;
    Label1: TLabel;
    Button3: TButton;
    Label2: TLabel;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure ComPort1RxChar(Sender: TObject; Count: Integer);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
 function SumStrings(ts: TStrings): Double;
var
  i: Integer;
begin
  ts.Text:= Trim(ts.Text); // quitar posibles espacios al inicio o fin
  Result:= 0;
  for i:= 0 to ts.Count-1 do
   try
     Result:= Result + StrToFloat(ts[i]);
   except
     raise Exception.Create('Error de conversión: Existe un valor erróneo');
   end;
end;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
comport1.ShowSetupDialog
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if ComPort1.Connected then
    ComPort1.Close
  else
    ComPort1.Open;
    Application.MessageBox('El puerto ha sido abierto de forma satisfactoria.','Abierto',0);
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  Str: String;
begin
  Str := Edit1.Text;
  ComPort1.WriteStr(Str);


end;

procedure TForm1.Button4Click(Sender: TObject);
var
i: Integer;
dados: String;
begin

FOR i := -1 + listbox1.Items.Count  downto 0 DO
BEGIN

IF (listbox1.Selected[i]) THEN
BEGIN
dados := InputBox('Modificando ' + listbox1.Items[i],'Nuevo valor : ' ,listbox1.Items[i]);
IF (Trim(dados) <> '') THEN
listbox1.Items[i] := dados;
END;

END;

end;

procedure TForm1.Button5Click(Sender: TObject);
var
i: Integer;
begin

FOR i := -1 + listbox1.Items.Count  downto 0 DO
BEGIN
IF (listbox1.Selected[i]) THEN
listbox1.Items.Delete(i);
END;

end;

procedure TForm1.Button6Click(Sender: TObject);
var
  vlSum:Double;
  i:integer;
begin
  vlSum := 0;

  for i := 0 to ListBox1.Items.Count - 1 do
    vlSum := vlSum + StrToFloat(ListBox1.Items[i]);
    label2.Caption:= FloatToStr(vlSum);
end;

procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var
  Str: String;

  begin

  ComPort1.ReadStr(Str,Count);

    while (length(Str)>1) and (Copy(Str,1,1)='0') do
    delete(Str,1,1);

    if Copy(Str,1,1)='.' then
      Str:= '0'+Str;

      ListBox1.Items.Add(Str);
       label2.Caption:=(FloatToStr(SumStrings(ListBox1.Items))) + ' Kilogramos';





end;
end.


La franja horaria es GMT +2. Ahora son las 20:35:47.

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