Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Probleme mit Durchzählen von Elementen (https://www.delphipraxis.net/94285-probleme-mit-durchzaehlen-von-elementen.html)

daschaos 19. Jun 2007 11:06


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:
function DoGetChildData(AParentID: Integer; AIndex: Integer; var ChildValue: Integer; var Value: Integer; var  
  Caption: WideString): Integer;
   
function DoGetChildCount(AParentID: Integer): Integer;
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.
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;

marabu 19. Jun 2007 11:40

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

daschaos 19. Jun 2007 12:00

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).

marabu 19. Jun 2007 13:39

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 19. Jun 2007 18:18

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