GARANTIR DESCONTO

Fórum Somar em uma listbox e exibir em um campo edit #340948

25/04/2007

0

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?


Mcsmarmcs

Mcsmarmcs

Responder

Posts

26/04/2007

Adriano Santos

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]


Responder

Gostei + 0

26/04/2007

Mcsmarmcs

Parece uma forma interessante de se fazer, mas no momento estou trabalhando com tabulação.


Responder

Gostei + 0

26/04/2007

Rogick

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


Responder

Gostei + 0

26/04/2007

Mcsmarmcs

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;


Responder

Gostei + 0

27/04/2007

Rogick

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


Responder

Gostei + 0

27/04/2007

Rogick

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


Responder

Gostei + 0

27/04/2007

Mcsmarmcs

Deixa pra lá, vou tentar outro método.
Obrigado pela paciência.


Responder

Gostei + 0

27/04/2007

Rogick

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:


Responder

Gostei + 0

27/04/2007

Rogick

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


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar