![]() |
Probleme mit Durchzählen von Elementen
Ich weiß nich, ob man mir helfen kann, aber ich bin zu blöd die Gesamtanzahl meiner Elemente zu zählen. Ich habe eine Komponente die zwei Schnittstellen nach außen hat, die diese dann mit Leben füllen sollen, um später zu zeichnen. Damit die Gesamtfunktionalität gegeben ist, brauche ich aber unter anderem eine Funktion die die Gesamtanzahl meiner Elemente angibt.
Also die Daten müssen so angeordnet sein, dass die ID´s einfach durchnumeriert werden... Die Schnittstellen sehen folgendermaßen aus:
Delphi-Quellcode:
Ich weiß nicht, ob die erste überhaupt interessant ist in diesem Kontext? Naja, auf jeden Fall liefert diese zu gegebener ParentID und dem Index, also welches Kind des Parent man haben möchte, z.B. das zweite, die ChildID.
function DoGetChildData(AParentID: Integer; AIndex: Integer; var ChildValue: Integer; var Value: Integer; var
Caption: WideString): Integer; function DoGetChildCount(AParentID: Integer): Integer; Die zweite Schnittstelle liefert mir dann immer die direkte Anzahl an Kindern. Die Funktion zum Zählen der Elemente hab ich mir ungefähr so vorgestellt, wobei die so nich richtig funktioniert, weil der Aufruf CountTotalNumberofElements(ParentID + i) ja nich richtig ist. Das funktioniert ja nur für ParentID = 0, das dann die zum Beispiel 5 Kinder mit i aufgerufen werden. Wenn ich jetzt aber die Kinder von 1 aufrufen möchte, müsste der ja bei 6 anfangen, und genau das ist mein Problem! Wie mache ich das?
Delphi-Quellcode:
function TTreemapChart.CountTotalNumberOfElements(ParentID: Integer): Integer;
var i : Integer; Helper : Integer; begin Helper := DoGetChildCount(ParentID); for i := 1 to Helper do begin Result := Result + Helper + CountTotalNumberofElements(ParentID + i); end; end; |
Re: Probleme mit Durchzählen von Elementen
Hallo,
offensichtlich sind die Dinge, die du deine Elemente nennst, Teil einer Baumstruktur. Deine Komponente TTreeMapChart scheint Eigentümer dieser Struktur zu sein. Es gibt zwei grundsätzliche Herangehensweisen bei der Speicherung von Bäumen: (1) Abbildung der Knoten auf die Items in einem linearen Array und (2) Realisierung der Hierarchie über Zeiger. Bei (1) werden die Knoten dicht gepackt (Array) gespeichert und die notwendigen Zeiger verwenden Indexwerte. Bei (2) können die Knoten einzeln und verstreut auf dem Heap gespeichert sein und die Zeiger arbeiten mit Adressen. Aufgrund deiner Fragestellung scheinst du Weg (1) gewählt zu haben. Wie sehen die Knoteninformationen aus? Welchen Grad, welche Höhe, welche sonstigen Eigenschaften hat der Baum? Das ist wichtig für den Algorithmus zur Feststellung der Gesamtzahl an Nachfolgern. Grüße vom marabu |
Re: Probleme mit Durchzählen von Elementen
Momentan verwende ich nur Testdaten, die in einem Array abgelegt sind. Im späteren Verlauf, das wird aber noch eine Weile dauern, bis ich mit realen Werten arbeite, werd ich wohl den zweiten Weg wählen müssen.
Dann sollen die Dateien einer Festplatte einzeln eingelesen werden. Und am Anfang will ich eben erstmal zählen, wieviel Dateien zum Beispiel die Festplatte enthält mit Hilfe der Funktion oben. Und die Höhe oder Grad eines Baumes sind ja dann nicht bekannt. Aber kann ich nicht unabhängig davon, was ich verwende nur mit den Daten der Schnittstelle arbeiten? Also dass ich dort immer ausgehend von einer ID anfrage, wieviel Kinder dasjenige Element hat, welche ID das soundsovielte Kind hat usw. ? Weil es ist ja eine Komponente und soll unabhängig von meiner Anwendung und Gegebenheiten, die später die Daten liefert, arbeiten. An Eigenschaften hat ein Element neben seiner Kennung (ID) halt noch die Größe(Value), die Anzahl der Kinder und einen Text(Caption). |
Re: Probleme mit Durchzählen von Elementen
Hallo,
ich habe den Eindruck, dass deine Datenstrukturen noch nicht festgelegt sind, aber irgendwie muss ich bei TreeMap und Dateisystem an SequoiaView denken. Höhe und Tiefe des entstehenden Baumes sind nur insofern interessant, als dass kein spezieller Baum vorliegt. Das Zählen deiner Elemente wird über einen Tree Traversal Algorithmus erledigt. Du wirst ein Kennzeichen zur Unterscheidung von Verzeichnissen und Dateien benötigen, da beide nebeneinander existieren können. Selbstverständlich kannst du mit einer abstrakten Schnittstelle arbeiten, welche die Implementierungsdetails (Array oder kein Array) verbirgt. Du musst auch gar nicht bei Null anfangen. Schau dir doch die Klassen TTreeNodes und TTreeNode an. Dort kannst du Eigenschaften und Methoden sehen, die auch du benötigen wirst - vielleicht nicht alle, aber einige bestimmt. Die drei Eigenschaften aus deiner Aufzählung sind auf jeden Fall nicht ausreichend, egal wie du letzten Endes implementierst. Freundliche Grüße |
DP-Maintenance
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz