PDA

Ver la Versión Completa : Ayuda con Listbox


nuxbaster
23-09-2014, 20:54:36
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
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,


...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:

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:

http://i42.photobucket.com/albums/e305/nlsgarcia/Balanza_Digital_zps53901c47.jpg

Revisa esta información:

1- Libros y tutoriales para aprender Delphi (http://www.clubdelphi.com/foros/showthread.php?t=85907)

2- Guía de estilo de los foros (http://www.clubdelphi.com/foros/guiaestilo.php)

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
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, 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:

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:

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
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.