2011-05-08 4 views
0

Cela semble très simple, mais c'est comme un oignon - beaucoup de couches que vous peler. J'ai une hiérarchie de mes propres classes d'objets - un peu comme les composants d'une forme, en ce sens que chacun d'entre eux peut avoir des enfants et un parent. En haut, il y a un objet racine. Un autre code gère cette hiérarchie et il est possible que des branches ou des feuilles puissent être créées, supprimées ou renommées à tout moment. Je souhaite avoir une vue arborescente (d'une certaine manière, probablement virtuelle) qui fournit une vue de cette hiérarchie de telle manière qu'il soit possible d'avoir plusieurs de ces vues arborescentes, chacune tirant elle-même de la hiérarchie d'objets si nécessaire.Quel est le meilleur algorithme Delphi pour afficher une arborescence pour afficher une hiérarchie existante d'objets

Je dispose déjà d'une solution utilisant TTreeView de Delphi, mais elle repose sur l'itération dans la hiérarchie lorsqu'un drapeau 'modifié' est levé et la reconstruction des branches de la vue arborescente qui ont changé. C'est lent (je peux avoir plus de 1000 objets) et j'aimerais un algorithme qui réussisse à faire un seul changement de vue d'arbre pour une seule insertion ou suppression d'objet. Est-ce possible?

Répondre

1

Vous pouvez certainement détecter qu'un objet a été inséré ou supprimé et apporter les modifications nécessaires.

Par exemple, pour une suppression, recherchez le nœud associé à l'objet supprimé, puis supprimez-le. Pour une insertion, recherchez l'objet associé au parent, puis insérez un nouveau nœud au bon endroit.

Si vous rencontrez des problèmes de performance en parcourant l'arborescence pour trouver le nœud associé à l'objet, vous pouvez utiliser un dictionnaire.

Pour une vue arborescente virtuelle, c'est plus simple car vous obtenez simplement l'arborescence pour refléter la structure de l'objet. Quand une modification est faite, vous demandez une mise à jour et tout se passe naturellement.

+0

Ma question concerne l'algorithme pour implémenter ce que vous suggérez. Lorsque vous avez écrit "trouver le nœud associé à l'objet supprimé", je me demandais comment cela pouvait être fait rapidement dans une arborescence, c'est-à-dire écrire une fonction "objet à nœud" qui n'avait pas besoin de parcourir tout l'arbre. –

+1

@Brian Si vous ne voulez pas marcher dans l'arbre pour des raisons de performances, utilisez un dictionnaire. –

Questions connexes