GARANTIR DESCONTO

Fórum Adicionando itens em massa no ListView - Através de Memo separado por barras #585930

18/09/2017

0

Boa tarde,

Estou tentando adicionar itens em massa em um ListView.

Preciso colocar o texto de um Memo separado por barras (/) como itens e subitens nesse ListView.

Exemplo:
Texto digitado no Memo:
João da Silva/Curitiba - PR
Maria Oliveira/São Paulo - SP
Roberto Silva
Pedro Miranda/Porto Alegre - RS


Na primeira coluna do ListView ficariam os nomes e na segunda as cidades (nem sempre a cidade será citada).

Como eu poderia fazer isso? Parece algo simples, porém só encontrei exemplos complexos na internet.
Lucas Bernieri

Lucas Bernieri

Responder

Post mais votado

18/09/2017

Boa noite, Lucas, espero que este código te ajude:

procedure TForm1.Button1Click(Sender: TObject);
var
  MemoLine, Separator: string;
  ListItem: TListItem;
  i, SeparatorPos: Integer;
begin
  Separator := '/';

  ListView1.Items.BeginUpdate;
  ListView1.Clear;

  try
    //Percorre linhas do Memo;
    for i := 0 to Memo1.Lines.Count do
    begin
      //Armazena cada linha do Memo na variável MemoLine;
      MemoLine := Memo1.Lines[i];

      // Pra cada linha do Memo, cria um item/linha na ListView;
      ListItem := ListView1.Items.Add;

      //Pega a posição do separador (que é a barra "/") na linha armazenada;
      SeparatorPos := Pos(Separator, MemoLine);

      // Se tiver barra, procede assim
      if (SeparatorPos > 1) then
      begin
        //Copia o valor desde o início da string até a posição da barra - 1;
        ListItem.Caption := Copy(MemoLine, 1, SeparatorPos - 1);

        // Apaga o conteúdo copiado e inserido na ListView;
        Delete(MemoLine, 1, SeparatorPos);

        // Adiciona o restante da string na segunda coluna da ListView;
        ListItem.SubItems.Add(Copy(MemoLine, 1, SeparatorPos - 1))
      end
      else
      begin
        // Se não tem barra, apenas insere a linha do Memo na ListView;
        ListItem.Caption := MemoLine;
      end;
    end;
  finally
    ListView1.Items.EndUpdate;
  end;
end;

Felipe Morais

Felipe Morais
Responder

Gostei + 1

Mais Posts

18/09/2017

Felipe Morais

Lembrando: sua ListView tem que ter duas colunas e propriedade "ViewStyle" tem que ser "vsReport".
Responder

Gostei + 0

19/09/2017

Lucas Bernieri

Obrigado Moraissan, dei uma incrementada e funcionou quase 100%.

Só deu um probleminha: quando eu insiro um item com um número 9 de caracteres (por exemplo), no subitem o procedimento insere os mesmos 9 caracteres (se houver mais caracteres os itens são cortados e inseridos na próxima linha.

Qual poderiam ser a solução pra esse problema?

procedure TFrmAdicionarVarios.BtnAdicionarTudoClick(Sender: TObject);
var
  MemoLine, Separator: string;
  i, SeparatorPos: Integer;
begin
//Define a variável Separator com o separador escolhido
  case RGrpSeparador.ItemIndex of
  0:  Separator := #9; {Separado por Tabulações}
  1:  Separator := ';';
  2:  Separator := '/';
  3:  Separator := '|';
  4:  Separator := EdtSeparator.Text; {Outro: Separador digitado no Edit}
  end;


  FrmMain.LstvTemplates.Items.BeginUpdate;
  try
    //Percorre linhas do Memo;
    for i := 0 to MmAdicionarVarios.Lines.Count-1 do
    begin
      //Armazena cada linha do Memo na variável MemoLine;
      MemoLine := MmAdicionarVarios.Lines[i];

      // Pra cada linha do Memo, cria um item/linha na ListView;
      ListItem := FrmMain.LstvTemplates.Items.Add;

      //Pega a posição do separador escolhido na linha armazenada;
      SeparatorPos := Pos(Separator, MemoLine);

      // Se tiver separador, procede assim
      if (SeparatorPos > 1) then
        begin
        //Copia o valor desde o início da string até a posição do separador - 1;
        ListItem.Caption := Copy(MemoLine, 1, SeparatorPos - 1);

        // Apaga o conteúdo copiado e inserido na ListView;
        Delete(MemoLine, 1, SeparatorPos);

        // Adiciona o restante da string na segunda coluna da ListView;
        ListItem.SubItems.Add(Copy(MemoLine, 1, SeparatorPos - 1));
        end
      else
        begin
        // Se não tem separador, apenas insere a linha do Memo na ListView;
        ListItem.Caption := MemoLine;
        end;
    end;
  finally
    FrmMain.LstvTemplates.Items.EndUpdate;
  end;
Responder

Gostei + 0

19/09/2017

Felipe Morais

Bom dia, Lucas

Se isto está acontecendo deve ser por causa do separador escolhido. Você já debugou pra ver o que retorna?
Se o código que postei inicialmente funcionou, curte lá, abraços!
Responder

Gostei + 0

19/09/2017

Lucas Bernieri

Muito obrigado, curti tua resposta.
O código está 100%
Descobri que o problema estava no Memo que ao colar textos muito grandes quebrava a linha, fazendo com que o programa interpretasse uma nova linha como novo item.

Solução: Mudar a propriedade ScrollBars do Memo para ssBoth.
Responder

Gostei + 0

19/09/2017

Felipe Morais

Boa, garoto!
Responder

Gostei + 0

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

Aceitar