Ajuda com treeview

Delphi

28/01/2011

Amigos do fórum boa noite, Venho até o fórum solicitar uma ajuda. Tenho o seguinte treeview :         node := Tree1.Items.add(nil, QuDireitosCampo.AsString);
        if (copy(QuDireitosDireito.AsString, 1, 1) = '0') or (copy(QuDireitosDireito.AsString, 1, 1) = '1') then
           Begin
             Tree1.Items.AddChild(node, 'Inclui');
             Node.Item[0].ImageIndex := StrToInt(copy(QuDireitosDireito.AsString, 1, 1));
           End;         if (copy(QuDireitosDireito.AsString, 2, 1) = '0') or (copy(QuDireitosDireito.AsString, 2, 1) = '1') then
          begin
            Tree1.Items.AddChild(node, 'Altera');
            Node.Item[1].ImageIndex := StrToInt(copy(QuDireitosDireito.AsString, 2, 1));
          end;
  Até aí ok, tudo funcionando, o que está pegando é na hora de dar duplo click nele, está apresentando o erro de list of bounds(0), como se o treeview estivesse vazio. A treeview está carregada, só não entendo o porque disto. Alguem poderia me ajudar? Obrigado. Abaixo códigos que ja tentei, mas sem sucesso.   procedure TTeste.Tree1DblClick(Sender: TObject);
Begin //if Node.Item[Node.SelectedIndex].ImageIndex = 1 then
//    Node.Item[1].ImageIndex := 1;
//   Tree1.Items.Item[1].ImageIndex := 1 //   Node.Item[Node.SelectedIndex].ImageIndex := 0
//   else
//   Node.Item[Node.SelectedIndex].ImageIndex := 1   if Tree1.Items.Item[Node.SelectedIndex].ImageIndex = 1 then
   Tree1.Items.Item[Node.SelectedIndex].ImageIndex := 0
   else
   Tree1.Items.Item[Node.SelectedIndex].ImageIndex := 1; end;
Cleber

Cleber

Curtidas 0

Respostas

Cleber

Cleber

28/01/2011

Alguem pessoal?
GOSTEI 0
Wilson Junior

Wilson Junior

28/01/2011

Teste se Node.Selected <> nil e após, vc pode acessar diretamente Node.Selected..ImageIndex.

Espero ter colaborado.
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

28/01/2011

tente:

  if TreeView1.Selected <> nil then
  begin
    TreeView1.Items.BeginUpdate;
    if TreeView1.Selected.ImageIndex = 1 then
      TreeView1.Selected.ImageIndex := 0
    else
      TreeView1.Selected.ImageIndex := 1;
//    TreeView1.Selected.SelectedIndex := TreeView1.Selected.ImageIndex;
    TreeView1.Items.EndUpdate;
  end;

além do imageindex você talvez precise manipular também o selectedindex.

GOSTEI 0
Cleber

Cleber

28/01/2011

Obrigado Emerson Vou testar e te falo. até +.  
GOSTEI 0
Cleber

Cleber

28/01/2011

Emersom boa noite,
GOSTEI 0
Cleber

Cleber

28/01/2011

Emerson boa noite, Deu certo, agora acontece a seguinte situação, já pesquisei e não consegui solução. Acontece que quando dou 2 clicks para alterar o imageindex, se o ponteiro do mouse está em cima da imagem, a imagem que continua á a imagem atual, para apareceber a imagem nova é preciso tirar o mouse de cima da opção. Já tentei atualizar o treeview de tudo quanto foi jeito mas não consegui.  
  if Tree1.Selected <> nil then
  begin
    Tree1.Items.BeginUpdate;
    if Tree1.Selected.ImageIndex = 1 then
        Tree1.Selected.ImageIndex :=0
    else
        Tree1.Selected.ImageIndex :=1
    Tree1.Items.EndUpdate;
  end;
    Tree1.Refresh;
GOSTEI 0
Cleber

Cleber

28/01/2011

Boa noite, O que percebi é o seguinte. O Nó Pai está recebendo a figura de indice 0 que está no imagelist, que teóricamente esta imagem somente seria usada nos  nós  filhos. Dai quando eu clico uma vez em algum nó filho, a imagem do nó pais está sobrepondo temporariamente a imagem do nó filho, daí quando eu saio deste nó filho, a imagem original aparece. Alguem ja viu algo assim? Creio que a imagem não deveria aparecer no nó pai. e somente nos filhos, pois quando eu der duplo clique somente alterno as figuras. Segue função que aciona     QuDireitos.Close;
  QuDireitos.SQL.Clear;
  QuDireitos.SQL.Add('select  * from USUARIO_DIREITOS');
  QuDireitos.Open;
  TRee1.Items.BeginUpdate;
  if QuDireitos.RecordCount > 0 then
    while not QuDireitos.Eof do
    begin
      node := Tree1.Items.add(nil, QuDireitosCampo.AsString);         if (copy(QuDireitosDireito.AsString, 1, 1) = '0') or (copy(QuDireitosDireito.AsString, 1, 1) = '1') then
           Begin
             Tree1.Items.AddChild(node, 'Inclui');
             Node.Item[0].ImageIndex := StrToInt(copy(QuDireitosDireito.AsString, 1, 1));
           End;         if (copy(QuDireitosDireito.AsString, 2, 1) = '0') or (copy(QuDireitosDireito.AsString, 2, 1) = '1') then
          begin
            Tree1.Items.AddChild(node, 'Altera');
            Node.Item[1].ImageIndex := StrToInt(copy(QuDireitosDireito.AsString, 2, 1));
          end;         if (copy(QuDireitosDireito.AsString, 3, 1) = '0') or (copy(QuDireitosDireito.AsString, 3, 1) = '1') then
          Begin
             Tree1.Items.AddChild(node, 'Exclui');
             Node.Item[2].ImageIndex := StrToInt(copy(QuDireitosDireito.AsString, 3, 1));
          end;         if (copy(QuDireitosDireito.AsString, 4, 1) = '0') or (copy(QuDireitosDireito.AsString, 4, 1) = '1') then
          Begin
             Tree1.Items.AddChild(node, 'Imprime');
             Node.Item[3].ImageIndex := StrToInt(copy(QuDireitosDireito.AsString, 4, 1));
          end;   
      QuDireitos.next;
GOSTEI 0
Cleber

Cleber

28/01/2011

Bom, já consegui fazer com que a figura do nó pai não apareça. Agora o problema de se clicar em cima do nó filho e a imagem ficar sobreposta com a imagem do indice 0 do imagelist, não deu Acontece tb que quando eu clico 2x em cima de um nó filho para mudar a imagem, eu ainda continuo tendo que mudar para o item de baixo ou para o item de cima para que a figura atualizada apareça. Que coisa chata este treeview, e o duro que pesquisei pela net só tem exemplos meio vagos. Alguem teria uma rotina que está funcionando somente para postar um trecho pra eu comparar com a minha e ver o que pode estar acontecendo? Obrigado.
GOSTEI 0
Cleber

Cleber

28/01/2011

Funcionou. Era o selectindex mesmo, eu só não estava sabendo como manipula-lo.               Node.Item[1].ImageIndex := NaoGrava;
            Node.Item[1].SelectedIndex := NaoGrava;   Obrigado a todos.
   
GOSTEI 0
POSTAR