Fórum TreeView Editável.. É possível?? #238434

18/06/2004

0

Bom dia Pessoal,


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

Lucas Silva

Responder

Posts

18/06/2004

Vinicius2k

Lucas,

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+


Responder

Gostei + 0

18/06/2004

Lucas Silva

2k,
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...


Responder

Gostei + 0

18/06/2004

Vinicius2k

Entendi... bem, com o TreeView convencional não conheço... e me arriscaria a dizer q não tem jeito, mas posso estar enganado...

Acho que seria melhor para esta situação vc procurar por algum componente de 3º que tenha esta funcionalidade...

T+


Responder

Gostei + 0

18/06/2004

Lucas Silva

Entendi... bem, com o TreeView convencional não conheço... e me arriscaria a dizer q não tem jeito, mas posso estar enganado... Acho que seria melhor para esta situação vc procurar por algum componente de 3º que tenha esta funcionalidade... T+


Valeu...
Vou dar uma procurada aqui...


Responder

Gostei + 0

18/06/2004

Nildo

Lucas, use o método:

TreeView1.Selected.EditText;


Responder

Gostei + 0

18/06/2004

Vinicius2k

Lucas, use o método: TreeView1.Selected.EditText;


:oops: comprovado que eu estava enganado...
pensando bem, seria muito estranho a TreeView não ter este recurso mesmo...


Responder

Gostei + 0

18/06/2004

Xanatos

Bom...nao precisa de mudar nada pra editar é só mudar a propriedade readonly para false! e voce mudar como um arquivo ou pasta do windows!


Responder

Gostei + 0

18/06/2004

Michael

Olá amigo Lucas!

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!


Responder

Gostei + 0

18/06/2004

Lucas Silva

Ótimo pessoal...
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!


Responder

Gostei + 0

18/06/2004

Vinicius2k

Lucas,
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+


Responder

Gostei + 0

18/06/2004

Xanatos

Ou voce pode usar o ImageIndex como se fosse uma tag e no evento onEditing!

  if Node.ImageIndex <> 1 then
    AllowEdit:= false;


8)


Responder

Gostei + 0

18/06/2004

Lucas Silva

Gostaria que quando o usuário abrisse o Node ele já viria em codições de edição.
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?


Responder

Gostei + 0

18/06/2004

Michael

Para fazer o que você quer precisamos salvar o item que está selecionado e então verificar no momento da edição se ele não foi o último membro da TreeView que foi modificado: Eis o procedimento adequado para o seu propósito Lucas:

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!


Responder

Gostei + 0

18/06/2004

Lucas Silva

Funcionou sim.
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.


Responder

Gostei + 0

18/06/2004

Nildo

voce quer editar com condição? é facil...

no evento OnEditing você coloca assim:

AllowEdit := (Condicao);

E você pode usar o objeto NODE deste evento. Por exemplo:

AllowEdit := ( Node.text = ´tal´ );


Responder

Gostei + 0

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

Aceitar