Hola.
Este es un modo en que podes hacer lo que buscas:
Código Delphi
[-]
...
implementation
uses contnrs;
type
TFldClass = class
Id : Integer; Desc: string;
Prec: Double;
end;
var
lst: TObjectList;
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;
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 ); end;
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; Desc: string;
Prec: Double;
end;
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;
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 ); end;
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