Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Ilano

Inserir items de um ListBox em memo quebrando por nº de palavras

Recommended Posts

Olá pessoal,

 

Estou tentando fazer o seguinte:

Numa ListBox tenho todos os campos de uma tabela. Quero passar esses campos para um memo, mas com um detalhe, que sejam jogadas em cada linha 7 palavras, ou seja, sete campos em cada linha para compor um select.

 

Alguém teria uma sugestão?

 

Grato,

 

Ilano.

 


Sendo mais claro, perciso disso:

 

No ListBox tenho os itens:

 

Campo1

Campo2

Campo3

Campo4

Campo5

Campo6

Campo7

Campo8

Campo9

Campo10

Campo11

Campo12

Campo13

Campo14

Campo15

 

Apóes percorrer o ListBox, no memo fique assim:

 

(Na linha 0) SELECT Campo1, Campo2, Campo3, Campo4, Campo5, Campo6, Campo7,

(Na linha 1) Campo8, Campo9, Campo10, Campo11, Campo12, Campo13, Campo14,

(Na linha 2) Campo15 FROM NOME_DA_TABELA

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom pessoal,

 

Fiz um negócio meio estranho, mas funcionou. Se alguém souber como melhorar, o que acredito que tenha como melhorar sim, por favor, esteja à vontade.

 

 


 

procedure TFrmListarCampos.BtnGerarSQLClick(Sender: TObject);
Var
I, C, F : Integer;
pCampos : String;

begin
pCampos:='';
C:=0;
F:=0;
cxListBox1.Items.Clear;
cxSQL.Lines.Clear;

For I:=0 To clbCampos.Items.Count - 1 Do
Begin
If clbCampos.Items.Items.Checked = True Then
C:=C + 1;
ENd;

For I:=0 To clbCampos.Items.Count - 1 Do
Begin
If clbCampos.Items.Items.Checked = True Then
Begin
F:=F + 1;
cxListBox1.Items.Add(clbCampos.Items.Items.Text);
End;
End;

F:=cxListBox1.Items.Count;
C:=0;

For I:=0 To cxListBox1.Items.Count - 1 Do
Begin
pCampos:=pCampos + cxListBox1.Items.Strings + ', ';

If (C >= 7) AND (I < F) Then
Begin
cxSQL.Lines.Add(pCampos);
pCampos:='';
C:=0;
End
Else
If (C <= 7) AND (I = F - 1) Then
Begin
cxSQL.Lines.Add(LeftStr(pCampos, (Length(pCampos) - 2)));
cxSQL.Lines.Add('FROM ' + LbTabela.Caption + ' (NOLOCK)')
End;

C:=C + 1;

End;

cxSQL.Lines.Strings[0]:='SELECT TOP 1000 ' + cxSQL.Lines.Strings[0];
BtnConfirmar.Enabled:=True;

end;

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Colega, seu código ficou um tanto confuso e ficou difícil identificar os componentes que usou.... de todo modo, não precisa usar tantos for para fazer o que quer, 1 só já é o suficiente... vou postar aqui um exemplo que faz a mesma coisa usando um checklistbox e um memo para exibir os dados formatados em sql quando clicar no botão. No checklistbox eu adicionei direto os itens como no exemplo que passou (campo1 ... campo15).

 

 

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    cxSQL: TMemo;
    Button1: TButton;
    clbCampos: TCheckListBox;
    LbTabela: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
Var
  iAux,
  iQtdePalavras : Integer;
  pCampos         : String;

begin
  pCampos         := EmptyStr;
  iQtdePalavras    := 0;
  cxSQL.Lines.Clear;

  For iAux :=0 To clbCampos.Items.Count - 1 Do
  Begin
    If clbCampos.Checked[iAux] = True Then
    begin
       inc(iQtdePalavras);
       //Pegou o primeiro item da linha, logo não precisa jogar a ',' ainda
       if (Trim(pCampos) = EmptyStr) then
           pCampos := 'SELECT TOP 1000 ' + clbCampos.Items.Strings[iAux]
       else
       begin
          //Verifica se já chegou no limite de 7 palavras para decidir o próximo passo
          if (iQtdePalavras) > 7 then
          begin
            //Insere no memo
                        cxSQL.Lines.Add(pCampos + ', ');
                        //recomeça a inserção dos campos na variável auxiliar
            pCampos := clbCampos.Items.Strings[iAux];
            //Reinicia o contador de palavras, agora com 1 para manter o padrão
                        //de quebrar a cada 7 palavras
            iQtdePalavras := 1;
          end
          else  //Se não chegou a 7 palavras, apenas acrescenta a ',' e acumula
            pCampos := pCampos + ', ' + clbCampos.Items.Strings[iAux];
       end;
    end;
  end;
  //Insere os últimos itens selecionados no checklistbox
  cxSQL.Lines.Add(pCampos);
  cxSQL.Lines.Add('FROM ' + LbTabela.Caption + ' (NOLOCK)');
 
//  BtnConfirmar.Enabled:=True;
end;

end.
 

 

Rodando o teste, obtive o resultado abaixo no memo, selecionando os 15 itens.

 

 

SELECT TOP 1000 Campo1, Campo2, Campo3, Campo4, Campo5, Campo6, Campo7,
Campo8, Campo9, Campo10, Campo11, Campo12, Campo13, Campo14,
Campo15
FROM TabTeste (NOLOCK)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beleza Chrnos,

 

Já implementei no meu projeto, deu certinho!

Realmente ficou bem melhor, fora que você explicou com riqueza de detalhes todas as linhas.

 

obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

O nosso mal é sair programando sem pensar no melhor meio pra isso rs.... mas se funcionou e entendeu o conceito que usei, então está ótimo rs... qualquer coisa estamos ai pra ajudar. :coolio:

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.