Editar as celulas de um ListView
No listView é possível editar as células da primeira coluna ´Caption´, será que é possível fazer isto com as demais colunas também, tipo como com o DBGrid?
Mkoch
Curtidas 0
Respostas
Marcio.theis
13/10/2005
De uma olhada neste link:
http://www.linhadecodigo.com.br/artigos.asp?id_ac=581
http://www.linhadecodigo.com.br/artigos.asp?id_ac=581
GOSTEI 0
Mkoch
13/10/2005
Valeu pela ajuda, mas não é bem isso não, isso eu já faço, eu gostaria de poder editar o conteúdo carregado no listview, digitando diretamente dentro das suas células como em um DBGrid.
GOSTEI 0
Michael
13/10/2005
Olá!
A dica do colega Márcio não ajudou? Repare bem nela. Para incluir os dados nas demais colunas da ListView, excetuando-se, claro, a primeira, usou-se [b:686ecd8c0b]SubItems.Add[/b:686ecd8c0b]. Vc vc olhar no help do Delphi vai descobrir que SubItems é um objeto do tipo [b:686ecd8c0b]TStrings[/b:686ecd8c0b]. Então, para trocar o conteúdo da segunda coluna, digamos do primeiro item da lista, basta:
[]´s
A dica do colega Márcio não ajudou? Repare bem nela. Para incluir os dados nas demais colunas da ListView, excetuando-se, claro, a primeira, usou-se [b:686ecd8c0b]SubItems.Add[/b:686ecd8c0b]. Vc vc olhar no help do Delphi vai descobrir que SubItems é um objeto do tipo [b:686ecd8c0b]TStrings[/b:686ecd8c0b]. Então, para trocar o conteúdo da segunda coluna, digamos do primeiro item da lista, basta:
ListView1.Items[0].SubItems[0]:= ´String´;
[]´s
GOSTEI 0
Bruno Belchior
13/10/2005
A minha dúvida é: como editar os [b:9db20baa69]SubItens[/b:9db20baa69] assim como edito o caption? ou seja aparecendo um ´edit´ no próprio ListView... acredito que nativamente é possível, caso contrário deveria se chamar ListEditor...
GOSTEI 0
Bruno Belchior
13/10/2005
só corrigindo:[quote:350df39aa1=´Bruno Belchior´]acredito que nativamente [b:350df39aa1][color=red:350df39aa1]não[/color:350df39aa1][/b:350df39aa1] é possível[/quote:350df39aa1]
GOSTEI 0
Fx|hand
13/10/2005
bom, eu posso tah falando uma tremenda bobagem... mais se eu naum me engano, vc consegue localizar ondi q o usuario está clicando...
e por ai vc consegue saber a coluna e o item q o usuario clicou... naum é taum dificil criar uma tedit no meio da listview pro kra poder alterar... =P
deve ter alguma coisa do tipo no torry... =D
boua sorte !
e por ai vc consegue saber a coluna e o item q o usuario clicou... naum é taum dificil criar uma tedit no meio da listview pro kra poder alterar... =P
deve ter alguma coisa do tipo no torry... =D
boua sorte !
GOSTEI 0
Bruno Belchior
13/10/2005
já tinha imaginado essa possibilidade... mas é meio q gambiarra...
GOSTEI 0
Michael
13/10/2005
Olá Bruno!
Existe um componente chamado VirtualTreeView. Embora ele seja essencialmente um TreeView, nada impede que vc o use como um ListView. É o componente do gênero mais sofisticado que eu já trabalhei, free e open-source. Nele vc pode implementar como a edição de cada coluna será feita. O próprio demo que vem com ele traz algo assim.
Para se ter uma idéia da qualidade deste controle, a Borland o incluiu no IDE do Delphi 2005, e deve ter feito o mesmo para a versão 2006. Sempre que vc encontrar uma lista no IDE é ele.
Estou escrevendo um artigo mostrando tudo o que eu sei sobre este componente. Deve sair na ClubeDelphi no início do ano que vem.
O link para download é: http://www.delphi-gems.com/VirtualTreeview/ .
[]´s
Existe um componente chamado VirtualTreeView. Embora ele seja essencialmente um TreeView, nada impede que vc o use como um ListView. É o componente do gênero mais sofisticado que eu já trabalhei, free e open-source. Nele vc pode implementar como a edição de cada coluna será feita. O próprio demo que vem com ele traz algo assim.
Para se ter uma idéia da qualidade deste controle, a Borland o incluiu no IDE do Delphi 2005, e deve ter feito o mesmo para a versão 2006. Sempre que vc encontrar uma lista no IDE é ele.
Estou escrevendo um artigo mostrando tudo o que eu sei sobre este componente. Deve sair na ClubeDelphi no início do ano que vem.
O link para download é: http://www.delphi-gems.com/VirtualTreeview/ .
[]´s
GOSTEI 0
Bruno Belchior
13/10/2005
Já ouvi falar muito bem desse componente (inclusive acho que foi você mesmo Michael que escreveu sobre ele em outro post qualquer) mais analizando a VCL, cheguei a conclusão que realmente não existe maneira de editar outras células nativamente... visto que a própria edição da ´célula caption´ é feita interna pelo SO, sendo enviada apenas uma mensagem para o controle, de outro modo, acredito que só mesmo fazendo uma contorcionismo, como colocar um Edit sobre o controle ou algo do gênero... pessoalmente gosto muito do controle ListView, pois oferece uma interface muito boa para com o usuário...
GOSTEI 0
Khundalini
13/10/2005
Cara, desculpem se eu estiver sendo grosseiro. Mas um TListView não possui células. O que pode ser feito é interceptar onde o usuário clicou e, em tempo de execução, criar um componente de edição (TEdit, TMaskEdit, TDateTimePicker, etc.) dentro da área correspondente à area do subitem clicado.
Sds,
Rubem Rocha
Manaus, AM
Sds,
Rubem Rocha
Manaus, AM
GOSTEI 0
Djpedro
13/10/2005
Olá!
A dica do colega Márcio não ajudou? Repare bem nela. Para incluir os dados nas demais colunas da ListView, excetuando-se, claro, a primeira, usou-se [b:5e797b8279]SubItems.Add[/b:5e797b8279]. Vc vc olhar no help do Delphi vai descobrir que SubItems é um objeto do tipo [b:5e797b8279]TStrings[/b:5e797b8279]. Então, para trocar o conteúdo da segunda coluna, digamos do primeiro item da lista, basta:
[]´s
ListView1.Items[0].SubItems[0]:= ´String´;
Cara, foi mal.. Mandei um email para vc, não tinha visto que não podia enviar direto à vc.
Cara,
Eu estou fazendo um programa em delphi, mas estou encontrando um problema. Meu programa é um controle de laboratórios de informática, então estou fazendo alguns que j´pa conheço, mas precisarei entregar para o cliente... Só que ele pode precisar adicionar máquinas ou laboratórios novos, e ntão preciso gerar ou um script ou uma função para isso seja feito por ele mesmo dinamicamente, sem que ele altere código ou coisa parecida. Dei uma estudada e vi que dá pra fazer em ListView. 8)
GOSTEI 0
Pikkasso
13/10/2005
[quote:1178959060=´FX|HanD´]bom, eu posso tah falando uma tremenda bobagem... mais se eu naum me engano, vc consegue localizar ondi q o usuario está clicando...
e por ai vc consegue saber a coluna e o item q o usuario clicou... naum é taum dificil criar uma tedit no meio da listview pro kra poder alterar... =P
deve ter alguma coisa do tipo no torry... =D
boua sorte ![/quote:1178959060]
Fiz isso com o seguinte codigo:
procedure TForm1.ListView1Click(Sender: TObject);
var
pbRect : TRect;
begin
if MyIte <> -1 then begin
/////////////////Só funciona Maximizado??????????????????????????
Edit2.Parent := ListView1;
pbRect := ListView1.Items[MyIte].DisplayRect(drBounds);
case MySub of
2: begin
pbRect.Left := pbRect.Left + ListView1.Columns[0].Width +
pbRect.Left + ListView1.Columns[1].Width;
pbRect.Right := pbRect.Left + ListView1.Columns[MySub].Width;
end;
3: begin
pbRect.Left := pbRect.Left + ListView1.Columns[0].Width +
pbRect.Left + ListView1.Columns[1].Width +
pbRect.Left + ListView1.Columns[2].Width;
pbRect.Right := pbRect.Left + ListView1.Columns[MySub].Width;
end;
4: begin
pbRect.Left := pbRect.Left + ListView1.Columns[0].Width +
pbRect.Left + ListView1.Columns[1].Width +
pbRect.Left + ListView1.Columns[2].Width +
pbRect.Left + ListView1.Columns[3].Width;
pbRect.Right := pbRect.Left + ListView1.Columns[MySub].Width;
end;
5: begin
pbRect.Left := pbRect.Left + ListView1.Columns[0].Width +
pbRect.Left + ListView1.Columns[1].Width +
pbRect.Left + ListView1.Columns[2].Width +
pbRect.Left + ListView1.Columns[3].Width +
pbRect.Left + ListView1.Columns[4].Width;
pbRect.Right := pbRect.Left + ListView1.Columns[MySub].Width;
end;
end;
if (MySub <> 0) and (MySub <> 1) then begin
Edit2.BoundsRect := pbRect;
try
Edit2.Text := ListView1.Items[MyIte].SubItems[MySub -1];
except
Edit2.Text := ´´;
end;
ItemEdit := MyIte;
SubEdit := MySub;
Edit2.Visible := True;
Edit2.SetFocus;
end;
end;
end;
ItemEdit, MyIte, SubEdit e MySub são variáveis globais que são definidas no evento onMouseMove do ListView.
Esse código tem um problema: Fonciona muito bem quando o form está maximizado, porem quando não o TEdit até fica no tamanho (width e heigh) e na altura (top) do SubItem clicado, porem fica desalinhado horizontalmente (left). O que poderá estar acontecendo?
e por ai vc consegue saber a coluna e o item q o usuario clicou... naum é taum dificil criar uma tedit no meio da listview pro kra poder alterar... =P
deve ter alguma coisa do tipo no torry... =D
boua sorte ![/quote:1178959060]
Fiz isso com o seguinte codigo:
procedure TForm1.ListView1Click(Sender: TObject);
var
pbRect : TRect;
begin
if MyIte <> -1 then begin
/////////////////Só funciona Maximizado??????????????????????????
Edit2.Parent := ListView1;
pbRect := ListView1.Items[MyIte].DisplayRect(drBounds);
case MySub of
2: begin
pbRect.Left := pbRect.Left + ListView1.Columns[0].Width +
pbRect.Left + ListView1.Columns[1].Width;
pbRect.Right := pbRect.Left + ListView1.Columns[MySub].Width;
end;
3: begin
pbRect.Left := pbRect.Left + ListView1.Columns[0].Width +
pbRect.Left + ListView1.Columns[1].Width +
pbRect.Left + ListView1.Columns[2].Width;
pbRect.Right := pbRect.Left + ListView1.Columns[MySub].Width;
end;
4: begin
pbRect.Left := pbRect.Left + ListView1.Columns[0].Width +
pbRect.Left + ListView1.Columns[1].Width +
pbRect.Left + ListView1.Columns[2].Width +
pbRect.Left + ListView1.Columns[3].Width;
pbRect.Right := pbRect.Left + ListView1.Columns[MySub].Width;
end;
5: begin
pbRect.Left := pbRect.Left + ListView1.Columns[0].Width +
pbRect.Left + ListView1.Columns[1].Width +
pbRect.Left + ListView1.Columns[2].Width +
pbRect.Left + ListView1.Columns[3].Width +
pbRect.Left + ListView1.Columns[4].Width;
pbRect.Right := pbRect.Left + ListView1.Columns[MySub].Width;
end;
end;
if (MySub <> 0) and (MySub <> 1) then begin
Edit2.BoundsRect := pbRect;
try
Edit2.Text := ListView1.Items[MyIte].SubItems[MySub -1];
except
Edit2.Text := ´´;
end;
ItemEdit := MyIte;
SubEdit := MySub;
Edit2.Visible := True;
Edit2.SetFocus;
end;
end;
end;
ItemEdit, MyIte, SubEdit e MySub são variáveis globais que são definidas no evento onMouseMove do ListView.
Esse código tem um problema: Fonciona muito bem quando o form está maximizado, porem quando não o TEdit até fica no tamanho (width e heigh) e na altura (top) do SubItem clicado, porem fica desalinhado horizontalmente (left). O que poderá estar acontecendo?
GOSTEI 0
Pikkasso
13/10/2005
Também tenho outra dúvida.
Como faço pro edit sumir quando uso a roda do mouse como scrol (wheel)?
Como faço pro edit sumir quando uso a roda do mouse como scrol (wheel)?
GOSTEI 0