Muitos sistemas possuem uma estrutura de tabela semelhante à seguinte (tabela1):
IDNome ParentID
-------------------------------------------------- -------
001 Eletrônica0
002 Metálico 0
003 Capacitores Eletrônicos001
004 Eletrônica de Resistência001
005 Metais não ferrosos002
E todo mundo está acostumado a usar árvore (TreeView) para exibir, para que a classificação de toda a tabela possa ser bem exibida. Porém, se a quantidade de dados for grande, a geração da árvore será mais lenta, principalmente ao usar recursão para implementá-la, o número de acessos ao banco de dados será muitos (dependendo do número de camadas), e o efeito será mais óbvio quando usado em três camadas. Aqui está uma boa maneira de gerar uma estrutura em árvore.
Este algoritmo acessa o banco de dados apenas uma vez. A implementação específica é a seguinte:
1. Obtenha todos os dados do banco de dados de uma vez e classifique-os de acordo com o campo ParentID, de modo a garantir que o nó pai de cada dado esteja na frente dele.
2. Retire o primeiro dado e desenhe-o na árvore. Ao adicioná-lo à árvore, primeiro encontre o nó pai desses dados. Se não houver nenhum nó pai, use esse registro diretamente como o nó de primeiro nível. a árvore.
3. Se ainda houver dados, retire-os e execute a etapa 2 até que não haja mais dados.
Implementação do programa:
Este programa usará uma variável TStringList de stlID para armazenar o valor do ID de cada nó na árvore correspondente e usará a função FindParent para encontrar o nó pai.
função FindParent(ID:String):TTreeNode;
var
eu:Inteiro;
começar
resultado:=nulo;
para i:=TreeView1.Items.Count-1 até 0 faça
se stlID.Strings[i]=ID então
começar
resultado:=TreeView1.Items[i];
quebrar;
fim;
fim;
//Árvore geradora
Procedimento CreateTree;
var
tmpNode:TTreeNode;
começar
Consulta1.fechar;
Query1.SQL.Text:='selecione * da ordem da tabela1 por ParentID';
Consulta1.Open;
Consulta1.Primeiro;
enquanto não Query1.Eof faça
começar
tmpNode:=TreeView1.Items.AddChild(FindParent(Query1.FieldByName('ParentID').AsString),Query1.FieldByName('Nome').AsString);
stlID.Add(Query1.FieldByName('ID').AsString);//ID do registro
Consulta1.Próximo;
fim;
fim;