Somar em uma listbox e exibir em um campo edit
Possuo uma listbox com várias linhas e colunas e um campo edit, todos possuem conteúdo do tipo float.
Ao criar uma nova linha, o campo edit precisa somar o conteúdo da coluna 5, ou seja, a coluna 5 vai ter números em todas as linhas e esta soma deve ser exibida no campo edit.
Alguém sabe como somar o conteúdo desta coluna e exibir em um campo edit?
Ao criar uma nova linha, o campo edit precisa somar o conteúdo da coluna 5, ou seja, a coluna 5 vai ter números em todas as linhas e esta soma deve ser exibida no campo edit.
Alguém sabe como somar o conteúdo desta coluna e exibir em um campo edit?
Mcsmarmcs
Curtidas 0
Respostas
Adriano Santos
25/04/2007
Possuo uma listbox com várias linhas e colunas e um campo edit, todos possuem conteúdo do tipo float.
Ao criar uma nova linha, o campo edit precisa somar o conteúdo da coluna 5, ou seja, a coluna 5 vai ter números em todas as linhas e esta soma deve ser exibida no campo edit.
Alguém sabe como somar o conteúdo desta coluna e exibir em um campo edit?
Como você está fazendo pra montar as colunas no listbox? São colunas mesmo? Tabulação?
Talvez seja mais prático usar um TListView, mais fácil. Olha um exemplo:
[list:77d0c65111]
[*:77d0c65111] Poe na tela 3 Edits (edtDescricao, edtValor, edtSoma), 1 Button e 1 ListView (lstValores).
[*:77d0c65111] Clica duas vezes no ListView e adiciona 2 colunas. Uma descrição e a outra Valor. A primeira com 190 de Width e a segunda com 90. Configura a segunda pra Aliment = taRightJustify.
[*:77d0c65111] No codigo do botão coloque:
procedure TForm1.Button1Click(Sender: TObject); procedure AdicionarValor(ADesc, AValor: string); var Item : TListItem; begin with lstValores do begin Item := Items.Add; Item.Caption := ADesc; Item.SubItems.Add(AValor); end; end; function Somar: Double; var I : integer; Vlr : Double; begin Vlr := 0; for I := 0 to lstValores.Items.Count - 1 do Vlr := Vlr + StrToFloat(lstValores.Items[I].SubItems[0]); Result := Vlr; end; begin AdicionarValor(edtDescricao.Text, edtValor.Text); edtSoma.Text := FormatFloat(´,.´, Somar); end;
[/list:u:77d0c65111]
Você vai ter algo como isso aqui:
[URL=http://img339.imageshack.us/my.php?image=listviewnz9.jpg][img:77d0c65111]http://img339.imageshack.us/img339/1373/listviewnz9.th.jpg[/img:77d0c65111][/URL]
GOSTEI 0
Mcsmarmcs
25/04/2007
Parece uma forma interessante de se fazer, mas no momento estou trabalhando com tabulação.
GOSTEI 0
Rogick
25/04/2007
dá p/ colocar um preview da tela ou o código p/ vermos?
Mas eu acho melhor vc criar uma classe do tipo TObject e uma lista(TList ou TStringList p/ manipular estas informações, a ListBox só irá exibir o conteúdo desta lista e vc terá um poder de manipulação maior sobre as informações
Mas posta o q vc tá fazendo p/ eu ter uma idéia de como t ajudar melhor
Mas eu acho melhor vc criar uma classe do tipo TObject e uma lista(TList ou TStringList p/ manipular estas informações, a ListBox só irá exibir o conteúdo desta lista e vc terá um poder de manipulação maior sobre as informações
Mas posta o q vc tá fazendo p/ eu ter uma idéia de como t ajudar melhor
GOSTEI 0
Mcsmarmcs
25/04/2007
Esse é o código.
procedure Tfrmvenda.btnexecutarClick(Sender: TObject);
const
// Numero maximo de TABs
MAX_TABS = 4;
Tab = #9;
var
Tabulators: array[0..MAX_TABS] of Integer;
begin
if DBLookupComboBox1.Text=´´ then
begin
DBLookupComboBox1.SetFocus;
MessageDlg(´Todos os campos marcados com ´*´ devem ser preenchidos!´, mtInformation,[mbOk], 0);
end
else
begin
Panel2.Enabled:=true;
Panel10.Enabled:=false;
btnexecutar.Enabled:=false;
Tabulators[0] := 50;
Tabulators[1] := 50;
Tabulators[2] := 50;
Tabulators[3] := 50;
Tabulators[4] := 50;
Listbox1.TabWidth := 1;
// Seta TABs no TListbox
SendMessage(ListBox1.Handle, LB_SETTABSTOPS, MAX_TABS, Longint(@Tabulators));
with dm.qryteste do
begin
Active:=false;
SQL.Clear;
SQL.Add(´SELECT COUNT(*) FROM vendas;´);
Active:=true;
end;
dbedit9.text:= floattostr(strtofloat(DBEdit11.text)+1);
DBEdit5.text:=´0´;//somente para calcular o acumulador
Listbox1.Items.Add(´Data: ´+(dbedit6.text)+tab+´Hora: ´+(dbedit7.text)+tab+´Nota Fiscal: ´+(dbedit9.text)+tab+´´+tab+´´);
Listbox1.Items.Add(´Código´+tab+´Descrição´+tab+´Valor Unit.´+tab+´Quantidade´+tab+´Valor Total´ );
dbedit10.Text:=dm.qryloginnome.Value;
dbedit1.DataField:=´´;
dbedit4.DataField:=´´;
dbedit2.SetFocus;
end;
end;
procedure Tfrmvenda.btnexecutarClick(Sender: TObject);
const
// Numero maximo de TABs
MAX_TABS = 4;
Tab = #9;
var
Tabulators: array[0..MAX_TABS] of Integer;
begin
if DBLookupComboBox1.Text=´´ then
begin
DBLookupComboBox1.SetFocus;
MessageDlg(´Todos os campos marcados com ´*´ devem ser preenchidos!´, mtInformation,[mbOk], 0);
end
else
begin
Panel2.Enabled:=true;
Panel10.Enabled:=false;
btnexecutar.Enabled:=false;
Tabulators[0] := 50;
Tabulators[1] := 50;
Tabulators[2] := 50;
Tabulators[3] := 50;
Tabulators[4] := 50;
Listbox1.TabWidth := 1;
// Seta TABs no TListbox
SendMessage(ListBox1.Handle, LB_SETTABSTOPS, MAX_TABS, Longint(@Tabulators));
with dm.qryteste do
begin
Active:=false;
SQL.Clear;
SQL.Add(´SELECT COUNT(*) FROM vendas;´);
Active:=true;
end;
dbedit9.text:= floattostr(strtofloat(DBEdit11.text)+1);
DBEdit5.text:=´0´;//somente para calcular o acumulador
Listbox1.Items.Add(´Data: ´+(dbedit6.text)+tab+´Hora: ´+(dbedit7.text)+tab+´Nota Fiscal: ´+(dbedit9.text)+tab+´´+tab+´´);
Listbox1.Items.Add(´Código´+tab+´Descrição´+tab+´Valor Unit.´+tab+´Quantidade´+tab+´Valor Total´ );
dbedit10.Text:=dm.qryloginnome.Value;
dbedit1.DataField:=´´;
dbedit4.DataField:=´´;
dbedit2.SetFocus;
end;
end;
GOSTEI 0
Rogick
25/04/2007
Esse é o código.
procedure Tfrmvenda.btnexecutarClick(Sender: TObject);
const
// Numero maximo de TABs
MAX_TABS = 4;
Tab = #9;
var
Tabulators: array[0..MAX_TABS] of Integer;
begin
if DBLookupComboBox1.Text=´´ then
begin
DBLookupComboBox1.SetFocus;
MessageDlg(´Todos os campos marcados com ´*´ devem ser preenchidos!´, mtInformation,[mbOk], 0);
end
else
begin
Panel2.Enabled:=true;
Panel10.Enabled:=false;
btnexecutar.Enabled:=false;
Tabulators[0] := 50;
Tabulators[1] := 50;
Tabulators[2] := 50;
Tabulators[3] := 50;
Tabulators[4] := 50;
Listbox1.TabWidth := 1;
// Seta TABs no TListbox
SendMessage(ListBox1.Handle, LB_SETTABSTOPS, MAX_TABS, Longint(@Tabulators));
with dm.qryteste do
begin
Active:=false;
SQL.Clear;
SQL.Add(´SELECT COUNT(*) FROM vendas;´);
Active:=true;
end;
dbedit9.text:= floattostr(strtofloat(DBEdit11.text)+1);
DBEdit5.text:=´0´;//somente para calcular o acumulador
Listbox1.Items.Add(´Data: ´+(dbedit6.text)+tab+´Hora: ´+(dbedit7.text)+tab+´Nota Fiscal: ´+(dbedit9.text)+tab+´´+tab+´´);
Listbox1.Items.Add(´Código´+tab+´Descrição´+tab+´Valor Unit.´+tab+´Quantidade´+tab+´Valor Total´ );
dbedit10.Text:=dm.qryloginnome.Value;
dbedit1.DataField:=´´;
dbedit4.DataField:=´´;
dbedit2.SetFocus;
end;
end;
Eu não entendi direito, esses DBEdits estão vinculados a q DataSet? É ao [b:cc3239dcd9]dm.qryteste[/b:cc3239dcd9]? E aonde exatamente vc joga os valores p/ a listBox? Pelo o q vi, vc tá só montando o cabeçalho. Pode mostrar aqui uma lista preenchida? É só criar um botão e colocar este código nele
... ListBox1.SaveToFile(´c:\lista.txt´); ...
Ai abrir o arquivo gerado e copiar o conteúdo p/ cá p/ q eu possa ter uma idéia melhor do q vc tá fazendo
Abraços, Rogick
GOSTEI 0
Rogick
25/04/2007
Esse é o código.
procedure Tfrmvenda.btnexecutarClick(Sender: TObject);
const
// Numero maximo de TABs
MAX_TABS = 4;
Tab = #9;
var
Tabulators: array[0..MAX_TABS] of Integer;
begin
if DBLookupComboBox1.Text=´´ then
begin
DBLookupComboBox1.SetFocus;
MessageDlg(´Todos os campos marcados com ´*´ devem ser preenchidos!´, mtInformation,[mbOk], 0);
end
else
begin
Panel2.Enabled:=true;
Panel10.Enabled:=false;
btnexecutar.Enabled:=false;
Tabulators[0] := 50;
Tabulators[1] := 50;
Tabulators[2] := 50;
Tabulators[3] := 50;
Tabulators[4] := 50;
Listbox1.TabWidth := 1;
// Seta TABs no TListbox
SendMessage(ListBox1.Handle, LB_SETTABSTOPS, MAX_TABS, Longint(@Tabulators));
with dm.qryteste do
begin
Active:=false;
SQL.Clear;
SQL.Add(´SELECT COUNT(*) FROM vendas;´);
Active:=true;
end;
dbedit9.text:= floattostr(strtofloat(DBEdit11.text)+1);
DBEdit5.text:=´0´;//somente para calcular o acumulador
Listbox1.Items.Add(´Data: ´+(dbedit6.text)+tab+´Hora: ´+(dbedit7.text)+tab+´Nota Fiscal: ´+(dbedit9.text)+tab+´´+tab+´´);
Listbox1.Items.Add(´Código´+tab+´Descrição´+tab+´Valor Unit.´+tab+´Quantidade´+tab+´Valor Total´ );
dbedit10.Text:=dm.qryloginnome.Value;
dbedit1.DataField:=´´;
dbedit4.DataField:=´´;
dbedit2.SetFocus;
end;
end;
Eu não entendi direito, esses DBEdits estão vinculados a q DataSet? É ao [b:518ea0d96b]dm.qryteste[/b:518ea0d96b]? E aonde exatamente vc joga os valores p/ a listBox? Pelo o q vi, vc tá só montando o cabeçalho. Pode mostrar aqui uma lista preenchida? É só criar um botão e colocar este código nele
... ListBox1.SaveToFile(´c:\lista.txt´); ...
Ai abrir o arquivo gerado e copiar o conteúdo p/ cá p/ q eu possa ter uma idéia melhor do q vc tá fazendo
Abraços, Rogick
GOSTEI 0
Mcsmarmcs
25/04/2007
Deixa pra lá, vou tentar outro método.
Obrigado pela paciência.
Obrigado pela paciência.
GOSTEI 0
Rogick
25/04/2007
Vc pode fazer isso com uma StringGrid e configurá-la para não exibir as linhas da grade e selecionar as linhas todas na prop Option mudando as seguintes opções:
goFiexdVertLine = False
goFiexdHorzLine = False
goRowSelect = True
goRangeSelect = False
Assim vc poderá manipular célula por célula da StringGrid por meio da prop [b:1976137dbd]Cells[/b:1976137dbd] e ter um visual d ListBox, se vc fizer uma arrumação direita o resultado será mto bom 8)
Boa programação p/ vc :wink:
goFiexdVertLine = False
goFiexdHorzLine = False
goRowSelect = True
goRangeSelect = False
Assim vc poderá manipular célula por célula da StringGrid por meio da prop [b:1976137dbd]Cells[/b:1976137dbd] e ter um visual d ListBox, se vc fizer uma arrumação direita o resultado será mto bom 8)
Boa programação p/ vc :wink:
GOSTEI 0
Rogick
25/04/2007
Oops, errei no [b:323a1d0ad9]Options[/b:323a1d0ad9] os parametros corretos são esses:
goFiexedVertLine = False
goFiexedHorzLine = True
goVertLine = False
goHorzLine = False
goRowSelect = True
goRangeSelect = False
goEdit = False
Agora sim vai ficar um negócio direito.
Abraços
goFiexedVertLine = False
goFiexedHorzLine = True
goVertLine = False
goHorzLine = False
goRowSelect = True
goRangeSelect = False
goEdit = False
Agora sim vai ficar um negócio direito.
Abraços
GOSTEI 0