Guest --Sérgio -- Postado Abril 3, 2008 Denunciar Share Postado Abril 3, 2008 É possível habilitar ou desabilitar apenas alguns nodes do treeview?Em um primeiro caso, precisaria deixar apenas um node e dois dosseus filhos habilitados e o resto todo desabilitado. Assim que umacondição for satisfeita, a situação se inverteria. Esses três tornarian-sedesabilitados e o resto habilitado. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Abril 3, 2008 Denunciar Share Postado Abril 3, 2008 É possível habilitar ou desabilitar apenas alguns nodes do treeview?Acho que não é possivel, mas é possivel adicionar e excluir nodes em tempo de execução.abraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Abril 4, 2008 Denunciar Share Postado Abril 4, 2008 É possível habilitar ou desabilitar apenas alguns nodes do treeview?Sérgio, não há opção nativa para isto, mas é possível implementar. Eu implementei em uma árvore com apenas um nível (uso como menu em conjunto com TNoteBooks).A idéia é manipular alguns eventos e fazer uso da propriedade Data (um pointer), que normalmente não é utilizada. Caso você a use, deve adaptar o tipo de dados que você armazena nela para conter mais esta informação.Vou deixar a função para habilitar/desabilitar toda a arvore, o que é bem simples, para você ter uma idéia: atribuindo False à Data para desabilitar e True para habilitar:procedure TForm1.EnableAllNodes(ShowNodes :Boolean); var Idx :Integer; begin for Idx := 1 to TreeView1.Items.Count -1 do TreeView1.Items.Item[Idx].Data := Pointer(ShowNodes); TreeView1.Refresh; end; entretanto, no caso de utilizar em sub-niveis, talvez seja necessário criar uma função recursiva para isto ou, talvez, você simplesmente não permita que o nó pai seja expandido - depende da sua aplicação. No evento CustomDrawItem tratamos a questão visual: procedure TForm1.TreeView1CustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean); begin if Boolean(Node.Data) then // habilitado begin if cdsSelected in State then TreeView1.Canvas.Font.Color := clWhite else TreeView1.Canvas.Font.Color := clBlack; end else // desabilitado TreeView1.Canvas.Font.Color := clGray; end; No evento OnChanging, determinamos se o nó pode ou não ser selecionado, baseado no valor que armazenamos na propriedade Data: procedure TForm1.TreeView1Changing(Sender: TObject; Node: TTreeNode; var AllowChange: Boolean); begin AllowChange := Boolean(Node.Data); end; Se você manipular a propriedade Selected do TreeView no evento OnShow, talvez seja necessário desabilitar o evento OnChanging (foi o meu caso), porque, eventualmente, você terá este nó desabilitado. Então, se for necessário para você, o código deve ter esta sequência: procedure TForm1.FormShow(Sender: TObject); begin TreeView1.OnChanging := nil; TreeView1.Selected := TreeView1.Items[0]; // seleciona o 1º nó TreeView1.OnChanging := TreeView1Changing; ... end; No meu caso, ao incluir um novo registro, o método EnableAllNodes é chamado com False e após a gravação dos dados principais, é chamado com True, habilitando todas as opções. Voce pode mudar o estado de um nó diretamente simplesmente alterando a sua propriedade Data: TreeView1.Items.Item[2].Data := Pointer(False); TreeView1.Refresh;A idéia é mais ou menos esta. Agora é questão de trabalhar nela.Abraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest --Sérgio -- Postado Abril 4, 2008 Denunciar Share Postado Abril 4, 2008 Oi Micheus, oi Jonas, obrigado pelas suas colaborações. Talvez meu problema seja mais simples do que vocês estão pensando. Meu formulário é composto de umTreeview, um Pagecontrol e um conjunto de botões. Do lado esquerdo tenho,verticalmente o treeview, do lado direito e ocupando uma boa parte do formulárioo pagecontrol e abaixo do pagecontrol, um conjunto de botões. Esse pagecontroltem várias abas. cada aba correspondendo a um procedimento da minha aplicaçãocadastro de clientes, fornecedores, contas à pagar e etc. Meu Treeview contem omenu principal da minha aplicaçãoLogin--|______ Longon--|______ Logout--|______ ExitCadastros--|_______clientes--|_______Fornecedores--|_______ FuncionáriosFinanceiro--|-- Pagar--|-- RceberetdO que desejo é que quando a aplicação se inicie, somente Logon e exiteestejam habilitados. Após o logon, este deve se indisponibilizar e,dependendo do usuário que se logar, apenas as opções pertinentes àele, deverão ficar acessíveis. Tipo para os vendedores somente cadastro de clientes e as opções de vendas, permanecendo,por exemplo, o financeiro desabilitado.Um detalhe, as abas do PageControl ficam escondidas em tempode execução Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Abril 8, 2008 Denunciar Share Postado Abril 8, 2008 Talvez meu problema seja mais simples do que vocês estão pensando. ...Do lado esquerdo tenho, verticalmente o treeview, do lado direito e ocupando uma boa parte do formulárioo pagecontrol e abaixo do pagecontrol, um conjunto de botões. Esse pagecontroltem várias abas. cada aba correspondendo a um procedimento da minha aplicaçãocadastro de clientes, fornecedores, contas à pagar e etc. Meu Treeview contem omenu principal da minha aplicaçãoÉ basicamente o que eu disse que tenho, apenas você utilizou TPageControl e eu TNoteBook; usou treeview muiti-niveis e eu um único nível!O que desejo é que quando a aplicação se inicie, somente Logon e exiteestejam habilitados.não é o caso de dasabilitar todos e habilitar apenas a opção desejada?Após o logon, este deve se indisponibilizar e,dependendo do usuário que se logar, apenas as opções pertinentes àele, deverão ficar acessíveis.não seria o caso de desabilitar tudo e habilitar apenas a opção desada?Então, como dissemos antes, não existe a opção "Enabled = False" para os itens do TTreeview. Então, se você acho complicado o que eu postei, não tem como ser mais simples.Tudo que você precisa para fazer este menu está nas anotações que coloquei. Algum detalhe pode ser adaptado, mas tudo o que postei você vai precisar.Talvez se você implementar ele você veja o resultado e então tente adaptar a sua necessidade.Um detalhe, as abas do PageControl ficam escondidas em tempo de execuçãoisto não é relevante.Abraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest --Sérgio -- Postado Abril 9, 2008 Denunciar Share Postado Abril 9, 2008 Oi Micheus, o problema é que a instrução: TreeView1.Items.Item[idx].Data := Pointer(ShowNodes);Estando ShowNodes como falso ou verdadeiro não atuasobre meu treeview. Os Nodes não são desabilitados, permanecendo suas funções OnClick, ativas em qualquer doscasos. Não sei, talvez falte alguma coisa. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Abril 9, 2008 Denunciar Share Postado Abril 9, 2008 Oi Micheus, o problema é que a instrução: TreeView1.Items.Item[idx].Data := Pointer(ShowNodes);Estando ShowNodes como falso ou verdadeiro não atuasobre meu treeview. Os Nodes não são desabilitados, permanecendo suas funções OnClick, ativas em qualquer doscasos. Não sei, talvez falte alguma coisa.que tal você postar o código dos eventos que você está utilizando para tratar o treeview, daí a gente tenta ver o que falta. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Guest --Sérgio --
É possível habilitar ou desabilitar apenas alguns nodes do treeview?
Em um primeiro caso, precisaria deixar apenas um node e dois dos
seus filhos habilitados e o resto todo desabilitado. Assim que uma
condição for satisfeita, a situação se inverteria. Esses três tornarian-se
desabilitados e o resto habilitado.
Link para o comentário
Compartilhar em outros sites
6 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.