Jump to content
Fórum Script Brasil
  • 0
Sign in to follow this  
Guest --Sérgio --

Desabilitar nodes do treeview

Question

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.

Share this post


Link to post
Share on other sites

6 answers to this question

Recommended Posts

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

Share this post


Link to post
Share on other sites
  • 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

Cloud Computing


  • Forum Statistics

    • Total Topics
      148602
    • Total Posts
      644294
×
×
  • Create New...