Ir para conteúdo
Fórum Script Brasil
  • 0

Somar Em Uma Listbox E Exibir Em Um Campo Edit


mcsmarmcs

Pergunta

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?

Link para o comentário
Compartilhar em outros sites

15 respostass a esta questão

Posts Recomendados

  • 0
O listbox tem colunas sim e trabalha com tabulação, já o listview eu não sei trabalhar.

O stringgrid eu não conheço, em que paleta ele está?

Paleta "Aditional".

Voce provavelmente está adicionando as tabulações concatenando o texto a ser incluído no ListBox, é isto?

Link para o comentário
Compartilhar em outros sites

  • 0

Opa

É realmente o Listbox tem colunas mas é muito horrivel trabalhar com elas assim,

não há como pegar a coluna em si, e pra adicioná-las tem que fazer tipo

Listbox1.TabWidth := 50;

ListBox1.Items.Add('Coluna 1'#9'Coluna 2'#9'Coluna 3') ;

ListBox1.Items.Add('Item 1 da Coluna 1'#9'Item 1 da Coluna 2'#9'Item 1 da Coluna 3') ;

ListBox1.Items.Add('Item 2 da Coluna 1'#9'Item 2 da Coluna 2'#9'Item 2 da Coluna 3') ;

Ou usar um ^I ao invés de #9

Você adiciona os items as colunas assim?

Mas realmente é aconselhável você utilizar ou um StringGrid ou um ListView porque

se realmente for do jeito que falei não da pra trabalhar, até da mais do pior modo ashuashu

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
A tabulação á assim mesmo. você tem algum tutorial explicando como trabalhar com StringGrid ou ListView ?
mcsmarmcs, vou dar umas dicas do StringGrid, o ListView deixo com o Churc porque eu ainda não utilizei ele. :rolleyes:

No StringGrid você pode definir o número de linhas e colunas já em design-time: propriedades ColCount e RowCount; Se você vai popular as linhas em run-time, a sugestão é que você defina RowCount com 2 (uma para o "header" e outra para a 1ªlinha de dados). Este mínimo é obrigatório para ter o header, do contrário - definir 1 - você não terá o "header"; O número de colunas, parece-me que você sabe de ante-mão, então, basta defini-la na propriedade ColCount lembrando de somar o número de colunas fixas, caso haja;

O "header" da linha e da coluna são definidos pelas propriedades FixedCols e FixedRows, respectivamente. Acredito que você terá apena o "header" das colunas, logo você define FixedRows=1 e FixedCols=0;

O texto que será mostrado no "Header" é definido em run-time (no código), basta que você atribua-o à cada coluna na linha 0 (zero).

Um StringGrid é, digamos assim, uma matriz de strings que você acessa via propriedade Cells[Col, Row]. Mas você também pode vê-la de outro modo, como uma matriz de TStrings, já que você tem uma lista de linhas e uma lista de colunas do tipo TStrings. Neste caso você acessa elas através da propriedade Rows e Cols. Digamos que você quer acessar/processar todas as linhas da 4ª coluna de seu StringGrid, então você faz um loop varrendo a lista TString daquela coluna, como segue:

var
  IdxRow :Integer;
  Valor :Double;
begin
  Valor := 0;
 // o 1º elemento da linha é o header, então começamos de 1 (não de zero)
 // da mesma forma, a 4ª coluna corresponde ao item 3, já que a lista começa em 0
  for IdxRow := 1 to StringGrid1.Cols[3].Count -1 do
    Valor := Valor + (StrToFloat(StringGrid1.Cols[3].Strings[IdxRow]);
  ShowMessage('Valor total da 4ªcoluna: ' +FloatToStr(Valor));'
end;
observe que o for, poderia também ficar assim:
...
  for IdxRow := 1 to StringGrid1.RowCount -1 do
    Valor := Valor + (StrToFloat(StringGrid1.Cells[3, IdxRow]));
(Se não errei nada, é claro. hehehe) A adição ou remoção de linhas do StringGrid, é feita através da propriedade RowCount, basta aumentar ou diminuir. Após adicionar uma linha, você pode incluir os campos de forma bem simples, já que você tem as informações separadas. Por ex. para adicionar os dados da linha 1:
StringGrid1.Lines[1].Strings[0] := '01/10/2007';
StringGrid1.Lines[1].Strings[1] := 'Batatinha';
StringGrid1.Lines[1].Strings[2] := '20Kg';
ou
StringGrid1.Cells[0, 1] := '01/10/2007';
StringGrid1.Lines[1, 1] := 'Batatinha';
StringGrid1.Lines[2, 1] := '20Kg';

fica a seu gosto.

A dimensão de cada coluna, você poder fazer em design-time, apenas posicionando o cursor, no header, sobre as divisas e clicando e arrastanto. Em run-time, você deve utilizar a propriedade ColWidths[idx], onde cada posição Idx define a largura da coluna, de maneira similar, você pode modificar a altura das linhas via propriedade RowHeights.

Outras propriedades que você pode querer mexer são: ScrollBars e Options (essa em especial, permite que você defina características sobre seleção e edição)

O resto é você mexer nas propriedades e observar, a maioria fala por si. Qualquer detalhe, basta selecionar a propriedade e pressionar F1.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Bom dia,

Estou trabalhando com stringrid(Delphi7) importando uma planilha do Excel. Está funcionando tudo legal, ou seja, o usuário digita o nome ou o cnpj do cliente e ele é localizado no stringrid, inclusive ficando destacado com uma cor diferente. No entanto, como a lista de clientes é grande, eu necessito que, ao localizar o cliente, o stringgrid seja "rolado" e o exiba na tela. Como faço isso?

Link para o comentário
Compartilhar em outros sites

  • 0

exemplo:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, Grids;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    function Pesquisar(Valor : String; Coluna : Integer = 0) : Integer;
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.Pesquisar(Valor : String; Coluna : Integer = 0) : Integer;
var I : Integer;
begin
  Result := -1;
  for I := 0 to StringGrid1.RowCount - 1 do
  begin
    if (StringGrid1.Cells[Coluna,I] = Valor) then
    begin
      Result := I;
      Break;
    end;
  end;
end;


procedure TForm1.BitBtn1Click(Sender: TObject);
var
  Linha : Integer;
begin
  Linha := Pesquisar('20',1);
  if (Linha <> -1) then
    StringGrid1.Row := Linha;
end;

end.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

ok... tente isso então

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  Linha : Integer;
begin
  Linha := Pesquisar('20',1); // valor e coluna 
  if (Linha <> -1) then
    begin
      StringGrid1.Rows[linha].IndexOf('20'); 
      StringGrid1.Row := linha;
    end;

end;

OBS: o 20 é o valor que ele vai procurar na celula e mostrar ( vai rolar o stringgrid até a posição )

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Bom dia,

Quero te agradecer por estar me ajudando, mas infelizmente não funcionou. Não sei se preciso modificar o valor de alguma propriedade do stringgrid, mas realmente ele não rola o stringrid de jeito nenhum. Aqui vai todo meu código para você analisar. Mas uma vez te agradeço.

unit UPrincipal;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Comobj, StdCtrls, DB, ADODB, Buttons, ExtCtrls, Registry, Printers, Grids,
Math, ShlObj, ActiveX, DateUtils, ClipBrd, Shellapi, Winsock, Tlhelp32,
Mask;
type
TFormPrincipal = class(TForm)
StringGrid1: TStringGrid;
BotaoImportar: TBitBtn;
BotaoSair: TBitBtn;
OpenDialog1: TOpenDialog;
lbl1: TLabel;
lbl2: TLabel;
medtCNPJ: TMaskEdit;
lbl3: TLabel;
BotaoConsultar: TBitBtn;
RG1: TRadioGroup;
medtCPF: TMaskEdit;
EditNome: TEdit;
EditResCodigo: TEdit;
EditResNome: TEdit;
EditResDoc: TEdit;
BotaoNovaConsulta: TBitBtn;
procedure BotaoImportarClick(Sender: TObject);
procedure RG1Click(Sender: TObject);
procedure BotaoSairClick(Sender: TObject);
procedure BotaoConsultarClick(Sender: TObject);
procedure medtCPFClick(Sender: TObject);
procedure medtCNPJClick(Sender: TObject);
procedure EditNomeClick(Sender: TObject);
procedure BotaoNovaConsultaClick(Sender: TObject);
private
function XlsToStringGrid(XStringGrid: TStringGrid; xFileXLS: string): Boolean;
function Pesquisar(Valor : String; Coluna : Integer = 0) : Integer;
{ Private declarations }
public
{ Public declarations }
Result1 : integer;
aux : string;
end;
var
FormPrincipal: TFormPrincipal;
pColuna : integer;
implementation
{$R *.dfm}
function TFormPrincipal.Pesquisar(Valor : String; Coluna : Integer = 0) : Integer;
var I, auxiliar : Integer;
begin
Result := -1;
auxiliar := StringGrid1.RowCount - 1;
showmessage('Auxiliar: ' + inttostr(auxiliar));
showmessage('Coluna: ' + inttostr(coluna));
showmessage('Valor: ' + valor);
//showmessage('Celula: ' + StringGrid1.Cells[Coluna,I]);
for I := 0 to auxiliar do
begin
//showmessage('Celula: ' + StringGrid1.Cells[Coluna,I]);
if (StringGrid1.Cells[Coluna,I] = Valor) then
begin
Result := I;
Break;
end;
end;
end;
function Fecha_exe(ExeFileName: variant): Integer;
const
PROCESSSO_FINALIZA = $0001;
var
ContinuaLoop: BOOL;
FAquivo: THandle;
FProcessoEntrada: TProcessEntry32;
begin
Result := 0;
FAquivo := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessoEntrada.dwSize := SizeOf(FProcessoEntrada);
ContinuaLoop := Process32First(FAquivo, FProcessoEntrada);
while Integer(ContinuaLoop) <> 0 do
begin
if ((UpperCase(ExtractFileName(FProcessoEntrada.szExeFile)) =
UpperCase(ExeFileName)) or (UpperCase(FProcessoEntrada.szExeFile) =
UpperCase(ExeFileName))) then
Result := Integer(TerminateProcess(
OpenProcess(PROCESSSO_FINALIZA,
BOOL(0), FProcessoEntrada.th32ProcessID), 0));
ContinuaLoop := Process32Next(FAquivo, FProcessoEntrada);
end;
CloseHandle(FAquivo);
end;
Function TFormPrincipal.XlsToStringGrid(xStringGrid: TStringGrid; xFileXLS: string): boolean;
const
xlCellTypeLastCell = $0000000B;
tfontstyle = (fsbold);
var
XLSAplicacao, AbaXLS: OLEVariant;
RangeMatrix: Variant;
x, y, k, r, i: Integer;
begin
i := stringgrid1.Row;
if i = 1 then
begin
stringgrid1.Canvas.Font.Style := [ ];
end;
Result := False;
// Cria Excel- OLE Object
XLSAplicacao := CreateOleObject('Excel.Application');
try
// Esconde Excel
XLSAplicacao.Visible := False;
// Abre o Workbook
XLSAplicacao.Workbooks.Open(xFileXLS);
AbaXLS := XLSAplicacao.Workbooks[ExtractFileName(xFileXLS)].WorkSheets[1];
AbaXLS.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
// Pegar o número da última linha
x := XLSAplicacao.ActiveCell.Row;
// Pegar o número da última coluna
y := XLSAplicacao.ActiveCell.Column+1;
// Seta xStringGrid linha e coluna
XStringGrid.RowCount := x-1;
XStringGrid.ColCount := y;
// Associaca a variant WorkSheet com a variant do Delphi
RangeMatrix := XLSAplicacao.Range['A1', XLSAplicacao.Cells.Item[x, y]].Value;
// Cria o loop para listar os registros no TStringGrid
k := 1;
repeat
for r := 1 to y do
XStringGrid.Cells[®, (k-1)] := RangeMatrix[k, r];
stringgrid1.cells[0, k] := inttostr(k);
inc(k, 1);
until k > x;
RangeMatrix := Unassigned;
finally
// Fecha o Excel
If not VarisEmpty(XLSAplicacao) then
begin
XLSAplicacao.Quit;
XLSAplicacao := Unassigned;
AbaXls := Unassigned;
Result := true;
end;
end;
end;
procedure TFormPrincipal.BotaoImportarClick(Sender: TObject);
begin
if OpenDialog1.Execute then
XlsToStringGrid(StringGrid1,OpenDialog1.FileName);
Fecha_exe('excel.exe');
lbl1.Visible := true;
editNome.Visible :=true;
lbl2.Visible := true;
lbl3.Visible := true;
RG1.Visible := true;
BotaoConsultar.Visible := true;
end;
procedure TFormPrincipal.RG1Click(Sender: TObject);
begin
if rg1.itemindex = 0 then
begin
medtCNPJ.Visible := true;
medtCPF.Visible := false
end
else
begin
medtCPF.Visible := true;
medtCNPJ.Visible := false
end
end;
procedure TFormPrincipal.BotaoSairClick(Sender: TObject);
begin
lbl1.Visible := false;
editNome.Visible := false;
lbl2.Visible := false;
lbl3.Visible := false;
RG1.Visible := false;
BotaoConsultar.Visible := false;
medtCNPJ.Visible := false;
medtCPF.Visible := false;
end;
procedure TFormPrincipal.BotaoConsultarClick(Sender: TObject);
var
i, j, Linha : Integer;
pvalor : string;
begin
Result1 := 0;
if editNome.Text <> '' then
pvalor := editNome.Text
else
if medtCNPJ.Visible = True then
pvalor := medtCNPJ.Text
else
pvalor := medtCPF.Text;
j := StringGrid1.RowCount - 1;
//messagebox(Stringgrid1.Handle,PChar('Indice atual '+inttostr(j)+' Pcoluna '+inttostr(pcoluna)),PChar('CONFIRMAÇÃO'), 0+64);
with Stringgrid1 do
begin
for i := 1 to j do begin
aux := StringGrid1.Cells[pColuna,i];
if pvalor = aux then begin
Result1 := I;
Selection := TGridRect( Rect(0, result1, 4, result1) );
Linha := Pesquisar(inttostr(result1),0); // valor e coluna
showmessage(inttostr(linha));
if (Linha <> -1) then
begin
StringGrid1.Rows[0].IndexOf(inttostr(result1));
StringGrid1.Row := linha;
showmessage('Entrou');
end;
lbl1.Visible := false;
editNome.Visible := false;
lbl2.Visible := false;
medtCNPJ.Visible := false;
lbl3.Visible := false;
medtCPF.Visible := false;
RG1.Visible := false;
BotaoConsultar.Visible := false;
BotaoNovaConsulta.Visible := true;
editrescodigo.Visible := true;
editresnome.Visible := true;
editresdoc.Visible := true;
editrescodigo.Text := StringGrid1.Cells[1,i];
editresnome.Text := StringGrid1.Cells[2,i];
editresdoc.Text := StringGrid1.Cells[3,i];
messagebox(Stringgrid1.Handle,PChar('CLIENTE ENCONTRADO! '+#13+#13+'Poderá vê-lo abaixo, e também na lista que está em ordem alfabética, usando a barra de rolagem, se necessário.'),PChar('CONFIRMAÇÃO'), 0+64);
Break;
end
end;
if result1 = 0 then
MessageBox(Stringgrid1.Handle,pchar('Cliente Não encontrado.'),PChar('CONSULTA'),0);
end;
end;
procedure TFormPrincipal.medtCPFClick(Sender: TObject);
begin
editNome.Text := '';
medtCNPJ.Text := '';
medtCPF.Text := '';
pcoluna := 3;
end;
procedure TFormPrincipal.medtCNPJClick(Sender: TObject);
begin
editNome.Text := '';
medtCNPJ.Text := '';
medtCPF.Text := '';
pcoluna := 3;
end;
procedure TFormPrincipal.EditNomeClick(Sender: TObject);
begin
editNome.Text := '';
medtCNPJ.Text := '';
medtCPF.Text := '';
pcoluna := 2;
end;
procedure TFormPrincipal.BotaoNovaConsultaClick(Sender: TObject);
begin
editrescodigo.Visible := false;
editresnome.Visible := false;
editresdoc.Visible := false;
BotaoNovaConsulta.Visible := false;
lbl1.Visible := true;
editNome.Visible := true;
lbl2.Visible := true;
lbl3.Visible := true;
RG1.Visible := true;
rg1.ItemIndex := -1;
BotaoConsultar.Visible := true;
end;
end.
Link para o comentário
Compartilhar em outros sites

  • 0

voce verificou se está entrando nesse IF ? qual é o valor do Result1 que voce está procurando nas celulas ?


    if pvalor = aux then begin
      Result1 := I;
      Selection := TGridRect( Rect(0, result1, 4, result1) );
       Linha := Pesquisar(inttostr(result1),0); // valor e coluna
        showmessage(inttostr(linha));
        if (Linha <> -1) then
          begin
            StringGrid1.Rows[0].IndexOf(inttostr(result1));
            StringGrid1.Row := linha;
            showmessage('Entrou');
          end;

OBS: Se tiver dúvidas quanto a rolagem do stringgrid, faça o teste somente com o código que te passei

coloque 30 linhas no stringgrid para que apareça a barra de rolagem, e depois coloque valores na coluna 1, e faça o teste

vai percerber que ele rola até o valor que voce mandou pesquisar e encontrou no stringgrid

abraço

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...