Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   seleccionados de un checkboxlist y sumar en un label (https://www.clubdelphi.com/foros/showthread.php?t=92019)

rafaelon 02-07-2017 23:25:07

seleccionados de un checkboxlist y sumar en un label
 
hola , tengo la siguiente duda tengo varios elementos en un checkboxlist los cuales se alimentan de una tabla "trabajos" tiene 3 campos "ID_trabajos", "Descripción" y "precio" , el problema es que en el checkboxlist solo tengo que muestre la descripción y lo que quisiera es que lo que seleccione en el checkboxlist segun el precio que tiene en la tabla se sume y se muestre en un label, gracias

ecfisa 03-07-2017 01:53:33

Hola.

Este es un modo en que podes hacer lo que buscas:
Código Delphi [-]
...
implementation

uses contnrs; // TObjectList

type
  TFldClass = class
    Id  : Integer;   // ( por si lo necesitas + adelante )
    Desc: string;
    Prec: Double;
  end;

var
  lst: TObjectList;

// Carga Id, descripcion y precio en lista
procedure TForm1.FormCreate(Sender: TObject);
var
  FC  : TFldClass;
begin
  lst := TObjectList.Create;

  CheckListBox1.Clear;
  Query.Close;
  Query.SQL.Text := 'SELECT ID_TRABAJOS, DESCRIPCION, PRECIO FROM TRABAJOS';
  Query.Open;

  while not Query.Eof do
  begin
    FC := TFldClass.Create;
    FC.Id   := Query.FieldByName( 'ID_TRABAJOS' ).AsInteger;
    FC.Desc := Query.FieldByName( 'DESCRIPCION' ).AsString;
    FC.Prec := Query.FieldByName( 'PRECIO' ).AsFloat;
    lst.Add( FC );
    CheckListBox1.Items.AddObject( Query.FieldByName( 'DESCRIPCION' ).AsString, FC );
    Query.Next;
  end;
end;

// Muestra suma de precios de items seleccionados
procedure TForm1.btnShowSumClick(Sender: TObject);
var
  i   : Integer;
  tot  : Double;
begin
  tot  := 0;
  for i := 0 to CheckListBox1.Items.Count - 1 do
    if CheckListBox1.Checked[i] then
      tot := tot + TFldClass( lst[i] ).Prec;
  LabelTotal.Caption := FloatToStr( tot );  // Suma en LabelTotal
end;

// Liberar lista
procedure TForm1.FormDestroy(Sender: TObject);
begin
  lst.Free;
end;

Y, si no te importa liberar la lista manualmente (ya que TStrings no lo hará de forma automática), podes prescindir del uso de TObjectList:
Código Delphi [-]
...
implementation

type
  TFldClass = class
    Id  : Integer;   // ( por si lo necesitas + adelante )
    Desc: string;
    Prec: Double;
  end;

// Carga Id, descripcion y precio en lista
procedure TForm1.FormCreate(Sender: TObject);
var
  FC  : TFldClass;
begin

  CheckListBox1.Clear;
  Query.Close;
  Query.SQL.Text := 'SELECT ID_TRABAJOS, DESCRIPCION, PRECIO FROM TRABAJOS';
  Query.Open;

  while not Query.Eof do
  begin
    FC := TFldClass.Create;
    FC.Id   := Query.FieldByName( 'ID_TRABAJOS' ).AsInteger;
    FC.Desc := Query.FieldByName( 'DESCRIPCION' ).AsString;
    FC.Prec := Query.FieldByName( 'PRECIO' ).AsFloat;
    CheckListBox1.Items.AddObject( Query.FieldByName( 'DESCRIPCION' ).AsString, FC );
    Query.Next;
  end;
end;

// Muestra suma de precios de items seleccionados
procedure TForm1.btnShowSumClick(Sender: TObject);
var
  i   : Integer;
  tot  : Double;
begin
  tot  := 0;
  for i := 0 to CheckListBox1.Items.Count - 1 do
    if CheckListBox1.Checked[i] then
      tot := tot + TFldClass( CheckListBox1.Items.Objects[i] ).Prec;
  LabelTotal.Caption := FloatToStr( tot );  // Suma en LabelTotal
end;

// Liberar lista
procedure TForm1.FormDestroy(Sender: TObject);
var
  i : Integer;
begin
  for i := 0 to CheckListBox1.Items.Count - 1 do
    CheckListBox1.Items.Objects[i].Free;
end;

Saludos :)

rafaelon 03-07-2017 03:24:21

gracias por la respuesta ,me da error al declarar TFldClass = class

ecfisa 03-07-2017 04:15:32

Hola

No tendría por que dar error, pero no sé si será requisito en las nuevas versiones de Delphi... a ver, intenta declarando la clase así:
Código Delphi [-]
type
  TFldClass = class( TObject )
    Id  : Integer;   // ( por si lo necesitas + adelante )
    Desc: string;
    Prec: Double;
  end;
Estoy casi seguro que no es el problema, pero si aún así sigue dandote error, por favor copia y pega textualmente como lo estas implementando.

Saludos :)

AgustinOrtu 03-07-2017 05:16:59

No, no es requisito declarar el ancestro cuando se define una nueva clase, en ese caso obvio que se asume un descendiente de TObject.

rafaelon 03-07-2017 16:12:57

era mi error ya corre bien y funciona, solo que lo estaba declarando el class donde no correspondia , gracias de nuevo


La franja horaria es GMT +2. Ahora son las 11:21:27.

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