Fórum TreeView Editável.. É possível?? #238434
18/06/2004
0
Minha TreeView está assim:
Texto |-Igual |- x
Eu tava querendo saber se tem jeito do usuário escrever nessa treeView, mais precisamente no lugar do [b:e6b2e6873d]X[/b:e6b2e6873d]. Ou se tem algum componente melhor pra fazer isto....
Qualquer Ajuda é muito bem vinda...
Lucas!
Lucas Silva
Curtir tópico
+ 0Posts
18/06/2004
Vinicius2k
Escrever na TreeView é relativamente simples, mas o que eu não entendi é se vai haver interação do usuário em informar qual item ele quer editar (através de seleção)...
Se sim, por exemplo :
procedure TForm1.Button1Click(Sender: TObject); begin TreeView1.Items[TreeView1.Selected.AbsoluteIndex].Text:= Edit1.Text; end;
Se não vc precisará armazenar em uma variável o AbsoluteIndex do node que vc quer editar e aplicar no Items[xxx] da rotina acima...
É isso q vc precisa?
T+
Gostei + 0
18/06/2004
Lucas Silva
O que eu estou querendo é o usuario clicar e alterar um dado na treeview,
se possível escrevendo nela mesmo....
Vamos supor que eu tenha a treeview:
Nome |- Igual |- Lucas
Tem jeito de clicar na palavra [b:22f9e6eb61]Lucas[/b:22f9e6eb61], e sair editando???
Não sei se isso é possível...
Gostei + 0
18/06/2004
Vinicius2k
Acho que seria melhor para esta situação vc procurar por algum componente de 3º que tenha esta funcionalidade...
T+
Gostei + 0
18/06/2004
Lucas Silva
Valeu...
Vou dar uma procurada aqui...
Gostei + 0
18/06/2004
Nildo
TreeView1.Selected.EditText;
Gostei + 0
18/06/2004
Vinicius2k
:oops: comprovado que eu estava enganado...
pensando bem, seria muito estranho a TreeView não ter este recurso mesmo...
Gostei + 0
18/06/2004
Xanatos
Gostei + 0
18/06/2004
Michael
O componente TTreeView tem a propriedade ReadOnly que define se os labels dos seus itens serão editáveis ou não. Se esta propriedade for setada para false, então quando o usuário der um clique sobre um ítem selecionado da lista o Windows permitirá a sua edição. Uma desvantagem decorrente deste procedimento é que todos os ítens poderão ser alterados pelo usuário. Em alguns casos é necessário que apenas determinados itens sejam editáveis, e outros não. Infelizmente os objetos TTreeNode não tem uma propriedade ReadOnly individual, o que facilitaria em muito o trabalho. Mas como pessoalmente o Delphi é a ferramenta mais flexivél que existe, nada o que um pouco de código não resolva não é?
Imagine que você tenha o seguinte TreeView:
Cadastro |- Dados pessoais |- Nome |- Michael Benford
Apenas o nome ´Michael Benford´ deveria ser editável, e não os outros. Para que isso seja possível, basta adicionar no evento OnClick do TreeView:
procedure TForm1.TreeView1Click(Sender: TObject);
begin
{ Evita que seja gerado um erro de Access Violation se nada foi selecionado }
if TreeView1.Selected = nil then exit;
TreeView1.ReadOnly := not (TreeView1.Selected.Level = 3);
end;
O ´macete´ aqui é utilizar a propriedade Level do TTreeNode para saber em qual nível nosso ítem está localizado. Como a contagem começa de 0, então nosso nome está no nível 3. Existem outras maneiras de se obter o mesmo resultado, como utilizar a propriedade ImageIndex do TreeNode, caso você defina uma imagem personalizada para esse nível. Você ainda poderia utilizar também outra propriedade, HasChildren, que informa se o ítem tem ´filhos´ ou não. Assim, somente os ítens do último nível serão editados. Nosso exemplo ficaria assim:
procedure TForm1.TreeView1Click(Sender: TObject);
begin
{ Evita que seja gerado um erro de Access Violation se nada foi selecionado }
if TreeView1.Selected = nil then exit;
TreeView1.ReadOnly := TreeView1.Selected.HasChildren;
end;
Esta abordagem talvez seja a mais prática, mas somente, como já dito, os últimos ítens serão editáveis. A vantagem é que você não terá que se preocupar em contar os nívels (Levels) de cada ítem.
Espero ter ajudado amigo! Qualquer dúvida, estamos aí.
Abraços!
Gostei + 0
18/06/2004
Lucas Silva
Funcionou legal...
Só mais uma dúvida aqui.
procedure TForm1.TreeView1Click(Sender: TObject);
begin
{ Evita que seja gerado um erro de Access Violation se nada foi selecionado }
if TreeView1.Selected = nil then exit;
if TreeView1.Selected.Level = 2 then
TreeView1.Selected.EditText;
end;Com este código quando clico no nivel 2 do TV ele deixa para a edição.
Quando digito alguma coisa e clico em outro TreeNode ele não sai (fica com o foco só no TreeNode editável (de nível 2) ), a não ser que eu dê um enter no TreeNode de nível 2, e depois clique em outro TreeNode;
Alguem já passou por isto??
Lucas!
Gostei + 0
18/06/2004
Vinicius2k
o que o colega xanatos sugeriu eu sabia, mas imaginei que vc não quisesse tornar todos os ítens editáveis...
bem, então pode-se aliar a isso a ténica do colega michel, mas talvez de uma forma mais simples...
sem usar o OnClick... seria o método convencional do windows de um click depois outro para entrar em edição (não duplo)... vc protegeria o nível que pode ser editado no evento OnEditing, dessa forma, por exemplo:
procedure TForm1.TreeView1Editing(Sender: TObject; Node: TTreeNode; var AllowEdit: Boolean); begin if Node.Level < 2 then AllowEdit:= False; //só permite edição no level 3 end;
também pode usar a leitura da propriedade HasChildrens para permitir a edição apenas de quem não tem filhos, ou seja, o último...
creio que ficaria sem este problema que vc está enfrentando agora...
T+
Gostei + 0
18/06/2004
Xanatos
if Node.ImageIndex <> 1 then AllowEdit:= false;
8)
Gostei + 0
18/06/2004
Lucas Silva
Este código que você me passou ai 2k, tem um problema (não é bem um problema), o usuário tem que abrir o node, clicar em cima dele 2 vezes, e ai sim ele abre para edição...
Teria jeito que resolver isto?
Gostei + 0
18/06/2004
Michael
procedure TForm1.TreeView1Click(Sender: TObject);
{$J+}
const UltimoItemEditado : TTreeNode = nil;
{$J-}
begin
{ Evita que seja gerado um erro de Access Violation se nada foi selecionado }
if TreeView1.Selected = nil then exit;
{ Permite a edição apenas se o item selecionado estiver no nivel 2 }
TreeView1.ReadOnly := not (TreeView1.Selected.Level = 2);
if not TreeView1.ReadOnly and (TreeView1.Selected <> UltimoItemEditado) then
begin
UltimoItemEditado := TreeView1.Selected;
TreeView1.Selected.EditText;
end;
end;
Era assim que você queria que funcionasse?
Ao amigo Vinicius2k: meu nome é Michael, e não Michel! ;-)
Abraços!
Gostei + 0
18/06/2004
Lucas Silva
Agora só falta alguns ajustes aqui..
Qual é a função dos [b:cb97f79fec]{$J+} [/b:cb97f79fec]e [b:cb97f79fec]{$J-}[/b:cb97f79fec]
{$J+}
const UltimoItemEditado : TTreeNode = nil;
{$J-} Notei que se não colocar dá um erro de código.
Gostei + 0
18/06/2004
Nildo
no evento OnEditing você coloca assim:
AllowEdit := (Condicao);
E você pode usar o objeto NODE deste evento. Por exemplo:
AllowEdit := ( Node.text = ´tal´ );
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)