Ajuda com treeview
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;
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
Curtidas 0
Respostas
Cleber
28/01/2011
Alguem pessoal?
GOSTEI 0
Wilson Junior
28/01/2011
Teste se Node.Selected <> nil e após, vc pode acessar diretamente Node.Selected..ImageIndex.
Espero ter colaborado.
Espero ter colaborado.
GOSTEI 0
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.
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
28/01/2011
Obrigado Emerson
Vou testar e te falo.
até +.
GOSTEI 0
Cleber
28/01/2011
Emersom boa noite,
GOSTEI 0
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;
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
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;
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
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
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.
Node.Item[1].SelectedIndex := NaoGrava; Obrigado a todos.
GOSTEI 0