Fórum Adicionando itens em massa no ListView - Através de Memo separado por barras #585930
18/09/2017
0
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.
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
Curtir tópico
+ 0Post mais votado
18/09/2017
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
Gostei + 1
Mais Posts
18/09/2017
Felipe Morais
Gostei + 0
19/09/2017
Lucas Bernieri
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;Gostei + 0
19/09/2017
Felipe Morais
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!
Gostei + 0
19/09/2017
Lucas Bernieri
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.
Gostei + 0
19/09/2017
Felipe Morais
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)