Ir para conteúdo
Fórum Script Brasil
  • 0

Desabilitar nodes do treeview


Guest --Sérgio --

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

  • 0
É 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

Link para o comentário
Compartilhar em outros sites

  • 0
Guest --Sérgio --

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 um

Treeview, 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ário

o pagecontrol e abaixo do pagecontrol, um conjunto de botões. Esse pagecontrol

tem várias abas. cada aba correspondendo a um procedimento da minha aplicação

cadastro de clientes, fornecedores, contas à pagar e etc. Meu Treeview contem o

menu principal da minha aplicação

Login

--|______ Longon

--|______ Logout

--|______ Exit

Cadastros

--|_______clientes

--|_______Fornecedores

--|_______ Funcionários

Financeiro

--|-- Pagar

--|-- Rceber

etd

O que desejo é que quando a aplicação se inicie, somente Logon e exite

estejam 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 tempo

de execução

Link para o comentário
Compartilhar em outros sites

  • 0
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ário

o pagecontrol e abaixo do pagecontrol, um conjunto de botões. Esse pagecontrol

tem várias abas. cada aba correspondendo a um procedimento da minha aplicação

cadastro de clientes, fornecedores, contas à pagar e etc. Meu Treeview contem o

menu 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 exite

estejam 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ção
isto não é relevante.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
Guest --Sérgio --

Oi Micheus, o problema é que a instrução:

TreeView1.Items.Item[idx].Data := Pointer(ShowNodes);

Estando ShowNodes como falso ou verdadeiro não atua

sobre meu treeview. Os Nodes não são desabilitados,

permanecendo suas funções OnClick, ativas em qualquer dos

casos. Não sei, talvez falte alguma coisa.

Link para o comentário
Compartilhar em outros sites

  • 0
Oi Micheus, o problema é que a instrução:

TreeView1.Items.Item[idx].Data := Pointer(ShowNodes);

Estando ShowNodes como falso ou verdadeiro não atua

sobre meu treeview. Os Nodes não são desabilitados,

permanecendo suas funções OnClick, ativas em qualquer dos

casos. 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.

Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...