riezebosch schreef op donderdag 19 mei 2005 @ 16:56:
De vergelijking voor de grens. De grens wordt bepaald vanaf de bepaalde Node tot aan al z'n parents. Maar als je dus uitgaat van de root, en alle childs die binnen het bereik (onder de grens) vallen langs wilt gaan (met DoeActie), zal telkens opnieuw de hele grens gecontroleerd (en opgebouwd) moeten worden.
Of je moet de grens opbouwen van de geselecteerde Node tot aan de root, en van daaruit weer teruggaan alle kinderen langs met als parameter het lijstje met de Nodes van de grens. Maar dat is ook vrij complex..
Ik snap je echt niet?
Grens is een instantie van TNode die je gebruikt om de gewenste diepte aan te geven. Eenmaal geinstantieerd wordt deze niet meer veranderd (tenzij je de pointer naar een bestaande node opgeeft, maar goed, in mijn code wordt er aan Grens iig niets veranderd). Dit is dus 1 actie, die eenmalig uitgevoerd wordt.
Dan het doorlopen zelf. Ga van
EEN root uit (en daar waar jij hem zelf aanroept in je OnClick of zo

vul je daar dus
DE root in, er vanuit gaande dat je alles vanaf het begin tot aan je grens wilt hebben). Vervolgens wordt er gecontroleerd of je al voorbij de grens bent (afhankelijk van je implementatie dus, maar in princiepe niet meer dan een "if getal1 < getal2".
Zit je nog voor de grens ga dan verder, anders doe niet (einde procedure).
Dat verdergaan bestaat uit het uitvoeren van de gewenste actie, gevolgd door het aflopen van alle nodes die aan je huidige node hangen. Dat aflopen is dus per node die aan je huidige node hangen deze alinea weer doorlopen.
Ik zie daar nergens het opbouwen of afbreken of meermaals doorlopen van je complete boom tussen staan?
Als ik er het lijstje van de topicstart bijpak en je wilt 1.2.3 als grens hebben dan doet hij dus het volgende
1: Ik zit nog niet voorbij de grens
1: DoeActie
1.1: Ik zit nog niet voorbij de grens
1.1 DoeActie
1.1.1: Ik zit nog niet voorbij de grens
1.1.1: DoeActie
1.1.2: Ik zit nog niet voorbij de grens
1.1.2: DoeActie
1.1.2.1: Ik zit nog niet voorbij de grens
1.1.2.1: DoeActie
1.1.3: Ik zit nog niet voorbij de grens
1.1.3: DoeActie
1.2: Ik zit nog niet voorbij de grens
1.2: DoeActie
1.2.1: Ik zit nog niet voorbij de grens
1.2.1: DoeActie
1.2.2: Ik zit nog niet voorbij de grens
1.2.2:DoeActie
1.2.3: Ik zit nog niet voorbij de grens
1.2.3:DoeActie
1.2.3.1: Ik zit voorbij de grens
1.2.4: Ik zit voorbij de grens
1.2.5: Ik zit voorbij de grens
1.2.6: Ik zit voorbij de grens
1.2.7: Ik zit voorbij de grens
1.3: Ik zit voorbij de grens
1.4: Ik zit voorbij de grens
1.5:: Ik zit voorbij de grens
2: Ik zit voorbij de grens
3: Ik zit voorbij de grens
4: Ik zit voorbij de grens
Ik zie nu dat het dus nog een klein beetje slimmer kan, maar het is dus echt niet zo dat voor ieder item opnieuw je hele boom doorlopen wordt?
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| public procedure DoorloopTotGrens(Grens: TNode)
begin
if not IsVoorbijGrens(TreeRootNode, Grens) then
DoorloopTree(TreeRootNode, Grens);
end;
private function IsVoorbijGrens(Node, Grens: TNode):boolean;
begin
// complete bool eval moet uitstaan, anders herschrijven
result := (Node.Major > Grens.Major) or
((Node.Major = Grens.Major) and (Node.Minor > Grens.Minor));
end;
private procedure DoorloopTree(Root, Grens: TNode)
var i: integer;
begin
Root.DoeActie;
i := 0;
while (i < Root.Items.Count) and (not IsVoorbijGrens(Root.Items[i], Grens) do
begin
DoorloopTree(Root.Items[i], Grens);
inc(i);
end;
end; |
Delphi kent geen private en public statements op die positie, maar om hier de hele klasse uit te schrijven gaat me net te ver

Je snapt ze wel denk ik

Dat doe ik ook, dat is mijn IsVoorbijGrens()
[
Voor 5% gewijzigd door
Paul op 19-05-2005 17:19
]